Files
sanguo_vnpy_v2/scripts/spike_s1_alpha_ashare.py
T

100 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""S1: 验证 vnpy.alpha 能否处理 A 股数据(Phase 1 真实数据 → AlphaLab → 因子计算)。
验证链:
1. AlphaLab init
2. read_db_daily 读 A 股 barsPhase 1
3. save_bar_data + load_bar_data(存取兼容性)
4. 构造 panel dfdatetime, vt_symbol, OHLCV
5. AlphaDataset + add_feature(ma5) + prepare_dataspawn 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()