2025-07-15 22:46:08 +08:00
|
|
|
|
{
|
|
|
|
|
|
"cells": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
"execution_count": 1,
|
|
|
|
|
|
"id": "initial_id",
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
"ExecuteTime": {
|
2025-07-28 14:36:58 +08:00
|
|
|
|
"end_time": "2025-07-22T07:44:51.375234Z",
|
|
|
|
|
|
"start_time": "2025-07-22T07:44:51.352161Z"
|
2025-07-15 22:46:08 +08:00
|
|
|
|
},
|
|
|
|
|
|
"collapsed": true
|
|
|
|
|
|
},
|
|
|
|
|
|
"outputs": [],
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
"from datetime import datetime\n",
|
|
|
|
|
|
"%load_ext autoreload\n",
|
|
|
|
|
|
"%autoreload 2\n"
|
|
|
|
|
|
]
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"cell_type": "code",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
"execution_count": 2,
|
2025-07-15 22:46:08 +08:00
|
|
|
|
"id": "a559dfcf",
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
"ExecuteTime": {
|
2025-07-28 14:36:58 +08:00
|
|
|
|
"end_time": "2025-07-22T07:44:56.927700Z",
|
|
|
|
|
|
"start_time": "2025-07-22T07:44:51.391111Z"
|
2025-07-15 22:46:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
"outputs": [
|
|
|
|
|
|
{
|
2025-07-28 14:36:58 +08:00
|
|
|
|
"ename": "ModuleNotFoundError",
|
|
|
|
|
|
"evalue": "No module named 'src'",
|
|
|
|
|
|
"output_type": "error",
|
|
|
|
|
|
"traceback": [
|
|
|
|
|
|
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
|
|
|
|
|
"\u001b[31mModuleNotFoundError\u001b[39m Traceback (most recent call last)",
|
|
|
|
|
|
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mturtle\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m down\n\u001b[32m----> \u001b[39m\u001b[32m2\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01msrc\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01manalysis\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mresult_analyzer\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m ResultAnalyzer\n\u001b[32m 3\u001b[39m \u001b[38;5;66;03m# 导入所有必要的模块\u001b[39;00m\n\u001b[32m 4\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01msrc\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mdata_manager\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m DataManager\n",
|
|
|
|
|
|
"\u001b[31mModuleNotFoundError\u001b[39m: No module named 'src'"
|
2025-07-15 22:46:08 +08:00
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
"\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
"from turtle import down\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
"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",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
"from src.indicators.indicators import RSI, BollingerBandwidth, HistoricalRange, NormalizedATR, RateOfChange, StochasticOscillator\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
"from src.strategies.OpenTwoFactorStrategy import SimpleLimitBuyStrategyLong, SimpleLimitBuyStrategyShort, SimpleLimitBuyStrategy\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# --- 配置参数 ---\n",
|
|
|
|
|
|
"# 获取当前脚本所在目录,假设数据文件在项目根目录下的 data 文件夹内\n",
|
|
|
|
|
|
"# data_file_path = '/mnt/d/PyProject/NewQuant/data/data/SHFE_rb2510/SHFE_rb2510_min60.csv'\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
"# data_file_path = \"/mnt/d/PyProject/NewQuant/data/data/KQ_m@CZCE_MA/KQ_m@CZCE_MA_min60.csv\"\n",
|
|
|
|
|
|
"# data_file_path = \"/mnt/d/PyProject/NewQuant/data/data/KQ_m@SHFE_rb/KQ_m@SHFE_rb_min60.csv\"\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
"data_file_path = \"/mnt/d/PyProject/NewQuant/data/data/KQ_m@CZCE_MA/KQ_m@CZCE_MA_min60.csv\"\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"initial_capital = 100000.0\n",
|
|
|
|
|
|
"slippage_rate = 0.000 # 假设每笔交易0.1%的滑点\n",
|
|
|
|
|
|
"commission_rate = 0.0001 # 假设每笔交易0.02%的佣金\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"global_config = {\n",
|
|
|
|
|
|
" 'symbol': 'KQ_m@CZCE_MA',\n",
|
|
|
|
|
|
"}\n",
|
|
|
|
|
|
"\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
"# Short 可用\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
"strategy_parameters = {\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
" 'main_symbol': \"MA\", # 根据您的数据文件中的品种名称调整\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
" 'trade_volume': 1,\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
" 'lag': 7,\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
" # 'range_factor': 1.8, # 示例值,需要通过网格搜索优化\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
" # 'profit_factor': 2.8, # 示例值\n",
|
|
|
|
|
|
" # 'range_factor': 1.6, # 示例值,需要通过网格搜索优化\n",
|
|
|
|
|
|
" # 'profit_factor': 2.1, # 示例值\n",
|
|
|
|
|
|
" 'range_factor_l': 1.8, # 示例值,需要通过网格搜索优化\n",
|
|
|
|
|
|
" 'profit_factor_l': 2.8, # 示例值\n",
|
|
|
|
|
|
" 'range_factor_s': 1.6, # 示例值,需要通过网格搜索优化\n",
|
|
|
|
|
|
" 'profit_factor_s': 2.1, # 示例值\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
" 'max_position': 10,\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
" 'enable_log': True,\n",
|
|
|
|
|
|
" 'stop_loss_points': 20,\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
" 'use_indicator': True,\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
" # 'indicator': HistoricalRange(11, 25, 20),\n",
|
|
|
|
|
|
" # 'indicator': BollingerBandwidth(window=20, nbdev=2.0, down_bound=1.9, up_bound=3.25),\n",
|
|
|
|
|
|
" 'indicator_l': HistoricalRange(11, 25, 20),\n",
|
|
|
|
|
|
" 'indicator_s': BollingerBandwidth(window=20, nbdev=2.0, down_bound=1.9, up_bound=3.25),\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
"}\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
"start_time = datetime(2021, 1, 1)\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
"end_time = datetime(2024, 6, 1)\n",
|
|
|
|
|
|
"\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
"start_time = datetime(2024, 6, 1)\n",
|
|
|
|
|
|
"end_time = datetime(2025, 8, 1)\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
"\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# --- 1. 初始化数据管理器 ---\n",
|
|
|
|
|
|
"print(\"初始化数据管理器...\")\n",
|
|
|
|
|
|
"data_manager = DataManager(file_path=data_file_path, symbol=global_config['symbol'], start_time=start_time, end_time=end_time)\n",
|
|
|
|
|
|
"# 确保 DataManager 能够重置以进行多次回测\n",
|
|
|
|
|
|
"# data_manager.reset() # 首次运行不需要重置\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# --- 2. 初始化回测引擎并运行 ---\n",
|
|
|
|
|
|
"print(\"\\n初始化回测引擎...\")\n",
|
|
|
|
|
|
"engine = BacktestEngine(\n",
|
|
|
|
|
|
" data_manager=data_manager,\n",
|
2025-07-28 14:36:58 +08:00
|
|
|
|
" strategy_class=SimpleLimitBuyStrategy,\n",
|
2025-07-15 22:46:08 +08:00
|
|
|
|
" # current_segment_symbol=strategy_parameters['symbol'],\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=INDICATOR_LIST\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没有生成投资组合快照,无法进行结果分析。\")\n",
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
"# --- 4. 结果分析与可视化 (待实现) ---\n",
|
|
|
|
|
|
"# if portfolio_snapshots:\n",
|
|
|
|
|
|
"# analyzer = ResultAnalyzer(portfolio_snapshots, trade_history, initial_capital_result)\n",
|
|
|
|
|
|
"# metrics = analyzer.calculate_all_metrics()\n",
|
|
|
|
|
|
"# print(\"\\n--- 绩效指标 ---\")\n",
|
|
|
|
|
|
"# for key, value in metrics.items():\n",
|
|
|
|
|
|
"# print(f\" {key}: {value:.4f}\")\n",
|
|
|
|
|
|
"#\n",
|
|
|
|
|
|
"# print(\"\\n--- 绘制绩效图表 ---\")\n",
|
|
|
|
|
|
"# analyzer.plot_performance()\n",
|
|
|
|
|
|
"# else:\n",
|
|
|
|
|
|
"# print(\"\\n没有生成投资组合快照,无法进行结果分析。\")\n",
|
|
|
|
|
|
"\n"
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
|
|
|
|
|
"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
|
|
|
|
|
|
}
|