227 lines
9.3 KiB
Plaintext
227 lines
9.3 KiB
Plaintext
|
|
{
|
|||
|
|
"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
|
|||
|
|
}
|