100 lines
3.5 KiB
Python
100 lines
3.5 KiB
Python
"""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()
|