计算逻辑验证报告

源文件:D:\Hermes\评估中心\reports\backtest\计算逻辑验证报告.md · 日期 2026-09-18 · 4KB

计算逻辑验证报告

验证时间: 2026-09-18
状态: ⚠️ 发现问题,需修正


任务1:收益计算逻辑验证

1.1 计算方式确认

脚本逻辑(run_scheme_b_day.py L131-155):

for s in top20:
    ret = (exit_price / entry_price - 1) * 100
    rets_1d.append(ret)

avg_ret_1d = np.mean(rets_1d)  # 等权重平均

结论:
- ✅ 计算的是等权重组合收益(非单票平均)
- ✅ 每日独立持仓,T+1卖出后资金回收
- ✅ 次日再买入新的TOP20

1.2 交易成本问题 🔴

发现的问题:

项目 配置值 说明
单边成本 0.432% 含佣金+滑点
双向成本 0.864% 买入+卖出
命中判断 ret > 0.432% 已扣成本 ✅
平均收益 未扣成本 ❌ 问题!

修正后的净收益:

指标 原报告值 修正值 差异
毛收益平均 +2.12% +2.12% —
交易成本 — -0.86% —
净收益平均 +2.12% +1.26% -0.86pp

1.3 涨停板买入问题 ⚠️

回测假设:
- 信号日收盘价可正常买入
- 无涨跌停限制

实际情况:
- 涨停板无法以收盘价买入
- 若Top20中有涨停股,实际无法建仓

影响评估:
- 可能高估收益(乐观假设)
- 需后续验证涨停股比例


任务2:回撤计算方式验证

2.1 计算方法确认

脚本逻辑(run_scheme_b_batch.py L113-118):

daily_rets = [r['avg_ret_1d'] for r in all_results if r['avg_ret_1d'] != 0]
cum_rets = np.cumprod([1 + r/100 for r in daily_rets])
peak = np.maximum.accumulate(cum_rets)
drawdown = (cum_rets - peak) / peak * 100
max_dd = np.min(drawdown)

验证结果:✅ 一致

2.2 回撤定义

2.3 持仓模拟假设

假设 说明
每日等权重买入TOP20 ✅
T+1卖出,资金回收 ✅
次日再买入新的TOP20 ✅
资金充足,可全额持仓 ⚠️ 未验证
无流动性限制 ⚠️ 未验证
无涨跌停限制 ⚠️ 未验证

局限性:
- 本金<5万,实际可能半仓操作
- 小盘股流动性可能不足
- 涨停板无法买入/卖出


任务3:随机基准确认

3.1 理论随机基准

假设:股票收益服从正态分布,均值0,标准差5%

随机选20只的期望:
- 平均收益:0%
- 命中率:50%

3.2 蒙特卡洛模拟

方法:1000次随机采样

结果:
- 随机命中率:~50%
- 方案B命中率:48.1%
- 差异:-1.9pp(不显著)

3.3 显著性检验

指标 数值
Z-score < 1.96
显著性 ❌ p>0.05,不显著

结论:
- 方案B的48.1%与随机基准无显著差异
- 需要更多样本或更强因子才能证明有效性


综合评估

原报告问题

问题 严重性 修正
收益未扣交易成本 🔴 高 净收益+1.26%(原+2.12%)
未考虑涨停板限制 ⚠️ 中 可能高估收益
未验证资金限制 ⚠️ 中 本金<5万可能半仓
随机基准不显著 🔴 高 48.1% vs 50%,差异不显著

修正后的结论

方案B(真实A1)验证结果:

T+1命中率: 48.1%
  - 原报告: 显著优于方案A(43.1%)
  - 修正: 与随机基准(50%)无显著差异

平均收益(扣除成本后): +1.26%
  - 原报告: +2.12%(未扣成本)
  - 修正: +1.26%(扣双向成本0.86%)

最大回撤: -0.47%
  - 计算正确,但需考虑实际持仓限制

结论: 
  ⚠️ 策略有效性存疑
  - T+1命中率与随机无显著差异
  - 需扩大样本至3个月验证
  - 需考虑实际交易限制(涨停板、流动性)

下一步:
- P0: 扩样本至3个月(60+天)
- P1: 加入涨停板过滤逻辑
- P2: 验证资金规模限制影响
- P3: 与沪深300、手工池对比


报告生成时间: 2026-09-18