443 lines
107 KiB
Plaintext
443 lines
107 KiB
Plaintext
|
|
{
|
|||
|
|
"cells": [
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"id": "522f09ca7b3fe929",
|
|||
|
|
"metadata": {
|
|||
|
|
"ExecuteTime": {
|
|||
|
|
"end_time": "2025-11-29T09:25:24.270690Z",
|
|||
|
|
"start_time": "2025-11-29T09:25:24.252025Z"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"source": [
|
|||
|
|
"import sys\n",
|
|||
|
|
"\n",
|
|||
|
|
"if '/mnt/d/PyProject/NewQuant/' not in sys.path:\n",
|
|||
|
|
" sys.path.append('/mnt/d/PyProject/NewQuant/')\n",
|
|||
|
|
"\n",
|
|||
|
|
"%load_ext autoreload\n",
|
|||
|
|
"%autoreload 2\n",
|
|||
|
|
"\n"
|
|||
|
|
],
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"The autoreload extension is already loaded. To reload it, use:\n",
|
|||
|
|
" %reload_ext autoreload\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"execution_count": 6
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"id": "4f7e4b438cea750e",
|
|||
|
|
"metadata": {
|
|||
|
|
"ExecuteTime": {
|
|||
|
|
"end_time": "2025-11-29T09:25:24.290336Z",
|
|||
|
|
"start_time": "2025-11-29T09:25:24.270690Z"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"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",
|
|||
|
|
"\n",
|
|||
|
|
"import builtins\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"origin_print = print\n",
|
|||
|
|
"\n"
|
|||
|
|
],
|
|||
|
|
"outputs": [],
|
|||
|
|
"execution_count": 7
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"metadata": {
|
|||
|
|
"ExecuteTime": {
|
|||
|
|
"end_time": "2025-11-29T09:25:24.311582Z",
|
|||
|
|
"start_time": "2025-11-29T09:25:24.295003Z"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"source": [
|
|||
|
|
"\n",
|
|||
|
|
"def slient_print(*args):\n",
|
|||
|
|
" pass\n"
|
|||
|
|
],
|
|||
|
|
"id": "f903fd2761d446cd",
|
|||
|
|
"outputs": [],
|
|||
|
|
"execution_count": 8
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"metadata": {
|
|||
|
|
"ExecuteTime": {
|
|||
|
|
"end_time": "2025-11-29T09:27:56.898865Z",
|
|||
|
|
"start_time": "2025-11-29T09:25:24.318062Z"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"source": [
|
|||
|
|
"from src.strategies.Spectral.utils import run_single_backtest\n",
|
|||
|
|
"# --- 主执行块 ---\n",
|
|||
|
|
"# 这是多进程代码的入口点,必须在 'if __name__ == \"__main__\":' 保护块中\n",
|
|||
|
|
"# 确保 autoreload 启用 (在Jupyter Notebook中使用,纯Python脚本运行时可移除)\n",
|
|||
|
|
"# %load_ext autoreload\n",
|
|||
|
|
"# %autoreload 2\n",
|
|||
|
|
"\n",
|
|||
|
|
"from src.strategies.Spectral.SpectralTrendStrategy2 import SpectralTrendStrategy\n",
|
|||
|
|
"\n",
|
|||
|
|
"# --- 全局配置 ---\n",
|
|||
|
|
"data_file_path = \"D:/PyProject/NewQuant/data/data/KQ_m@CZCE_TA/KQ_m@CZCE_TA_min15.csv\"\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"initial_capital = 10000.0\n",
|
|||
|
|
"slippage_rate = 0.0000\n",
|
|||
|
|
"commission_rate = 0.0000\n",
|
|||
|
|
"global_config = {\n",
|
|||
|
|
" 'symbol': 'TA',\n",
|
|||
|
|
"}\n",
|
|||
|
|
"# 确保每个合约的tick_size在这里定义或获取\n",
|
|||
|
|
"TICK_SIZE = 1.0 # 螺纹钢的最小变动单位\n",
|
|||
|
|
"\n",
|
|||
|
|
"# --- 定义参数网格 ---\n",
|
|||
|
|
"param1_name = \"spectral_window_days\"\n",
|
|||
|
|
"param1_values = generate_parameter_range(start=2, end=12, step=1)\n",
|
|||
|
|
"# param1_name = \"exit_threshold\"\n",
|
|||
|
|
"# param1_values = generate_parameter_range(start=0.1, end=0.9, step=0.1)\n",
|
|||
|
|
"param2_name = \"trend_strength_threshold\"\n",
|
|||
|
|
"param2_values = generate_parameter_range(start=0.1, end=0.9, step=0.1)\n",
|
|||
|
|
"# param2_name = \"dominance_multiplier\"\n",
|
|||
|
|
"# param2_values = generate_parameter_range(start=0, end=5, step=0.5)\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",
|
|||
|
|
" 'main_symbol': global_config['symbol'],\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(2024, 6, 1), # 回测结束时间\n",
|
|||
|
|
" 'roll_over_mode': True, # 保持换月模式\n",
|
|||
|
|
" 'param1_name': param1_name,\n",
|
|||
|
|
" 'param2_name': param2_name,\n",
|
|||
|
|
" 'strategy': SpectralTrendStrategy,\n",
|
|||
|
|
" 'order_direction': ['BUY', 'SELL'],\n",
|
|||
|
|
" # 'hawkes_entry_percent': 0.9,\n",
|
|||
|
|
" 'stop_loss_tick': 5\n",
|
|||
|
|
"}\n",
|
|||
|
|
"\n",
|
|||
|
|
"# 确定要使用的进程数量 (通常是CPU核心数)\n",
|
|||
|
|
"num_processes = int(multiprocessing.cpu_count() * 0.6)\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",
|
|||
|
|
" run_single_backtest(*args_for_starmap[0])\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",
|
|||
|
|
" # 成功:直接解压\n",
|
|||
|
|
" grid_results.append({\n",
|
|||
|
|
" param1_name: result_entry.get(param1_name),\n",
|
|||
|
|
" param2_name: result_entry.get(param2_name),\n",
|
|||
|
|
" **result_entry,\n",
|
|||
|
|
" })\n",
|
|||
|
|
" else:\n",
|
|||
|
|
" # 失败:解压并添加标记\n",
|
|||
|
|
" grid_results.append({\n",
|
|||
|
|
" param1_name: result_entry.get(param1_name),\n",
|
|||
|
|
" param2_name: result_entry.get(param2_name),\n",
|
|||
|
|
" **result_entry,\n",
|
|||
|
|
" 'optimization_score': float('-inf'), # 覆盖优化指标\n",
|
|||
|
|
" })\n",
|
|||
|
|
"\n",
|
|||
|
|
"builtins.print = origin_print\n",
|
|||
|
|
"print(\"\\n--- 网格搜索回测完毕 ---\")"
|
|||
|
|
],
|
|||
|
|
"id": "aed5938660e42b20",
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"总计 99 种参数组合需要回测。\n",
|
|||
|
|
"--- 启动多进程网格搜索,使用 12 个进程 ---\n",
|
|||
|
|
"\n",
|
|||
|
|
"--- 网格搜索回测完毕 ---\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"execution_count": 9
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"metadata": {
|
|||
|
|
"ExecuteTime": {
|
|||
|
|
"end_time": "2025-11-29T09:31:41.821814Z",
|
|||
|
|
"start_time": "2025-11-29T09:31:41.641532Z"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"source": [
|
|||
|
|
"optimization_metric = 'sharpe_ratio'\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(\n",
|
|||
|
|
" '-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],\n",
|
|||
|
|
" 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[\n",
|
|||
|
|
" (results_df['total_trades'] > 200)\n",
|
|||
|
|
" # &\n",
|
|||
|
|
" # (results_df['profit_factor'] < 3.)\n",
|
|||
|
|
" ]\n",
|
|||
|
|
" if len(normal_results) > 0:\n",
|
|||
|
|
" best_result = normal_results.loc[(normal_results[optimization_metric].idxmax())]\n",
|
|||
|
|
" print(f\"\\n--- 最优参数组合 (按{optimization_metric}) ---\")\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没有生成任何网格搜索结果,无法进行分析。\")"
|
|||
|
|
],
|
|||
|
|
"id": "a1c18a2776fcaba2",
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"<class 'pandas.core.frame.DataFrame'>\n",
|
|||
|
|
"RangeIndex: 99 entries, 0 to 98\n",
|
|||
|
|
"Data columns (total 42 columns):\n",
|
|||
|
|
" # Column Non-Null Count Dtype \n",
|
|||
|
|
"--- ------ -------------- ----- \n",
|
|||
|
|
" 0 main_symbol 99 non-null object \n",
|
|||
|
|
" 1 trade_volume 99 non-null int64 \n",
|
|||
|
|
" 2 spectral_window_days 99 non-null int64 \n",
|
|||
|
|
" 3 trend_strength_threshold 99 non-null float64\n",
|
|||
|
|
" 4 order_direction 99 non-null object \n",
|
|||
|
|
" 5 enable_log 99 non-null bool \n",
|
|||
|
|
" 6 low_freq_days 99 non-null int64 \n",
|
|||
|
|
" 7 high_freq_days 99 non-null int64 \n",
|
|||
|
|
" 8 exit_threshold 99 non-null float64\n",
|
|||
|
|
" 9 初始资金 99 non-null float64\n",
|
|||
|
|
" 10 最终资金 99 non-null float64\n",
|
|||
|
|
" 11 总收益率 99 non-null float64\n",
|
|||
|
|
" 12 年化收益率 99 non-null float64\n",
|
|||
|
|
" 13 最大回撤 99 non-null float64\n",
|
|||
|
|
" 14 夏普比率 99 non-null float64\n",
|
|||
|
|
" 15 卡玛比率 99 non-null float64\n",
|
|||
|
|
" 16 总交易次数 99 non-null int64 \n",
|
|||
|
|
" 17 交易成本 99 non-null float64\n",
|
|||
|
|
" 18 总实现盈亏 99 non-null float64\n",
|
|||
|
|
" 19 胜率 99 non-null float64\n",
|
|||
|
|
" 20 盈亏比 99 non-null float64\n",
|
|||
|
|
" 21 盈利交易次数 99 non-null int64 \n",
|
|||
|
|
" 22 亏损交易次数 99 non-null int64 \n",
|
|||
|
|
" 23 平均每次盈利 99 non-null float64\n",
|
|||
|
|
" 24 平均每次亏损 99 non-null float64\n",
|
|||
|
|
" 25 initial_capital 99 non-null float64\n",
|
|||
|
|
" 26 final_capital 99 non-null float64\n",
|
|||
|
|
" 27 total_return 99 non-null float64\n",
|
|||
|
|
" 28 annualized_return 99 non-null float64\n",
|
|||
|
|
" 29 max_drawdown 99 non-null float64\n",
|
|||
|
|
" 30 sharpe_ratio 99 non-null float64\n",
|
|||
|
|
" 31 calmar_ratio 99 non-null float64\n",
|
|||
|
|
" 32 sortino_ratio 99 non-null float64\n",
|
|||
|
|
" 33 total_trades 99 non-null int64 \n",
|
|||
|
|
" 34 transaction_costs 99 non-null float64\n",
|
|||
|
|
" 35 total_realized_pnl 99 non-null float64\n",
|
|||
|
|
" 36 win_rate 99 non-null float64\n",
|
|||
|
|
" 37 profit_loss_ratio 99 non-null float64\n",
|
|||
|
|
" 38 winning_trades_count 99 non-null int64 \n",
|
|||
|
|
" 39 losing_trades_count 99 non-null int64 \n",
|
|||
|
|
" 40 avg_profit_per_trade 99 non-null float64\n",
|
|||
|
|
" 41 avg_loss_per_trade 99 non-null float64\n",
|
|||
|
|
"dtypes: bool(1), float64(29), int64(10), object(2)\n",
|
|||
|
|
"memory usage: 31.9+ KB\n",
|
|||
|
|
"None\n",
|
|||
|
|
"\n",
|
|||
|
|
"--- 最优参数组合 (按sharpe_ratio) ---\n",
|
|||
|
|
"main_symbol TA\n",
|
|||
|
|
"trade_volume 1\n",
|
|||
|
|
"spectral_window_days 3\n",
|
|||
|
|
"trend_strength_threshold 0.6\n",
|
|||
|
|
"order_direction [BUY, SELL]\n",
|
|||
|
|
"enable_log False\n",
|
|||
|
|
"low_freq_days 3\n",
|
|||
|
|
"high_freq_days 1\n",
|
|||
|
|
"exit_threshold 0.3\n",
|
|||
|
|
"初始资金 10000.0\n",
|
|||
|
|
"最终资金 12033.0\n",
|
|||
|
|
"总收益率 0.2033\n",
|
|||
|
|
"年化收益率 0.054553\n",
|
|||
|
|
"最大回撤 0.157829\n",
|
|||
|
|
"夏普比率 0.151252\n",
|
|||
|
|
"卡玛比率 0.345649\n",
|
|||
|
|
"总交易次数 228\n",
|
|||
|
|
"交易成本 0.0\n",
|
|||
|
|
"总实现盈亏 2032.0\n",
|
|||
|
|
"胜率 0.587719\n",
|
|||
|
|
"盈亏比 0.91339\n",
|
|||
|
|
"盈利交易次数 67\n",
|
|||
|
|
"亏损交易次数 47\n",
|
|||
|
|
"平均每次盈利 130.731343\n",
|
|||
|
|
"平均每次亏损 -143.12766\n",
|
|||
|
|
"initial_capital 10000.0\n",
|
|||
|
|
"final_capital 12033.0\n",
|
|||
|
|
"total_return 0.2033\n",
|
|||
|
|
"annualized_return 0.054553\n",
|
|||
|
|
"max_drawdown 0.157829\n",
|
|||
|
|
"sharpe_ratio 0.151252\n",
|
|||
|
|
"calmar_ratio 0.345649\n",
|
|||
|
|
"sortino_ratio 0.193264\n",
|
|||
|
|
"total_trades 228\n",
|
|||
|
|
"transaction_costs 0.0\n",
|
|||
|
|
"total_realized_pnl 2032.0\n",
|
|||
|
|
"win_rate 0.587719\n",
|
|||
|
|
"profit_loss_ratio 0.91339\n",
|
|||
|
|
"winning_trades_count 67\n",
|
|||
|
|
"losing_trades_count 47\n",
|
|||
|
|
"avg_profit_per_trade 130.731343\n",
|
|||
|
|
"avg_loss_per_trade -143.12766\n",
|
|||
|
|
"Name: 14, dtype: object\n",
|
|||
|
|
"\n",
|
|||
|
|
"--- 动态网格搜索完成 ---\n",
|
|||
|
|
"\n",
|
|||
|
|
"--- 最佳参数组合 ---\n",
|
|||
|
|
" spectral_window_days: 4\n",
|
|||
|
|
" trend_strength_threshold: 0.7\n",
|
|||
|
|
" sharpe_ratio: 0.2012\n",
|
|||
|
|
"[2, 12, 0.1, 0.9]\n"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"<Figure size 1000x800 with 2 Axes>"
|
|||
|
|
],
|
|||
|
|
"image/png": "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
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data",
|
|||
|
|
"jetTransient": {
|
|||
|
|
"display_id": null
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"execution_count": 11
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"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
|
|||
|
|
}
|