Commit 79c8ea63 authored by 吕先亚's avatar 吕先亚

update config

parent 2f187d6c
...@@ -217,9 +217,11 @@ reports: # 报告模块相关 ...@@ -217,9 +217,11 @@ reports: # 报告模块相关
- daily-signal-report - daily-signal-report
email: email:
receives: receives:
- jlin@ftfintech.com.tw
- YYang1@ftsice.com.tw
copies:
- brody_wu@chifufund.com - brody_wu@chifufund.com
- wenwen.tang@thizgroup.com - wenwen.tang@thizgroup.com
copies: ${DAILY_EMAIL_COPIES}
subject: subject:
# default: "MdisFoF_prr3(實盤)-每日投組推薦_{today}" # default: "MdisFoF_prr3(實盤)-每日投組推薦_{today}"
rebalance: "MdisFoF_prr3(實盤)-每月投組推薦_{today}" rebalance: "MdisFoF_prr3(實盤)-每月投組推薦_{today}"
...@@ -237,8 +239,8 @@ reports: # 报告模块相关 ...@@ -237,8 +239,8 @@ reports: # 报告模块相关
min-date: {days: 30} min-date: {days: 30}
- name: asset-pool-report # 基金池 - name: asset-pool-report # 基金池
min-date: {days: 30} min-date: {days: 30}
# - name: combo-report # 持仓报告 - name: combo-report # 持仓报告
# min-date: {days: 40} min-date: {days: 40}
- name: mpt-report - name: mpt-report
min-date: {days: 30} min-date: {days: 30}
- name: signal-report - name: signal-report
......
...@@ -221,8 +221,11 @@ reports: # 报告模块相关 ...@@ -221,8 +221,11 @@ reports: # 报告模块相关
- daily-signal-report - daily-signal-report
email: email:
receives: receives:
- jlin@ftfintech.com.tw
- YYang1@ftsice.com.tw
copies:
- brody_wu@chifufund.com - brody_wu@chifufund.com
copies: ${DAILY_EMAIL_COPIES} - wenwen.tang@thizgroup.com
subject: subject:
# default: "SteadyFoF_prr3(實盤)-每日投組推薦_{today}" # default: "SteadyFoF_prr3(實盤)-每日投組推薦_{today}"
rebalance: "SteadyFoF_prr3(實盤)-每月投組推薦_{today}" rebalance: "SteadyFoF_prr3(實盤)-每月投組推薦_{today}"
...@@ -261,7 +264,7 @@ reports: # 报告模块相关 ...@@ -261,7 +264,7 @@ reports: # 报告模块相关
subject: "SVROBO6-实盘版-每日监测_{today}" subject: "SVROBO6-实盘版-每日监测_{today}"
content: "Dear All: 附件是今天生成的监测数据,請驗收,謝謝! 注>:該郵件為自動發送,如有問題請聯繫矽谷團隊 telan_qian@chifufund.com" content: "Dear All: 附件是今天生成的监测数据,請驗收,謝謝! 注>:該郵件為自動發送,如有問題請聯繫矽谷團隊 telan_qian@chifufund.com"
robo-executor: # 执行器相关 robo-executor: # 执行器相关
use: ${ROBO_EXECUTOR:backtest} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest use: ${ROBO_EXECUTOR:real} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
sync-data: ${SYNC_DATA:on} # 是否开启同步资料数据 sync-data: ${SYNC_DATA:on} # 是否开启同步资料数据
backtest: # 回测执行器相关 backtest: # 回测执行器相关
start-date: 2013-01-02 # 回测起始日期 start-date: 2013-01-02 # 回测起始日期
...@@ -271,7 +274,7 @@ robo-executor: # 执行器相关 ...@@ -271,7 +274,7 @@ robo-executor: # 执行器相关
end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组 end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
clean-up: on clean-up: on
real: # 实盘执行器 real: # 实盘执行器
export: ${EXPORT_ENABLE:on} # 是否开启报告 export: ${EXPORT_ENABLE:off} # 是否开启报告
start-date: 2023-05-08 # 实盘开始时间 start-date: 2023-05-08 # 实盘开始时间
include-date: [] include-date: []
web: web:
......
...@@ -206,8 +206,11 @@ reports: # 报告模块相关 ...@@ -206,8 +206,11 @@ reports: # 报告模块相关
- daily-signal-report - daily-signal-report
email: email:
receives: receives:
- jlin@ftfintech.com.tw
- YYang1@ftsice.com.tw
copies:
- brody_wu@chifufund.com - brody_wu@chifufund.com
copies: ${DAILY_EMAIL_COPIES} - wenwen.tang@thizgroup.com
subject: subject:
# default: "USFoF_prr4(實盤)-每日投組推薦_{today}" # default: "USFoF_prr4(實盤)-每日投組推薦_{today}"
rebalance: "USFoF_prr4(實盤)-每月投組推薦_{today}" rebalance: "USFoF_prr4(實盤)-每月投組推薦_{today}"
...@@ -246,7 +249,7 @@ reports: # 报告模块相关 ...@@ -246,7 +249,7 @@ reports: # 报告模块相关
subject: "SVROBO6-实盘版-每日监测_{today}" subject: "SVROBO6-实盘版-每日监测_{today}"
content: "Dear All: 附件是今天生成的监测数据,請驗收,謝謝! 注>:該郵件為自動發送,如有問題請聯繫矽谷團隊 telan_qian@chifufund.com" content: "Dear All: 附件是今天生成的监测数据,請驗收,謝謝! 注>:該郵件為自動發送,如有問題請聯繫矽谷團隊 telan_qian@chifufund.com"
robo-executor: # 执行器相关 robo-executor: # 执行器相关
use: ${ROBO_EXECUTOR:backtest} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest use: ${ROBO_EXECUTOR:real} # 执行哪个执行器,优先取系统环境变量ROBO_EXECUTOR的值,默认backtest
sync-data: ${SYNC_DATA:on} # 是否开启同步资料数据 sync-data: ${SYNC_DATA:on} # 是否开启同步资料数据
backtest: # 回测执行器相关 backtest: # 回测执行器相关
start-date: 2013-01-02 # 回测起始日期 start-date: 2013-01-02 # 回测起始日期
...@@ -254,9 +257,9 @@ robo-executor: # 执行器相关 ...@@ -254,9 +257,9 @@ robo-executor: # 执行器相关
sealing-period: 10 #调仓封闭期 sealing-period: 10 #调仓封闭期
start-step: ${BACKTEST_START_STEP:1} # 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组 start-step: ${BACKTEST_START_STEP:1} # 回测从哪一步开始执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组 end-step: ${BACKTEST_END_STEP:3} # 回测从哪一步执行完成后结束执行 1:计算资产池;2:计算最优投组:3:计算再平衡信号以及持仓投组
clean-up: on clean-up: off
real: # 实盘执行器 real: # 实盘执行器
export: ${EXPORT_ENABLE:on} # 是否开启报告 export: ${EXPORT_ENABLE:off} # 是否开启报告
start-date: 2023-05-08 # 实盘开始时间 start-date: 2023-05-08 # 实盘开始时间
include-date: [] include-date: []
web: web:
......
...@@ -130,7 +130,8 @@ class DailySignalReportor(RoboReportor): ...@@ -130,7 +130,8 @@ class DailySignalReportor(RoboReportor):
def load_report(self, max_date=prev_workday(dt.today()), min_date=None) -> List[dict]: def load_report(self, max_date=prev_workday(dt.today()), min_date=None) -> List[dict]:
signals = pd.DataFrame(rrs.get_list(max_date=max_date, min_date=min_date)) signals = pd.DataFrame(rrs.get_list(max_date=max_date, min_date=min_date))
signals = signals[(signals['date'].dt.date == max_date.date())] # signals = signals[(signals['date'].dt.date == max_date.date())]
signals = signals.tail(1)
if not signals.empty: if not signals.empty:
datum_ids = reduce(lambda x, y: x | y, signals['portfolio'].apply(lambda x: set(json.loads(x).keys()))) datum_ids = reduce(lambda x, y: x | y, signals['portfolio'].apply(lambda x: set(json.loads(x).keys())))
datums = pd.DataFrame(self._datum.get_datums(type=DatumType.FUND, datum_ids=datum_ids)) datums = pd.DataFrame(self._datum.get_datums(type=DatumType.FUND, datum_ids=datum_ids))
......
...@@ -136,7 +136,7 @@ class BacktestExecutor(RoboExecutor): ...@@ -136,7 +136,7 @@ class BacktestExecutor(RoboExecutor):
@component(bean_name='real') @component(bean_name='real')
class RealExecutor(RoboExecutor): class RealExecutor(RoboExecutor):
@autowired(names={'daily_export': 'daily-real-export', 'monitor_export': 'daily-monitor-export'}) @autowired(names={'daily_export': 'daily-real-export'})
def __init__(self, builder: PortfoliosBuilder = None, hold: PortfoliosHolder = None, syncs: List[DataSync] = None, def __init__(self, builder: PortfoliosBuilder = None, hold: PortfoliosHolder = None, syncs: List[DataSync] = None,
daily_export: RoboExportor = None, monitor_export: RoboExportor = None, pool: AssetPool = None, daily_export: RoboExportor = None, monitor_export: RoboExportor = None, pool: AssetPool = None,
signal: RebalanceSignal = None): signal: RebalanceSignal = None):
......
import datetime as dt import datetime as dt
import json import json
import logging import logging
import os
from statistics import pstdev from statistics import pstdev
from tempfile import TemporaryDirectory
import pandas as pd import pandas as pd
import uvicorn import uvicorn
...@@ -24,13 +26,17 @@ fund_infos, cp, roi, risk = None, None, None, None ...@@ -24,13 +26,17 @@ fund_infos, cp, roi, risk = None, None, None, None
async def send_email(): async def send_email():
with TemporaryDirectory() as tmpdir:
filepath = os.path.join(tmpdir, "portfolio.json")
with open(filepath, "w", encoding='utf-8') as file:
recommends = await recommend()
json.dump(recommends, file, indent=4, ensure_ascii=False)
email = get_config('reports.exports.real-daily.email') email = get_config('reports.exports.real-daily.email')
receives = email['receives'] receives = email['receives']
copies = email['copies'] if 'copies' in email and email['copies'] is not None else [] copies = email['copies'] if 'copies' in email and email['copies'] is not None else []
recommends = await recommend()
subject = email['subject']['rebalance'].format(today=format_date(dt.date.today())) subject = email['subject']['rebalance'].format(today=format_date(dt.date.today()))
content = json.dumps(recommends) content = email['content']['rebalance']
sendmail(receives=receives, copies=copies, subject=subject, content=content, attach_paths=None) sendmail(receives=receives, copies=copies, subject=subject, content=content, attach_paths=[filepath])
def get_today_rec(): def get_today_rec():
...@@ -85,7 +91,7 @@ async def recommend(): ...@@ -85,7 +91,7 @@ async def recommend():
'risk': risk, 'risk': risk,
'rr': round(sum([id_ticker_map[key]['risk'] * weight for key, weight in funds.items()]), 2), 'cp': cp, 'rr': round(sum([id_ticker_map[key]['risk'] * weight for key, weight in funds.items()]), 2), 'cp': cp,
'roi': roi} 'roi': roi}
note = {'recomman_reason': "推荐理由是:"} note = {'recomman_reason': "推荐理由是:..."}
data['note'] = json.dumps(note) data['note'] = json.dumps(note)
# 计算股债比 # 计算股债比
stock_weight = int( stock_weight = int(
...@@ -116,8 +122,8 @@ async def startup_event(): ...@@ -116,8 +122,8 @@ async def startup_event():
current_time = dt.datetime.now() current_time = dt.datetime.now()
target_time = dt.time(10, 20) target_time = dt.time(10, 20)
if current_time.time() > target_time: if current_time.time() > target_time:
# await send_email()
scheduler.add_job(main.start, trigger=DateTrigger(run_date=current_time)) scheduler.add_job(main.start, trigger=DateTrigger(run_date=current_time))
await send_email()
# 开启定时任务,执行实盘 # 开启定时任务,执行实盘
scheduler.add_job(main.start, 'cron', day_of_week='0-4', hour=10, minute=20) scheduler.add_job(main.start, 'cron', day_of_week='0-4', hour=10, minute=20)
scheduler.add_job(send_email, 'cron', day_of_week='0-4', hour=10, minute=25) scheduler.add_job(send_email, 'cron', day_of_week='0-4', hour=10, minute=25)
......
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