From 9898833120b424392135ddc5ca0dfce0e4364838 Mon Sep 17 00:00:00 2001
From: jichao <jichao614@foxmail.com>
Date: Mon, 28 Nov 2022 12:40:01 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=9B=98=E5=AE=8C=E6=88=90=E5=BE=85?=
 =?UTF-8?q?=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 robo_executor.py | 34 +++++++++++++++++++++++++---------
 1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/robo_executor.py b/robo_executor.py
index eefa425..6f0a6f6 100644
--- a/robo_executor.py
+++ b/robo_executor.py
@@ -1,10 +1,15 @@
+import sys
+import time
+from datetime import datetime as dt
+from enum import Enum, unique
+
 import pandas as pd
 
-from framework import component, autowired, block_execute, get_config, get_logger, filter_weekend, workday_range, format_date, prev_workday
 from api import RoboExecutor, AssetRisk, Datum, AssetPool, PortfoliosBuilder, PortfoliosRisk, PortfoliosHolder, PortfoliosType
-from datetime import datetime as dt
-import time
-from enum import Enum, unique
+from framework import (
+    component, autowired, block_execute, get_config, get_logger, filter_weekend,
+    workday_range, format_date, prev_workday, parse_date
+)
 
 logger = get_logger(__name__)
 
@@ -64,7 +69,8 @@ class BacktestExector(RoboExecutor):
         if self.start_step.within(BacktestStep.EWMA_VALUE):
             logger.info("start to build fund ewma value.".center(50, '-'))
             now = dt.now()
-            block_execute(self._risk.build_risk_date, {x['id']: (x['id'], self.end_date) for x in self._datum.get_fund_datums(risk=(3, 4, 5))}, isolate=True, result=False)
+            block_execute(self._risk.build_risk_date, {x['id']: (x['id'], self.end_date) for x in self._datum.get_fund_datums(risk=(3, 4, 5))}, isolate=True,
+                          result=False)
             logger.info(f"build fund ewma value success, use[{(dt.now() - now).seconds}s]")
         if self.start_step.within(BacktestStep.ASSET_POOL):
             logger.info("start to build asset pool".center(50, '-'))
@@ -72,14 +78,16 @@ class BacktestExector(RoboExecutor):
             workdays = workday_range(self.start_date, self.end_date)
             for date in workdays:
                 self._risk.get_risk_pool(date)
-                time.sleep(0.05) # 这里需要sleep,否则里面多进程太快,数据库连接容易超时
+                time.sleep(0.05)  # 这里需要sleep,否则里面多进程太快,数据库连接容易超时
             for date in workdays:
                 self._pool.get_pool(date)
             logger.info(f"build asset pool success, use[{(dt.now() - now).seconds}s]")
         if self.start_step.within(BacktestStep.NORMAL_PORTFOLIO):
             logger.info("start to build normal portfolios".center(50, '-'))
             now = dt.now()
-            block_execute(self._builder.get_portfolios, {f'{x.name}_{format_date(j)}': (j, x) for x in PortfoliosRisk for j in workday_range(self.start_date, self.end_date)}, isolate=True, result=False)
+            block_execute(self._builder.get_portfolios,
+                          {f'{x.name}_{format_date(j)}': (j, x) for x in PortfoliosRisk for j in workday_range(self.start_date, self.end_date)}, isolate=True,
+                          result=False)
             logger.info(f"build normal portfolios success, use[{(dt.now() - now).seconds}s]")
         if self.start_step.within(BacktestStep.HOLD_PORTFOLIO):
             logger.info("start to build hold portfolios".center(50, '-'))
@@ -101,8 +109,17 @@ class RealExecutor(RoboExecutor):
     def start_date(self):
         return pd.to_datetime(filter_weekend(self._config['start-date']))
 
+    @property
+    def curt_date(self):
+        if len(sys.argv) > 1:
+            try:
+                return parse_date(sys.argv[1])
+            except Exception as e:
+                logger.warning(f'get curt date from argv failure.', e)
+        return dt.combine(dt.today().date(), dt.min.time())
+
     def start_exec(self):
-        date = dt.combine(dt.today().date(), dt.min.time())
+        date = self.curt_date
         for risk in PortfoliosRisk:
             logger.info(f"start to build risk[{risk.name}] real for date[{format_date(date)}]".center(50, '-'))
             now = dt.now()
@@ -112,4 +129,3 @@ class RealExecutor(RoboExecutor):
             if p_type is not PortfoliosType.NORMAL:
                 self._builder.get_portfolios(prev_workday(date), p_type)
             logger.info(f"build risk[{risk.name}] real for date[{format_date(date)}] success, use[{(dt.now() - now).seconds}s]")
-
-- 
2.18.1