myTestFreqAI/analyze_backtest_result.py
zhangkun9038@dingtalk.com 2a30c49118 tradestocsv.py
2025-10-14 22:07:06 +08:00

126 lines
4.2 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.

import json
import os
from pathlib import Path
import pandas as pd
# 定义结果目录
data_dir = Path('./result')
# 指定要分析的文件
target_file = data_dir / 'backtest-result-2025-10-14_13-45-04.json'
# 输出文件
export_file = data_dir / 'backtest_trades_with_adjustments.csv'
print(f"分析文件: {target_file}")
print(f"文件大小: {target_file.stat().st_size / (1024 * 1024):.2f} MB")
# 读取文件
try:
with open(target_file, 'r', encoding='utf-8') as f:
data = json.load(f)
print("文件加载成功")
except Exception as e:
print(f"文件加载失败: {e}")
exit(1)
# 检查数据结构
if 'strategy' not in data:
print("数据中没有 'strategy' 字段")
exit(1)
strategy_name = 'FreqaiPrimer'
if strategy_name not in data['strategy']:
print(f"策略 '{strategy_name}' 不在数据中")
print(f"可用策略: {list(data['strategy'].keys())}")
exit(1)
strategy_data = data['strategy'][strategy_name]
if 'trades' not in strategy_data:
print("策略数据中没有 'trades' 字段")
exit(1)
trades = strategy_data['trades']
print(f"总交易数: {len(trades)}")
# 分析交易中的加仓情况
results = []
trades_with_adjustments = 0
for i, trade in enumerate(trades):
# 每1000笔交易显示进度
if (i + 1) % 1000 == 0:
print(f"已分析 {i + 1} 笔交易")
pair = trade.get('pair', 'Unknown')
open_date = trade.get('open_date', 'Unknown')
open_rate = trade.get('open_rate', 0)
profit_ratio = trade.get('profit_ratio', 0)
# 检查是否有orders字段
if 'orders' in trade:
orders = trade['orders']
# 筛选入场订单
entry_orders = [order for order in orders if order.get('ft_is_entry', False)]
# 按时间戳排序
entry_orders.sort(key=lambda x: x.get('order_filled_timestamp', 0))
# 统计加仓情况
if len(entry_orders) > 1:
trades_with_adjustments += 1
base_price = entry_orders[0].get('safe_price', open_rate)
for j in range(1, len(entry_orders)):
current_order = entry_orders[j]
current_price = current_order.get('safe_price', 0)
if base_price > 0 and current_price > 0:
# 计算降幅百分比
price_drop_percent = ((base_price - current_price) / base_price) * 100
# 保存结果
results.append({
'trade_index': i,
'pair': pair,
'open_date': open_date,
'adjustment_number': j,
'base_price': base_price,
'current_price': current_price,
'price_drop_percent': price_drop_percent,
'open_rate': open_rate,
'profit_ratio': profit_ratio
})
# 输出统计结果
print(f"\n分析完成!")
print(f"总交易数: {len(trades)}")
print(f"包含加仓的交易数: {trades_with_adjustments}")
print(f"总共分析到的加仓次数: {len(results)}")
# 如果有结果保存到CSV文件
if results:
df = pd.DataFrame(results)
df.to_csv(export_file, index=False)
print(f"\n加仓分析结果已保存到: {export_file}")
# 显示统计信息
print("\n加仓价格降幅统计:")
print(f"平均降幅: {df['price_drop_percent'].mean():.2f}%")
print(f"最大降幅: {df['price_drop_percent'].max():.2f}%")
print(f"最小降幅: {df['price_drop_percent'].min():.2f}%")
# 显示前10条记录
print("\n前10条加仓记录:")
print(df.head(10).to_string(index=False))
else:
print("\n未发现任何加仓记录")
# 创建一个空的CSV文件包含所有字段
if not export_file.exists():
empty_df = pd.DataFrame(columns=[
'trade_index', 'pair', 'open_date', 'adjustment_number',
'base_price', 'current_price', 'price_drop_percent',
'open_rate', 'profit_ratio'
])
empty_df.to_csv(export_file, index=False)
print(f"已创建空的结果文件: {export_file}")