2025-10-05 00:09:59 +08:00
|
|
|
|
{
|
|
|
|
|
|
"cells": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
"id": "522f09ca7b3fe929",
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
"ExecuteTime": {
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"end_time": "2025-10-24T08:51:43.194699Z",
|
|
|
|
|
|
"start_time": "2025-10-24T08:51:43.179275Z"
|
2025-10-05 00:09:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
"from datetime import datetime\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"from src.data_processing import load_raw_data\n",
|
|
|
|
|
|
"%load_ext autoreload\n",
|
|
|
|
|
|
"%autoreload 2\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"import sys\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"if '/mnt/d/PyProject/NewQuant/' not in sys.path:\n",
|
|
|
|
|
|
" sys.path.append('/mnt/d/PyProject/NewQuant/')"
|
|
|
|
|
|
],
|
|
|
|
|
|
"outputs": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"name": "stdout",
|
|
|
|
|
|
"output_type": "stream",
|
|
|
|
|
|
"text": [
|
|
|
|
|
|
"The autoreload extension is already loaded. To reload it, use:\n",
|
|
|
|
|
|
" %reload_ext autoreload\n"
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"execution_count": 5
|
2025-10-05 00:09:59 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
"id": "4f7e4b438cea750e",
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
"ExecuteTime": {
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"end_time": "2025-10-24T08:51:43.218306Z",
|
|
|
|
|
|
"start_time": "2025-10-24T08:51:43.204291Z"
|
2025-10-05 00:09:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
"from turtle import down\n",
|
|
|
|
|
|
"from src.analysis.result_analyzer import ResultAnalyzer\n",
|
|
|
|
|
|
"# 导入所有必要的模块\n",
|
|
|
|
|
|
"from src.data_manager import DataManager\n",
|
|
|
|
|
|
"from src.backtest_engine import BacktestEngine\n",
|
|
|
|
|
|
"from src.indicators.indicator_list import INDICATOR_LIST\n",
|
|
|
|
|
|
"from src.indicators.indicators import *\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# 导入您自己的 SMC 策略\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"from futures_trading_strategies.FG.TrendlineBreakoutStrategy.DualModeTrendlineHawkesStrategy2 import DualModeTrendlineHawkesStrategy\n",
|
|
|
|
|
|
"# from src.strategies.TrendlineBreakoutStrategy.DualModeTrendlineHawkesStrategy import DualModeTrendlineHawkesStrategy\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"\n",
|
|
|
|
|
|
"# --- 配置参数 ---\n",
|
|
|
|
|
|
"# 获取当前脚本所在目录,假设数据文件在项目根目录下的 data 文件夹内\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"data_file_path = 'D:/PyProject/NewQuant/data/data/KQ_m@CZCE_FG/KQ_m@CZCE_FG_min15.csv'\n"
|
2025-10-05 00:09:59 +08:00
|
|
|
|
],
|
|
|
|
|
|
"outputs": [],
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"execution_count": 6
|
2025-10-05 00:09:59 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
"ExecuteTime": {
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"end_time": "2025-10-24T08:51:43.234330Z",
|
|
|
|
|
|
"start_time": "2025-10-24T08:51:43.220316Z"
|
2025-10-05 00:09:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"initial_capital = 100000.0\n",
|
|
|
|
|
|
"slippage_rate = 0.000 # 假设每笔交易0.1%的滑点\n",
|
|
|
|
|
|
"commission_rate = 0.0000 # 假设每笔交易0.02%的佣金\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"global_config = {\n",
|
|
|
|
|
|
" 'symbol': 'KQ_m@CZCE_FG', # 确保与数据文件中的 symbol 匹配\n",
|
|
|
|
|
|
"}\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# 回测时间范围\n",
|
|
|
|
|
|
"start_time = datetime(2021, 1, 1)\n",
|
|
|
|
|
|
"end_time = datetime(2024, 6, 1)\n",
|
|
|
|
|
|
"\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"start_time = datetime(2025, 1, 1)\n",
|
|
|
|
|
|
"end_time = datetime(2025, 11, 10)\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"indicators = INDICATOR_LIST\n",
|
|
|
|
|
|
"indicators = []\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# 确保 DataManager 能够重置以进行多次回测\n",
|
|
|
|
|
|
"# data_manager.reset() # 首次运行不需要重置"
|
|
|
|
|
|
],
|
|
|
|
|
|
"id": "9ee53c41eaaefabb",
|
|
|
|
|
|
"outputs": [],
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"execution_count": 7
|
2025-10-05 00:09:59 +08:00
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
"ExecuteTime": {
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"end_time": "2025-10-24T08:51:45.460848Z",
|
|
|
|
|
|
"start_time": "2025-10-24T08:51:43.238104Z"
|
2025-10-05 00:09:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
"from src.indicators.indicators import ROC_MA\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# --- 1. 初始化数据管理器 ---\n",
|
|
|
|
|
|
"print(\"初始化数据管理器...\")\n",
|
|
|
|
|
|
"data_manager = DataManager(file_path=data_file_path, symbol=global_config['symbol'], start_time=start_time,\n",
|
|
|
|
|
|
" end_time=end_time)\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"strategy_parameters = {\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
" 'main_symbol': 'FG',\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
" 'trade_volume': 1,\n",
|
|
|
|
|
|
" # 'indicators': [RateOfChange(10, -2.1, -0.5), ROC_MA(10, 10, -2.7, -0.4)],\n",
|
|
|
|
|
|
" 'enable_log': False,\n",
|
|
|
|
|
|
" 'trend_params': {\n",
|
|
|
|
|
|
" \"trendline_n\": 10,\n",
|
|
|
|
|
|
" \"hawkes_kappa\": 0.9,\n",
|
|
|
|
|
|
" },\n",
|
|
|
|
|
|
" 'reversion_params': {\n",
|
|
|
|
|
|
" \"trendline_n\": 70,\n",
|
|
|
|
|
|
" \"hawkes_kappa\": 0.1,\n",
|
|
|
|
|
|
" },\n",
|
|
|
|
|
|
" 'conflict_resolution': 'NONE'\n",
|
|
|
|
|
|
"}\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# --- 2. 初始化回测引擎并运行 ---\n",
|
|
|
|
|
|
"print(\"\\n初始化回测引擎...\")\n",
|
|
|
|
|
|
"engine = BacktestEngine(\n",
|
|
|
|
|
|
" data_manager=data_manager,\n",
|
|
|
|
|
|
" strategy_class=DualModeTrendlineHawkesStrategy, # <--- 更改为您的 SMC 策略类\n",
|
|
|
|
|
|
" # current_segment_symbol 参数已从 SMCPureH1LongStrategy 中移除,不需要设置\n",
|
|
|
|
|
|
" strategy_params=strategy_parameters,\n",
|
|
|
|
|
|
" initial_capital=initial_capital,\n",
|
|
|
|
|
|
" slippage_rate=slippage_rate,\n",
|
|
|
|
|
|
" commission_rate=commission_rate,\n",
|
|
|
|
|
|
" roll_over_mode=True,\n",
|
|
|
|
|
|
" start_time=start_time,\n",
|
|
|
|
|
|
" end_time=end_time,\n",
|
|
|
|
|
|
" indicators=indicators # 如果您的 SMC 策略不使用这些指标,也可以考虑移除\n",
|
|
|
|
|
|
")\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"print(\"\\n开始运行回测...\")\n",
|
|
|
|
|
|
"engine.run_backtest()\n",
|
|
|
|
|
|
"print(\"\\n回测运行完毕。\")\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# --- 3. 获取回测结果 ---\n",
|
|
|
|
|
|
"results = engine.get_backtest_results()\n",
|
|
|
|
|
|
"portfolio_snapshots = results[\"portfolio_snapshots\"]\n",
|
|
|
|
|
|
"trade_history = results[\"trade_history\"]\n",
|
|
|
|
|
|
"initial_capital_result = results[\"initial_capital\"]\n",
|
|
|
|
|
|
"bars = results[\"all_bars\"]\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# --- 4. 结果分析与可视化 ---\n",
|
|
|
|
|
|
"if portfolio_snapshots:\n",
|
|
|
|
|
|
" analyzer = ResultAnalyzer(portfolio_snapshots, trade_history, bars, initial_capital_result, INDICATOR_LIST)\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" analyzer.generate_report()\n",
|
|
|
|
|
|
" analyzer.plot_performance()\n",
|
|
|
|
|
|
" metrics = analyzer.calculate_all_metrics()\n",
|
|
|
|
|
|
" print(metrics)\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" analyzer.analyze_indicators()\n",
|
|
|
|
|
|
"else:\n",
|
|
|
|
|
|
" print(\"\\n没有生成投资组合快照,无法进行结果分析。\")"
|
|
|
|
|
|
],
|
|
|
|
|
|
"id": "f903fd2761d446cd",
|
|
|
|
|
|
"outputs": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"name": "stdout",
|
|
|
|
|
|
"output_type": "stream",
|
|
|
|
|
|
"text": [
|
|
|
|
|
|
"初始化数据管理器...\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"数据加载成功: D:/PyProject/NewQuant/data/data/KQ_m@CZCE_FG/KQ_m@CZCE_FG_min15.csv\n",
|
|
|
|
|
|
"数据范围从 2020-12-31 14:45:00 到 2025-10-24 14:30:00\n",
|
|
|
|
|
|
"总计 26508 条记录。\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"\n",
|
|
|
|
|
|
"初始化回测引擎...\n",
|
|
|
|
|
|
"模拟器初始化:初始资金=100000.00, 滑点率=0.0, 佣金率=0.0\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"内存仓储已初始化,管理ID: 'futures_trading_strategies.FG.TrendlineBreakoutStrategy.DualModeTrendlineHawkesStrategy2.DualModeTrendlineHawkesStrategy_ec6cb042fb4d776e22af01d6641dc528'\n",
|
|
|
|
|
|
"DualModeTrendlineHawkesStrategy initialized.\n",
|
|
|
|
|
|
"Enabled modes: ['TREND', 'REVERSION']\n",
|
|
|
|
|
|
"Conflict resolution: NONE\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"\n",
|
|
|
|
|
|
"--- 回测引擎初始化完成 ---\n",
|
|
|
|
|
|
" 策略: DualModeTrendlineHawkesStrategy\n",
|
|
|
|
|
|
" 初始资金: 100000.00\n",
|
|
|
|
|
|
" 换月模式: 启用\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"开始运行回测...\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"--- 回测开始 ---\n",
|
|
|
|
|
|
"DualModeTrendlineHawkesStrategy 策略初始化回调被调用。\n",
|
|
|
|
|
|
"开始将 DataFrame 转换为 Bar 对象流...\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"Initializing Hawkes state with lookback 50...\n",
|
|
|
|
|
|
"Initializing Hawkes state with lookback 50...\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"Bar 对象流生成完毕。\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"--- 回测结束,检查并平仓所有剩余持仓 ---\n",
|
|
|
|
|
|
"--- 回测结束 ---\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"总计处理了 4436 根K线。\n",
|
|
|
|
|
|
"总计发生了 108 笔交易。\n",
|
|
|
|
|
|
"最终总净值: 99987.00\n",
|
|
|
|
|
|
"总收益率: -0.01%\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"\n",
|
|
|
|
|
|
"回测运行完毕。\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"--- 结果分析器初始化完成 ---\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"--- 交易明细 ---\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
" 2025-01-08 10:30:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1301.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-01-08 22:45:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1299.00 | Comm: 0.00 | PnL: -2.00\n",
|
|
|
|
|
|
" 2025-01-10 21:30:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1324.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-01-13 10:30:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1346.00 | Comm: 0.00 | PnL: 22.00\n",
|
|
|
|
|
|
" 2025-01-20 09:15:00 | SELL | CZCE.FG505 | Vol: 1 | Price: 1430.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-01-20 11:00:00 | CLOSE_SHORT | CZCE.FG505 | Vol: 1 | Price: 1415.00 | Comm: 0.00 | PnL: 15.00\n",
|
|
|
|
|
|
" 2025-01-23 21:15:00 | SELL | CZCE.FG505 | Vol: 1 | Price: 1384.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-01-23 22:15:00 | CLOSE_SHORT | CZCE.FG505 | Vol: 1 | Price: 1384.00 | Comm: 0.00 | PnL: 0.00\n",
|
|
|
|
|
|
" 2025-02-05 10:00:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1337.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-02-05 22:15:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1339.00 | Comm: 0.00 | PnL: 2.00\n",
|
|
|
|
|
|
" 2025-02-13 11:15:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1298.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-02-14 14:45:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1266.00 | Comm: 0.00 | PnL: -32.00\n",
|
|
|
|
|
|
" 2025-02-19 21:15:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1288.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-02-19 22:15:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1287.00 | Comm: 0.00 | PnL: -1.00\n",
|
|
|
|
|
|
" 2025-02-21 14:00:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1269.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-02-21 22:45:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1264.00 | Comm: 0.00 | PnL: -5.00\n",
|
|
|
|
|
|
" 2025-02-24 09:15:00 | SELL | CZCE.FG505 | Vol: 1 | Price: 1259.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-02-24 10:30:00 | CLOSE_SHORT | CZCE.FG505 | Vol: 1 | Price: 1270.00 | Comm: 0.00 | PnL: -11.00\n",
|
|
|
|
|
|
" 2025-03-03 09:15:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1228.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-03-03 14:15:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1225.00 | Comm: 0.00 | PnL: -3.00\n",
|
|
|
|
|
|
" 2025-03-05 09:30:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1206.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-03-05 22:00:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1195.00 | Comm: 0.00 | PnL: -11.00\n",
|
|
|
|
|
|
" 2025-03-11 21:15:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1168.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-03-11 22:00:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1158.00 | Comm: 0.00 | PnL: -10.00\n",
|
|
|
|
|
|
" 2025-03-17 09:15:00 | SELL | CZCE.FG505 | Vol: 1 | Price: 1185.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-03-17 14:45:00 | CLOSE_SHORT | CZCE.FG505 | Vol: 1 | Price: 1171.00 | Comm: 0.00 | PnL: 14.00\n",
|
|
|
|
|
|
" 2025-03-24 09:45:00 | SELL | CZCE.FG505 | Vol: 1 | Price: 1217.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-03-25 10:30:00 | CLOSE_SHORT | CZCE.FG505 | Vol: 1 | Price: 1231.00 | Comm: 0.00 | PnL: -14.00\n",
|
|
|
|
|
|
" 2025-03-25 21:00:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1261.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-03-25 22:00:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1254.00 | Comm: 0.00 | PnL: -7.00\n",
|
|
|
|
|
|
" 2025-03-28 22:45:00 | BUY | CZCE.FG505 | Vol: 1 | Price: 1180.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-03-31 10:30:00 | CLOSE_LONG | CZCE.FG505 | Vol: 1 | Price: 1179.00 | Comm: 0.00 | PnL: -1.00\n",
|
|
|
|
|
|
" 2025-03-31 22:00:00 | SELL | CZCE.FG505 | Vol: 1 | Price: 1214.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-04-01 22:00:00 | CLOSE_SHORT | CZCE.FG505 | Vol: 1 | Price: 1233.00 | Comm: 0.00 | PnL: -19.00\n",
|
|
|
|
|
|
" 2025-04-08 21:30:00 | SELL | CZCE.FG505 | Vol: 1 | Price: 1178.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-04-08 22:45:00 | CLOSE_SHORT | CZCE.FG505 | Vol: 1 | Price: 1172.00 | Comm: 0.00 | PnL: 6.00\n",
|
|
|
|
|
|
" 2025-04-17 21:15:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 1158.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-04-18 10:30:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 1139.00 | Comm: 0.00 | PnL: 19.00\n",
|
|
|
|
|
|
" 2025-04-23 09:15:00 | BUY | CZCE.FG509 | Vol: 1 | Price: 1156.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-04-23 10:00:00 | CLOSE_LONG | CZCE.FG509 | Vol: 1 | Price: 1148.00 | Comm: 0.00 | PnL: -8.00\n",
|
|
|
|
|
|
" 2025-05-06 09:15:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 1074.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-05-06 11:00:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 1075.00 | Comm: 0.00 | PnL: -1.00\n",
|
|
|
|
|
|
" 2025-05-07 21:15:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 1062.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-05-08 09:30:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 1051.00 | Comm: 0.00 | PnL: 11.00\n",
|
|
|
|
|
|
" 2025-05-13 21:45:00 | BUY | CZCE.FG509 | Vol: 1 | Price: 1032.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-05-14 09:30:00 | CLOSE_LONG | CZCE.FG509 | Vol: 1 | Price: 1037.00 | Comm: 0.00 | PnL: 5.00\n",
|
|
|
|
|
|
" 2025-05-22 22:00:00 | BUY | CZCE.FG509 | Vol: 1 | Price: 1001.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-05-23 10:45:00 | CLOSE_LONG | CZCE.FG509 | Vol: 1 | Price: 1005.00 | Comm: 0.00 | PnL: 4.00\n",
|
|
|
|
|
|
" 2025-05-23 21:00:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 1001.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-05-26 09:45:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 1015.00 | Comm: 0.00 | PnL: -14.00\n",
|
|
|
|
|
|
" 2025-06-03 21:30:00 | BUY | CZCE.FG509 | Vol: 1 | Price: 964.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-06-03 22:45:00 | CLOSE_LONG | CZCE.FG509 | Vol: 1 | Price: 963.00 | Comm: 0.00 | PnL: -1.00\n",
|
|
|
|
|
|
" 2025-06-04 14:30:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 988.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-06-05 10:45:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 963.00 | Comm: 0.00 | PnL: 25.00\n",
|
|
|
|
|
|
" 2025-06-13 09:15:00 | BUY | CZCE.FG509 | Vol: 1 | Price: 978.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-06-13 14:00:00 | CLOSE_LONG | CZCE.FG509 | Vol: 1 | Price: 981.00 | Comm: 0.00 | PnL: 3.00\n",
|
|
|
|
|
|
" 2025-06-16 09:15:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 974.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-06-16 09:45:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 976.00 | Comm: 0.00 | PnL: -2.00\n",
|
|
|
|
|
|
" 2025-06-24 09:15:00 | BUY | CZCE.FG509 | Vol: 1 | Price: 1011.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-06-24 10:30:00 | CLOSE_LONG | CZCE.FG509 | Vol: 1 | Price: 1011.00 | Comm: 0.00 | PnL: 0.00\n",
|
|
|
|
|
|
" 2025-06-30 21:15:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 1002.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-06-30 21:45:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 1002.00 | Comm: 0.00 | PnL: 0.00\n",
|
|
|
|
|
|
" 2025-07-02 11:15:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 1028.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-07-03 13:45:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 1043.00 | Comm: 0.00 | PnL: -15.00\n",
|
|
|
|
|
|
" 2025-07-08 13:45:00 | BUY | CZCE.FG509 | Vol: 1 | Price: 1032.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-07-08 14:45:00 | CLOSE_LONG | CZCE.FG509 | Vol: 1 | Price: 1024.00 | Comm: 0.00 | PnL: -8.00\n",
|
|
|
|
|
|
" 2025-07-09 21:15:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 1037.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-07-11 21:30:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 1088.00 | Comm: 0.00 | PnL: -51.00\n",
|
|
|
|
|
|
" 2025-07-18 10:45:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 1091.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-07-18 13:45:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 1088.00 | Comm: 0.00 | PnL: 3.00\n",
|
|
|
|
|
|
" 2025-07-18 21:15:00 | BUY | CZCE.FG509 | Vol: 1 | Price: 1115.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-07-21 10:45:00 | CLOSE_LONG | CZCE.FG509 | Vol: 1 | Price: 1163.00 | Comm: 0.00 | PnL: 48.00\n",
|
|
|
|
|
|
" 2025-07-22 13:45:00 | BUY | CZCE.FG509 | Vol: 1 | Price: 1219.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-07-22 22:15:00 | CLOSE_LONG | CZCE.FG509 | Vol: 1 | Price: 1233.00 | Comm: 0.00 | PnL: 14.00\n",
|
|
|
|
|
|
" 2025-07-25 21:15:00 | SELL | CZCE.FG509 | Vol: 1 | Price: 1331.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-07-28 09:45:00 | CLOSE_SHORT | CZCE.FG509 | Vol: 1 | Price: 1254.00 | Comm: 0.00 | PnL: 77.00\n",
|
|
|
|
|
|
" 2025-08-12 10:30:00 | BUY | CZCE.FG509 | Vol: 1 | Price: 1075.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-08-12 14:45:00 | CLOSE_LONG | CZCE.FG509 | Vol: 1 | Price: 1075.00 | Comm: 0.00 | PnL: 0.00\n",
|
|
|
|
|
|
" 2025-08-14 21:15:00 | BUY | CZCE.FG601 | Vol: 1 | Price: 1234.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-08-15 09:00:00 | CLOSE_LONG | CZCE.FG601 | Vol: 1 | Price: 1215.00 | Comm: 0.00 | PnL: -19.00\n",
|
|
|
|
|
|
" 2025-08-18 21:15:00 | BUY | CZCE.FG601 | Vol: 1 | Price: 1228.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-08-18 22:00:00 | CLOSE_LONG | CZCE.FG601 | Vol: 1 | Price: 1225.00 | Comm: 0.00 | PnL: -3.00\n",
|
|
|
|
|
|
" 2025-08-19 22:00:00 | BUY | CZCE.FG601 | Vol: 1 | Price: 1160.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-08-20 13:45:00 | CLOSE_LONG | CZCE.FG601 | Vol: 1 | Price: 1160.00 | Comm: 0.00 | PnL: 0.00\n",
|
|
|
|
|
|
" 2025-08-27 21:15:00 | SELL | CZCE.FG601 | Vol: 1 | Price: 1161.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-08-28 09:30:00 | CLOSE_SHORT | CZCE.FG601 | Vol: 1 | Price: 1158.00 | Comm: 0.00 | PnL: 3.00\n",
|
|
|
|
|
|
" 2025-09-03 21:15:00 | SELL | CZCE.FG601 | Vol: 1 | Price: 1123.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-09-03 22:15:00 | CLOSE_SHORT | CZCE.FG601 | Vol: 1 | Price: 1132.00 | Comm: 0.00 | PnL: -9.00\n",
|
|
|
|
|
|
" 2025-09-04 21:15:00 | BUY | CZCE.FG601 | Vol: 1 | Price: 1147.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-09-04 22:15:00 | CLOSE_LONG | CZCE.FG601 | Vol: 1 | Price: 1140.00 | Comm: 0.00 | PnL: -7.00\n",
|
|
|
|
|
|
" 2025-09-09 21:15:00 | SELL | CZCE.FG601 | Vol: 1 | Price: 1172.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-09-09 22:30:00 | CLOSE_SHORT | CZCE.FG601 | Vol: 1 | Price: 1171.00 | Comm: 0.00 | PnL: 1.00\n",
|
|
|
|
|
|
" 2025-09-18 09:15:00 | SELL | CZCE.FG601 | Vol: 1 | Price: 1218.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-09-18 10:30:00 | CLOSE_SHORT | CZCE.FG601 | Vol: 1 | Price: 1225.00 | Comm: 0.00 | PnL: -7.00\n",
|
|
|
|
|
|
" 2025-09-18 13:30:00 | SELL | CZCE.FG601 | Vol: 1 | Price: 1208.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-09-18 21:45:00 | CLOSE_SHORT | CZCE.FG601 | Vol: 1 | Price: 1206.00 | Comm: 0.00 | PnL: 2.00\n",
|
|
|
|
|
|
" 2025-09-19 21:15:00 | BUY | CZCE.FG601 | Vol: 1 | Price: 1224.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-09-19 22:00:00 | CLOSE_LONG | CZCE.FG601 | Vol: 1 | Price: 1223.00 | Comm: 0.00 | PnL: -1.00\n",
|
|
|
|
|
|
" 2025-09-24 09:15:00 | BUY | CZCE.FG601 | Vol: 1 | Price: 1202.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-09-24 10:00:00 | CLOSE_LONG | CZCE.FG601 | Vol: 1 | Price: 1196.00 | Comm: 0.00 | PnL: -6.00\n",
|
|
|
|
|
|
" 2025-10-10 21:15:00 | SELL | CZCE.FG601 | Vol: 1 | Price: 1186.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-10-10 22:00:00 | CLOSE_SHORT | CZCE.FG601 | Vol: 1 | Price: 1184.00 | Comm: 0.00 | PnL: 2.00\n",
|
|
|
|
|
|
" 2025-10-16 21:15:00 | SELL | CZCE.FG601 | Vol: 1 | Price: 1130.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-10-16 22:15:00 | CLOSE_SHORT | CZCE.FG601 | Vol: 1 | Price: 1130.00 | Comm: 0.00 | PnL: 0.00\n",
|
|
|
|
|
|
" 2025-10-17 21:15:00 | BUY | CZCE.FG601 | Vol: 1 | Price: 1124.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-10-17 22:30:00 | CLOSE_LONG | CZCE.FG601 | Vol: 1 | Price: 1112.00 | Comm: 0.00 | PnL: -12.00\n",
|
|
|
|
|
|
" 2025-10-24 11:15:00 | BUY | CZCE.FG601 | Vol: 1 | Price: 1104.00 | Comm: 0.00\n",
|
|
|
|
|
|
" 2025-10-24 14:30:00 | CLOSE_LONG | CZCE.FG601 | Vol: 1 | Price: 1095.00 | Comm: 0.00 | PnL: -9.00\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"正在计算绩效指标...\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"total_return: -0.00012000000000000899, annualized_return:-0.00010250937113220893, 252 / total_days:0.8542372881355932\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"绩效指标计算完成。\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"--- 回测绩效报告 ---\n",
|
|
|
|
|
|
"初始资金 : 100000.00\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"最终资金 : 99988.00\n",
|
|
|
|
|
|
"总收益率 : -0.01%\n",
|
|
|
|
|
|
"年化收益率 : -0.01%\n",
|
|
|
|
|
|
"最大回撤 : 0.15%\n",
|
|
|
|
|
|
"夏普比率 : -0.03\n",
|
|
|
|
|
|
"卡玛比率 : -0.07\n",
|
|
|
|
|
|
"总交易次数 : 108\n",
|
|
|
|
|
|
"总实现盈亏 : -13.00\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"交易成本 : 0.00\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"--- 交易详情 ---\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"盈利交易次数 : 19\n",
|
|
|
|
|
|
"亏损交易次数 : 29\n",
|
|
|
|
|
|
"胜率 : 39.58%\n",
|
|
|
|
|
|
"盈亏比 : 1.46\n",
|
|
|
|
|
|
"平均每次盈利 : 14.53\n",
|
|
|
|
|
|
"平均每次亏损 : -9.97\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"正在绘制绩效图表...\n"
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"data": {
|
|
|
|
|
|
"text/plain": [
|
|
|
|
|
|
"<Figure size 1400x1000 with 2 Axes>"
|
|
|
|
|
|
],
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"image/png": "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lVVWabe9gS6n+pkrKytzqmhT1/le6e77053tz7fffut8xnT9o+tV/fyZ12/ofZ988knnd+31qn/r+67OPfdc52/9XJ9yyinOY2irAH1vDK1GPvbYY535rp9rfQ/1der0pquC1XWW/r9Oi34u9fVqRbFW5xu6LOhnQul7qtOg0+JeD5900knO++del+j16ei80t6+rfUkBgAgHVocAADgIxPguE+F10BFd0DfffddpzJNd3b19FPdEdYBvV599VUnrEk95Vt3ODUk1FBO76+PqTuT2mtQn0erEXXHU390oCrt66k7o2rvvfd2/kd75iqtWNR+fLrDqwGGVtjOmDHDqfzSHWTd8dSd58768ccf5U9/+pMTbujz6w6vBoE6jVpxpNV4ekpuJmkIo4Gwzs9evXo5QZb2Pf3b3/4mX375ZUaeU4PMdO+DhgvXX3+9U2G4dOlSJ7xxM0GG7vC3d8qwBhqvvfaa85r0PdNBi2bOnOmEHfqjgVDqwHX6/uopznq7hhda+ajLnQZaevqzBr5m0Dedbxo66u1aGanzrbKy0pl+/b9M0DBOX4cGr7rMuCu99fXo8qLLuQYmGkLqAQ+9XgPU2bNnO1XqGvDotOsAdi+++KIzj3T51nBSD2Docp4a8On9tfWISh3MTMNfDXk32GCDps+tHlzQgxkaBmmYpcu2zj8N9VPf085+xnUa9VRpnUZ9rwwNWvVUdaX/ZwahUvpZnTNnjnPgQeefu3XEAQcc4ARyJrzVClcNoTXUu+CCC9p9T7Qi1ITD7Z0Wr9PrnubuSLd+04MQGozrAQgzGJ87ZNR1lS6/GkIbGsZrH1g9AKDrMO3Pqu+V9kXV59ADKB1pp/H00087z9HWYIU64JS2G9CzCfSzrtO9xx57OJ+rxx57zLN54+X709Xtj65rdGAsXd50XbJw4ULnIJ+2KtHPjKky1h6vGmzqtkCXQe3TmtojXJdDXbf84Q9/cB7XHEzUwF3XTVqlusUWWzifLV0mtFWP/uhn3gStpr2EPq8+n64XTRitn2l9Pbos6OdGlx39zOv06jpDp19/lM4HPdNF32t9Tt2m6rTrukTnhR6g0rA4NfzWZUs/s3oQJ9NtfgAAIREHAACee/fdd+PrrbdefKeddmr1Pl999VV86623du732GOPNV0/efJk57qxY8fG58+f33R9RUVFfP/993du0/ukPpf+3H777U3XNzQ0OJc33nijc9v111/fYhrM/9XV1SVN1wYbbBDfbLPN4m+99VbS4910003O/bfffvt4VVVVm4+jr12v+/77752/Gxsb46NHj3auu+CCC+K1tbVN9/3kk0/iQ4cOdW579dVX252/P/74Y9NzdtbUqVOd/9NpWbBgQdP1L774YnzDDTd0bjvooINazF/3dW6pr1P96U9/cq575513mq5r7X046aSTnOsfffTRpOtramqc5WPIkCHx5cuXt/madNr1MQ444ID40qVL077ekSNHpp3u7bbbLj5jxoym63/66aem9+L1119vuv7OO+9sWi4XLVrUdP0bb7wR33jjjZ3b9HV3hJk/jz/+eLv33XPPPZ37/ve//226zrz3xx13nLNcuZf3Sy+91LntkksuabpNVVdXx0844QTntkmTJjVdv9deeznX6TJlvP/++851ujzoz5IlS5pue+6555z
|
2025-10-05 00:09:59 +08:00
|
|
|
|
},
|
|
|
|
|
|
"metadata": {},
|
|
|
|
|
|
"output_type": "display_data",
|
|
|
|
|
|
"jetTransient": {
|
|
|
|
|
|
"display_id": null
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"data": {
|
|
|
|
|
|
"text/plain": [
|
|
|
|
|
|
"<Figure size 1400x700 with 1 Axes>"
|
|
|
|
|
|
],
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"image/png": "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
|
2025-10-05 00:09:59 +08:00
|
|
|
|
},
|
|
|
|
|
|
"metadata": {},
|
|
|
|
|
|
"output_type": "display_data",
|
|
|
|
|
|
"jetTransient": {
|
|
|
|
|
|
"display_id": null
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"name": "stdout",
|
|
|
|
|
|
"output_type": "stream",
|
|
|
|
|
|
"text": [
|
|
|
|
|
|
"图表绘制完成。\n",
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"{'初始资金': 100000.0, '最终资金': np.float64(99988.0), '总收益率': np.float64(-0.00012000000000000899), '年化收益率': np.float64(-0.00010250937113220893), '最大回撤': np.float64(0.0015393226980128744), '夏普比率': np.float64(-0.02586895202679291), '卡玛比率': np.float64(-0.06659381510097863), '总交易次数': 108, '交易成本': 0.0, '总实现盈亏': -13.0, '胜率': 0.3958333333333333, '盈亏比': 1.4576579857949374, '盈利交易次数': 19, '亏损交易次数': 29, '平均每次盈利': 14.526315789473685, '平均每次亏损': -9.96551724137931, 'initial_capital': 100000.0, 'final_capital': np.float64(99988.0), 'total_return': np.float64(-0.00012000000000000899), 'annualized_return': np.float64(-0.00010250937113220893), 'max_drawdown': np.float64(0.0015393226980128744), 'sharpe_ratio': np.float64(-0.02586895202679291), 'calmar_ratio': np.float64(-0.06659381510097863), 'sortino_ratio': np.float64(-0.015157375450423963), 'total_trades': 108, 'transaction_costs': 0.0, 'total_realized_pnl': -13.0, 'win_rate': 0.3958333333333333, 'profit_loss_ratio': 1.4576579857949374, 'winning_trades_count': 19, 'losing_trades_count': 29, 'avg_profit_per_trade': 14.526315789473685, 'avg_loss_per_trade': -9.96551724137931}\n",
|
2025-10-05 00:09:59 +08:00
|
|
|
|
"指标 'rsi_5' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'rsi_7' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'rsi_10' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'rsi_14' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'rsi_15' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'rsi_20' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'rsi_25' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'rsi_30' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'rsi_35' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'rsi_40' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'range_0' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'range_1' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'range_6' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'range_13' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'range_20' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'stoch_k_14_3' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'stoch_k_5_3' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'stoch_k_21_5' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'roc_5' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'roc_10' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'roc_15' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'roc_20' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'roc_ma_5_5' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'roc_ma_5_10' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'roc_ma_10_10' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'roc_ma_10_20' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'roc_ma_20_20' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'roc_ma_20_40' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'natr_5' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'natr_14' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'natr_21' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'adx_7' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'adx_14' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'adx_30' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'adx_60' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'adx_120' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'adx_240' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'bbw_10_15' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'bbw_20_20' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'bbw_50_25' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'price_range_to_vol_ratio_n3_atr5' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'price_range_to_vol_ratio_n3_atr14' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'price_range_to_vol_ratio_n3_atr21' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'price_range_to_vol_ratio_n7_atr5' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'price_range_to_vol_ratio_n7_atr14' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'price_range_to_vol_ratio_n7_atr21' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'price_range_to_vol_ratio_n21_atr5' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'price_range_to_vol_ratio_n21_atr14' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"指标 'price_range_to_vol_ratio_n21_atr21' 没有对应的有效平仓交易数据。跳过绘图。\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"所有指标的分析图表已生成。\n"
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
2025-11-07 16:26:00 +08:00
|
|
|
|
"execution_count": 8
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
"ExecuteTime": {
|
|
|
|
|
|
"end_time": "2025-10-24T08:51:45.537834Z",
|
|
|
|
|
|
"start_time": "2025-10-24T08:51:45.493347Z"
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
"from collections import defaultdict\n",
|
|
|
|
|
|
"from typing import Dict\n",
|
|
|
|
|
|
"from src.core_data import Trade\n",
|
|
|
|
|
|
"import pandas as pd\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"def get_trade_time_category(trade_time: pd.Timestamp) -> str:\n",
|
|
|
|
|
|
" \"\"\"\n",
|
|
|
|
|
|
" 根据交易时间,判断其所属的时间类别\n",
|
|
|
|
|
|
" \"\"\"\n",
|
|
|
|
|
|
" time = trade_time.time()\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" if pd.to_datetime('09:00').time() <= time < pd.to_datetime('09:05').time():\n",
|
|
|
|
|
|
" return \"早盘开盘\"\n",
|
|
|
|
|
|
" if pd.to_datetime('14:55').time() <= time <= pd.to_datetime('15:00').time():\n",
|
|
|
|
|
|
" return \"午盘收盘\"\n",
|
|
|
|
|
|
" if pd.to_datetime('21:00').time() <= time < pd.to_datetime('21:05').time():\n",
|
|
|
|
|
|
" return \"夜盘开盘\"\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" # 您还可以定义其他时段,例如上午收盘等\n",
|
|
|
|
|
|
" # if pd.to_datetime('11:25').time() <= time <= pd.to_datetime('11:30').time():\n",
|
|
|
|
|
|
" # return \"上午收盘\"\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" return \"其他时段\"\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"def analyze_trades_by_open_time(trade_history: List[Trade]) -> Dict[str, Dict]:\n",
|
|
|
|
|
|
" \"\"\"\n",
|
|
|
|
|
|
" 分析不同开仓时间对交易收益的影响\n",
|
|
|
|
|
|
" \"\"\"\n",
|
|
|
|
|
|
" # 使用defaultdict来简化聚合逻辑\n",
|
|
|
|
|
|
" analysis_results = defaultdict(lambda: {\n",
|
|
|
|
|
|
" \"total_pnl\": 0.0,\n",
|
|
|
|
|
|
" \"trade_count\": 0,\n",
|
|
|
|
|
|
" \"win_count\": 0,\n",
|
|
|
|
|
|
" \"pnl_list\": []\n",
|
|
|
|
|
|
" })\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" # 简化处理:假设交易历史是按时间顺序排列的\n",
|
|
|
|
|
|
" # key为symbol,value为对应的开仓交易\n",
|
|
|
|
|
|
" open_trades = {}\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" for trade in trade_history:\n",
|
|
|
|
|
|
" if trade.is_open_trade:\n",
|
|
|
|
|
|
" # 如果某个标的已有未平仓的交易,先进行记录\n",
|
|
|
|
|
|
" # 在简化模型下,这里可以假设一个标的只持一仓\n",
|
|
|
|
|
|
" open_trades[trade.symbol] = trade\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" elif trade.is_close_trade:\n",
|
|
|
|
|
|
" # 查找与此平仓对应的开仓记录\n",
|
|
|
|
|
|
" if trade.symbol in open_trades:\n",
|
|
|
|
|
|
" open_trade = open_trades.pop(trade.symbol)\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" # 获取开仓时间并进行分类\n",
|
|
|
|
|
|
" category = get_trade_time_category(open_trade.fill_time)\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" # 累加数据\n",
|
|
|
|
|
|
" pnl = trade.realized_pnl\n",
|
|
|
|
|
|
" analysis_results[category][\"total_pnl\"] += pnl\n",
|
|
|
|
|
|
" analysis_results[category][\"trade_count\"] += 1\n",
|
|
|
|
|
|
" analysis_results[category][\"pnl_list\"].append(pnl)\n",
|
|
|
|
|
|
" if pnl > 0:\n",
|
|
|
|
|
|
" analysis_results[category][\"win_count\"] += 1\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" # 计算最终指标\n",
|
|
|
|
|
|
" final_report = {}\n",
|
|
|
|
|
|
" for category, data in analysis_results.items():\n",
|
|
|
|
|
|
" trade_count = data[\"trade_count\"]\n",
|
|
|
|
|
|
" if trade_count > 0:\n",
|
|
|
|
|
|
" final_report[category] = {\n",
|
|
|
|
|
|
" \"交易总数\": trade_count,\n",
|
|
|
|
|
|
" \"总盈亏\": round(data[\"total_pnl\"], 2),\n",
|
|
|
|
|
|
" \"平均盈亏\": round(data[\"total_pnl\"] / trade_count, 2),\n",
|
|
|
|
|
|
" \"胜率\": f\"{round((data['win_count'] / trade_count) * 100, 2)}%\"\n",
|
|
|
|
|
|
" }\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
" return final_report\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"analyze_trades_by_open_time(trade_history)"
|
|
|
|
|
|
],
|
|
|
|
|
|
"id": "64de0c98fdcfcd3d",
|
|
|
|
|
|
"outputs": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"data": {
|
|
|
|
|
|
"text/plain": [
|
|
|
|
|
|
"{'其他时段': {'交易总数': 52, '总盈亏': 8.0, '平均盈亏': 0.15, '胜率': '36.54%'},\n",
|
|
|
|
|
|
" '夜盘开盘': {'交易总数': 2, '总盈亏': -21.0, '平均盈亏': -10.5, '胜率': '0.0%'}}"
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
"execution_count": 9,
|
|
|
|
|
|
"metadata": {},
|
|
|
|
|
|
"output_type": "execute_result"
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
|
|
|
|
|
"execution_count": 9
|
2025-10-05 00:09:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
],
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
"kernelspec": {
|
|
|
|
|
|
"display_name": "quant",
|
|
|
|
|
|
"language": "python",
|
|
|
|
|
|
"name": "python3"
|
|
|
|
|
|
},
|
|
|
|
|
|
"language_info": {
|
|
|
|
|
|
"codemirror_mode": {
|
|
|
|
|
|
"name": "ipython",
|
|
|
|
|
|
"version": 3
|
|
|
|
|
|
},
|
|
|
|
|
|
"file_extension": ".py",
|
|
|
|
|
|
"mimetype": "text/x-python",
|
|
|
|
|
|
"name": "python",
|
|
|
|
|
|
"nbconvert_exporter": "python",
|
|
|
|
|
|
"pygments_lexer": "ipython3",
|
|
|
|
|
|
"version": "3.12.11"
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"nbformat": 4,
|
|
|
|
|
|
"nbformat_minor": 5
|
|
|
|
|
|
}
|