diff --git a/config-mdis_prr3.yml b/config-mdis_prr3.yml index e6b0708522be3b4a2d125073dcc2928b32c0f9d6..748b7ae23bfea5396109376c32f1a591919e8436 100644 --- a/config-mdis_prr3.yml +++ b/config-mdis_prr3.yml @@ -217,9 +217,11 @@ reports: # 报告模å—相关 - daily-signal-report email: receives: + - jlin@ftfintech.com.tw + - YYang1@ftsice.com.tw + copies: - brody_wu@chifufund.com - wenwen.tang@thizgroup.com - copies: ${DAILY_EMAIL_COPIES} subject: # default: "MdisFoF_prr3(實盤)-æ¯æ—¥æŠ•組推薦_{today}" rebalance: "MdisFoF_prr3(實盤)-æ¯æœˆæŠ•組推薦_{today}" @@ -237,8 +239,8 @@ reports: # 报告模å—相关 min-date: {days: 30} - name: asset-pool-report # åŸºé‡‘æ± min-date: {days: 30} -# - name: combo-report # æŒä»“报告 -# min-date: {days: 40} + - name: combo-report # æŒä»“报告 + min-date: {days: 40} - name: mpt-report min-date: {days: 30} - name: signal-report diff --git a/config-stable_prr3.yml b/config-stable_prr3.yml index a49a4e524e63a198ddfcbf8d7d8ab5946e5e664c..5c382d48fe4b22fa214b71d60bb3d885276b30a2 100644 --- a/config-stable_prr3.yml +++ b/config-stable_prr3.yml @@ -221,8 +221,11 @@ reports: # 报告模å—相关 - daily-signal-report email: receives: + - jlin@ftfintech.com.tw + - YYang1@ftsice.com.tw + copies: - brody_wu@chifufund.com - copies: ${DAILY_EMAIL_COPIES} + - wenwen.tang@thizgroup.com subject: # default: "SteadyFoF_prr3(實盤)-æ¯æ—¥æŠ•組推薦_{today}" rebalance: "SteadyFoF_prr3(實盤)-æ¯æœˆæŠ•組推薦_{today}" @@ -261,7 +264,7 @@ reports: # 报告模å—相关 subject: "SVROBO6-实盘版-æ¯æ—¥ç›‘测_{today}" content: "Dear All: 附件是今天生æˆçš„监测数æ®ï¼Œè«‹é©—收,è¬è¬ï¼ 注>:該郵件為自動發é€ï¼Œå¦‚有å•題請è¯ç¹«çŸ½è°·åœ˜éšŠ telan_qian@chifufund.com" robo-executor: # 执行器相关 - use: ${ROBO_EXECUTOR:backtest} # 执行哪个执行器,优先å–系统环境å˜é‡ROBO_EXECUTOR的值,默认backtest + use: ${ROBO_EXECUTOR:real} # 执行哪个执行器,优先å–系统环境å˜é‡ROBO_EXECUTOR的值,默认backtest sync-data: ${SYNC_DATA:on} # 是å¦å¼€å¯åŒæ¥èµ„æ–™æ•°æ® backtest: # 回测执行器相关 start-date: 2013-01-02 # 回测起始日期 @@ -271,7 +274,7 @@ robo-executor: # 执行器相关 end-step: ${BACKTEST_END_STEP:3} # å›žæµ‹ä»Žå“ªä¸€æ¥æ‰§è¡Œå®ŒæˆåŽç»“æŸæ‰§è¡Œ 1:è®¡ç®—èµ„äº§æ± ï¼›2:计算最优投组:3:计算å†å¹³è¡¡ä¿¡å·ä»¥åŠæŒä»“投组 clean-up: on real: # 实盘执行器 - export: ${EXPORT_ENABLE:on} # 是å¦å¼€å¯æŠ¥å‘Š + export: ${EXPORT_ENABLE:off} # 是å¦å¼€å¯æŠ¥å‘Š start-date: 2023-05-08 # 实盘开始时间 include-date: [] web: diff --git a/config-usmarket_prr4.yml b/config-usmarket_prr4.yml index ee427f59751e0b0885bd056b47150e3f2dd8ca69..8c94f92f6f3dc3710241f184ff9ca1b107b208d5 100644 --- a/config-usmarket_prr4.yml +++ b/config-usmarket_prr4.yml @@ -206,8 +206,11 @@ reports: # 报告模å—相关 - daily-signal-report email: receives: + - jlin@ftfintech.com.tw + - YYang1@ftsice.com.tw + copies: - brody_wu@chifufund.com - copies: ${DAILY_EMAIL_COPIES} + - wenwen.tang@thizgroup.com subject: # default: "USFoF_prr4(實盤)-æ¯æ—¥æŠ•組推薦_{today}" rebalance: "USFoF_prr4(實盤)-æ¯æœˆæŠ•組推薦_{today}" @@ -246,7 +249,7 @@ reports: # 报告模å—相关 subject: "SVROBO6-实盘版-æ¯æ—¥ç›‘测_{today}" content: "Dear All: 附件是今天生æˆçš„监测数æ®ï¼Œè«‹é©—收,è¬è¬ï¼ 注>:該郵件為自動發é€ï¼Œå¦‚有å•題請è¯ç¹«çŸ½è°·åœ˜éšŠ telan_qian@chifufund.com" robo-executor: # 执行器相关 - use: ${ROBO_EXECUTOR:backtest} # 执行哪个执行器,优先å–系统环境å˜é‡ROBO_EXECUTOR的值,默认backtest + use: ${ROBO_EXECUTOR:real} # 执行哪个执行器,优先å–系统环境å˜é‡ROBO_EXECUTOR的值,默认backtest sync-data: ${SYNC_DATA:on} # 是å¦å¼€å¯åŒæ¥èµ„æ–™æ•°æ® backtest: # 回测执行器相关 start-date: 2013-01-02 # 回测起始日期 @@ -254,9 +257,9 @@ robo-executor: # 执行器相关 sealing-period: 10 #调仓å°é—期 start-step: ${BACKTEST_START_STEP:1} # 回测从哪一æ¥å¼€å§‹æ‰§è¡Œ 1:è®¡ç®—èµ„äº§æ± ï¼›2:计算最优投组:3:计算å†å¹³è¡¡ä¿¡å·ä»¥åŠæŒä»“投组 end-step: ${BACKTEST_END_STEP:3} # å›žæµ‹ä»Žå“ªä¸€æ¥æ‰§è¡Œå®ŒæˆåŽç»“æŸæ‰§è¡Œ 1:è®¡ç®—èµ„äº§æ± ï¼›2:计算最优投组:3:计算å†å¹³è¡¡ä¿¡å·ä»¥åŠæŒä»“投组 - clean-up: on + clean-up: off real: # 实盘执行器 - export: ${EXPORT_ENABLE:on} # 是å¦å¼€å¯æŠ¥å‘Š + export: ${EXPORT_ENABLE:off} # 是å¦å¼€å¯æŠ¥å‘Š start-date: 2023-05-08 # 实盘开始时间 include-date: [] web: diff --git a/rebalance/base_signal.py b/rebalance/base_signal.py index e969f4473a4a672c0122fc0d89998a5acaceb161..5ebbb3693161473d1e63d194e2734914f1186478 100644 --- a/rebalance/base_signal.py +++ b/rebalance/base_signal.py @@ -130,7 +130,8 @@ class DailySignalReportor(RoboReportor): 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 = 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: 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)) diff --git a/robo_executor.py b/robo_executor.py index a274e9def3d22514fb8e22843a22c1a0cc1119b9..a8ff6edac28efdc4a5ce1960181d314b79956961 100644 --- a/robo_executor.py +++ b/robo_executor.py @@ -136,7 +136,7 @@ class BacktestExecutor(RoboExecutor): @component(bean_name='real') 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, daily_export: RoboExportor = None, monitor_export: RoboExportor = None, pool: AssetPool = None, signal: RebalanceSignal = None): diff --git a/web/robo_controller.py b/web/robo_controller.py index 080af93d67c8b93a18a38281ef4719ec1741ec6d..374d41b25c42358ae7771feafe7fe1ecb6c04648 100644 --- a/web/robo_controller.py +++ b/web/robo_controller.py @@ -1,7 +1,9 @@ import datetime as dt import json import logging +import os from statistics import pstdev +from tempfile import TemporaryDirectory import pandas as pd import uvicorn @@ -24,13 +26,17 @@ fund_infos, cp, roi, risk = None, None, None, None async def send_email(): - email = get_config('reports.exports.real-daily.email') - receives = email['receives'] - 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())) - content = json.dumps(recommends) - sendmail(receives=receives, copies=copies, subject=subject, content=content, attach_paths=None) + 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') + receives = email['receives'] + copies = email['copies'] if 'copies' in email and email['copies'] is not None else [] + subject = email['subject']['rebalance'].format(today=format_date(dt.date.today())) + content = email['content']['rebalance'] + sendmail(receives=receives, copies=copies, subject=subject, content=content, attach_paths=[filepath]) def get_today_rec(): @@ -85,7 +91,7 @@ async def recommend(): 'risk': risk, 'rr': round(sum([id_ticker_map[key]['risk'] * weight for key, weight in funds.items()]), 2), 'cp': cp, 'roi': roi} - note = {'recomman_reason': "推èç†ç”±æ˜¯:"} + note = {'recomman_reason': "推èç†ç”±æ˜¯:..."} data['note'] = json.dumps(note) # 计算股债比 stock_weight = int( @@ -116,8 +122,8 @@ async def startup_event(): current_time = dt.datetime.now() target_time = dt.time(10, 20) if current_time.time() > target_time: - # await send_email() 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(send_email, 'cron', day_of_week='0-4', hour=10, minute=25) @@ -125,4 +131,4 @@ async def startup_event(): if __name__ == "__main__": - uvicorn.run("robo_controller:app", host="0.0.0.0", port=get_config('web.port')) + uvicorn.run("robo_controller:app", host="0.0.0.0", port=get_config('web.port')) \ No newline at end of file