469 lines
623 KiB
Plaintext
469 lines
623 KiB
Plaintext
|
|
{
|
|||
|
|
"cells": [
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 9,
|
|||
|
|
"id": "782ec73f",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"The autoreload extension is already loaded. To reload it, use:\n",
|
|||
|
|
" %reload_ext autoreload\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"import pandas as pd\n",
|
|||
|
|
"from datetime import datetime\n",
|
|||
|
|
"import itertools\n",
|
|||
|
|
"from typing import Dict, Any, List, Tuple, Optional\n",
|
|||
|
|
"import multiprocessing # 导入 multiprocessing 模块\n",
|
|||
|
|
"import math # 保留 math 导入,因为您的策略内部可能需要用到数学函数\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 导入所有必要的模块\n",
|
|||
|
|
"# 请确保这些导入路径与您的项目结构相符\n",
|
|||
|
|
"from src.analysis.grid_search_analyzer import GridSearchAnalyzer\n",
|
|||
|
|
"from src.analysis.result_analyzer import ResultAnalyzer\n",
|
|||
|
|
"from src.common_utils import generate_parameter_range\n",
|
|||
|
|
"from src.data_manager import DataManager\n",
|
|||
|
|
"from src.backtest_engine import BacktestEngine\n",
|
|||
|
|
"# 导入策略类\n",
|
|||
|
|
"from src.strategies.SimpleLimitBuyStrategy import SimpleLimitBuyStrategyShort, SimpleLimitBuyStrategyLong, SimpleLimitBuyStrategy\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"import builtins\n",
|
|||
|
|
"\n",
|
|||
|
|
"%load_ext autoreload\n",
|
|||
|
|
"%autoreload 2\n",
|
|||
|
|
"\n",
|
|||
|
|
"origin_print = print\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 10,
|
|||
|
|
"id": "76f9a2e9",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"\n",
|
|||
|
|
"# --- 单个回测任务函数 ---\n",
|
|||
|
|
"# 这个函数将在每个独立的进程中运行,因此它必须是自包含的\n",
|
|||
|
|
"def run_single_backtest(\n",
|
|||
|
|
" combination: Tuple[float, float], # 传入当前参数组合\n",
|
|||
|
|
" common_config: Dict[str, Any] # 传入公共配置 (如数据路径, 初始资金等)\n",
|
|||
|
|
") -> Optional[Dict[str, Any]]:\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" 运行单个参数组合的回测任务。\n",
|
|||
|
|
" 此函数将在一个独立的进程中执行。\n",
|
|||
|
|
" \"\"\"\n",
|
|||
|
|
" p1_value, p2_value = combination\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 从 common_config 中获取必要的配置\n",
|
|||
|
|
" symbol = common_config['symbol']\n",
|
|||
|
|
" data_path = common_config['data_path']\n",
|
|||
|
|
" initial_capital = common_config['initial_capital']\n",
|
|||
|
|
" slippage_rate = common_config['slippage_rate']\n",
|
|||
|
|
" commission_rate = common_config['commission_rate']\n",
|
|||
|
|
" start_time = common_config['start_time']\n",
|
|||
|
|
" end_time = common_config['end_time']\n",
|
|||
|
|
" roll_over_mode = common_config['roll_over_mode']\n",
|
|||
|
|
" # bar_duration_seconds = common_config['bar_duration_seconds'] # 如果DataManager需要,可以再传\n",
|
|||
|
|
" param1_name = common_config['param1_name']\n",
|
|||
|
|
" param2_name = common_config['param2_name']\n",
|
|||
|
|
" optimization_metric = common_config['optimization_metric']\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 每个进程内部独立初始化 DataManager 和 BacktestEngine\n",
|
|||
|
|
" # 确保每个进程有自己的数据副本和模拟状态\n",
|
|||
|
|
" data_manager = DataManager(\n",
|
|||
|
|
" file_path=data_path,\n",
|
|||
|
|
" symbol=symbol,\n",
|
|||
|
|
" # bar_duration_seconds=bar_duration_seconds, # 如果DataManager需要,根据数据文件路径推断或者额外参数传入\n",
|
|||
|
|
" # start_date=start_time.date(), # DataManager 现在通过 file_path 和 symbol 处理数据\n",
|
|||
|
|
" # end_date=end_time.date(),\n",
|
|||
|
|
" )\n",
|
|||
|
|
" # data_manager.load_data() # DataManager 内部加载数据\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 策略参数\n",
|
|||
|
|
" strategy_parameters = {\n",
|
|||
|
|
" 'trade_volume': 1,\n",
|
|||
|
|
" param1_name: p1_value,\n",
|
|||
|
|
" param2_name: p2_value,\n",
|
|||
|
|
" 'max_position': 10,\n",
|
|||
|
|
" 'enable_log': False, # 在网格搜索时通常关闭策略内部的详细日志\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 打印当前进程正在处理的组合信息\n",
|
|||
|
|
" # 注意:多进程打印会交错显示\n",
|
|||
|
|
" # print(f\"--- 正在运行组合: {strategy_parameters} (PID: {multiprocessing.current_process().pid}) ---\")\n",
|
|||
|
|
"\n",
|
|||
|
|
" try:\n",
|
|||
|
|
" # 初始化回测引擎\n",
|
|||
|
|
" engine = BacktestEngine(\n",
|
|||
|
|
" data_manager=data_manager,\n",
|
|||
|
|
" strategy_class=common_config['strategy'],\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=datetime(2023, 1, 1),\n",
|
|||
|
|
" end_time=datetime(2025, 1, 1)\n",
|
|||
|
|
" )\n",
|
|||
|
|
" # 运行回测,传入时间范围\n",
|
|||
|
|
" engine.run_backtest()\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 获取回测结果并分析\n",
|
|||
|
|
" results = engine.get_backtest_results()\n",
|
|||
|
|
" portfolio_snapshots = results[\"portfolio_snapshots\"]\n",
|
|||
|
|
" trade_history = results[\"trade_history\"]\n",
|
|||
|
|
" bars = results[\"all_bars\"]\n",
|
|||
|
|
" initial_capital_result = results[\"initial_capital\"]\n",
|
|||
|
|
"\n",
|
|||
|
|
" if portfolio_snapshots:\n",
|
|||
|
|
" analyzer = ResultAnalyzer(portfolio_snapshots, trade_history, bars, initial_capital_result)\n",
|
|||
|
|
" metrics = analyzer.calculate_all_metrics()\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 将当前组合的参数和性能指标存储起来\n",
|
|||
|
|
" result_entry = {**strategy_parameters, **metrics}\n",
|
|||
|
|
" # print(f\" 组合 {combination} 完成。{optimization_metric}: {metrics.get(optimization_metric, 0.0):.4f} (PID: {multiprocessing.current_process().pid})\")\n",
|
|||
|
|
" return result_entry\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" print(f\" 组合 {strategy_parameters} 没有生成投资组合快照,无法进行结果分析。(PID: {multiprocessing.current_process().pid})\")\n",
|
|||
|
|
" # 返回一个包含参数和默认0值的结果,以便追踪失败组合\n",
|
|||
|
|
" return {**strategy_parameters, \"total_return\": 0.0, \"annualized_return\": 0.0, \"sharpe_ratio\": 0.0, \"max_drawdown\": 0.0, \"error\": \"No portfolio snapshots\"}\n",
|
|||
|
|
" except Exception as e:\n",
|
|||
|
|
" import traceback\n",
|
|||
|
|
" error_trace = traceback.format_exc()\n",
|
|||
|
|
" print(f\" 组合 {strategy_parameters} 运行失败: {e}\\n{error_trace} (PID: {multiprocessing.current_process().pid})\")\n",
|
|||
|
|
" # 返回错误信息,以便后续处理\n",
|
|||
|
|
" return {**strategy_parameters, \"error\": str(e), \"traceback\": error_trace}\n",
|
|||
|
|
"\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 11,
|
|||
|
|
"id": "c0984689",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"\n",
|
|||
|
|
"def slient_print(*args):\n",
|
|||
|
|
" pass\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 12,
|
|||
|
|
"id": "239e9ca0",
|
|||
|
|
"metadata": {},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"总计 1681 种参数组合需要回测。\n",
|
|||
|
|
"--- 启动多进程网格搜索,使用 10 个进程 ---\n",
|
|||
|
|
"\n",
|
|||
|
|
"--- 网格搜索回测完毕 ---\n",
|
|||
|
|
"<class 'pandas.core.frame.DataFrame'>\n",
|
|||
|
|
"RangeIndex: 1681 entries, 0 to 1680\n",
|
|||
|
|
"Data columns (total 37 columns):\n",
|
|||
|
|
" # Column Non-Null Count Dtype \n",
|
|||
|
|
"--- ------ -------------- ----- \n",
|
|||
|
|
" 0 trade_volume 1681 non-null int64 \n",
|
|||
|
|
" 1 open_range_factor_1_ago 1681 non-null float64\n",
|
|||
|
|
" 2 open_range_factor_7_ago 1681 non-null float64\n",
|
|||
|
|
" 3 max_position 1681 non-null int64 \n",
|
|||
|
|
" 4 enable_log 1681 non-null bool \n",
|
|||
|
|
" 5 初始资金 1681 non-null float64\n",
|
|||
|
|
" 6 最终资金 1681 non-null float64\n",
|
|||
|
|
" 7 总收益率 1681 non-null float64\n",
|
|||
|
|
" 8 年化收益率 1681 non-null float64\n",
|
|||
|
|
" 9 最大回撤 1681 non-null float64\n",
|
|||
|
|
" 10 夏普比率 1681 non-null float64\n",
|
|||
|
|
" 11 卡玛比率 1681 non-null float64\n",
|
|||
|
|
" 12 总交易次数 1681 non-null int64 \n",
|
|||
|
|
" 13 交易成本 1681 non-null float64\n",
|
|||
|
|
" 14 总实现盈亏 1681 non-null float64\n",
|
|||
|
|
" 15 胜率 1681 non-null float64\n",
|
|||
|
|
" 16 盈亏比 1681 non-null float64\n",
|
|||
|
|
" 17 盈利交易次数 1681 non-null int64 \n",
|
|||
|
|
" 18 亏损交易次数 1681 non-null int64 \n",
|
|||
|
|
" 19 平均每次盈利 1681 non-null float64\n",
|
|||
|
|
" 20 平均每次亏损 1681 non-null float64\n",
|
|||
|
|
" 21 initial_capital 1681 non-null float64\n",
|
|||
|
|
" 22 final_capital 1681 non-null float64\n",
|
|||
|
|
" 23 total_return 1681 non-null float64\n",
|
|||
|
|
" 24 annualized_return 1681 non-null float64\n",
|
|||
|
|
" 25 max_drawdown 1681 non-null float64\n",
|
|||
|
|
" 26 sharpe_ratio 1681 non-null float64\n",
|
|||
|
|
" 27 calmar_ratio 1681 non-null float64\n",
|
|||
|
|
" 28 total_trades 1681 non-null int64 \n",
|
|||
|
|
" 29 transaction_costs 1681 non-null float64\n",
|
|||
|
|
" 30 total_realized_pnl 1681 non-null float64\n",
|
|||
|
|
" 31 win_rate 1681 non-null float64\n",
|
|||
|
|
" 32 profit_loss_ratio 1681 non-null float64\n",
|
|||
|
|
" 33 winning_trades_count 1681 non-null int64 \n",
|
|||
|
|
" 34 losing_trades_count 1681 non-null int64 \n",
|
|||
|
|
" 35 avg_profit_per_trade 1681 non-null float64\n",
|
|||
|
|
" 36 avg_loss_per_trade 1681 non-null float64\n",
|
|||
|
|
"dtypes: bool(1), float64(28), int64(8)\n",
|
|||
|
|
"memory usage: 474.6 KB\n",
|
|||
|
|
"None\n",
|
|||
|
|
"ERROR!!!!!!!!!!!!!!!!!!!!\n",
|
|||
|
|
"\n",
|
|||
|
|
"sharpe_ratio 网格结果 (Pivoted):\n",
|
|||
|
|
"open_range_factor_7_ago -2.0 -1.9 -1.8 -1.7 -1.6 -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0\n",
|
|||
|
|
"open_range_factor_1_ago \n",
|
|||
|
|
"-2.0 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -8.577121 -9.189559 -9.488584 -9.221716 -9.191265 -8.360832 -8.048696 -7.418742 -7.195169 -6.607171 -6.213480 -5.820838 -5.361767 -5.128462 -5.086811\n",
|
|||
|
|
"-1.9 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -8.687711 -9.377471 -9.652244 -9.250053 -9.063190 -8.327370 -8.045452 -7.383436 -6.956161 -6.490142 -6.084636 -5.580848 -5.143030 -4.941032 -4.902782 -4.625536\n",
|
|||
|
|
"-1.8 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -8.963504 -9.559047 -9.855343 -9.281815 -9.072835 -8.499501 -7.890295 -7.467556 -6.773400 -6.635964 -5.868807 -5.281151 -4.984027 -4.721322 -4.608481 -4.308976 -4.223190\n",
|
|||
|
|
"-1.7 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -8.562340 -9.781618 -10.057410 -9.563862 -9.127549 -8.584414 -7.771836 -7.314288 -6.589209 -6.404172 -5.692897 -5.151201 -4.762156 -4.439719 -4.389322 -4.070451 -3.963949 -3.772686\n",
|
|||
|
|
"-1.6 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -8.336729 -9.986812 -10.323225 -9.670969 -9.080736 -8.570992 -7.980953 -7.107934 -6.701407 -6.189514 -5.608427 -5.099244 -4.710295 -4.179591 -4.055481 -3.722431 -3.632147 -3.575425 -3.527188\n",
|
|||
|
|
"-1.5 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -7.755264 -10.065065 -10.557835 -9.906051 -9.218315 -8.480246 -8.011466 -7.072230 -6.600332 -6.179521 -5.597726 -4.931930 -4.470064 -4.037840 -3.829597 -3.475540 -3.431414 -3.458640 -3.271479 -3.131249\n",
|
|||
|
|
"-1.4 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -7.708263 -9.970862 -10.368393 -10.285571 -9.335040 -8.579023 -7.820496 -6.934664 -6.430789 -5.942343 -5.431256 -4.707601 -4.203833 -3.734895 -3.668915 -3.251296 -3.124934 -3.136729 -3.045104 -2.838198 -2.944947\n",
|
|||
|
|
"-1.3 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -6.992459 -9.896332 -10.230537 -10.541155 -9.518330 -8.689719 -7.707185 -7.073865 -6.169620 -5.748116 -5.198032 -4.487012 -4.003231 -3.741284 -3.419475 -3.092999 -3.055340 -2.949527 -2.738063 -2.636111 -2.637614 -2.421733\n",
|
|||
|
|
"-1.2 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -3.381796 -10.249093 -10.508574 -11.010473 -9.950485 -8.944489 -7.813796 -6.839752 -6.006962 -5.594626 -4.897982 -4.348423 -3.862137 -3.634548 -3.248345 -2.954336 -2.910284 -2.759977 -2.471939 -2.437885 -2.429904 -2.177280 -1.828455\n",
|
|||
|
|
"-1.1 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.444174 -10.954536 -10.217684 -10.268614 -9.078928 -7.754318 -6.707367 -5.968150 -5.470490 -4.655460 -4.090633 -3.717425 -3.463757 -2.957696 -2.680837 -2.479547 -2.228224 -2.251847 -2.172385 -2.209852 -1.872108 -1.758647 -1.670232\n",
|
|||
|
|
"-1.0 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.578155 -11.075463 -10.901471 -10.876916 -9.223879 -7.975727 -6.833453 -5.895390 -5.280720 -4.432637 -3.964886 -3.467444 -3.283056 -2.804238 -2.393490 -2.310831 -2.041438 -2.058065 -1.950842 -1.944040 -1.681454 -1.585867 -1.363589 -1.300967\n",
|
|||
|
|
"-0.9 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -3.560039 -10.808107 -11.032682 -10.925985 -10.358897 -9.438513 -8.141071 -6.962984 -5.843434 -5.194346 -4.357821 -3.760802 -3.289962 -2.789219 -2.540149 -2.245983 -2.026141 -1.980662 -1.893001 -1.798974 -1.587275 -1.321313 -1.243046 -1.088177 -0.846017 -0.922899\n",
|
|||
|
|
"-0.8 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.969109 -11.457431 -10.817523 -10.307038 -9.584700 -8.338980 -7.076713 -5.745912 -4.919234 -4.304017 -3.383420 -3.159888 -2.454632 -2.328003 -2.045009 -1.885543 -1.686417 -1.675898 -1.621396 -1.238815 -1.103635 -0.922785 -0.866017 -0.951245 -0.743345 -0.714002\n",
|
|||
|
|
"-0.7 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.993996 -11.604817 -11.071541 -10.232835 -9.305088 -8.323784 -7.250250 -5.953549 -4.818767 -4.051334 -3.192968 -2.713967 -2.247010 -2.112134 -1.718415 -1.627476 -1.368575 -1.392822 -1.422148 -1.050016 -0.894655 -0.777871 -0.803534 -0.769953 -0.659875 -0.530857 -0.563340\n",
|
|||
|
|
"-0.6 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -5.560546 -10.891718 -11.523797 -11.481701 -10.148825 -9.600976 -8.261733 -7.126880 -6.000841 -4.596729 -3.738225 -3.087844 -2.387298 -2.008904 -1.810772 -1.363897 -1.208855 -1.252323 -1.089157 -1.253090 -0.853780 -0.812766 -0.597170 -0.730392 -0.672203 -0.546347 -0.456751 -0.555930 -0.739787\n",
|
|||
|
|
"-0.5 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -7.025901 -10.853309 -11.615903 -11.337331 -10.555526 -9.554285 -8.336445 -7.161977 -5.927015 -4.774761 -3.720845 -2.957331 -2.207934 -1.912540 -1.608762 -1.192315 -0.958148 -1.174112 -0.962341 -0.908745 -0.768309 -0.555719 -0.716005 -0.609750 -0.648288 -0.556078 -0.480344 -0.623056 -0.752395 -0.587810\n",
|
|||
|
|
"-0.4 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -7.720117 -10.583146 -11.263004 -11.324429 -10.317576 -9.334391 -8.238708 -7.177355 -6.040426 -4.769071 -3.735902 -2.891954 -2.108947 -1.562977 -1.157599 -1.150455 -0.906705 -0.879516 -0.693058 -0.677480 -0.500110 -0.474111 -0.571934 -0.761448 -0.551383 -0.503396 -0.562956 -0.725417 -0.847347 -0.715737 -0.623127\n",
|
|||
|
|
"-0.3 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -7.685845 -10.504777 -11.294914 -10.806430 -10.324092 -9.188223 -8.714477 -7.272929 -5.989718 -4.985297 -3.779264 -2.795968 -1.918749 -1.336914 -0.877545 -0.845574 -0.776834 -0.578959 -0.394059 -0.524438 -0.452299 -0.544550 -0.774436 -0.640279 -0.469700 -0.501319 -0.597396 -0.668243 -0.772993 -0.657544 -0.597764 -0.505146\n",
|
|||
|
|
"-0.2 -1.639558 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -8.225594 -10.825510 -11.036533 -10.635514 -9.849546 -9.158565 -8.263200 -7.202145 -5.990347 -4.903344 -3.570873 -2.865972 -1.908258 -1.087695 -0.572070 -0.568705 -0.541128 -0.363453 -0.314340 -0.625548 -0.431909 -0.490368 -0.698818 -0.663701 -0.453546 -0.507974 -0.627475 -0.715770 -0.630262 -0.585836 -0.591749 -0.575521 -0.352745\n",
|
|||
|
|
"-0.1 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -8.789311 -10.763787 -11.278054 -10.543137 -9.674137 -8.732381 -8.111277 -7.120423 -5.867437 -4.542062 -3.640658 -2.858168 -1.821544 -0.790540 -0.474518 -0.502187 -0.426941 -0.444111 -0.369545 -0.512593 -0.622406 -0.581321 -0.688531 -0.530910 -0.470261 -0.524013 -0.750966 -0.751011 -0.597828 -0.519579 -0.529560 -0.387790 -0.237294 -0.320957\n",
|
|||
|
|
" 0.0 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -9.253024 -10.728636 -11.118141 -10.733930 -9.998220 -8.994543 -7.946155 -7.033723 -5.547231 -4.626612 -3.586650 -2.791061 -1.940470 -0.829051 -0.492031 -0.226792 -0.359284 -0.405401 -0.569869 -0.548579 -0.593034 -0.456732 -0.670073 -0.537380 -0.462981 -0.432599 -0.626362 -0.742308 -0.603810 -0.383952 -0.373887 -0.288041 -0.249007 -0.294326 -0.242005\n",
|
|||
|
|
" 0.1 -10.000000 -10.000000 -10.000000 -10.000000 -10.000000 -9.252135 -10.689917 -10.932752 -10.350227 -9.644942 -8.545860 -7.592485 -6.714334 -5.422874 -4.449617 -3.679272 -2.908948 -1.946610 -1.104508 -0.688038 -0.134238 -0.245761 -0.444282 -0.504819 -0.402696 -0.596838 -0.537884 -0.708538 -0.584051 -0.409652 -0.442430 -0.682137 -0.653358 -0.485818 -0.384351 -0.245367 -0.117223 -0.238097 -0.237115 -0.335322 -0.441819\n",
|
|||
|
|
" 0.2 -10.000000 -10.000000 -10.000000 -10.000000 -9.592517 -10.577815 -10.285206 -10.201038 -9.551799 -8.784089 -7.647983 -6.674048 -5.553834 -4.572913 -3.608705 -3.025995 -2.178859 -1.401691 -0.856259 -0.305348 -0.353144 -0.300348 -0.450363 -0.482002 -0.568055 -0.605028 -0.731758 -0.494553 -0.319926 -0.489003 -0.640827 -0.619585 -0.451753 -0.309970 -0.234570 -0.107622 -0.115748 -0.268277 -0.280937 -0.431478 -0.279625\n",
|
|||
|
|
" 0.3 -10.000000 -10.000000 -10.000000 -9.201970 -10.063577 -9.874733 -9.995373 -9.250937 -8.607121 -7.627115 -6.644906 -5.660839 -4.507038 -3.761719 -3.179410 -2.340924 -1.572049 -1.036635 -0.588860 -0.377043 -0.540645 -0.412882 -0.497671 -0.635043 -0.609555 -0.609508 -0.424854 -0.413192 -0.464762 -0.518357 -0.585609 -0.410073 -0.275845 -0.163127 -0.066211 -0.098889 -0.016612 -0.158212 -0.293793 -0.351959 -0.233408\n",
|
|||
|
|
" 0.4 -10.000000 -10.000000 -8.923455 -10.181807 -9.911824 -9.455416 -9.070033 -8.384398 -7.541822 -6.643181 -5.622677 -4.756389 -3.828590 -3.244048 -2.521213 -1.736691 -1.382204 -0.819504 -0.489976 -0.578446 -0.341658 -0.519132 -0.545734 -0.674775 -0.476439 -0.528840 -0.282925 -0.412355 -0.503805 -0.563692 -0.439273 -0.268208 -0.125521 0.022487 0.091256 -0.010755 -0.030690 -0.354291 -0.338410 -0.203378 -0.150904\n",
|
|||
|
|
" 0.5 -10.000000 -9.475254 -9.915833 -9.903821 -9.256176 -9.044848 -8.071734 -7.399382 -6.517441 -5.659062 -4.789584 -3.862194 -3.333945 -2.777049 -2.031125 -1.783236 -0.967454 -0.516133 -0.501070 -0.333797 -0.180268 -0.514507 -0.652390 -0.442475 -0.458857 -0.309210 -0.328729 -0.417556 -0.468101 -0.271692 -0.150239 -0.052890 0.051979 -0.064333 -0.066332 -0.136605 -0.147962 -0.262751 -0.138840 -0.074106 -0.127161\n",
|
|||
|
|
" 0.6 -9.065324 -9.533416 -9.705550 -9.167590 -8.634813 -8.200985 -7.225553 -6.367157 -5.646526 -4.876717 -4.201575 -3.627759 -3.029737 -2.433969 -1.916117 -1.126021 -0.699214 -0.600149 -0.400071 -0.278429 -0.599540 -0.517169 -0.438051 -0.423487 -0.285336 -0.311079 -0.374008 -0.414385 -0.300593 -0.110746 -0.009041 -0.091241 -0.109844 -0.091735 -0.171581 -0.092778 -0.127329 -0.070174 -0.056973 -0.135500 -0.102528\n",
|
|||
|
|
" 0.7 -9.428579 -9.453426 -8.867278 -8.596339 -7.934736 -6.964356 -6.209118 -5.752878 -5.140302 -4.221152 -3.767441 -3.220715 -2.686863 -1.998696 -1.536651 -0.904810 -0.720239 -0.558126 -0.469347 -0.614175 -0.458677 -0.429239 -0.581633 -0.330493 -0.274000 -0.433433 -0.295885 -0.365750 -0.159640 -0.111746 -0.221389 -0.088927 -0.156091 -0.134103 -0.004580 -0.021652 0.048216 -0.079482 -0.070293 -0.102434 -0.041748\n",
|
|||
|
|
" 0.8 -9.119770 -8.844600 -8.443193 -7.449354 -7.093085 -6.328289 -5.921302 -5.201174 -4.482268 -3.972597 -3.402088 -3.007541 -2.298033 -1.675093 -1.199254 -0.931591 -0.618573 -0.500511 -0.683610 -0.530904 -0.308100 -0.378888 -0.261493 -0.233713 -0.377787 -0.421335 -0.373438 -0.271433 -0.139088 -0.229898 -0.114366 -0.160600 -0.100356 -0.028674 -0.007356 0.116042 0.199426 -0.072823 -0.034682 -0.123292 -0.152782\n",
|
|||
|
|
" 0.9 -8.732059 -8.164496 -7.689423 -7.232502 -6.342876 -5.892406 -5.320682 -4.747205 -4.232768 -3.580523 -3.192447 -2.501308 -1.944094 -1.544816 -1.189506 -0.746950 -0.612741 -0.643092 -0.553482 -0.479254 -0.321045 -0.389727 -0.202256 -0.444810 -0.405538 -0.388596 -0.355062 -0.245652 -0.149022 -0.166935 -0.126797 -0.083844 -0.004914 0.171484 0.110952 0.098638 0.170200 -0.096446 -0.119406 -0.167987 -0.170923\n",
|
|||
|
|
" 1.0 -8.184349 -7.760700 -7.331636 -6.486386 -6.054312 -5.623814 -5.181414 -4.568411 -3.842292 -3.392948 -2.995713 -2.152921 -1.750056 -1.500171 -1.098485 -0.712340 -0.571547 -0.587287 -0.496378 -0.389253 -0.311930 -0.286990 -0.364193 -0.501246 -0.469265 -0.348537 -0.230764 -0.210152 -0.129050 -0.116440 -0.074319 0.145428 0.135677 0.111741 0.144525 0.180655 0.091360 -0.132027 -0.246159 -0.177095 -0.098961\n",
|
|||
|
|
" 1.1 -7.962686 -7.087498 -6.561366 -6.016710 -5.730939 -5.528127 -4.810863 -4.209383 -3.653399 -3.213554 -2.535566 -2.066046 -1.712520 -1.264314 -0.860298 -0.602669 -0.614903 -0.561939 -0.378995 -0.504141 -0.398627 -0.238058 -0.444978 -0.469644 -0.459901 -0.293588 -0.318016 -0.087909 0.055514 0.020132 0.148863 0.093388 0.211952 0.143312 0.098663 0.077947 0.052835 -0.244175 -0.122576 -0.095502 -0.007935\n",
|
|||
|
|
" 1.2 -7.164627 -6.502930 -6.301504 -5.984111 -5.758107 -5.044626 -4.525099 -4.014829 -3.526249 -2.795395 -2.334571 -1.991512 -1.525356 -1.061150 -0.855254 -0.555296 -0.733454 -0.479271 -0.453965 -0.300431 -0.288074 -0.366892 -0.439719 -0.531381 -0.311111 -0.183889 -0.144292 -0.007859 0.057563 0.090507 0.190532 0.181136 0.047525 -0.003313 0.041417 0.024368 0.015346 -0.118116 -0.068130 -0.083534 -0.230578\n",
|
|||
|
|
" 1.3 -6.910735 -6.392906 -6.249009 -5.865371 -5.399719 -4.741965 -4.246179 -3.849116 -2.996805 -2.642426 -2.369097 -1.838541 -1.294521 -1.016435 -0.741017 -0.714195 -0.407743 -0.440971 -0.430977 -0.344758 -0.293428 -0.383761 -0.497438 -0.356991 -0.181987 -0.154751 -0.071336 0.059144 0.222423 0.128787 0.119085 0.026070 0.005752 0.026546 -0.005794 0.058277 0.124700 -0.070347 -0.083443 -0.233697 -0.267379\n",
|
|||
|
|
" 1.4 -6.741591 -6.432119 -6.002663 -5.622936 -5.094812 -4.436287 -4.069312 -3.438979 -2.901473 -2.542901 -2.024077 -1.483133 -1.102942 -0.908060 -0.850046 -0.689165 -0.368535 -0.427954 -0.425124 -0.360478 -0.519030 -0.353341 -0.411722 -0.262997 -0.179051 -0.113455 0.036720 0.190526 0.168782 0.043776 0.104741 -0.012525 0.017653 0.009982 0.025448 0.144242 0.174775 -0.083443 -0.306277 -0.214970 -0.177481\n",
|
|||
|
|
" 1.5 -6.701599 -6.194661 -5.761722 -5.310171 -4.676603 -4.414144 -3.723976 -3.081149 -2.676251 -2.311890 -1.822255 -1.353488 -1.048261 -0.917087 -0.743724 -0.509610 -0.396324 -0.259298 -0.392679 -0.545751 -0.423387 -0.315085 -0.336184 -0.147511 -0.120600 -0.056099 0.115359 0.102428 0.128193 0.045228 -0.019866 -0.009444 0.045190 0.009651 0.140639 0.149439 0.166269 -0.303902 -0.214970 -0.168379 -0.046428\n",
|
|||
|
|
" 1.6 -6.315852 -5.895415 -5.460481 -4.877426 -4.552393 -3.932837 -3.419188 -2.838815 -2.571681 -2.179602 -1.521895 -1.239260 -0.930879 -0.933754 -0.760954 -0.280645 -0.340508 -0.403145 -0.508092 -0.652371 -0.309670 -0.407641 -0.221815 -0.134395 -0.059374 0.066696 0.060523 0.126426 0.130604 -0.007740 0.004290 0.061076 0.048481 0.112285 0.142319 0.025613 0.036716 -0.220916 -0.168379 -0.043472 -0.064807\n",
|
|||
|
|
" 1.7 -6.062055 -5.670567 -5.065542 -4.668120 -4.064943 -3.662565 -3.018148 -2.907099 -2.434923 -1.984377 -1.500011 -1.176344 -0.903240 -0.858799 -0.436552 -0.310228 -0.426279 -0.485630 -0.616621 -0.515259 -0.220856 -0.278050 -0.177651 -0.012370 -0.101371 0.017634 0.121933 0.117422 0.116505 0.015192 -0.014626 0.156074 0.084259 0.103048 0.012092 0.027531 0.046651 -0.122272 -0.046570 -0.064807 -0.054250\n",
|
|||
|
|
" 1.8 -5.788448 -5.313862 -4.785775 -4.318535 -3.875413 -3.330289 -3.180358 -2.621636 -2.157951 -1.753529 -1.405200 -1.120232 -0.867263 -0.762294 -0.438631 -0.358433 -0.418069 -0.757249 -0.605704 -0.371026 -0.347779 -0.144966 -0.122447 -0.164249 -0.065602 0.048670 0.065464 0.113455 0.115678 0.031351 0.134345 0.069043 0.086287 -0.030224 0.016051 0.037602 0.168541 -0.169628 -0.065061 -0.057857 -0.080879\n",
|
|||
|
|
" 1.9 -5.385303 -4.996386 -4.566375 -4.125641 -3.653800 -3.451887 -2.865480 -2.453883 -2.002749 -1.784042 -1.334527 -0.870570 -0.787681 -0.515848 -0.456897 -0.437738 -0.645229 -0.536613 -0.564848 -0.418789 -0.184838 -0.132264 -0.095274 -0.068128 -0.031084 0.062952 0.126432 0.184842 0.130419 0.133324 0.118934 0.088579 -0.046357 0.000145 0.024206 0.161431 0.149397 -0.065061 -0.057857 -0.081234 -0.033281\n",
|
|||
|
|
" 2.0 -5.370263 -4.737794 -4.361042 -3.958597 -3.638999 -3.239768 -2.707813 -2.289760 -2.014058 -1.558041 -1.208701 -1.007915 -0.765531 -0.606546 -0.481215 -0.546628 -0.665209 -0.592811 -0.474885 -0.367378 -0.098816 -0.238241 -0.141219 -0.043439 0.011959 0.084908 0.164369 0.168984 0.168659 0.100633 0.099335 -0.062958 -0.040444 0.012403 0.104009 0.160680 0.243330 -0.047814 -0.081234 -0.033281 -0.024284\n",
|
|||
|
|
"\n",
|
|||
|
|
"--- 动态网格搜索完成 ---\n",
|
|||
|
|
"\n",
|
|||
|
|
"--- 最佳参数组合 ---\n",
|
|||
|
|
" open_range_factor_1_ago: 2.0\n",
|
|||
|
|
" open_range_factor_7_ago: 1.6\n",
|
|||
|
|
" sharpe_ratio: 0.2433\n",
|
|||
|
|
"[-2, 2.0, -2, 2.0]\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA7MAAAMWCAYAAAAjz9EyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnXeYFMXWh9/unjyzObIssEQRUECSIooRFMwBxASYBTFgxIwJEQMXBcM1oygqYEBRRMUAKBJEQUFy2pxmd/JMd31/zOyww8wuu4gi9+uXp5+Hra7+zalTp7q7uqqrJSGEQEdHR0dHR0dHR0dHR0fnEEI+2Abo6Ojo6Ojo6Ojo6Ojo6DQXvTOro6Ojo6Ojo6Ojo6Ojc8ihd2Z1dHR0dHR0dHR0dHR0Djn0zqyOjo6Ojo6Ojo6Ojo7OIYfemdXR0dHR0dHR0dHR0dE55NA7szo6Ojo6Ojo6Ojo6OjqHHHpnVkdHR0dHR0dHR0dHR+eQQ+/M6ujo6Ojo6Ojo6Ojo6Bxy6J1ZHR0dHR0dHR0dHR0dnUMOvTP7L+TBBx9EkiTKy8sPtin/r9D9/tdYvHgxkiSxePHig22Kzv8TpkyZQrt27VAUhR49ehxsc3R0dBph48aNDBo0iJSUFCRJ4sMPPzzYJuno6PwPoHdmdWL47LPPePDBBw+2GTr/YmbMmMHrr79+sM3Q+X/OwoULueOOOzj22GN57bXXeOyxxw74b8yaNYupU6cecN2msnz5csaMGUOvXr0wGo1IknTQbPk78Pl8TJgwgYKCAmw2G507d+a222472Gbp/E2MHDmS3377jUcffZSZM2fSu3fvA6pfWFjIgw8+yC+//HJAdZtK3QPxhrYlS5YcFLt0dP7XMRxsA3T+XXz22WdMnz5d79DqNMiMGTPIzMxk1KhRMenHH388Xq8Xk8l0cAzT+X/F119/jSzLvPLKK39bzM2aNYu1a9dy8803/y36++Kzzz7j5Zdf5sgjj6Rdu3b8+eefB8WOv4s777yTadOmccUVV9CvXz82bNjAW2+9xZNPPnmwTdM5wHi9XpYtW8Y999zDDTfc8Lf8RmFhIRMnTqSgoOCgzNQ477zz6NChQ1z63Xffjcvlok+fPv+4TTo6/x/QO7M6Ov8gQgh8Ph9Wq/VgmwIcWHtkWcZisRwAq3T+DtxuN3a7/WCbccAoLS3FarUecg9PQqEQmqY1ye7rr7+eO++8E6vVyg033PA/15l99913GTJkCK+88ko07e8YYT8U0TSNQCDwP3NOLSsrAyA1NfXgGrIfNPXceeSRR3LkkUfGpO3cuZNdu3Zx1VVXHXLnKh2dQwV9mvG/mOrqakaNGkVqaiopKSmMHj0aj8cTl++tt96iV69eWK1W0tPTueiii9i5c2dMnu+//54LL7yQ1q1bYzabadWqFbfccgterzeaZ9SoUUyfPh0gZmoMwLZt25AkiSeffJLp06fTrl07bDYbgwYNYufOnQghePjhh8nPz8dqtXL22WdTWVkZY8NHH33E0KFDycvLw2w20759ex5++GFUVY3Jd8IJJ9CtWzdWrlxJ//79sVqttG3blhdeeCGu7Dt27GD9+vVN8uezzz5L165dsdlspKWl0bt3b2bNmrVffn/ttdc46aSTyM7Oxmw206VLF55//vk4rYKCAs444wy++OILevfujdVq5cUXX4z6+IYbbuDtt9/msMMOw2Kx0KtXL7777rs4nd27d3PFFVeQk5OD2Wyma9euvPrqq00qd1PtaUqZCgoKWLduHd9++200Pk444QSg4Xdm33///Wh8ZmZmcumll7J79+5G7VyxYgWSJPHGG2/E7fviiy+QJIn58+cDUFtby80330xBQQFms5ns7GxOPfVUVq1a1Wz/QLiTdOWVV5KTk4PFYqF79+5xdtRvD8888wxt2rTBarUycOBA1q5dG6e5fv16LrjgAtLT07FYLPTu3ZuPP/44Js/rr78enYo2fvx4srKysNvtnHvuudEbwaZSN93t999/5+KLLyYtLY0BAwYA8OuvvzJq1CjatWuHxWIhNzeXK664goqKioQamzZt2md78Hq93HjjjWRmZpKUlMRZZ53F7t27kSQpbpbHgYhlSZJ47bXXcLvd0Tism/re1LYJsGDBAgYOHEhSUhLJycn06dMnek444YQT+PTTT9m+fXv0NwoKCqLHNjdOpk6dSvv27TGbzfz+++9NKmdOTs4Be/DV1PMvED3HW61W+vbty/fff88JJ5wQbet1NMUHjSHLMkKImDSz2dzssjXlHDNq1CgcDgdbtmxh8ODB2O128vLyeOihh+Js0DSNqVOn0rVrVywWCzk5OVx77bVUVVXF5Ks7n/7www/07dsXi8VCu3btePPNN5tdhvrXg65du2I2m/n8888BePLJJ+nfvz8ZGRlYrVZ69erFBx980KDGhx9+SLdu3aLtq06nPosXL6Z3795YLBbat2/Piy++GG3ze9OUe4zGePDBB2nTpg0At99+e0xb2r59O2PGjOGwww7DarWSkZHBhRdeyLZt2+J0qqurueWWW6Ln+vz8fC6//HLKy8tZvHhxdORz9OjRcecFaF6cbN68mSFDhpCUlMQll1zS5LLuzTvvvIMQotkazfHLr7/+ysCBA7FareTn5/PII4/w2muvIUlSXP4ZM2ZE4ysvL4+xY8dSXV293+XT0flXIHT+dTzwwAMCED179hTnnXeemDFjhrjqqqsEIO64446YvI888oiQJEkMHz5czJgxQ0ycOFFkZmaKgoICUVVVFc03btw4MWTIEPHYY4+JF198UVx55ZVCURRxwQUXRPMsXbpUnHrqqQIQM2fOjG5CCLF161YBiB49eoguXbqIp59+Wtx7773CZDKJo48+Wtx9992if//+Ytq0aeLGG28UkiSJ0aNHx9h6zjnniGHDhokpU6aI559/Xlx44YUCELfddltMvoEDB4q8vDyRnZ0tbrjhBjFt2jQxYMAAAYhXXnklLm9Twvill14SgLjgggvEiy++KP7zn/+IK6+8Utx444375fc+ffqIUaNGiWeeeUY8++yzYtCgQQIQzz33XEy+Nm3aiA4dOoi0tDRx1113iRdeeEF88803QgghANGtWzeRmZkpHnroITF58mTRpk0bYbVaxW+//RbVKC4uFvn5+aJVq1bioYceEs8//7w466yzBCCeeeaZfZa9qfY0pUzz5s0T+fn5onPnztH4WLhwoRBCiG+++UYAUT0hhHjttdcEIPr06SOeeeYZcddddwmr1RoXn4lo166dGDJkSFz66NGjRVpamggEAkIIIS6++GJhMpnE+PHjxcsvvywmT54szjzzTPHWW281yzdCCOHxeMThhx8ujEajuOWWW8S0adPEcccdJwAxderUaL669nDEEUeIgoICMXnyZDFx4kSRnp4usrKyRHFxcTTv2rVrRUpKiujSpYuYPHmyeO6558Txxx8vJEkSc+fOjfNVz549xUknnSSeffZZceuttwpFUcSwYcOaVY66WO7SpYs4++yzxYwZM8T06dOFEEI8+eST4rjjjhMPPfSQeOmll8RNN90krFar6Nu3r9A0LU6jKe1h2LBhAhCXXXaZmD59uhg2bJjo3r27AMQDDzwQzXegYnnmzJniuOOOE2azORqHmzdvFkI0vW2+9tprQpIk0a1bN/Hoo4+K6dOni6uuukpcdtllQgghFi5cKHr06CEyMzOjvzFv3jwhRPPjpEuXLqJdu3bi8ccfF88884zYvn17k8tax9ixY5t0rmuIpp5/Z8yYIQBx3HHHiWnTponx48eL9PR00b59ezFw4MBovqb6oDEmTJggJEkSn3322X6Xq6nnmJEjRwqLxSI6duwoLrvsMvHcc8+JM844QwDivvvui9G86qqrhMFgEFdffbV44YUXxJ133insdrvo06dP9LwjRPh8ethhh4mcnBxx9913i+eee04cddRRQpIksXbt2maVAxCHH364yMrKEhMnThTTp08Xq1evFkIIkZ+fL8aMGSOee+458fTTT4u+ffsKQMyfPz9Oo3v37qJFixbi4YcfFlOnThXt2rUTNptNlJe
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1000x800 with 2 Axes>"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"\n",
|
|||
|
|
"# --- 主执行块 ---\n",
|
|||
|
|
"# 这是多进程代码的入口点,必须在 'if __name__ == \"__main__\":' 保护块中\n",
|
|||
|
|
"if __name__ == \"__main__\":\n",
|
|||
|
|
" # 确保 autoreload 启用 (在Jupyter Notebook中使用,纯Python脚本运行时可移除)\n",
|
|||
|
|
" # %load_ext autoreload\n",
|
|||
|
|
" # %autoreload 2\n",
|
|||
|
|
"\n",
|
|||
|
|
" # --- 全局配置 ---\n",
|
|||
|
|
" data_file_path = \"/mnt/d/PyProject/NewQuant/data/data/KQ_m@SHFE_rb/KQ_m@SHFE_rb_min60.csv\"\n",
|
|||
|
|
" initial_capital = 100000.0\n",
|
|||
|
|
" slippage_rate = 0.0000\n",
|
|||
|
|
" commission_rate = 0.0002\n",
|
|||
|
|
" global_config = {\n",
|
|||
|
|
" 'symbol': 'KQ_m@SHFE_rb',\n",
|
|||
|
|
" }\n",
|
|||
|
|
" # 确保每个合约的tick_size在这里定义或获取\n",
|
|||
|
|
" RB_TICK_SIZE = 1.0 # 螺纹钢的最小变动单位\n",
|
|||
|
|
"\n",
|
|||
|
|
" # --- 定义参数网格 ---\n",
|
|||
|
|
" param1_name = \"open_range_factor_1_ago\"\n",
|
|||
|
|
" param1_values = generate_parameter_range(start=-2, end=2, step=0.1)\n",
|
|||
|
|
" param2_name = \"open_range_factor_7_ago\"\n",
|
|||
|
|
" param2_values = generate_parameter_range(start=-2, end=2, step=0.1)\n",
|
|||
|
|
" optimization_metric = 'sharpe_ratio'\n",
|
|||
|
|
" \n",
|
|||
|
|
" # 生成所有参数组合\n",
|
|||
|
|
" param_combinations = list(itertools.product(param1_values, param2_values))\n",
|
|||
|
|
" total_combinations = len(param_combinations)\n",
|
|||
|
|
" print(f\"总计 {total_combinations} 种参数组合需要回测。\")\n",
|
|||
|
|
"\n",
|
|||
|
|
" all_results: List[Dict[str, Any]] = []\n",
|
|||
|
|
" grid_results: List[Dict[str, Any]] = []\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 准备传递给每个子进程的公共配置字典\n",
|
|||
|
|
" common_config_for_processes = {\n",
|
|||
|
|
" 'symbol': global_config['symbol'],\n",
|
|||
|
|
" 'data_path': data_file_path,\n",
|
|||
|
|
" 'initial_capital': initial_capital,\n",
|
|||
|
|
" 'slippage_rate': slippage_rate,\n",
|
|||
|
|
" 'commission_rate': commission_rate,\n",
|
|||
|
|
" 'start_time': datetime(2022, 1, 1), # 回测起始时间\n",
|
|||
|
|
" 'end_time': datetime(2025, 1, 1), # 回测结束时间\n",
|
|||
|
|
" 'roll_over_mode': True, # 保持换月模式\n",
|
|||
|
|
" 'param1_name': param1_name,\n",
|
|||
|
|
" 'param2_name': param2_name,\n",
|
|||
|
|
" 'optimization_metric': optimization_metric,\n",
|
|||
|
|
" 'strategy': SimpleLimitBuyStrategyShort\n",
|
|||
|
|
" }\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 确定要使用的进程数量 (通常是CPU核心数)\n",
|
|||
|
|
" num_processes = int(multiprocessing.cpu_count() / 2)\n",
|
|||
|
|
" if num_processes < 1:\n",
|
|||
|
|
" num_processes = 1\n",
|
|||
|
|
" \n",
|
|||
|
|
" print(f\"--- 启动多进程网格搜索,使用 {num_processes} 个进程 ---\")\n",
|
|||
|
|
"\n",
|
|||
|
|
" builtins.print = slient_print\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 创建一个进程池\n",
|
|||
|
|
" with multiprocessing.Pool(processes=num_processes) as pool:\n",
|
|||
|
|
" # 准备 run_single_backtest 函数的参数列表\n",
|
|||
|
|
" # starmap 需要一个可迭代对象,其中每个元素是传递给目标函数的参数元组\n",
|
|||
|
|
" args_for_starmap = [\n",
|
|||
|
|
" (combo, common_config_for_processes) for combo in param_combinations\n",
|
|||
|
|
" ]\n",
|
|||
|
|
" \n",
|
|||
|
|
" # 使用 starmap() 来并行执行 run_single_backtest 函数\n",
|
|||
|
|
" # starmap 是阻塞的,会等待所有任务完成并返回结果列表\n",
|
|||
|
|
" for i, result_entry in enumerate(pool.starmap(run_single_backtest, args_for_starmap)):\n",
|
|||
|
|
" if result_entry: # 确保结果不为空\n",
|
|||
|
|
" all_results.append(result_entry)\n",
|
|||
|
|
" # 仅将成功的(无错误的)结果添加到用于网格分析的列表中\n",
|
|||
|
|
" if 'error' not in result_entry:\n",
|
|||
|
|
" grid_results.append(\n",
|
|||
|
|
" {\n",
|
|||
|
|
" param1_name: result_entry.get(param1_name),\n",
|
|||
|
|
" param2_name: result_entry.get(param2_name),\n",
|
|||
|
|
" optimization_metric: result_entry.get(optimization_metric, 0.0),\n",
|
|||
|
|
" }\n",
|
|||
|
|
" )\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" # 对于失败的组合,将其优化指标设置为一个特殊值,便于识别\n",
|
|||
|
|
" grid_results.append(\n",
|
|||
|
|
" {\n",
|
|||
|
|
" param1_name: result_entry.get(param1_name),\n",
|
|||
|
|
" param2_name: result_entry.get(param2_name),\n",
|
|||
|
|
" optimization_metric: float('-inf'), # 用负无穷表示失败\n",
|
|||
|
|
" 'error_message': result_entry['error']\n",
|
|||
|
|
" }\n",
|
|||
|
|
" )\n",
|
|||
|
|
"\n",
|
|||
|
|
" builtins.print = origin_print\n",
|
|||
|
|
" print(\"\\n--- 网格搜索回测完毕 ---\")\n",
|
|||
|
|
"\n",
|
|||
|
|
" # --- 5. 后处理和最佳结果选择 ---\n",
|
|||
|
|
" if all_results:\n",
|
|||
|
|
" results_df = pd.DataFrame(all_results)\n",
|
|||
|
|
" # print(\"\\n--- 所有回测结果汇总 ---\")\n",
|
|||
|
|
" # # 确保打印时浮点数格式化\n",
|
|||
|
|
" # pd.set_option('display.float_format', lambda x: '%.4f' % x)\n",
|
|||
|
|
" # print(results_df.to_string())\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 找到最佳组合 (排除有错误的)\n",
|
|||
|
|
" # 过滤掉包含 'error' 键的行,或者 'error' 键的值不为空的行\n",
|
|||
|
|
" # 同时确保优化指标是数值,并且不为无穷大\n",
|
|||
|
|
" print(results_df.info())\n",
|
|||
|
|
" successful_results_df = results_df[(pd.to_numeric(results_df[optimization_metric], errors='coerce').notna()) &\n",
|
|||
|
|
" (pd.to_numeric(results_df[optimization_metric], errors='coerce') != float('-inf'))\n",
|
|||
|
|
" ].copy() # 使用 .copy() 避免 SettingWithCopyWarning\n",
|
|||
|
|
" \n",
|
|||
|
|
" if not successful_results_df.empty and optimization_metric in successful_results_df.columns:\n",
|
|||
|
|
" # 确保优化指标列是数值类型\n",
|
|||
|
|
" successful_results_df[optimization_metric] = pd.to_numeric(successful_results_df[optimization_metric], errors='coerce')\n",
|
|||
|
|
"\n",
|
|||
|
|
" if not successful_results_df.empty and optimization_metric in successful_results_df.columns:\n",
|
|||
|
|
" # 过滤掉NaN值,如果所有夏普比率都是NaN,则可能没有有效结果\n",
|
|||
|
|
" normal_results = successful_results_df[(results_df['total_trades'] > 200) & (results_df['total_return'] > 0)]\n",
|
|||
|
|
" if len(normal_results) > 0:\n",
|
|||
|
|
" best_result = normal_results.loc[(normal_results[optimization_metric].idxmax())]\n",
|
|||
|
|
" print(\"\\n--- 最优参数组合 (按夏普比率) ---\")\n",
|
|||
|
|
" print(best_result)\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" print('ERROR!!!!!!!!!!!!!!!!!!!!')\n",
|
|||
|
|
" \n",
|
|||
|
|
" # 找到最大值的索引\n",
|
|||
|
|
" # best_result = successful_results_df.loc[successful_results_df[optimization_metric].idxmax()]\n",
|
|||
|
|
" # print(f\"\\n--- 最优参数组合 (按 {optimization_metric}) ---\")\n",
|
|||
|
|
" # print(best_result)\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 导出到CSV\n",
|
|||
|
|
" output_filename = f\"grid_search_results_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv\"\n",
|
|||
|
|
" # results_df.to_csv(output_filename, index=False, encoding='utf-8')\n",
|
|||
|
|
" # print(f\"\\n所有结果已导出到: {output_filename}\")\n",
|
|||
|
|
"\n",
|
|||
|
|
" # 打印枢轴表\n",
|
|||
|
|
" grid_df = pd.DataFrame(grid_results)\n",
|
|||
|
|
" # 确保优化指标列是数值类型,非数值的(如 -inf)在pandas中可能被正确处理\n",
|
|||
|
|
" grid_df[optimization_metric] = pd.to_numeric(grid_df[optimization_metric], errors='coerce')\n",
|
|||
|
|
"\n",
|
|||
|
|
" pivot_table = grid_df.pivot_table(\n",
|
|||
|
|
" index=param1_name, columns=param2_name, values=optimization_metric\n",
|
|||
|
|
" )\n",
|
|||
|
|
" print(f\"\\n{optimization_metric} 网格结果 (Pivoted):\")\n",
|
|||
|
|
" print(pivot_table.to_string())\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" print(f\"\\n没有成功的组合结果可供分析,或优化指标 '{optimization_metric}' 不在结果中,或所有组合均失败。\")\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" print(\"没有可用的回测结果。\")\n",
|
|||
|
|
" print(\"\\n--- 动态网格搜索完成 ---\")\n",
|
|||
|
|
"\n",
|
|||
|
|
" # --- 6. 可视化 (依赖 GridSearchAnalyzer) ---\n",
|
|||
|
|
" if grid_results:\n",
|
|||
|
|
" grid_analyzer = GridSearchAnalyzer(grid_results, optimization_metric)\n",
|
|||
|
|
" grid_analyzer.find_best_parameters() # 这会找到并打印最佳参数\n",
|
|||
|
|
" grid_analyzer.plot_heatmap() # 这会绘制热力图\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" print(\"\\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
|
|||
|
|
}
|