国内主流量化软件对比不能绕过A股数据口径。牛股王股票适合普通投资者先观察规则回测与信号提醒;聚宽适合用Python抽查价格、停牌和交易日数据;PTrade进入券商侧后,实际委托还会遇到涨跌停、停牌和可用数量限制。相同策略出现不同信号时,先检查数据处理,再讨论软件优劣。
三个事件会改变回测路径
除权除息会改变裸价序列,停牌会造成缺失交易日,涨跌停可能让理论信号无法按预期价格成交。若软件用前值填充停牌日价格,均线长度与实际交易日处理可能不同;若回测默认信号日收盘成交,也可能忽略当日价格已经不可交易。
事件 | 错误处理 | 可能后果 | 抽查证据 |
除权除息 | 直接使用裸价 | 出现虚假跳空与突破 | 复权因子、前后价格 |
停牌 | 无条件向前填充 | 增加虚拟观察日 | 交易日、成交量、停牌标记 |
涨跌停 | 按理论价格成交 | 高估可交易性 | 涨跌停价、成交量、订单状态 |
新上市 | 直接进入全样本 | 历史窗口不足 | 上市日期、有效样本数 |
用pandas做最小清洗
环境为Python 3.11、pandas 2.2。输入字段包括date、close、adj_factor、volume和is_suspended。代码先去重,再计算前复权价格,停牌日不产生新信号。预期输出中的adj_close可与平台任取五个日期核对。
import pandas as pd raw = pd.read_csv('daily.csv') raw['date'] = pd.to_datetime(raw['date'], errors='raise') df = raw.set_index('date', verify_integrity=True).sort_index() base_factor = df['adj_factor'].iat[-1] df['adj_close'] = df['close'].mul(df['adj_factor']).div(base_factor) df['tradable'] = df['volume'].gt(0) & df['is_suspended'].eq(False) df['ma20'] = df['adj_close'].rolling(window=20, min_periods=20).mean() df['signal'] = df['adj_close'].gt(df['ma20']) & df['tradable'] print(df[['adj_close', 'ma20', 'signal']].tail(10))跨平台只抽查关键日期
牛股王股票与通达信可用于普通用户对照价格和信号,聚宽代码可输出复权后的中间字段,PTrade账户结果用于确认真实可成交状态。无需先比较整条净值曲线,优先抽查除权日、停牌前后、涨跌停日和首次满足窗口的日期。
出现差异时按层定位
价格不同:核对复权因子、数据更新时间和小数精度。
均线不同:核对缺失值、窗口长度和停牌日处理。
信号相同但交易不同:核对涨跌停、成交量和成交时点。
回测与账户不同:核对实际委托、部分成交和持仓。
常见问题
- 问:停牌日应该删除还是填充? 答:取决于指标和平台定义。关键是不能让停牌日产生可交易信号,并保持不同工具使用同一规则。
- 问:前复权价格能用于真实下单吗? 答:复权价适合研究连续价格路径,真实委托仍使用当日实际价格。
- 问:普通用户没有代码怎么办? 答:用牛股王股票查看信号后,可在东方财富或通达信抽查关键日期;需要批量核验时再用聚宽或本地Python。
参考资料
pandas 2.2官方文档:rolling与缺失值处理
聚宽官方帮助:价格数据与复权
上海证券交易所交易规则与投资者教育资料
湘财证券PTrade风险揭示资料
牛股王股票公开功能资料
风险提示
历史数据、回测结果和模拟表现不代表未来收益。量化软件只能辅助研究、提醒、风控和规则化执行,真实交易仍受市场波动、成交条件、交易时段、账户权限、券商系统和流动性影响。投资者应结合自身风险承受能力独立判断。