Commit 0f0faaa9 authored by wenwen.tang's avatar wenwen.tang 😕

update

parent 10dcaa4c
...@@ -241,7 +241,7 @@ robo-executor: # 执行器相关 ...@@ -241,7 +241,7 @@ robo-executor: # 执行器相关
end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组 end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
clean-up: true clean-up: true
real: # 实盘执行器 real: # 实盘执行器
export: ${EXPORT_ENABLE:on} # 是否开启报告 export: ${EXPORT_ENABLE:off} # 是否开启报告
start-date: 2023-05-08 # 实盘开始时间 start-date: 2023-05-08 # 实盘开始时间
include-date: [] include-date: []
......
...@@ -5,7 +5,6 @@ from api import RoboExecutor ...@@ -5,7 +5,6 @@ from api import RoboExecutor
@autowired(names={'executor': RoboExecutor.use_name()}) @autowired(names={'executor': RoboExecutor.use_name()})
def start(executor: RoboExecutor = None): def start(executor: RoboExecutor = None):
print('开始')
executor.start_exec() executor.start_exec()
......
...@@ -37,7 +37,8 @@ class BaseRebalanceSignal(RebalanceSignal, ABC): ...@@ -37,7 +37,8 @@ class BaseRebalanceSignal(RebalanceSignal, ABC):
'type': self.signal_type, 'type': self.signal_type,
'risk': risk, 'risk': risk,
'portfolio_type': portfolio_type, 'portfolio_type': portfolio_type,
'portfolio': portfolio 'portfolio': portfolio,
'effective': 1
}) })
return rrs.get_by_id(id) return rrs.get_by_id(id)
return None return None
......
...@@ -143,7 +143,7 @@ class RealExecutor(RoboExecutor): ...@@ -143,7 +143,7 @@ class RealExecutor(RoboExecutor):
self._builder = builder self._builder = builder
self._pool = pool self._pool = pool
self._hold = hold self._hold = hold
self._syncs = syncs self._syncs = [syncs]
self._daily_export = daily_export self._daily_export = daily_export
self._monitor_export = monitor_export self._monitor_export = monitor_export
self._config = get_config(__name__)['real'] self._config = get_config(__name__)['real']
...@@ -176,7 +176,8 @@ class RealExecutor(RoboExecutor): ...@@ -176,7 +176,8 @@ class RealExecutor(RoboExecutor):
def start_exec(self): def start_exec(self):
if self.is_sync_data: if self.is_sync_data:
self._syncs.do_sync() for sync in self._syncs:
sync.do_sync()
date = self.curt_date date = self.curt_date
if is_workday(date) or date in self.include_date: if is_workday(date) or date in self.include_date:
date = prev_workday(filter_weekend(date)) date = prev_workday(filter_weekend(date))
...@@ -198,3 +199,5 @@ class RealExecutor(RoboExecutor): ...@@ -198,3 +199,5 @@ class RealExecutor(RoboExecutor):
f'export email for date[{format_date(date)}] send success, use[{(dt.now() - now).seconds}s]') f'export email for date[{format_date(date)}] send success, use[{(dt.now() - now).seconds}s]')
else: else:
logger.info(f'today[{format_date(date)}] is a rest day, do not execute the daily real robo.') logger.info(f'today[{format_date(date)}] is a rest day, do not execute the daily real robo.')
import datetime as dt
import json import json
from datetime import date as dt, datetime
from multiprocessing import Process from multiprocessing import Process
import uvicorn import uvicorn
...@@ -8,7 +8,7 @@ from fastapi import FastAPI ...@@ -8,7 +8,7 @@ from fastapi import FastAPI
from py_jftech import prev_workday, filter_weekend from py_jftech import prev_workday, filter_weekend
import main import main
from api import DatumType from api import DatumType, PortfoliosRisk
from basic.datum import DefaultDatum from basic.datum import DefaultDatum
app = FastAPI() app = FastAPI()
...@@ -16,17 +16,25 @@ app = FastAPI() ...@@ -16,17 +16,25 @@ app = FastAPI()
REC_GID = 'E3886FBA-123B-7890-123E-123456BEEED' REC_GID = 'E3886FBA-123B-7890-123E-123456BEEED'
def getTodayRec(): def get_today_rec():
from portfolios.dao import robo_mpt_portfolios as rmp from portfolios.dao import robo_mpt_portfolios as rmp
from api import PortfoliosType, PortfoliosRisk from api import PortfoliosType, PortfoliosRisk
day = prev_workday(filter_weekend(dt.today())) day = prev_workday(filter_weekend(dt.date.today()))
portfolio = rmp.get_one(day, PortfoliosType.NORMAL, PortfoliosRisk.FT3) portfolio = rmp.get_one(day, PortfoliosType.NORMAL, PortfoliosRisk.FT3)
return portfolio return portfolio
def get_last_signal():
from rebalance.dao import robo_rebalance_signal as rrs
day = prev_workday(filter_weekend(dt.date.today()))
last_re = rrs.get_last_one(max_date=day, risk=PortfoliosRisk.FT3, effective=True)
return last_re
@app.get("/recommend") @app.get("/recommend")
async def root(): async def root():
portfolio = getTodayRec() portfolio = get_today_rec()
if portfolio: if portfolio:
fund_infos = DefaultDatum().get_datums(DatumType.FUND) fund_infos = DefaultDatum().get_datums(DatumType.FUND)
id_ticker_map = {str(info['id']): info for info in fund_infos} id_ticker_map = {str(info['id']): info for info in fund_infos}
...@@ -43,33 +51,39 @@ async def root(): ...@@ -43,33 +51,39 @@ async def root():
data['rr'] = 0.81 data['rr'] = 0.81
data['roi'] = 0.81 data['roi'] = 0.81
data['risk'] = round(sum([id_ticker_map[key]['risk'] * weight for key, weight in funds.items()]), 2) data['risk'] = round(sum([id_ticker_map[key]['risk'] * weight for key, weight in funds.items()]), 2)
data['note'] = '{}' note = {}
sig = get_last_signal()
note['last_reg_reb'] = sig['date'].strftime('%Y-%m-%d')
data['note'] = json.dumps(note)
portfolios['data'] = data portfolios['data'] = data
rec_list.append(portfolios) rec_list.append(portfolios)
return rec_list return rec_list
else: else:
return {'msg': '当日投组未产生,待10:30后获取'} return {'msg': '当日投组未产生,待10:00后获取'}
def start_robo(): def start_robo():
# 异常情况可以重启跑当天投组 # 异常情况可以重启跑当天投组
current_time = datetime.datetime.now() current_time = dt.datetime.now()
target_time = datetime.time(10, 15) target_time = dt.time(10, 0)
if current_time.time() > target_time: if current_time.time() > target_time:
main.start() main.start()
# 开启定时任务,执行实盘 # 开启定时任务,执行实盘
scheduler = BlockingScheduler() scheduler = BlockingScheduler()
scheduler.add_job(main.start, 'cron', day_of_week='0-4', hour=10, minute=15) scheduler.add_job(main.start, 'cron', day_of_week='0-4', hour=10, minute=00)
scheduler.start() scheduler.start()
def start_web():
uvicorn.run("robo_controller:app", reload=True, port=8080)
if __name__ == "__main__": if __name__ == "__main__":
# 开启一个进程执行start_robo() # 开启一个进程执行start_robo()
p1 = Process(target=start_robo) p1 = Process(target=start_robo)
p1.start() p1.start()
# 启动进程2 # 启动进程2
p2 = Process(target=uvicorn.run, p2 = Process(target=start_web)
args=("robo_controller:app",),
kwargs={'port': 8080})
p2.start() p2.start()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment