{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. 导入依赖" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:07:39.837396Z", "start_time": "2026-03-08T15:07:39.834964Z" } }, "source": [ "import os\n", "from datetime import datetime\n", "from typing import List\n", "\n", "import polars as pl\n", "\n", "from src.factors import FactorEngine\n", "from src.training import (\n", " DateSplitter,\n", " LightGBMModel,\n", " STFilter,\n", " StandardScaler,\n", " StockFilterConfig,\n", " StockPoolManager,\n", " Trainer,\n", " Winsorizer,\n", " NullFiller,\n", ")\n", "from src.training.config import TrainingConfig" ], "outputs": [], "execution_count": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. 定义辅助函数" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:07:39.849909Z", "start_time": "2026-03-08T15:07:39.843845Z" } }, "cell_type": "code", "source": [ "def create_factors_with_strings(engine: FactorEngine, factor_definitions: dict, label_factor: dict) -> List[str]:\n", " print(\"=\" * 80)\n", " print(\"使用字符串表达式定义因子\")\n", " print(\"=\" * 80)\n", "\n", " # 注册所有特征因子\n", " print(\"\\n注册特征因子:\")\n", " for name, expr in factor_definitions.items():\n", " engine.add_factor(name, expr)\n", " print(f\" - {name}: {expr}\")\n", "\n", " # 注册 label 因子\n", " print(\"\\n注册 Label 因子:\")\n", " for name, expr in label_factor.items():\n", " engine.add_factor(name, expr)\n", " print(f\" - {name}: {expr}\")\n", "\n", " # 从字典自动获取特征列\n", " feature_cols = list(factor_definitions.keys())\n", "\n", " print(f\"\\n特征因子数: {len(feature_cols)}\")\n", " print(f\"Label: {list(label_factor.keys())[0]}\")\n", " print(f\"已注册因子总数: {len(engine.list_registered())}\")\n", "\n", " return feature_cols\n", "\n", "\n", "def prepare_data(\n", " engine: FactorEngine,\n", " feature_cols: List[str],\n", " start_date: str,\n", " end_date: str,\n", ") -> pl.DataFrame:\n", " print(\"\\n\" + \"=\" * 80)\n", " print(\"准备数据\")\n", " print(\"=\" * 80)\n", "\n", " # 计算因子(全市场数据)\n", " print(f\"\\n计算因子: {start_date} - {end_date}\")\n", " factor_names = feature_cols + [LABEL_NAME] # 包含 label\n", "\n", " data = engine.compute(\n", " factor_names=factor_names,\n", " start_date=start_date,\n", " end_date=end_date,\n", " )\n", "\n", " print(f\"数据形状: {data.shape}\")\n", " print(f\"数据列: {data.columns}\")\n", " print(f\"\\n前5行预览:\")\n", " print(data.head())\n", "\n", " return data" ], "outputs": [], "execution_count": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. 配置参数\n", "\n", "### 3.1 因子定义" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:07:39.857927Z", "start_time": "2026-03-08T15:07:39.853639Z" } }, "cell_type": "code", "source": [ "# 特征因子定义字典:新增因子只需在此处添加一行\n", "LABEL_NAME = 'future_return_5'\n", "\n", "FACTOR_DEFINITIONS = {\n", " # ================= 1. 价格与趋势因子 (Trend & Momentum) =================\n", " \"ma_5\": \"ts_mean(close, 5)\",\n", " \"ma_20\": \"ts_mean(close, 20)\",\n", " \"ma_ratio_5_20\": \"ts_mean(close, 5) / (ts_mean(close, 20) + 1e-8) - 1\", # 均线发散度\n", " \"bias_10\": \"close / (ts_mean(close, 10) + 1e-8) - 1\", # 10日乖离率(反转/动量)\n", " \"high_low_ratio\": \"(close - ts_min(low, 20)) / (ts_max(high, 20) - ts_min(low, 20) + 1e-8)\", # 价格在近20日的位置(威廉指标变形)\n", " \"bbi_ratio\": \"(ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / (4 * close + 1e-8)\", # BBI 多空指标比率\n", "\n", " # ================= 2. 收益率与波动率因子 (Return & Volatility) =================\n", " \"return_5\": \"(close / ts_delay(close, 5)) - 1\", # 5日动量/反转\n", " \"return_10\": \"(close / ts_delay(close, 10)) - 1\",\n", " \"return_20\": \"(close / ts_delay(close, 20)) - 1\",\n", " \"return_diff_5_10\": \"(close / ts_delay(close, 5)) - (close / ts_delay(close, 10))\", # 收益率加速/减速趋势\n", " \"volatility_5\": \"ts_std(close, 5)\",\n", " \"volatility_20\": \"ts_std(close, 20)\",\n", " \"volatility_ratio\": \"ts_std(close, 5) / (ts_std(close, 20) + 1e-8)\", # 波动率期限结构(近期是否剧烈震荡)\n", " \"std_return_5\": \"ts_std((close / ts_delay(close, 1)) - 1, 5)\", # 5日真实收益率波动率\n", " \"std_return_20\": \"ts_std((close / ts_delay(close, 1)) - 1, 20)\", # 20日真实收益率波动率\n", "\n", " # ================= 3. 量能与流动性因子 (Volume & Liquidity) =================\n", " \"volume_ratio_5_20\": \"ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\", # 相对放量指标\n", " \"volume_change_rate\": \"ts_mean(vol, 2) / (ts_mean(vol, 10) + 1e-8) - 1\", # 短期成交量异动\n", " \"turnover_rate_mean_5\": \"ts_mean(turnover_rate, 5)\", # 5日平均换手率(活跃度)\n", " \"turnover_rate_std_20\": \"ts_std(turnover_rate, 20)\", # 换手率波动率(炒作情绪稳定性)\n", " \"turnover_deviation\": \"(turnover_rate - ts_mean(turnover_rate, 10)) / (ts_std(turnover_rate, 10) + 1e-8)\", # 换手率偏离度\n", " # \"amihud_illiq_20\": \"ts_mean(abs((close / ts_delay(close, 1)) - 1) / (amount + 1e-8), 20)\", # Amihud非流动性指标(核心Alpha)\n", "\n", " # ================= 4. 截面排名因子 (Cross-Sectional Rank) =================\n", " \"market_cap_rank\": \"cs_rank(total_mv)\", # 市值规模排名(Size因子)\n", " \"turnover_rank\": \"cs_rank(turnover_rate)\", # 当日换手率全市场排名\n", " \"return_5_rank\": \"cs_rank((close / ts_delay(close, 5)) - 1)\", # 5日收益率截面排名(横向比价)\n", "\n", " # # ================= 5. 财务质量因子 (Quality) =================\n", " # # 注:底层数据引擎需确保 n_income 等字段已就绪,或者映射到 fina_indicator\n", " # \"roe\": \"n_income / (total_hldr_eqy_exc_min_int + 1e-8)\", # ROE 净资产收益率 (盈利效率)\n", " # \"roa\": \"n_income / (total_assets + 1e-8)\", # ROA 总资产收益率\n", " # \"profit_margin\": \"n_income / (revenue + 1e-8)\", # 销售净利率 (定价权)\n", " # \"debt_to_asset\": \"total_liab / (total_assets + 1e-8)\", # 资产负债率 (杠杆/破产风险)\n", " # \"cash_to_liab\": \"money_cap / (total_liab + 1e-8)\", # 现金流负债比 (流动性风险)\n", " #\n", " # # ================= 6. 财务估值因子 (Value / Yield) =================\n", " # # 注:经典量化不用 PE (Price/Earn),而是用 EP (Earn/Price),因为亏损公司的 PE 是负的或无穷大,EP 可以平滑处理。\n", " # \"EP\": \"n_income / (total_mv * 10000 + 1e-8)\", # 盈利收益率 (Earnings Yield, 相当于 1/PE) *注:Tushare市值需乘10000对齐单位\n", " # \"BP\": \"total_hldr_eqy_exc_min_int / (total_mv * 10000 + 1e-8)\", # 账面市值比 (Book to Price, 相当于 1/PB)\n", " # \"CP\": \"n_cashflow_act / (total_mv * 10000 + 1e-8)\", # 现金流收益率 (Cashflow Yield)\n", " # \"SP\": \"revenue / (total_mv * 10000 + 1e-8)\", # 销售收益率 (Sales to Price, 相当于 1/PS)\n", " #\n", " # # 估值截面排名 (直接提取全市场最便宜、最赚钱的公司)\n", " # \"EP_rank\": \"cs_rank(n_income / (total_mv + 1e-8))\",\n", " # \"BP_rank\": \"cs_rank(total_hldr_eqy_exc_min_int / (total_mv + 1e-8))\",\n", "}\n", "\n", "# Label 因子定义(不参与训练,用于计算目标)\n", "LABEL_FACTOR = {\n", " LABEL_NAME: \"(ts_delay(close, -5) / close) - 1\", # 未来5日收益率\n", "}" ], "outputs": [], "execution_count": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 训练参数配置" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:07:39.865371Z", "start_time": "2026-03-08T15:07:39.861138Z" } }, "source": [ "# 日期范围配置(正确的 train/val/test 三分法)\n", "# Train: 用于训练模型参数\n", "# Val: 用于验证/早停/调参(位于 train 之后,test 之前)\n", "# Test: 仅用于最终评估,完全独立于训练过程\n", "TRAIN_START = \"20200101\"\n", "TRAIN_END = \"20231231\"\n", "VAL_START = \"20240101\"\n", "VAL_END = \"20241231\"\n", "TEST_START = \"20250101\"\n", "TEST_END = \"20251231\"\n", "\n", "# 模型参数配置\n", "MODEL_PARAMS = {\n", " \"objective\": \"regression\",\n", " \"metric\": \"mae\", # 改为 MAE,对异常值更稳健\n", " # 树结构控制(防过拟合核心)\n", " \"num_leaves\": 20, # 从31降为20,降低模型复杂度\n", " \"max_depth\": 4, # 显式限制深度,防止过度拟合噪声\n", " \"min_child_samples\": 50, # 叶子最小样本数,防止学习极端样本\n", " \"min_child_weight\": 0.001,\n", " # 学习参数\n", " \"learning_rate\": 0.01, # 降低学习率,配合更多树\n", " \"n_estimators\": 1000, # 增加树数量,配合早停\n", " # 采样策略(关键防过拟合)\n", " \"subsample\": 0.8, # 每棵树随机采样80%数据(行采样)\n", " \"subsample_freq\": 5, # 每5轮迭代进行一次 subsample\n", " \"colsample_bytree\": 0.8, # 每棵树随机选择80%特征(列采样)\n", " # 正则化\n", " \"reg_alpha\": 0.1, # L1正则,增加稀疏性\n", " \"reg_lambda\": 1.0, # L2正则,平滑权重\n", " # 数值稳定性\n", " \"verbose\": -1,\n", " \"random_state\": 42,\n", "}\n", "\n", "# 数据处理器配置\n", "PROCESSOR_CONFIGS = [\n", " {\"name\": \"winsorizer\", \"params\": {\"lower\": 0.01, \"upper\": 0.99}},\n", " {\"name\": \"cs_standard_scaler\", \"params\": {}},\n", "]\n", "\n", "# 股票池筛选配置\n", "STOCK_FILTER_CONFIG = {\n", " \"exclude_cyb\": True, # 排除创业板\n", " \"exclude_kcb\": True, # 排除科创板\n", " \"exclude_bj\": True, # 排除北交所\n", " \"exclude_st\": True, # 排除ST股票\n", "}\n", "\n", "# 输出配置(相对于本文件所在目录)\n", "OUTPUT_DIR = \"output\"\n", "SAVE_PREDICTIONS = True\n", "PERSIST_MODEL = False\n", "\n", "# Top N 配置:每日推荐股票数量\n", "TOP_N = 5 # 可调整为 10, 20 等" ], "outputs": [], "execution_count": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. 训练流程\n", "\n", "### 4.1 初始化组件" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:07:47.887413Z", "start_time": "2026-03-08T15:07:39.874187Z" } }, "source": [ "print(\"\\n\" + \"=\" * 80)\n", "print(\"LightGBM 回归模型训练\")\n", "print(\"=\" * 80)\n", "\n", "# 1. 创建 FactorEngine\n", "print(\"\\n[1] 创建 FactorEngine\")\n", "engine = FactorEngine()\n", "\n", "# 2. 使用字符串表达式定义因子\n", "print(\"\\n[2] 定义因子(字符串表达式)\")\n", "feature_cols = create_factors_with_strings(engine, FACTOR_DEFINITIONS, LABEL_FACTOR)\n", "target_col = LABEL_NAME\n", "\n", "# 3. 准备数据(使用模块级别的日期配置)\n", "print(\"\\n[3] 准备数据\")\n", "\n", "data = prepare_data(\n", " engine=engine,\n", " feature_cols=feature_cols,\n", " start_date=TRAIN_START,\n", " end_date=TEST_END,\n", ")\n", "\n", "# 4. 打印配置信息\n", "print(f\"\\n[配置] 训练期: {TRAIN_START} - {TRAIN_END}\")\n", "print(f\"[配置] 验证期: {VAL_START} - {VAL_END}\")\n", "print(f\"[配置] 测试期: {TEST_START} - {TEST_END}\")\n", "print(f\"[配置] 特征数: {len(feature_cols)}\")\n", "print(f\"[配置] 目标变量: {target_col}\")\n", "\n", "# 5. 创建模型\n", "model = LightGBMModel(params=MODEL_PARAMS)\n", "\n", "# 6. 创建数据处理器\n", "processors = [\n", " NullFiller(strategy=\"mean\"),\n", " Winsorizer(**PROCESSOR_CONFIGS[0][\"params\"]),\n", " StandardScaler(exclude_cols=[\"ts_code\", \"trade_date\", target_col]),\n", "]\n", "\n", "# 7. 创建数据划分器(正确的 train/val/test 三分法)\n", "# Train: 训练模型参数 | Val: 验证/早停 | Test: 最终评估\n", "splitter = DateSplitter(\n", " train_start=TRAIN_START,\n", " train_end=TRAIN_END,\n", " val_start=VAL_START,\n", " val_end=VAL_END,\n", " test_start=TEST_START,\n", " test_end=TEST_END,\n", ")\n", "\n", "# 8. 创建股票池管理器\n", "pool_manager = StockPoolManager(\n", " filter_config=StockFilterConfig(**STOCK_FILTER_CONFIG),\n", " selector_config=None, # 暂时不启用市值选择\n", " data_router=engine.router,\n", ")\n", "\n", "# 9. 创建 ST 股票过滤器\n", "st_filter = STFilter(\n", " data_router=engine.router,\n", ")\n", "\n", "# 10. 创建训练器\n", "trainer = Trainer(\n", " model=model,\n", " pool_manager=pool_manager,\n", " processors=processors,\n", " filters=[st_filter],\n", " splitter=splitter,\n", " target_col=target_col,\n", " feature_cols=feature_cols,\n", " persist_model=PERSIST_MODEL,\n", ")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "================================================================================\n", "LightGBM 回归模型训练\n", "================================================================================\n", "\n", "[1] 创建 FactorEngine\n", "\n", "[2] 定义因子(字符串表达式)\n", "================================================================================\n", "使用字符串表达式定义因子\n", "================================================================================\n", "\n", "注册特征因子:\n", " - ma_5: ts_mean(close, 5)\n", " - ma_20: ts_mean(close, 20)\n", " - ma_ratio_5_20: ts_mean(close, 5) / (ts_mean(close, 20) + 1e-8) - 1\n", " - bias_10: close / (ts_mean(close, 10) + 1e-8) - 1\n", " - high_low_ratio: (close - ts_min(low, 20)) / (ts_max(high, 20) - ts_min(low, 20) + 1e-8)\n", " - bbi_ratio: (ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / (4 * close + 1e-8)\n", " - return_5: (close / ts_delay(close, 5)) - 1\n", " - return_10: (close / ts_delay(close, 10)) - 1\n", " - return_20: (close / ts_delay(close, 20)) - 1\n", " - return_diff_5_10: (close / ts_delay(close, 5)) - (close / ts_delay(close, 10))\n", " - volatility_5: ts_std(close, 5)\n", " - volatility_20: ts_std(close, 20)\n", " - volatility_ratio: ts_std(close, 5) / (ts_std(close, 20) + 1e-8)\n", " - std_return_5: ts_std((close / ts_delay(close, 1)) - 1, 5)\n", " - std_return_20: ts_std((close / ts_delay(close, 1)) - 1, 20)\n", " - volume_ratio_5_20: ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\n", " - volume_change_rate: ts_mean(vol, 2) / (ts_mean(vol, 10) + 1e-8) - 1\n", " - turnover_rate_mean_5: ts_mean(turnover_rate, 5)\n", " - turnover_rate_std_20: ts_std(turnover_rate, 20)\n", " - turnover_deviation: (turnover_rate - ts_mean(turnover_rate, 10)) / (ts_std(turnover_rate, 10) + 1e-8)\n", " - market_cap_rank: cs_rank(total_mv)\n", " - turnover_rank: cs_rank(turnover_rate)\n", " - return_5_rank: cs_rank((close / ts_delay(close, 5)) - 1)\n", "\n", "注册 Label 因子:\n", " - future_return_5: (ts_delay(close, -5) / close) - 1\n", "\n", "特征因子数: 23\n", "Label: future_return_5\n", "已注册因子总数: 24\n", "\n", "[3] 准备数据\n", "\n", "================================================================================\n", "准备数据\n", "================================================================================\n", "\n", "计算因子: 20200101 - 20251231\n", "数据形状: (7044952, 32)\n", "数据列: ['ts_code', 'trade_date', 'high', 'close', 'low', 'vol', 'turnover_rate', 'total_mv', 'ma_5', 'ma_20', 'ma_ratio_5_20', 'bias_10', 'high_low_ratio', 'bbi_ratio', 'return_5', 'return_10', 'return_20', 'return_diff_5_10', 'volatility_5', 'volatility_20', 'volatility_ratio', 'std_return_5', 'std_return_20', 'volume_ratio_5_20', 'volume_change_rate', 'turnover_rate_mean_5', 'turnover_rate_std_20', 'turnover_deviation', 'market_cap_rank', 'turnover_rank', 'return_5_rank', 'future_return_5']\n", "\n", "前5行预览:\n", "shape: (5, 32)\n", "┌───────────┬────────────┬───────┬───────┬───┬─────────────┬─────────────┬────────────┬────────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ close ┆ … ┆ market_cap_ ┆ turnover_ra ┆ return_5_r ┆ future_ret │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ rank ┆ nk ┆ ank ┆ urn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪═════════════╪═════════════╪════════════╪════════════╡\n", "│ 002082.SZ ┆ 20200102 ┆ 29.23 ┆ 28.24 ┆ … ┆ 0.136631 ┆ 0.728075 ┆ null ┆ -0.024079 │\n", "│ 600387.SH ┆ 20200102 ┆ 24.42 ┆ 24.28 ┆ … ┆ 0.381818 ┆ 0.561497 ┆ null ┆ 0.058896 │\n", "│ 000592.SZ ┆ 20200102 ┆ 18.68 ┆ 18.42 ┆ … ┆ 0.53262 ┆ 0.436898 ┆ null ┆ 0.128122 │\n", "│ 002920.SZ ┆ 20200102 ┆ 31.51 ┆ 31.29 ┆ … ┆ 0.831551 ┆ 0.575668 ┆ null ┆ 0.129434 │\n", "│ 600138.SH ┆ 20200102 ┆ 68.71 ┆ 68.23 ┆ … ┆ 0.702139 ┆ 0.556551 ┆ null ┆ 0.010992 │\n", "└───────────┴────────────┴───────┴───────┴───┴─────────────┴─────────────┴────────────┴────────────┘\n", "\n", "[配置] 训练期: 20200101 - 20231231\n", "[配置] 验证期: 20240101 - 20241231\n", "[配置] 测试期: 20250101 - 20251231\n", "[配置] 特征数: 23\n", "[配置] 目标变量: future_return_5\n" ] } ], "execution_count": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2 执行训练" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:07:53.576371Z", "start_time": "2026-03-08T15:07:47.898097Z" } }, "source": [ "print(\"\\n\" + \"=\" * 80)\n", "print(\"开始训练\")\n", "print(\"=\" * 80)\n", "\n", "# 步骤 1: 股票池筛选\n", "print(\"\\n[步骤 1/6] 股票池筛选\")\n", "print(\"-\" * 60)\n", "if pool_manager:\n", " print(\" 执行每日独立筛选股票池...\")\n", " filtered_data = pool_manager.filter_and_select_daily(data)\n", " print(f\" 筛选前数据规模: {data.shape}\")\n", " print(f\" 筛选后数据规模: {filtered_data.shape}\")\n", " print(f\" 筛选前股票数: {data['ts_code'].n_unique()}\")\n", " print(f\" 筛选后股票数: {filtered_data['ts_code'].n_unique()}\")\n", " print(f\" 删除记录数: {len(data) - len(filtered_data)}\")\n", "else:\n", " filtered_data = data\n", " print(\" 未配置股票池管理器,跳过筛选\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "================================================================================\n", "开始训练\n", "================================================================================\n", "\n", "[步骤 1/6] 股票池筛选\n", "------------------------------------------------------------\n", " 执行每日独立筛选股票池...\n", " 筛选前数据规模: (7044952, 32)\n", " 筛选后数据规模: (4532198, 32)\n", " 筛选前股票数: 5678\n", " 筛选后股票数: 3359\n", " 删除记录数: 2512754\n" ] } ], "execution_count": 24 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:07:54.854708Z", "start_time": "2026-03-08T15:07:53.584313Z" } }, "source": [ "# 步骤 2: 划分训练/验证/测试集(正确的三分法)\n", "print(\"\\n[步骤 2/6] 划分训练集、验证集和测试集\")\n", "print(\"-\" * 60)\n", "if splitter:\n", " # 正确的三分法:train用于训练,val用于验证/早停,test仅用于最终评估\n", " train_data, val_data, test_data = splitter.split(filtered_data)\n", " print(f\" 训练集数据规模: {train_data.shape}\")\n", " print(f\" 验证集数据规模: {val_data.shape}\")\n", " print(f\" 测试集数据规模: {test_data.shape}\")\n", " print(f\" 训练集股票数: {train_data['ts_code'].n_unique()}\")\n", " print(f\" 验证集股票数: {val_data['ts_code'].n_unique()}\")\n", " print(f\" 测试集股票数: {test_data['ts_code'].n_unique()}\")\n", " print(\n", " f\" 训练集日期范围: {train_data['trade_date'].min()} - {train_data['trade_date'].max()}\"\n", " )\n", " print(\n", " f\" 验证集日期范围: {val_data['trade_date'].min()} - {val_data['trade_date'].max()}\"\n", " )\n", " print(\n", " f\" 测试集日期范围: {test_data['trade_date'].min()} - {test_data['trade_date'].max()}\"\n", " )\n", "\n", " print(\"\\n 训练集前5行预览:\")\n", " print(train_data.head())\n", " print(\"\\n 验证集前5行预览:\")\n", " print(val_data.head())\n", " print(\"\\n 测试集前5行预览:\")\n", " print(test_data.head())\n", "else:\n", " train_data = filtered_data\n", " test_data = filtered_data\n", " print(\" 未配置划分器,全部作为训练集\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[步骤 2/6] 划分训练集、验证集和测试集\n", "------------------------------------------------------------\n", " 训练集数据规模: (2991506, 32)\n", " 验证集数据规模: (769485, 32)\n", " 测试集数据规模: (771207, 32)\n", " 训练集股票数: 3297\n", " 验证集股票数: 3220\n", " 测试集股票数: 3215\n", " 训练集日期范围: 20200102 - 20231229\n", " 验证集日期范围: 20240102 - 20241231\n", " 测试集日期范围: 20250102 - 20251231\n", "\n", " 训练集前5行预览:\n", "shape: (5, 32)\n", "┌───────────┬────────────┬───────┬───────┬───┬─────────────┬─────────────┬────────────┬────────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ close ┆ … ┆ market_cap_ ┆ turnover_ra ┆ return_5_r ┆ future_ret │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ rank ┆ nk ┆ ank ┆ urn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪═════════════╪═════════════╪════════════╪════════════╡\n", "│ 002082.SZ ┆ 20200102 ┆ 29.23 ┆ 28.24 ┆ … ┆ 0.136631 ┆ 0.728075 ┆ null ┆ -0.024079 │\n", "│ 600387.SH ┆ 20200102 ┆ 24.42 ┆ 24.28 ┆ … ┆ 0.381818 ┆ 0.561497 ┆ null ┆ 0.058896 │\n", "│ 000592.SZ ┆ 20200102 ┆ 18.68 ┆ 18.42 ┆ … ┆ 0.53262 ┆ 0.436898 ┆ null ┆ 0.128122 │\n", "│ 002920.SZ ┆ 20200102 ┆ 31.51 ┆ 31.29 ┆ … ┆ 0.831551 ┆ 0.575668 ┆ null ┆ 0.129434 │\n", "│ 600138.SH ┆ 20200102 ┆ 68.71 ┆ 68.23 ┆ … ┆ 0.702139 ┆ 0.556551 ┆ null ┆ 0.010992 │\n", "└───────────┴────────────┴───────┴───────┴───┴─────────────┴─────────────┴────────────┴────────────┘\n", "\n", " 验证集前5行预览:\n", "shape: (5, 32)\n", "┌───────────┬────────────┬───────┬───────┬───┬─────────────┬─────────────┬────────────┬────────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ close ┆ … ┆ market_cap_ ┆ turnover_ra ┆ return_5_r ┆ future_ret │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ rank ┆ nk ┆ ank ┆ urn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪═════════════╪═════════════╪════════════╪════════════╡\n", "│ 600099.SH ┆ 20240102 ┆ 29.14 ┆ 28.8 ┆ … ┆ 0.097785 ┆ 0.779655 ┆ 0.904941 ┆ -0.039236 │\n", "│ 600918.SH ┆ 20240102 ┆ 7.02 ┆ 6.94 ┆ … ┆ 0.951764 ┆ 0.04298 ┆ 0.163254 ┆ -0.027378 │\n", "│ 600590.SH ┆ 20240102 ┆ 30.84 ┆ 30.09 ┆ … ┆ 0.532282 ┆ 0.789696 ┆ 0.920534 ┆ -0.072117 │\n", "│ 000430.SZ ┆ 20240102 ┆ 30.76 ┆ 30.67 ┆ … ┆ 0.159722 ┆ 0.473724 ┆ 0.77926 ┆ 0.039126 │\n", "│ 601881.SH ┆ 20240102 ┆ 13.63 ┆ 13.33 ┆ … ┆ 0.984234 ┆ 0.196134 ┆ 0.139395 ┆ -0.029257 │\n", "└───────────┴────────────┴───────┴───────┴───┴─────────────┴─────────────┴────────────┴────────────┘\n", "\n", " 测试集前5行预览:\n", "shape: (5, 32)\n", "┌───────────┬────────────┬────────┬────────┬───┬────────────┬────────────┬────────────┬────────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ close ┆ … ┆ market_cap ┆ turnover_r ┆ return_5_r ┆ future_ret │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _rank ┆ ank ┆ ank ┆ urn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪════════╪════════╪═══╪════════════╪════════════╪════════════╪════════════╡\n", "│ 605507.SH ┆ 20250102 ┆ 22.54 ┆ 21.55 ┆ … ┆ 0.75652 ┆ 0.281669 ┆ 0.449767 ┆ -0.058933 │\n", "│ 600993.SH ┆ 20250102 ┆ 322.06 ┆ 312.13 ┆ … ┆ 0.75149 ┆ 0.235469 ┆ 0.626281 ┆ -0.024765 │\n", "│ 600817.SH ┆ 20250102 ┆ 57.79 ┆ 55.83 ┆ … ┆ 0.568554 ┆ 0.162072 ┆ 0.442498 ┆ 0.007165 │\n", "│ 603896.SH ┆ 20250102 ┆ 29.75 ┆ 28.56 ┆ … ┆ 0.411513 ┆ 0.283718 ┆ 0.504194 ┆ -0.044468 │\n", "│ 600754.SH ┆ 20250102 ┆ 87.68 ┆ 85.56 ┆ … ┆ 0.91114 ┆ 0.477273 ┆ 0.825909 ┆ -0.062997 │\n", "└───────────┴────────────┴────────┴────────┴───┴────────────┴────────────┴────────────┴────────────┘\n" ] } ], "execution_count": 25 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:07:55.786511Z", "start_time": "2026-03-08T15:07:54.859705Z" } }, "source": [ "# 步骤 3: 训练集数据处理\n", "print(\"\\n[步骤 3/6] 训练集数据处理\")\n", "print(\"-\" * 60)\n", "fitted_processors = []\n", "if processors:\n", " for i, processor in enumerate(processors, 1):\n", " print(\n", " f\" [{i}/{len(processors)}] 应用处理器: {processor.__class__.__name__}\"\n", " )\n", " train_data_before = len(train_data)\n", " train_data = processor.fit_transform(train_data)\n", " train_data_after = len(train_data)\n", " fitted_processors.append(processor)\n", " print(f\" 处理前记录数: {train_data_before}\")\n", " print(f\" 处理后记录数: {train_data_after}\")\n", " if train_data_before != train_data_after:\n", " print(f\" 删除记录数: {train_data_before - train_data_after}\")\n", "\n", "print(\"\\n 训练集处理后前5行预览:\")\n", "print(train_data.head())\n", "print(f\"\\n 训练集特征统计:\")\n", "print(f\" 特征数: {len(feature_cols)}\")\n", "print(f\" 样本数: {len(train_data)}\")\n", "print(f\" 缺失值统计:\")\n", "for col in feature_cols[:5]: # 只显示前5个特征的缺失值\n", " null_count = train_data[col].null_count()\n", " if null_count > 0:\n", " print(\n", " f\" {col}: {null_count} ({null_count / len(train_data) * 100:.2f}%)\"\n", " )" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[步骤 3/6] 训练集数据处理\n", "------------------------------------------------------------\n", " [1/3] 应用处理器: NullFiller\n", " 处理前记录数: 2991506\n", " 处理后记录数: 2991506\n", " [2/3] 应用处理器: Winsorizer\n", " 处理前记录数: 2991506\n", " 处理后记录数: 2991506\n", " [3/3] 应用处理器: StandardScaler\n", " 处理前记录数: 2991506\n", " 处理后记录数: 2991506\n", "\n", " 训练集处理后前5行预览:\n", "shape: (5, 32)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ high ┆ close ┆ … ┆ market_ca ┆ turnover_ ┆ return_5_ ┆ future_r │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ p_rank ┆ rank ┆ rank ┆ eturn_5 │\n", "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ str ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 002082.SZ ┆ 20200102 ┆ -0.303819 ┆ -0.30681 ┆ … ┆ -1.365199 ┆ 1.001092 ┆ null ┆ -0.02407 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 9 │\n", "│ 600387.SH ┆ 20200102 ┆ -0.334151 ┆ -0.332286 ┆ … ┆ -0.518195 ┆ 0.411746 ┆ null ┆ 0.058896 │\n", "│ 000592.SZ ┆ 20200102 ┆ -0.370349 ┆ -0.369985 ┆ … ┆ 0.002754 ┆ -0.029081 ┆ null ┆ 0.128122 │\n", "│ 002920.SZ ┆ 20200102 ┆ -0.289441 ┆ -0.287188 ┆ … ┆ 1.035415 ┆ 0.461883 ┆ null ┆ 0.129434 │\n", "│ 600138.SH ┆ 20200102 ┆ -0.054852 ┆ -0.04954 ┆ … ┆ 0.58836 ┆ 0.394246 ┆ null ┆ 0.010992 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", " 训练集特征统计:\n", " 特征数: 23\n", " 样本数: 2991506\n", " 缺失值统计:\n", " ma_5: 11541 (0.39%)\n", " ma_20: 54850 (1.83%)\n", " ma_ratio_5_20: 54850 (1.83%)\n", " bias_10: 25950 (0.87%)\n", " high_low_ratio: 54850 (1.83%)\n" ] } ], "execution_count": 26 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:08:10.050651Z", "start_time": "2026-03-08T15:07:55.791554Z" } }, "source": [ "# 步骤 4: 训练模型\n", "print(\"\\n[步骤 4/6] 训练模型\")\n", "print(\"-\" * 60)\n", "print(f\" 模型类型: LightGBM\")\n", "print(f\" 训练样本数: {len(train_data)}\")\n", "print(f\" 特征数: {len(feature_cols)}\")\n", "print(f\" 目标变量: {target_col}\")\n", "\n", "X_train = train_data.select(feature_cols)\n", "y_train = train_data.select(target_col).to_series()\n", "\n", "print(f\"\\n 目标变量统计:\")\n", "print(f\" 均值: {y_train.mean():.6f}\")\n", "print(f\" 标准差: {y_train.std():.6f}\")\n", "print(f\" 最小值: {y_train.min():.6f}\")\n", "print(f\" 最大值: {y_train.max():.6f}\")\n", "print(f\" 缺失值: {y_train.null_count()}\")\n", "\n", "print(\"\\n 开始训练...\")\n", "model.fit(X_train, y_train)\n", "print(\" 训练完成!\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[步骤 4/6] 训练模型\n", "------------------------------------------------------------\n", " 模型类型: LightGBM\n", " 训练样本数: 2991506\n", " 特征数: 23\n", " 目标变量: future_return_5\n", "\n", " 目标变量统计:\n", " 均值: 0.001610\n", " 标准差: 0.059623\n", " 最小值: -0.155098\n", " 最大值: 0.212842\n", " 缺失值: 0\n", "\n", " 开始训练...\n", " 训练完成!\n" ] } ], "execution_count": 27 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:08:10.136262Z", "start_time": "2026-03-08T15:08:10.055577Z" } }, "source": [ "# 步骤 5: 测试集数据处理\n", "print(\"\\n[步骤 5/6] 测试集数据处理\")\n", "print(\"-\" * 60)\n", "if processors and test_data is not train_data:\n", " for i, processor in enumerate(fitted_processors, 1):\n", " print(\n", " f\" [{i}/{len(fitted_processors)}] 应用处理器: {processor.__class__.__name__}\"\n", " )\n", " test_data_before = len(test_data)\n", " test_data = processor.transform(test_data)\n", " test_data_after = len(test_data)\n", " print(f\" 处理前记录数: {test_data_before}\")\n", " print(f\" 处理后记录数: {test_data_after}\")\n", "else:\n", " print(\" 跳过测试集处理\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[步骤 5/6] 测试集数据处理\n", "------------------------------------------------------------\n", " [1/3] 应用处理器: NullFiller\n", " 处理前记录数: 771207\n", " 处理后记录数: 771207\n", " [2/3] 应用处理器: Winsorizer\n", " 处理前记录数: 771207\n", " 处理后记录数: 771207\n", " [3/3] 应用处理器: StandardScaler\n", " 处理前记录数: 771207\n", " 处理后记录数: 771207\n" ] } ], "execution_count": 28 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:08:11.299483Z", "start_time": "2026-03-08T15:08:10.141988Z" } }, "source": [ "# 步骤 6: 生成预测\n", "print(\"\\n[步骤 6/6] 生成预测\")\n", "print(\"-\" * 60)\n", "X_test = test_data.select(feature_cols)\n", "print(f\" 测试样本数: {len(X_test)}\")\n", "print(\" 预测中...\")\n", "predictions = model.predict(X_test)\n", "print(f\" 预测完成!\")\n", "\n", "print(f\"\\n 预测结果统计:\")\n", "print(f\" 均值: {predictions.mean():.6f}\")\n", "print(f\" 标准差: {predictions.std():.6f}\")\n", "print(f\" 最小值: {predictions.min():.6f}\")\n", "print(f\" 最大值: {predictions.max():.6f}\")\n", "\n", "# 保存结果到 trainer\n", "trainer.results = test_data.with_columns([pl.Series(\"prediction\", predictions)])" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[步骤 6/6] 生成预测\n", "------------------------------------------------------------\n", " 测试样本数: 771207\n", " 预测中...\n", " 预测完成!\n", "\n", " 预测结果统计:\n", " 均值: 0.000634\n", " 标准差: 0.008134\n", " 最小值: -0.156166\n", " 最大值: 0.131927\n" ] } ], "execution_count": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3 训练指标曲线" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:08:15.854279Z", "start_time": "2026-03-08T15:08:11.304814Z" } }, "source": [ "print(\"\\n\" + \"=\" * 80)\n", "print(\"训练指标曲线\")\n", "print(\"=\" * 80)\n", "\n", "# 重新训练以收集指标(因为之前的训练没有保存评估结果)\n", "print(\"\\n重新训练模型以收集训练指标...\")\n", "\n", "import lightgbm as lgb\n", "\n", "# 准备数据(使用 val 做验证,test 不参与训练过程)\n", "X_train_np = X_train.to_numpy()\n", "y_train_np = y_train.to_numpy()\n", "X_val_np = val_data.select(feature_cols).to_numpy()\n", "y_val_np = val_data.select(target_col).to_series().to_numpy()\n", "\n", "# 创建数据集\n", "train_dataset = lgb.Dataset(X_train_np, label=y_train_np)\n", "val_dataset = lgb.Dataset(X_val_np, label=y_val_np, reference=train_dataset)\n", "\n", "# 用于存储评估结果\n", "evals_result = {}\n", "\n", "# 使用与原模型相同的参数重新训练\n", "# 正确的三分法:train用于训练,val用于验证,test不参与训练过程\n", "# 添加早停:如果验证指标连续100轮没有改善则停止训练\n", "booster_with_eval = lgb.train(\n", " MODEL_PARAMS,\n", " train_dataset,\n", " num_boost_round=MODEL_PARAMS.get(\"n_estimators\", 100),\n", " valid_sets=[train_dataset, val_dataset],\n", " valid_names=[\"train\", \"val\"],\n", " callbacks=[\n", " lgb.record_evaluation(evals_result),\n", " lgb.early_stopping(stopping_rounds=100, verbose=True),\n", " ],\n", ")\n", "\n", "print(\"训练完成,指标已收集\")\n", "\n", "# 获取指标名称\n", "metric_name = list(evals_result[\"train\"].keys())[0]\n", "print(f\"\\n评估指标: {metric_name}\")\n", "\n", "# 提取训练和验证指标\n", "train_metric = evals_result[\"train\"][metric_name]\n", "val_metric = evals_result[\"val\"][metric_name]\n", "\n", "# 显示早停信息\n", "actual_rounds = len(train_metric)\n", "expected_rounds = MODEL_PARAMS.get(\"n_estimators\", 100)\n", "print(f\"\\n[早停信息]\")\n", "print(f\" 配置的最大轮数: {expected_rounds}\")\n", "print(f\" 实际训练轮数: {actual_rounds}\")\n", "if actual_rounds < expected_rounds:\n", " print(f\" 早停状态: 已触发(连续100轮验证指标未改善)\")\n", "else:\n", " print(f\" 早停状态: 未触发(达到最大轮数)\")\n", "\n", "print(f\"\\n最终指标:\")\n", "print(f\" 训练 {metric_name}: {train_metric[-1]:.6f}\")\n", "print(f\" 验证 {metric_name}: {val_metric[-1]:.6f}\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "================================================================================\n", "训练指标曲线\n", "================================================================================\n", "\n", "重新训练模型以收集训练指标...\n", "Training until validation scores don't improve for 100 rounds\n", "Early stopping, best iteration is:\n", "[164]\ttrain's l1: 0.0424587\tval's l1: 0.0537962\n", "训练完成,指标已收集\n", "\n", "评估指标: l1\n", "\n", "[早停信息]\n", " 配置的最大轮数: 1000\n", " 实际训练轮数: 264\n", " 早停状态: 已触发(连续100轮验证指标未改善)\n", "\n", "最终指标:\n", " 训练 l1: 0.042329\n", " 验证 l1: 0.053824\n" ] } ], "execution_count": 30 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:08:15.945008Z", "start_time": "2026-03-08T15:08:15.859092Z" } }, "source": [ "# 绘制训练指标曲线\n", "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots(figsize=(12, 6))\n", "\n", "# 绘制训练集和验证集的指标曲线(注意:val用于验证,test不参与训练)\n", "iterations = range(1, len(train_metric) + 1)\n", "ax.plot(iterations, train_metric, label=f\"Train {metric_name}\", linewidth=2, color=\"blue\")\n", "ax.plot(iterations, val_metric, label=f\"Validation {metric_name}\", linewidth=2, color=\"red\")\n", "\n", "ax.set_xlabel(\"Iteration\", fontsize=12)\n", "ax.set_ylabel(metric_name.upper(), fontsize=12)\n", "ax.set_title(f\"Training and Validation {metric_name.upper()} Curve\", fontsize=14, fontweight=\"bold\")\n", "ax.legend(fontsize=10)\n", "ax.grid(True, alpha=0.3)\n", "\n", "# 标记最佳验证指标点(用于早停决策)\n", "best_iter = val_metric.index(min(val_metric))\n", "best_metric = min(val_metric)\n", "ax.axvline(x=best_iter + 1, color=\"green\", linestyle=\"--\", alpha=0.7, label=f\"Best Iteration ({best_iter + 1})\")\n", "ax.scatter([best_iter + 1], [best_metric], color=\"green\", s=100, zorder=5)\n", "ax.annotate(\n", " f\"Best: {best_metric:.6f}\\nIter: {best_iter + 1}\",\n", " xy=(best_iter + 1, best_metric),\n", " xytext=(best_iter + 1 + len(iterations) * 0.1, best_metric),\n", " fontsize=9,\n", " arrowprops=dict(arrowstyle=\"->\", color=\"green\", alpha=0.7),\n", ")\n", "\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "print(f\"\\n[指标分析]\")\n", "print(f\" 最佳验证 {metric_name}: {best_metric:.6f}\")\n", "print(f\" 最佳迭代轮数: {best_iter + 1}\")\n", "print(f\" 早停建议: 如果验证指标连续10轮不下降,建议在第 {best_iter + 1} 轮停止训练\")\n", "print(f\"\\n[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\")" ], "outputs": [ { "data": { "text/plain": [ "
" ], "image/png": "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ny+7du2SKlWqSFxcXKjuFgAAAAAAIKK43W7JyMiQBg0aSHx84fVQhFIhooGUngobAAAAAAAAIr/88os5CQ6hVDnTCinrCU9NTY2oCq99+/ZJ7dq1i0wvgWhBm0csot0jFkVbu8/MzZRRK0aZ+b9f8ndJcaWEe5fgMNHW5oFg0O6d68iRI6Zwx8pKCkOlVIhYXfY0kIq0UCozM9PsMx9eiAW0ecQi2j1iUbS1+6TcJEmsmGjm9ZgIpRDtbR4IBu3e+Yob3ohQCgAAAHC45IRkeXbws555AACiAaEUAAAAEAG/NNepVCfcuwEAQEhR1wkAAAAApdS3b19JTk6WypUrm7FT2rdvL2lpaSELIz///PMS3SYnJ0cmTpwo1atXlxo1asgNN9wgubm5pd5+zJgxkpSUZI7PmtatW+dZr9vruDHabbBhw4YyefJkyc7ONut27NjhczudXC6XDB482HP7zz77TM466yxz+xYtWsjf//73Amfwmjt3rjRr1kwqVaokp5xyinzyySclek4AOBehFAAAAOBwufm58tzm58yk83CWBx54QI4ePWoG9n3wwQdl5MiR8vPPP4dlX+6991756KOP5L///a98/fXX8uGHH8p9991X6Pb33HNPsdtfd9115visqVevXj7rtm7dao79iy++MJM+B6pJkyY+tzt48KBUq1ZNrrjiCrP+0KFDcuGFF8pVV10lv/32myxbtsyEXLo/ljvuuEPeeOMNeeedd8x9rFq1ytwvgOhAKAUAAAA4nAZRK7auMBOhlHNpZdOgQYNM8PLtt996lm/atEnOPfdcU4nUqlUrefrpp33WnXHGGaZSqFatWnLRRReZ5T169DCXvXv3NhVGRQVL3hYvXiwzZsyQ+vXrm0lDnWefPTkeWSDPPfdcibb317ZtW1PBZFU16SDr33//fcBtX331VTMw9dChQ831tWvXmiqzCRMmSEJCgvTs2dOse+aZZ8x6DbHmzZtn9lGfN31+mzZtavYTQHQglAIAAACAENDA5V//+pecOHFCOnfubJbt2bNH/vCHP8i1114r+/btM8HMrFmzZPXq1Wa9dp3TIEqrhnbu3ClTp041yzds2OAJbrRCaPr06eb6H//4R7n//vsDPr7ex6+//up5bKXz2o3u8OHDBbbX6qRgttcudRqoadfEhx9+2BynN90fDc7q1KljKqW02ikQ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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[指标分析]\n", " 最佳验证 l1: 0.053796\n", " 最佳迭代轮数: 164\n", " 早停建议: 如果验证指标连续10轮不下降,建议在第 164 轮停止训练\n", "\n", "[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\n" ] } ], "execution_count": 31 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 查看结果" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:08:15.963026Z", "start_time": "2026-03-08T15:08:15.951854Z" } }, "source": [ "print(\"\\n\" + \"=\" * 80)\n", "print(\"训练结果\")\n", "print(\"=\" * 80)\n", "\n", "results = trainer.results\n", "\n", "print(f\"\\n结果数据形状: {results.shape}\")\n", "print(f\"结果列: {results.columns}\")\n", "print(f\"\\n结果前10行预览:\")\n", "print(results.head(10))\n", "print(f\"\\n结果后5行预览:\")\n", "print(results.tail())\n", "\n", "print(f\"\\n每日预测样本数统计:\")\n", "daily_counts = results.group_by(\"trade_date\").agg(pl.len()).sort(\"trade_date\")\n", "print(f\" 最小: {daily_counts['len'].min()}\")\n", "print(f\" 最大: {daily_counts['len'].max()}\")\n", "print(f\" 平均: {daily_counts['len'].mean():.2f}\")\n", "\n", "# 展示某一天的前10个预测结果\n", "sample_date = results[\"trade_date\"][0]\n", "sample_data = results.filter(results[\"trade_date\"] == sample_date).head(10)\n", "print(f\"\\n示例日期 {sample_date} 的前10条预测:\")\n", "print(sample_data.select([\"ts_code\", \"trade_date\", target_col, \"prediction\"]))" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "================================================================================\n", "训练结果\n", "================================================================================\n", "\n", "结果数据形状: (771207, 33)\n", "结果列: ['ts_code', 'trade_date', 'high', 'close', 'low', 'vol', 'turnover_rate', 'total_mv', 'ma_5', 'ma_20', 'ma_ratio_5_20', 'bias_10', 'high_low_ratio', 'bbi_ratio', 'return_5', 'return_10', 'return_20', 'return_diff_5_10', 'volatility_5', 'volatility_20', 'volatility_ratio', 'std_return_5', 'std_return_20', 'volume_ratio_5_20', 'volume_change_rate', 'turnover_rate_mean_5', 'turnover_rate_std_20', 'turnover_deviation', 'market_cap_rank', 'turnover_rank', 'return_5_rank', 'future_return_5', 'prediction']\n", "\n", "结果前10行预览:\n", "shape: (10, 33)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ high ┆ close ┆ … ┆ turnover_ ┆ return_5_ ┆ future_re ┆ predicti │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ rank ┆ rank ┆ turn_5 ┆ on │\n", "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ str ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 605507.SH ┆ 20250102 ┆ -0.346007 ┆ -0.349849 ┆ … ┆ -0.578277 ┆ -0.191441 ┆ -0.058933 ┆ 0.006321 │\n", "│ 600993.SH ┆ 20250102 ┆ 1.542811 ┆ 1.519556 ┆ … ┆ -0.74173 ┆ 0.436504 ┆ -0.024765 ┆ 0.002311 │\n", "│ 600817.SH ┆ 20250102 ┆ -0.123715 ┆ -0.129313 ┆ … ┆ -1.001409 ┆ -0.217301 ┆ 0.007165 ┆ 0.011855 │\n", "│ 603896.SH ┆ 20250102 ┆ -0.300539 ┆ -0.304751 ┆ … ┆ -0.571027 ┆ 0.002181 ┆ -0.044468 ┆ 0.013161 │\n", "│ 600754.SH ┆ 20250102 ┆ 0.064776 ┆ 0.06195 ┆ … ┆ 0.113762 ┆ 1.146671 ┆ -0.062997 ┆ -0.00216 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 3 │\n", "│ 603008.SH ┆ 20250102 ┆ -0.311449 ┆ -0.312278 ┆ … ┆ -0.192712 ┆ -0.166907 ┆ -0.018255 ┆ 0.008841 │\n", "│ 603650.SH ┆ 20250102 ┆ -0.251099 ┆ -0.263256 ┆ … ┆ -0.405596 ┆ -1.310734 ┆ -0.005427 ┆ 0.008721 │\n", "│ 002236.SZ ┆ 20250102 ┆ 4.21561 ┆ 4.130212 ┆ … ┆ 0.279852 ┆ -0.810765 ┆ -0.0513 ┆ 0.007152 │\n", "│ 603855.SH ┆ 20250102 ┆ -0.315863 ┆ -0.321092 ┆ … ┆ -0.960546 ┆ 0.258796 ┆ -0.044197 ┆ 0.007929 │\n", "│ 002513.SZ ┆ 20250102 ┆ -0.401879 ┆ -0.403117 ┆ … ┆ 1.141935 ┆ -1.044172 ┆ -0.020347 ┆ 0.02149 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", "结果后5行预览:\n", "shape: (5, 33)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ high ┆ close ┆ … ┆ turnover_ ┆ return_5_ ┆ future_re ┆ predicti │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ rank ┆ rank ┆ turn_5 ┆ on │\n", "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ str ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 603062.SH ┆ 20251231 ┆ -0.155813 ┆ -0.151122 ┆ … ┆ 0.341316 ┆ 0.721984 ┆ null ┆ 0.001931 │\n", "│ 600543.SH ┆ 20251231 ┆ -0.404843 ┆ -0.404275 ┆ … ┆ 0.52152 ┆ -1.221834 ┆ null ┆ 0.000149 │\n", "│ 601199.SH ┆ 20251231 ┆ -0.312584 ┆ -0.310026 ┆ … ┆ -1.386182 ┆ -0.708964 ┆ null ┆ -0.00138 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 7 │\n", "│ 600597.SH ┆ 20251231 ┆ -0.351304 ┆ -0.349398 ┆ … ┆ -1.302562 ┆ -0.518432 ┆ null ┆ -0.00432 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 7 │\n", "│ 600365.SH ┆ 20251231 ┆ -0.433978 ┆ -0.433418 ┆ … ┆ -1.417944 ┆ -1.018578 ┆ null ┆ 0.002212 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", "每日预测样本数统计:\n", " 最小: 3147\n", " 最大: 3186\n", " 平均: 3173.69\n", "\n", "示例日期 20250102 的前10条预测:\n", "shape: (10, 4)\n", "┌───────────┬────────────┬─────────────────┬────────────┐\n", "│ ts_code ┆ trade_date ┆ future_return_5 ┆ prediction │\n", "│ --- ┆ --- ┆ --- ┆ --- │\n", "│ str ┆ str ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪═════════════════╪════════════╡\n", "│ 605507.SH ┆ 20250102 ┆ -0.058933 ┆ 0.006321 │\n", "│ 600993.SH ┆ 20250102 ┆ -0.024765 ┆ 0.002311 │\n", "│ 600817.SH ┆ 20250102 ┆ 0.007165 ┆ 0.011855 │\n", "│ 603896.SH ┆ 20250102 ┆ -0.044468 ┆ 0.013161 │\n", "│ 600754.SH ┆ 20250102 ┆ -0.062997 ┆ -0.002163 │\n", "│ 603008.SH ┆ 20250102 ┆ -0.018255 ┆ 0.008841 │\n", "│ 603650.SH ┆ 20250102 ┆ -0.005427 ┆ 0.008721 │\n", "│ 002236.SZ ┆ 20250102 ┆ -0.0513 ┆ 0.007152 │\n", "│ 603855.SH ┆ 20250102 ┆ -0.044197 ┆ 0.007929 │\n", "│ 002513.SZ ┆ 20250102 ┆ -0.020347 ┆ 0.02149 │\n", "└───────────┴────────────┴─────────────────┴────────────┘\n" ] } ], "execution_count": 32 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 保存结果" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:08:16.296512Z", "start_time": "2026-03-08T15:08:15.970222Z" } }, "cell_type": "code", "source": [ "print(\"\\n\" + \"=\" * 80)\n", "print(\"保存预测结果\")\n", "print(\"=\" * 80)\n", "\n", "# 确保输出目录存在\n", "os.makedirs(OUTPUT_DIR, exist_ok=True)\n", "\n", "# 生成时间戳\n", "start_dt = datetime.strptime(TEST_START, \"%Y%m%d\")\n", "end_dt = datetime.strptime(TEST_END, \"%Y%m%d\")\n", "date_str = f\"{start_dt.strftime('%Y%m%d')}_{end_dt.strftime('%Y%m%d')}\"\n", "\n", "# 保存每日 Top N\n", "print(f\"\\n[1/1] 保存每日 Top {TOP_N} 股票...\")\n", "topn_output_path = os.path.join(OUTPUT_DIR, f\"regression_output.csv\")\n", "\n", "# 按日期分组,取每日 top N\n", "topn_by_date = []\n", "unique_dates = results[\"trade_date\"].unique().sort()\n", "for date in unique_dates:\n", " day_data = results.filter(results[\"trade_date\"] == date)\n", " # 按 prediction 降序排序,取前 N\n", " topn = day_data.sort(\"prediction\", descending=True).head(TOP_N)\n", " topn_by_date.append(topn)\n", "\n", "# 合并所有日期的 top N\n", "topn_results = pl.concat(topn_by_date)\n", "\n", "# 格式化日期并调整列顺序:日期、分数、股票\n", "topn_to_save = topn_results.select(\n", " [\n", " pl.col(\"trade_date\").str.slice(0, 4)\n", " + \"-\"\n", " + pl.col(\"trade_date\").str.slice(4, 2)\n", " + \"-\"\n", " + pl.col(\"trade_date\").str.slice(6, 2).alias(\"date\"),\n", " pl.col(\"prediction\").alias(\"score\"),\n", " pl.col(\"ts_code\"),\n", " ]\n", ")\n", "topn_to_save.write_csv(topn_output_path, include_header=True)\n", "print(f\" 保存路径: {topn_output_path}\")\n", "print(f\" 保存行数: {len(topn_to_save)}({len(unique_dates)}个交易日 × 每日top{TOP_N})\")\n", "print(f\"\\n 预览(前15行):\")\n", "print(topn_to_save.head(15))" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "================================================================================\n", "保存预测结果\n", "================================================================================\n", "\n", "[1/1] 保存每日 Top 5 股票...\n", " 保存路径: output\\regression_output.csv\n", " 保存行数: 1215(243个交易日 × 每日top5)\n", "\n", " 预览(前15行):\n", "shape: (15, 3)\n", "┌────────────┬──────────┬───────────┐\n", "│ trade_date ┆ score ┆ ts_code │\n", "│ --- ┆ --- ┆ --- │\n", "│ str ┆ f64 ┆ str │\n", "╞════════════╪══════════╪═══════════╡\n", "│ 2025-01-02 ┆ 0.124602 ┆ 603007.SH │\n", "│ 2025-01-02 ┆ 0.10774 ┆ 603559.SH │\n", "│ 2025-01-02 ┆ 0.059728 ┆ 603959.SH │\n", "│ 2025-01-02 ┆ 0.033194 ┆ 600804.SH │\n", "│ 2025-01-02 ┆ 0.03074 ┆ 600421.SH │\n", "│ … ┆ … ┆ … │\n", "│ 2025-01-06 ┆ 0.131927 ┆ 603007.SH │\n", "│ 2025-01-06 ┆ 0.067151 ┆ 603959.SH │\n", "│ 2025-01-06 ┆ 0.049428 ┆ 603386.SH │\n", "│ 2025-01-06 ┆ 0.048319 ┆ 002046.SZ │\n", "│ 2025-01-06 ┆ 0.048007 ┆ 002759.SZ │\n", "└────────────┴──────────┴───────────┘\n" ] } ], "execution_count": 33 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.5 特征重要性" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:08:16.304039Z", "start_time": "2026-03-08T15:08:16.300741Z" } }, "source": [ "importance = model.feature_importance()\n", "if importance is not None:\n", " print(\"\\n特征重要性:\")\n", " print(importance.sort_values(ascending=False))\n", "\n", "print(\"\\n\" + \"=\" * 80)\n", "print(\"训练完成!\")\n", "print(\"=\" * 80)" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "特征重要性:\n", "return_5_rank 2332.348582\n", "return_5 1950.969372\n", "turnover_rank 1887.661314\n", "return_10 1342.515739\n", "turnover_rate_std_20 1311.361422\n", "ma_ratio_5_20 1123.527241\n", "bbi_ratio 1071.855236\n", "high_low_ratio 994.522432\n", "bias_10 742.095194\n", "std_return_5 741.347398\n", "volume_change_rate 739.034219\n", "return_20 597.878394\n", "volume_ratio_5_20 595.380527\n", "std_return_20 515.137529\n", "market_cap_rank 466.798819\n", "ma_20 418.790501\n", "volatility_ratio 390.093624\n", "return_diff_5_10 354.139443\n", "turnover_rate_mean_5 351.775202\n", "turnover_deviation 177.305289\n", "ma_5 150.850527\n", "volatility_5 148.218010\n", "volatility_20 147.523706\n", "dtype: float64\n", "\n", "================================================================================\n", "训练完成!\n", "================================================================================\n" ] } ], "execution_count": 34 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. 可视化分析\n", "\n", "使用训练好的模型直接绘图。\n", "- **特征重要性图**:辅助特征选择\n", "- **决策树图**:理解决策逻辑" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:08:16.315496Z", "start_time": "2026-03-08T15:08:16.311483Z" } }, "source": [ "# 导入可视化库\n", "import matplotlib.pyplot as plt\n", "import lightgbm as lgb\n", "import pandas as pd\n", "\n", "# 从封装的model中取出底层Booster\n", "booster = model.model\n", "print(f\"模型类型: {type(booster)}\")\n", "print(f\"特征数量: {len(feature_cols)}\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "模型类型: \n", "特征数量: 23\n" ] } ], "execution_count": 35 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 绘制特征重要性(辅助特征选择)\n", "\n", "**解读**:\n", "- 重要性高的特征对模型贡献大\n", "- 重要性为0的特征可以考虑删除\n", "- 可以帮助理解哪些因子最有效" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T15:08:16.428810Z", "start_time": "2026-03-08T15:08:16.321345Z" } }, "cell_type": "code", "source": [ "print(\"绘制特征重要性...\")\n", "\n", "fig, ax = plt.subplots(figsize=(10, 8))\n", "lgb.plot_importance(\n", " booster, \n", " max_num_features=20,\n", " importance_type='gain',\n", " title='Feature Importance (Gain)',\n", " ax=ax\n", ")\n", "ax.set_xlabel('Importance (Gain)')\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "# 打印重要性排名\n", "importance_gain = pd.Series(\n", " booster.feature_importance(importance_type='gain'),\n", " index=feature_cols\n", ").sort_values(ascending=False)\n", "\n", "print(\"\\n[特征重要性排名 - Gain]\")\n", "print(importance_gain)\n", "\n", "# 识别低重要性特征\n", "zero_importance = importance_gain[importance_gain == 0].index.tolist()\n", "if zero_importance:\n", " print(f\"\\n[低重要性特征] 以下{len(zero_importance)}个特征重要性为0,可考虑删除:\")\n", " for feat in zero_importance:\n", " print(f\" - {feat}\")\n", "else:\n", " print(\"\\n所有特征都有一定重要性\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "绘制特征重要性...\n" ] }, { "data": { "text/plain": [ "
" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAMWCAYAAADs4eXxAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA6LBJREFUeJzs3QmcTfX/x/EPY98je7KLLJEtUfalJEqoLElFJSXaFGWNIrSIdtFCv1QUkYS02EKhiCKySwg/y5j5P97ff+f+7ty5d8ww19yZeT0fj2vGveeec+bOmXvP5/v5fD8nQ2xsbKwBAAAAAIBklzH5VwkAAAAAAAi6AQAAAAAIIzLdAAAAAACECUE3AAAAAABhQtANAAAAAECYEHQDAAAAABAmBN0AAAAAAIQJQTcAAAAAAGFC0A0AAAAAQJgQdAMAAKSQ7du3W7Zs2ezbb789L9vr3r27lSpV6qye+9hjj1ndunWTfZ8AIK0j6AYApEmTJ0+2DBkyBL0peAiH7777zgYPHmwHDx60SH09Vq5caanVyy+/7H6OtGTo0KEukK1fv368x5YsWWIdO3a04sWLW5YsWSxv3rxuWT1nz549531f+/btaz/++KPNmjXrvG8bAFKzTCm9AwAAhJMClNKlS8e5r0qVKmELuocMGeKyifny5QvLNtIzBd0XXnihe33Tgn379tnbb7/tboGefPJJGzZsmJUpU8b9vPp6/Phx++GHH+y5555zz/ntt9+SvM3XXnvNYmJizmp/ixQpYm3btrUxY8bY9ddff1brAID0iKAbAJCmXXPNNVarVi1LzY4ePWo5c+a09OrYsWOWI0cOS2veeecdy5Qpk7Vp0ybO/dOnT3cBt7LcU6dOdVluf+PGjXO3s5E5c+Zz2mftU4cOHez33393AwEAgDOjvBwAkK59/vnndtVVV7mgNnfu3Na6dWtbv359nGV++uknX7ZR82+V8evRo4f99ddfvmVUVv7www+775VZ90rZt27d6m76PlhptO7Xc/3Xo/t+/vlnu/XWW+2CCy6wBg0axAnUatasadmzZ7f8+fPbzTff7OYFnw39TLly5bJt27bZdddd575XKfOECRPc42vXrrUmTZq416ZkyZL23nvvBS1Z//rrr61Xr15WoEABy5Mnj3Xr1s3+/vvvoJnqypUrW9asWa1YsWLWu3fveKX4jRo1cpUIyuheffXVLth+/PHH3Txk/V4WL17se221rBw4cMAeeughq1q1qvsZtA8abFEptL9Fixa5533wwQc2YsQIu+iii9zvs2nTprZ58+Z4+7ts2TK79tpr3e9Ar0G1atXs+eefj7PMhg0b7KabbnK/C61LAzyJLb/+5JNPXLm49jkwy62M/htvvBEv4BaVmfsfMzJz5kx37Op11etbtmxZF7ifPn06wTnd3rGp7PWrr77qnqfn165d21asWBFv282aNfNtDwCQOGS6AQBp2qFDh2z//v1x7lNAI8oi3nbbbdayZUt75plnXEZ14sSJLshdvXq1LziZP3++y+zdfvvtLuBW8KcARV+XLl3qgpYbb7zRfv31V3v//fddFtLbRsGCBV0ZcVIpm1i+fHl7+umnLTY21t2nQHHQoEEu23jnnXe69b744osuONX+nk1Ju4IyBahax7PPPmvvvvuu3XfffS7IfOKJJ6xz587uZ5s0aZILpuvVqxevXF/La9sKBDdu3Ohewz/++MMX5IoeU+m9grZ77rnHt5wCOzUR88/AajBD+6QBhS5duljhwoVdgN2nTx8XoGq/RPeLfjcKYPWaad803/mVV16xhg0busELBaL+Ro0aZRkzZnSBuo4P/dz6ORVke/Q710BE0aJF7YEHHnC/919++cU+++wz93/R719zsTVQoT4Bes0U0Ldr185mzJhhN9xwQ8jX/dSpU+5n12vhT8eQbvr9BgbjCdEAiJbv16+f+/rVV1+54P3w4cM2evToMz5fAyr//POPGzzR70yviX7vem39fzcK+BWY63f24IMPJnr/ACBdiwUAIA166623FKkGvck///wTmy9fvti77rorzvN2794dmzdv3jj3Hzt2LN7633//fbeur7/+2nff6NGj3X1btmyJs6z+r/u1T4F0/1NPPeX7v77Xfbfcckuc5bZu3RobFRUVO2LEiDj3r127NjZTpkzx7g/1eqxYscJ332233ebue/rpp333/f3337HZs2ePzZAhQ+y0adN892/YsCHevnrrrFmzZuzJkyd99z/77LPu/pkzZ7r/7927NzZLliyxLVq0iD19+rRvuZdeeskt9+abb/rua9iwobtv0qRJ8X6GypUru8cDHT9+PM56vdc8a9assUOHDvXdt3DhQrfuSpUqxZ44ccJ3//PPP+/u12sp0dHRsaVLl44tWbKk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8uTJ4x47ePBgvOf9+uuv1rZtW7vwwgvdcg0aNLCFCxcm+CprXcFuo0eP9i2zatUqa968ueXLl88KFChgPXv2tCNHjsRZz/333281a9a0rFmzWvXq1fnNAgAAIMWli6B78ODBnIADSbBixQp75ZVXrFq1anHuP3bsmLVq1coef/zxkM+97rrrLDo62r766iv74Ycf7LLLLnP37d69O+Rzdu3aFef25ptvuqC7ffv27vGdO3das2bNrFy5crZs2TKbO3eurV+/3rp37x5vXT169LBOnTrx+wYAAEBESBVBt07W+/TpY2XKlHEZrBIlSlibNm1swYIFlpYoiFCQUapUKRdwjB8/PqV3CemQssedO3e21157zS644II4jynr/dhjj9kVV1wR9Ln79++3TZs2uWUUsJcvX95lzBWsr1u3LuQ2ixQpEuc2c+ZMa9y4sfubl88++8wyZ85sEyZMsEsuucRq165tkyZNshkzZtjmzZt963nhhResd+/evucBAAAAKS2TRbitW7da/fr1XUmpSk2rVq1qp06dsnnz5rmT6w0bNlhaocBEwUKHDh3swQcfPKd11R25wKIz5Uy2fUPatnVUa9/3+rtq3bq1yywPHz48SetR2beC4ilTptjll1/uBsmUMS9UqJAr+06MPXv22OzZs+3tt9/23XfixAnLkiWLZcz4v3HC7Nmzu6/ffPONy4ADAAAAkSjiM9333nuvy/ouX77cZYErVKhglStXtn79+tnSpUvdMtu2bXNzSHPlyuXmkHbs2NGduIeiOan+81SlXbt2cUpVlW1WwNGtWze33pIlS9qsWbNs3759vm0pk7dy5UrfcyZPnuwGBzQgUKlSJbeMSnFVLpsYyt5pYOHmm292wQpwvk2bNs3NnR45cuRZPV9/q19++aWtXr3acufObdmyZbOxY8e6cvDArHkoCrb13Btv/L/27gRexrr///iXQ7Jv2fdddlkKZd/dQt2FJFKUrWS9dUuI+Fm7k3T/SpSI/Fu0oBAiZJctJUTW7MuxHeb/eH/rmt+cc2aOc3IuM2fO6/l4zOOcmeuaa66Z850587k+n+/nesh7W/369W3Fi94fV69eNadPn7bZdInv+wsAAAAIhpDOdJ86dcp+WR81apRJnz521lYB7o0bN7xB8IoVK+xcUmXqNKdz+fLlt/T4kyZNMq+++qp56aWX7O8d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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[特征重要性排名 - Gain]\n", "return_5_rank 2332.348582\n", "return_5 1950.969372\n", "turnover_rank 1887.661314\n", "return_10 1342.515739\n", "turnover_rate_std_20 1311.361422\n", "ma_ratio_5_20 1123.527241\n", "bbi_ratio 1071.855236\n", "high_low_ratio 994.522432\n", "bias_10 742.095194\n", "std_return_5 741.347398\n", "volume_change_rate 739.034219\n", "return_20 597.878394\n", "volume_ratio_5_20 595.380527\n", "std_return_20 515.137529\n", "market_cap_rank 466.798819\n", "ma_20 418.790501\n", "volatility_ratio 390.093624\n", "return_diff_5_10 354.139443\n", "turnover_rate_mean_5 351.775202\n", "turnover_deviation 177.305289\n", "ma_5 150.850527\n", "volatility_5 148.218010\n", "volatility_20 147.523706\n", "dtype: float64\n", "\n", "所有特征都有一定重要性\n" ] } ], "execution_count": 36 } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.10.0" } }, "nbformat": 4, "nbformat_minor": 4 }