feat(data): 恢复双源(task#79)—撮合raw+策略qfq, 分红除权准确
用户要模拟=回测准确: raw除权缺口致MA假信号, 必须双源。
- data_source: qfq→qfq_dir(干净qfq), raw→raw_dir; _check_adjust_cfg(cfg提供才校验)
- engine 双bar流: step(raw_bars,qfq_bars)撮合/盯市raw+策略on_bar qfq; run zip(raw,qfq)
- live_orchestrator: warmup用qfq(信号am); 去adjust参数(双源固定)
- raw_redownload --adjust(''raw/'qfq'); config qfq_dir
- 113/113通过
This commit is contained in:
@@ -48,15 +48,15 @@ def prefix_for(code: str) -> str:
|
||||
return "sh" if code.startswith(("60", "68", "51", "56", "58")) else "sz"
|
||||
|
||||
|
||||
def download_one(ak, code: str, start: str, end: str):
|
||||
"""新浪源拉 raw 日线,返回 (df, None) 或 (None, err)。"""
|
||||
def download_one(ak, code: str, start: str, end: str, adjust: str = ""):
|
||||
"""新浪源拉日线(adjust="" raw / "qfq" 前复权),返回 (df, None) 或 (None, err)。"""
|
||||
sym = f"{prefix_for(code)}{code}"
|
||||
try:
|
||||
df = ak.stock_zh_a_daily(
|
||||
symbol=sym,
|
||||
start_date=start.replace("-", ""),
|
||||
end_date=end.replace("-", ""),
|
||||
adjust="", # raw 不复权
|
||||
adjust=adjust,
|
||||
)
|
||||
except Exception as e: # noqa: BLE001
|
||||
return None, f"{type(e).__name__}: {str(e)[:100]}"
|
||||
@@ -100,6 +100,7 @@ def main():
|
||||
ap.add_argument("--all", action="store_true", help="全市场(读 STOCK_LIST csv)")
|
||||
ap.add_argument("--start", default="2024-01-01")
|
||||
ap.add_argument("--end", default=None, help="默认今天")
|
||||
ap.add_argument("--adjust", default="", help="复权: '' raw / 'qfq' 前复权(双源用)")
|
||||
args = ap.parse_args()
|
||||
|
||||
end = args.end or time.strftime("%Y-%m-%d")
|
||||
@@ -122,7 +123,7 @@ def main():
|
||||
|
||||
ok = fail = rows = 0
|
||||
for i, code in enumerate(codes, 1):
|
||||
df, err = download_one(ak, code, args.start, end)
|
||||
df, err = download_one(ak, code, args.start, end, args.adjust)
|
||||
if df is None:
|
||||
fail += 1
|
||||
log.warning("[%d/%d] %s FAIL %s", i, len(codes), code, err)
|
||||
|
||||
Reference in New Issue
Block a user