{ "cells": [ { "cell_type": "code", "id": "522f09ca7b3fe929", "metadata": { "ExecuteTime": { "end_time": "2025-10-21T13:27:14.609968Z", "start_time": "2025-10-21T13:27:14.180365Z" } }, "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": [], "execution_count": 1 }, { "cell_type": "code", "id": "4f7e4b438cea750e", "metadata": { "ExecuteTime": { "end_time": "2025-10-21T13:27:14.989537Z", "start_time": "2025-10-21T13:27:14.615874Z" } }, "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", "from src.strategies.TrendlineBreakoutStrategy.TrendlineHawkesStrategyFast import TrendlineHawkesStrategy\n", "\n", "# --- 配置参数 ---\n", "# 获取当前脚本所在目录,假设数据文件在项目根目录下的 data 文件夹内\n", "data_file_path = '/mnt/d/PyProject/NewQuant/data/data/KQ_m@CZCE_MA/KQ_m@CZCE_MA_min15.csv'\n" ], "outputs": [], "execution_count": 2 }, { "metadata": { "ExecuteTime": { "end_time": "2025-10-21T13:27:15.060902Z", "start_time": "2025-10-21T13:27:14.996119Z" } }, "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_MA', # 确保与数据文件中的 symbol 匹配\n", "}\n", "\n", "# 回测时间范围\n", "start_time = datetime(2021, 1, 1)\n", "end_time = datetime(2024, 6, 1)\n", "\n", "start_time = datetime(2024, 1, 1)\n", "end_time = datetime(2025, 8, 1)\n", "\n", "\n", "indicators = INDICATOR_LIST\n", "indicators = []\n", "\n", "# 确保 DataManager 能够重置以进行多次回测\n", "# data_manager.reset() # 首次运行不需要重置" ], "id": "9ee53c41eaaefabb", "outputs": [], "execution_count": 3 }, { "metadata": { "ExecuteTime": { "end_time": "2025-10-21T13:27:21.876001Z", "start_time": "2025-10-21T13:27:15.070471Z" } }, "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", " 'main_symbol': 'MA', # <-- 替换为你的交易品种代码,例如 'GC=F' (黄金期货), 'ZC=F' (玉米期货)\n", " 'trade_volume': 1,\n", " 'trendline_n': 70,\n", " 'hawkes_kappa': 0.1,\n", " 'order_direction': ['SELL', 'BUY'],\n", " 'reverse_logic': True,\n", " # 'indicators': [RateOfChange(10, -2.1, -0.5), ROC_MA(10, 10, -2.7, -0.4)],\n", " 'enable_log': False\n", "}\n", "\n", "\n", "\n", "# --- 2. 初始化回测引擎并运行 ---\n", "print(\"\\n初始化回测引擎...\")\n", "engine = BacktestEngine(\n", " data_manager=data_manager,\n", " strategy_class=TrendlineHawkesStrategy, # <--- 更改为您的 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", "数据加载成功: /mnt/d/PyProject/NewQuant/data/data/KQ_m@CZCE_MA/KQ_m@CZCE_MA_min15.csv\n", "数据范围从 2020-12-31 14:45:00 到 2025-08-21 14:30:00\n", "总计 25596 条记录。\n", "\n", "初始化回测引擎...\n", "模拟器初始化:初始资金=100000.00, 滑点率=0.0, 佣金率=0.0\n", "内存仓储已初始化,管理ID: 'src.strategies.TrendlineBreakoutStrategy.TrendlineHawkesStrategyFast.TrendlineHawkesStrategy_13b1be9c188912b2ee8ccd9e5fb0718d'\n", "\n", "--- 回测引擎初始化完成 ---\n", " 策略: TrendlineHawkesStrategy\n", " 初始资金: 100000.00\n", " 换月模式: 启用\n", "\n", "开始运行回测...\n", "\n", "--- 回测开始 ---\n", "TrendlineHawkesStrategy 策略初始化回调被调用。\n", "开始将 DataFrame 转换为 Bar 对象流...\n", "首次运行,正在初始化霍克斯状态和滚动窗口...\n", "状态初始化完成。\n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001B[31m---------------------------------------------------------------------------\u001B[39m", "\u001B[31mKeyboardInterrupt\u001B[39m Traceback (most recent call last)", "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[4]\u001B[39m\u001B[32m, line 38\u001B[39m\n\u001B[32m 23\u001B[39m engine = BacktestEngine(\n\u001B[32m 24\u001B[39m data_manager=data_manager,\n\u001B[32m 25\u001B[39m strategy_class=TrendlineHawkesStrategy, \u001B[38;5;66;03m# <--- 更改为您的 SMC 策略类\u001B[39;00m\n\u001B[32m (...)\u001B[39m\u001B[32m 34\u001B[39m indicators=indicators \u001B[38;5;66;03m# 如果您的 SMC 策略不使用这些指标,也可以考虑移除\u001B[39;00m\n\u001B[32m 35\u001B[39m )\n\u001B[32m 37\u001B[39m \u001B[38;5;28mprint\u001B[39m(\u001B[33m\"\u001B[39m\u001B[38;5;130;01m\\n\u001B[39;00m\u001B[33m开始运行回测...\u001B[39m\u001B[33m\"\u001B[39m)\n\u001B[32m---> \u001B[39m\u001B[32m38\u001B[39m \u001B[43mengine\u001B[49m\u001B[43m.\u001B[49m\u001B[43mrun_backtest\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 39\u001B[39m \u001B[38;5;28mprint\u001B[39m(\u001B[33m\"\u001B[39m\u001B[38;5;130;01m\\n\u001B[39;00m\u001B[33m回测运行完毕。\u001B[39m\u001B[33m\"\u001B[39m)\n\u001B[32m 41\u001B[39m \u001B[38;5;66;03m# --- 3. 获取回测结果 ---\u001B[39;00m\n", "\u001B[36mFile \u001B[39m\u001B[32m/mnt/d/PyProject/NewQuant/src/backtest_engine.py:166\u001B[39m, in \u001B[36mBacktestEngine.run_backtest\u001B[39m\u001B[34m(self)\u001B[39m\n\u001B[32m 163\u001B[39m \u001B[38;5;28mself\u001B[39m.strategy.on_open_bar(current_bar.open, current_bar.symbol)\n\u001B[32m 165\u001B[39m current_indicator_dict = {}\n\u001B[32m--> \u001B[39m\u001B[32m166\u001B[39m close_array = \u001B[43mnp\u001B[49m\u001B[43m.\u001B[49m\u001B[43marray\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mclose_list\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m 167\u001B[39m open_array = np.array(\u001B[38;5;28mself\u001B[39m.open_list)\n\u001B[32m 168\u001B[39m high_array = np.array(\u001B[38;5;28mself\u001B[39m.high_list)\n", "\u001B[31mKeyboardInterrupt\u001B[39m: " ] } ], "execution_count": 4 } ], "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 }