verify_fixes.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import pandas as pd
  2. df = pd.read_csv('cyb50_optimized_trades_2017-06-01_2026-01-19.csv')
  3. df['买入日期'] = pd.to_datetime(df['买入日期'])
  4. df['卖出日期'] = pd.to_datetime(df['卖出日期'])
  5. print("Bug修复后验证报告")
  6. print("=" * 80)
  7. # 1. 持仓天数验证
  8. print("\n【1. 持仓天数验证】")
  9. df['计算天数'] = (df['卖出日期'] - df['买入日期']).dt.days + 1
  10. df['天数差异'] = df['计算天数'] - df['持仓天数']
  11. day_errors = df[df['天数差异'] != 0]
  12. print(f"总交易数: {len(df)}")
  13. print(f"天数不准确的交易: {len(day_errors)}")
  14. if len(day_errors) > 0:
  15. print(f"前5个不准确的交易:")
  16. for i, row in day_errors.head(5).iterrows():
  17. print(f" 交易#{int(row['交易编号'])}: 记录{int(row['持仓天数'])}天 vs 实际{int(row['计算天数'])}天 (差异: {int(row['天数差异'])}天)")
  18. else:
  19. print("✅ 所有持仓天数记录准确!")
  20. # 2. 开仓市值验证
  21. print(f"\n【2. 开仓市值验证】")
  22. df['计算市值'] = df['持仓数量'] * df['买入价格']
  23. df['市值差异'] = df['开仓市值'] - df['计算市值']
  24. position_errors = df[abs(df['市值差异']) > 1] # 允许1元误差
  25. print(f"市值不准确的交易: {len(position_errors)}")
  26. if len(position_errors) > 0:
  27. print(f"市值差异统计:")
  28. print(f" 平均差异: {df['市值差异'].mean():.6f}元")
  29. print(f" 最大差异: {df['市值差异'].max():.6f}元")
  30. print(f" 绝对值平均: {df['市值差异'].abs().mean():.6f}元")
  31. else:
  32. print("✅ 所有开仓市值计算准确!")
  33. # 3. 资金连续性验证
  34. print(f"\n【3. 资金连续性验证】")
  35. capital_issues = 0
  36. for i in range(1, len(df)):
  37. prev_final = df.iloc[i-1]['平仓时总资金']
  38. curr_initial = df.iloc[i]['开仓时总资金']
  39. if abs(prev_final - curr_initial) > 1: # 允许1元误差
  40. capital_issues += 1
  41. if capital_issues <= 3:
  42. print(f" 资金不连续 #{i}: {prev_final:,.2f} -> {curr_initial:,.2f}")
  43. if capital_issues == 0:
  44. print("✅ 资金连续性完美!")
  45. else:
  46. print(f"❌ 仍有{capital_issues}笔资金不连续")
  47. # 4. 净值一致性验证
  48. print(f"\n【4. 净值一致性验证】")
  49. total_pnl = df['盈亏金额'].sum()
  50. initial_capital = 1000000
  51. final_net_value = df.iloc[-1]['平仓时总资金']
  52. net_change = final_net_value - initial_capital
  53. print(f"交易累计盈亏: {total_pnl:,.2f}元")
  54. print(f"净值变化: {net_change:,.2f}元")
  55. print(f"差异: {abs(total_pnl - net_change):,.2f}元")
  56. if abs(total_pnl - net_change) < 1000: # 允许1000元误差
  57. print("✅ 净值与交易累计基本一致!")
  58. else:
  59. print(f"❌ 仍有较大差异")
  60. # 5. 盈亏计算准确性验证
  61. print(f"\n【5. 盈亏计算准确性验证】")
  62. pnl_errors = 0
  63. for i, row in df.iterrows():
  64. calculated_pnl = (row['卖出价格'] - row['买入价格']) * row['持仓数量']
  65. calculated_pnl -= row['平仓市值'] * 0.0004 # 扣除交易成本
  66. if abs(calculated_pnl - row['盈亏金额']) > 10: # 允许10元误差
  67. pnl_errors += 1
  68. if pnl_errors <= 3:
  69. print(f" 盈亏计算差异 #{int(row['交易编号'])}: 记录{row['盈亏金额']:.2f} vs 计算{calculated_pnl:.2f}")
  70. if pnl_errors == 0:
  71. print("✅ 所有盈亏计算准确!")
  72. else:
  73. print(f"❌ 仍有{pnl_errors}笔盈亏计算不准确")
  74. # 总体评分
  75. print(f"\n【总体评分】")
  76. score = 5
  77. if len(day_errors) > 0:
  78. score -= 1
  79. if len(position_errors) > 0:
  80. score -= 1
  81. if capital_issues > 0:
  82. score -= 1
  83. if abs(total_pnl - net_change) > 1000:
  84. score -= 1
  85. if pnl_errors > 0:
  86. score -= 1
  87. print(f"修复后评分: {score}/5")
  88. if score == 5:
  89. print("🎉 所有计算问题已修复!")
  90. else:
  91. print(f"⚠️ 仍有{5 - score}个问题需要解决")
  92. print("\n" + "=" * 80)