소스 검색

Fix catfly email report calculation accuracy

1. cyb50_30min_dual_direction.py:
   - 强制平仓后同步更新 results_df 的 net_value 和 capital
   - 确保最终资金统计准确

2. auto_report_long_only_t1.py:
   - 使用盈亏总和计算最终资金,而不是最后一笔交易的平仓资金
   - 避免交易顺序导致的资金计算偏差

3. t1_converter.py:
   - 修复非T0交易的手续费重复扣除问题
   - 直接使用原始交易的盈亏金额(已含手续费)

验证结果:
- 多空版本: 最终资金 1,331,177.68元 (+33.12%)
- T+1版本: 最终资金 1,223,864.14元 (+22.39%)
- 交叉验证通过,计算逻辑一致
openclaw 2 달 전
부모
커밋
a86688a826
3개의 변경된 파일15개의 추가작업 그리고 10개의 파일을 삭제
  1. 3 2
      cat-fly/auto_report_long_only_t1.py
  2. 8 0
      cat-fly/cyb50_30min_dual_direction.py
  3. 4 8
      cat-fly/t1_converter.py

+ 3 - 2
cat-fly/auto_report_long_only_t1.py

@@ -128,8 +128,9 @@ def generate_report(trades_df, initial_capital=1000000):
         text = f"近2个月无交易信号\n初始资金: {initial_capital:,.0f}元\n最终资金: {final_capital:,.0f}元"
         return html, text, final_capital
     
-    # 计算统计数据
-    final_capital = trades_df['平仓时资金'].iloc[-1]
+    # 计算统计数据 - 使用实际盈亏总和计算最终资金(更准确)
+    total_pnl = trades_df['盈亏金额'].sum()
+    final_capital = initial_capital + total_pnl
     total_return = (final_capital - initial_capital) / initial_capital * 100
     total_trades = len(trades_df)
     

+ 8 - 0
cat-fly/cyb50_30min_dual_direction.py

@@ -1109,6 +1109,10 @@ class DualDirectionExecutor:
             print(f"退出原因: 做多强制平仓(回测结束)")
             print(f"盈亏金额: {pnl:+,.2f} 元")
             print(f"{'='*60}")
+            
+            # 更新最终资金到results_df
+            df.iloc[-1, df.columns.get_loc('capital')] = capital
+            df.iloc[-1, df.columns.get_loc('net_value')] = capital
         
         # 做空持仓强制平仓
         if short_position < 0:
@@ -1150,6 +1154,10 @@ class DualDirectionExecutor:
             print(f"退出原因: 做空强制平仓(回测结束)")
             print(f"盈亏金额: {net_pnl:+,.2f} 元")
             print(f"{'='*60}")
+            
+            # 更新最终资金到results_df
+            df.iloc[-1, df.columns.get_loc('capital')] = capital
+            df.iloc[-1, df.columns.get_loc('net_value')] = capital
         
         trades_df = pd.DataFrame(trades)
         

+ 4 - 8
cat-fly/t1_converter.py

@@ -165,16 +165,12 @@ def simulate_t1_trades(data_df, long_trades_df, initial_capital=1000000):
                 t1_trades.append(trade_record)
                 continue
         
-        # 非T0交易,保持原样
+        # 非T0交易,使用原始盈亏(已包含手续费,无需重复计算)
         hold_hours = trade['持仓小时数']
         
-        # 计算盈亏(使用原始数据)
-        commission_rate = 0.0001
-        gross_pnl = (original_exit_price - entry_price) * position_size
-        open_cost = position_size * entry_price * commission_rate
-        close_cost = position_size * original_exit_price * commission_rate
-        pnl = gross_pnl - open_cost - close_cost
-        pnl_pct = (original_exit_price - entry_price) / entry_price * 100
+        # 直接使用原始盈亏(原始交易已计算好手续费)
+        pnl = trade['盈亏金额']
+        pnl_pct = trade['盈亏百分比']
         
         capital += pnl