"""S1: 验证 vnpy.alpha 能否处理 A 股数据(Phase 1 真实数据 → AlphaLab → 因子计算)。 验证链: 1. AlphaLab init 2. read_db_daily 读 A 股 bars(Phase 1) 3. save_bar_data + load_bar_data(存取兼容性) 4. 构造 panel df(datetime, vt_symbol, OHLCV) 5. AlphaDataset + add_feature(ma5) + prepare_data(spawn pool 因子计算) 6. fetch_raw(验证因子列生成) A 股特性支撑度(T+1/涨跌停/停牌)在因子层层面:alpha 模块本身不强制这些约束, 由策略/回测层处理;因子计算只需 OHLCV,A 股数据格式无差异。 """ import sys import os sys.path.insert(0, "/app/vnpy_v4.4.0") sys.path.insert(0, "/app") def main(): from vnpy.alpha.lab import AlphaLab from vnpy.alpha.dataset import AlphaDataset, Segment from vnpy.trader.constant import Interval import polars as pl results = {} # 1. AlphaLab init try: lab = AlphaLab("/tmp/alpha_lab_spike") results["alphalab_init"] = "OK" except Exception as e: results["alphalab_init"] = f"FAIL: {e}" return _print(results) # 2. read A 股 try: from sanguo_data.datareader import read_db_daily from sanguo_data.config import load_config cfg = load_config("/app/config/data_platform.yaml") bars = read_db_daily("600000", "2024-01-01", "2024-06-30", cfg) results["read_bars"] = f"OK ({len(bars)} bars)" if bars else "FAIL: 0 bars" if not bars: return _print(results) except Exception as e: import traceback; traceback.print_exc() results["read_bars"] = f"FAIL: {e}" return _print(results) # 3. save + load try: lab.save_bar_data(bars) vt = bars[0].vt_symbol loaded = lab.load_bar_data(vt, Interval.DAILY, "2024-01-01", "2024-06-30") results["save_load"] = f"OK (vt={vt}, loaded={len(loaded)})" except Exception as e: import traceback; traceback.print_exc() results["save_load"] = f"FAIL: {e}" return _print(results) # 4. panel df + AlphaDataset + add_feature + prepare + fetch try: df = pl.DataFrame({ "datetime": [b.datetime.replace(tzinfo=None) for b in bars], "vt_symbol": [b.vt_symbol for b in bars], "open": [b.open_price for b in bars], "high": [b.high_price for b in bars], "low": [b.low_price for b in bars], "close": [b.close_price for b in bars], "volume": [b.volume for b in bars], "turnover": [b.turnover for b in bars], "open_interest": [b.open_interest for b in bars], }) ds = AlphaDataset(df, ("2024-01-01", "2024-04-30"), ("2024-05-01", "2024-05-15"), ("2024-05-16", "2024-06-30")) ds.add_feature("ma5", "ts_mean(close, 5)") ds.prepare_data(max_workers=1) raw = ds.fetch_raw(Segment.TEST) has_ma5 = "ma5" in raw.columns results["factor_calc"] = f"OK (cols={raw.columns}, rows={raw.height}, ma5={has_ma5})" except Exception as e: import traceback; traceback.print_exc() results["factor_calc"] = f"FAIL: {e}" _print(results) def _print(results): print("=== S1 Spike Result ===") for k, v in results.items(): print(f" {k}: {v}") ok = all("OK" in v for v in results.values()) print(f"\nS1 VERDICT: {'PASS' if ok else 'PARTIAL/FAIL'}") if __name__ == "__main__": main()