{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. 导入依赖" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:00.925979Z", "start_time": "2026-03-08T12:42:00.366875Z" } }, "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": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. 定义辅助函数" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:00.940517Z", "start_time": "2026-03-08T12:42:00.935125Z" } }, "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": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. 配置参数\n", "\n", "### 3.1 因子定义" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:00.953087Z", "start_time": "2026-03-08T12:42:00.947665Z" } }, "cell_type": "code", "source": [ "# 特征因子定义字典:新增因子只需在此处添加一行\n", "LABEL_NAME = 'future_return_5'\n", "\n", "FACTOR_DEFINITIONS = {\n", " # 1. 价格动量因子\n", " \"ma5\": \"ts_mean(close, 5)\",\n", " \"ma10\": \"ts_mean(close, 10)\",\n", " \"ma20\": \"ts_mean(close, 20)\",\n", " \"ma_ratio\": \"ts_mean(close, 5) / ts_mean(close, 20) - 1\",\n", " # 2. 波动率因子\n", " \"volatility_5\": \"ts_std(close, 5)\",\n", " \"volatility_20\": \"ts_std(close, 20)\",\n", " \"vol_ratio\": \"ts_std(close, 5) / (ts_std(close, 20) + 1e-8)\",\n", " # 3. 收益率动量因子\n", " \"return_10\": \"(close / ts_delay(close, 10)) - 1\",\n", " \"return_20\": \"(close / ts_delay(close, 20)) - 1\",\n", " # 4. 收益率变化因子\n", " \"return_diff\": \"(close / ts_delay(close, 5)) - 1 - ((close / ts_delay(close, 10)) - 1)\",\n", " # 5. 成交量因子\n", " \"vol_ma5\": \"ts_mean(vol, 5)\",\n", " \"vol_ma20\": \"ts_mean(vol, 20)\",\n", " \"vol_ratio\": \"ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\",\n", " # 6. 市值因子(截面排名)\n", " \"market_cap_rank\": \"cs_rank(total_mv)\",\n", " # 7. 价格位置因子\n", " \"high_low_ratio\": \"(close - ts_min(low, 20)) / (ts_max(high, 20) - ts_min(low, 20) + 1e-8)\",\n", " # 8. 技术指标因子(3.1 完全可实现)\n", " \"turnover_rate_mean_5\": \"ts_mean(turnover_rate, 5)\", # 5日均换手率\n", " \"bbi_ratio_factor\": \"(ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / 4 / close\", # BBI比率\n", " # 9. ARBR 因子(3.1 完全可实现)\n", " # \"AR\": \"ts_sum(high - open, 26) / ts_sum(open - low, 26) * 100\", # AR人气指标\n", " # \"BR\": \"ts_sum(max_(0, high - ts_delay(close, 1)), 26) / ts_sum(max_(0, ts_delay(close, 1) - low), 26) * 100\", # BR意愿指标\n", " # \"AR_BR\": \"AR - BR\", # ARBR差值\n", " # 10. 成交量因子(3.1 完全可实现)\n", " \"volume_change_rate\": \"ts_mean(vol, 2) / ts_mean(vol, 10) - 1\", # 成交量变化率\n", " \"turnover_deviation\": \"(turnover_rate - ts_mean(turnover_rate, 3)) / ts_std(turnover_rate, 3)\", # 换手率偏离度\n", " \"vol_std_5\": \"ts_std(ts_delta(vol, 1), 5)\", # 成交量变化标准差\n", " # 11. 收益率因子(3.1 完全可实现)\n", " # \"return_5\": \"close / ts_delay(close, 5) - 1\", # 5日收益率\n", " \"std_return_5\": \"ts_std((close - ts_delay(close, 1)) / ts_delay(close, 1), 5)\", # 5日收益率标准差\n", " \"std_return_90\": \"ts_std((close - ts_delay(close, 1)) / ts_delay(close, 1), 90)\", # 90日收益率标准差\n", " # 12. 截面排序因子(3.1 完全可实现)\n", " \"cs_rank_volume_ratio\": \"cs_rank(volume_ratio)\", # 量比截面排名\n", " \"cs_rank_turnover_rate\": \"cs_rank(turnover_rate)\", # 换手率截面排名\n", " \"n_income_rank\": \"cs_rank(n_income)\", # 净利润截面排名\n", " # 13. 财务数据因子(来自利润表 financial_income)\n", " \"operate_profit_rank\": \"cs_rank(operate_profit)\", # 营业利润截面排名\n", " \"total_profit_rank\": \"cs_rank(total_profit)\", # 利润总额截面排名\n", " \"ebit_rank\": \"cs_rank(ebit)\", # 息税前利润截面排名\n", " \"ebitda_rank\": \"cs_rank(ebitda)\", # 息税折旧摊销前利润截面排名\n", " # 14. 财务数据因子(来自资产负债表 financial_balance)\n", " \"total_liab_rank\": \"cs_rank(total_liab)\", # 总负债截面排名\n", " \"money_cap_rank\": \"cs_rank(money_cap)\", # 货币资金截面排名\n", " # 15. 财务数据因子(来自现金流量表 financial_cashflow)\n", " \"n_cashflow_act_rank\": \"cs_rank(n_cashflow_act)\", # 经营活动现金流净额截面排名\n", " # 16. 财务估值因子\n", " \"profit_to_market_cap\": \"n_income / (total_mv + 1e-8)\", # 净利润率(净利润/市值)\n", " \"cashflow_to_market_cap\": \"n_cashflow_act / (total_mv + 1e-8)\", # 经营现金流/市值\n", " \"operate_profit_to_market_cap\": \"operate_profit / (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": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 训练参数配置" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:00.961926Z", "start_time": "2026-03-08T12:42:00.959032Z" } }, "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": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. 训练流程\n", "\n", "### 4.1 初始化组件" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:08.872125Z", "start_time": "2026-03-08T12:42:00.967162Z" } }, "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", " - ma5: ts_mean(close, 5)\n", " - ma10: ts_mean(close, 10)\n", " - ma20: ts_mean(close, 20)\n", " - ma_ratio: ts_mean(close, 5) / ts_mean(close, 20) - 1\n", " - volatility_5: ts_std(close, 5)\n", " - volatility_20: ts_std(close, 20)\n", " - vol_ratio: ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\n", " - return_10: (close / ts_delay(close, 10)) - 1\n", " - return_20: (close / ts_delay(close, 20)) - 1\n", " - return_diff: (close / ts_delay(close, 5)) - 1 - ((close / ts_delay(close, 10)) - 1)\n", " - vol_ma5: ts_mean(vol, 5)\n", " - vol_ma20: ts_mean(vol, 20)\n", " - market_cap_rank: cs_rank(total_mv)\n", " - high_low_ratio: (close - ts_min(low, 20)) / (ts_max(high, 20) - ts_min(low, 20) + 1e-8)\n", " - turnover_rate_mean_5: ts_mean(turnover_rate, 5)\n", " - bbi_ratio_factor: (ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / 4 / close\n", " - volume_change_rate: ts_mean(vol, 2) / ts_mean(vol, 10) - 1\n", " - turnover_deviation: (turnover_rate - ts_mean(turnover_rate, 3)) / ts_std(turnover_rate, 3)\n", " - vol_std_5: ts_std(ts_delta(vol, 1), 5)\n", " - std_return_5: ts_std((close - ts_delay(close, 1)) / ts_delay(close, 1), 5)\n", " - std_return_90: ts_std((close - ts_delay(close, 1)) / ts_delay(close, 1), 90)\n", " - cs_rank_volume_ratio: cs_rank(volume_ratio)\n", " - cs_rank_turnover_rate: cs_rank(turnover_rate)\n", " - n_income_rank: cs_rank(n_income)\n", " - operate_profit_rank: cs_rank(operate_profit)\n", " - total_profit_rank: cs_rank(total_profit)\n", " - ebit_rank: cs_rank(ebit)\n", " - ebitda_rank: cs_rank(ebitda)\n", " - total_liab_rank: cs_rank(total_liab)\n", " - money_cap_rank: cs_rank(money_cap)\n", " - n_cashflow_act_rank: cs_rank(n_cashflow_act)\n", " - profit_to_market_cap: n_income / (total_mv + 1e-8)\n", " - cashflow_to_market_cap: n_cashflow_act / (total_mv + 1e-8)\n", " - operate_profit_to_market_cap: operate_profit / (total_mv + 1e-8)\n", "\n", "注册 Label 因子:\n", " - future_return_5: (ts_delay(close, -5) / close) - 1\n", "\n", "特征因子数: 34\n", "Label: future_return_5\n", "已注册因子总数: 35\n", "\n", "[3] 准备数据\n", "\n", "================================================================================\n", "准备数据\n", "================================================================================\n", "\n", "计算因子: 20200101 - 20251231\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "D:\\PyProject\\ProStock\\src\\data\\financial_loader.py:148: UserWarning: Sortedness of columns cannot be checked when 'by' groups provided\n", " merged = df_price.join_asof(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "数据形状: (7044952, 53)\n", "数据列: ['ts_code', 'trade_date', 'turnover_rate', 'volume_ratio', 'high', 'vol', 'close', 'low', 'total_mv', 'f_ann_date', 'total_profit', 'operate_profit', 'ebit', 'n_income', 'ebitda', 'money_cap', 'total_liab', 'n_cashflow_act', 'ma5', 'ma10', 'ma20', 'ma_ratio', 'volatility_5', 'volatility_20', 'vol_ratio', 'return_10', 'return_20', 'return_diff', 'vol_ma5', 'vol_ma20', 'market_cap_rank', 'high_low_ratio', 'turnover_rate_mean_5', 'bbi_ratio_factor', 'volume_change_rate', 'turnover_deviation', 'vol_std_5', 'std_return_5', 'std_return_90', 'cs_rank_volume_ratio', 'cs_rank_turnover_rate', 'n_income_rank', 'operate_profit_rank', 'total_profit_rank', 'ebit_rank', 'ebitda_rank', 'total_liab_rank', 'money_cap_rank', 'n_cashflow_act_rank', 'profit_to_market_cap', 'cashflow_to_market_cap', 'operate_profit_to_market_cap', 'future_return_5']\n", "\n", "前5行预览:\n", "shape: (5, 53)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_r │\n", "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ eturn_5 │\n", "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 0.7885 ┆ 2.18 ┆ … ┆ 721.52104 ┆ 2580.5045 ┆ 938.15146 ┆ -0.00474 │\n", "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ 33 ┆ 4 ┆ 6 │\n", "│ 000001.SZ ┆ 20200103 ┆ 0.5752 ┆ 1.21 ┆ … ┆ 708.50174 ┆ 2533.9412 ┆ 921.22323 ┆ -0.02852 │\n", "│ ┆ ┆ ┆ ┆ ┆ 4 ┆ 96 ┆ 7 ┆ │\n", "│ 000001.SZ ┆ 20200106 ┆ 0.4442 ┆ 0.8 ┆ … ┆ 713.06736 ┆ 2550.2701 ┆ 927.15964 ┆ -0.00468 │\n", "│ ┆ ┆ ┆ ┆ ┆ 8 ┆ 5 ┆ 9 ┆ 5 │\n", "│ 000001.SZ ┆ 20200107 ┆ 0.3755 ┆ 0.7 ┆ … ┆ 709.74110 ┆ 2538.3738 ┆ 922.83470 ┆ -0.02274 │\n", "│ ┆ ┆ ┆ ┆ ┆ 6 ┆ 46 ┆ 6 ┆ 3 │\n", "│ 000001.SZ ┆ 20200108 ┆ 0.4369 ┆ 0.86 ┆ … ┆ 730.61584 ┆ 2613.0319 ┆ 949.97690 ┆ -0.00840 │\n", "│ ┆ ┆ ┆ ┆ ┆ 4 ┆ 01 ┆ 3 ┆ 1 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", "[配置] 训练期: 20200101 - 20231231\n", "[配置] 验证期: 20240101 - 20241231\n", "[配置] 测试期: 20250101 - 20251231\n", "[配置] 特征数: 34\n", "[配置] 目标变量: future_return_5\n" ] } ], "execution_count": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2 执行训练" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:17.812047Z", "start_time": "2026-03-08T12:42:08.881623Z" } }, "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, 53)\n", " 筛选后数据规模: (4532198, 53)\n", " 筛选前股票数: 5678\n", " 筛选后股票数: 3359\n", " 删除记录数: 2512754\n" ] } ], "execution_count": 6 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:19.603242Z", "start_time": "2026-03-08T12:42:17.822762Z" } }, "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, 53)\n", " 验证集数据规模: (769485, 53)\n", " 测试集数据规模: (771207, 53)\n", " 训练集股票数: 3297\n", " 验证集股票数: 3220\n", " 测试集股票数: 3215\n", " 训练集日期范围: 20200102 - 20231229\n", " 验证集日期范围: 20240102 - 20241231\n", " 测试集日期范围: 20250102 - 20251231\n", "\n", " 训练集前5行预览:\n", "shape: (5, 53)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_r │\n", "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ eturn_5 │\n", "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 0.7885 ┆ 2.18 ┆ … ┆ 721.52104 ┆ 2580.5045 ┆ 938.15146 ┆ -0.00474 │\n", "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ 33 ┆ 4 ┆ 6 │\n", "│ 000002.SZ ┆ 20200102 ┆ 1.0418 ┆ 1.31 ┆ … ┆ 776.91820 ┆ 47.131053 ┆ 1140.2493 ┆ -0.01105 │\n", "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ ┆ 95 ┆ 7 │\n", "│ 000004.SZ ┆ 20200102 ┆ 2.1613 ┆ 0.92 ┆ … ┆ -69.58089 ┆ -52.61755 ┆ -24.82135 ┆ -0.00044 │\n", "│ ┆ ┆ ┆ ┆ ┆ 5 ┆ 4 ┆ 9 ┆ 1 │\n", "│ 000005.SZ ┆ 20200102 ┆ 0.9843 ┆ 1.35 ┆ … ┆ 142.55925 ┆ 385.57490 ┆ 208.12520 ┆ 0.022337 │\n", "│ ┆ ┆ ┆ ┆ ┆ 6 ┆ 4 ┆ 2 ┆ │\n", "│ 000006.SZ ┆ 20200102 ┆ 0.9252 ┆ 1.62 ┆ … ┆ 633.27582 ┆ 650.95370 ┆ 819.10495 ┆ 0.012964 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 3 ┆ 5 ┆ │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", " 验证集前5行预览:\n", "shape: (5, 53)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_r │\n", "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ eturn_5 │\n", "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 000001.SZ ┆ 20240102 ┆ 0.5969 ┆ 1.41 ┆ … ┆ 2217.6093 ┆ 6486.3743 ┆ 2744.2180 ┆ -0.00325 │\n", "│ ┆ ┆ ┆ ┆ ┆ 09 ┆ 45 ┆ 84 ┆ 6 │\n", "│ 000002.SZ ┆ 20240102 ┆ 0.8348 ┆ 1.71 ┆ … ┆ 1736.4093 ┆ 19.432701 ┆ 2329.7434 ┆ -0.02660 │\n", "│ ┆ ┆ ┆ ┆ ┆ 99 ┆ ┆ 1 ┆ 1 │\n", "│ 000004.SZ ┆ 20240102 ┆ 2.2858 ┆ 0.78 ┆ … ┆ -168.7552 ┆ -184.4013 ┆ -192.7135 ┆ -0.01478 │\n", "│ ┆ ┆ ┆ ┆ ┆ 72 ┆ 85 ┆ 84 ┆ 9 │\n", "│ 000005.SZ ┆ 20240102 ┆ 0.5958 ┆ 0.43 ┆ … ┆ -96.94997 ┆ -295.0388 ┆ -46.06373 ┆ -0.05395 │\n", "│ ┆ ┆ ┆ ┆ ┆ 7 ┆ 72 ┆ 6 ┆ │\n", "│ 000006.SZ ┆ 20240102 ┆ 1.9404 ┆ 0.97 ┆ … ┆ -6.971845 ┆ -51.5536 ┆ -5.32671 ┆ -0.01345 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 4 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", " 测试集前5行预览:\n", "shape: (5, 53)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_r │\n", "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ eturn_5 │\n", "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 000001.SZ ┆ 20250102 ┆ 0.9377 ┆ 1.38 ┆ … ┆ 1791.1304 ┆ 6183.5904 ┆ 2158.1117 ┆ -0.00262 │\n", "│ ┆ ┆ ┆ ┆ ┆ 08 ┆ 38 ┆ 45 ┆ 2 │\n", "│ 000002.SZ ┆ 20250102 ┆ 1.2171 ┆ 1.06 ┆ … ┆ -1933.116 ┆ -1110.658 ┆ -1729.069 ┆ -0.02250 │\n", "│ ┆ ┆ ┆ ┆ ┆ 105 ┆ 303 ┆ 737 ┆ 9 │\n", "│ 000004.SZ ┆ 20250102 ┆ 9.4831 ┆ 0.8 ┆ … ┆ -199.1144 ┆ -126.8907 ┆ -197.3308 ┆ -0.06489 │\n", "│ ┆ ┆ ┆ ┆ ┆ 31 ┆ 63 ┆ 47 ┆ 7 │\n", "│ 000006.SZ ┆ 20250102 ┆ 2.2755 ┆ 0.79 ┆ … ┆ -646.1294 ┆ -325.4842 ┆ -637.5489 ┆ -0.04827 │\n", "│ ┆ ┆ ┆ ┆ ┆ 33 ┆ 66 ┆ 17 ┆ 8 │\n", "│ 000007.SZ ┆ 20250102 ┆ 1.9691 ┆ 1.05 ┆ … ┆ 6.740918 ┆ 108.91759 ┆ 22.556002 ┆ 0.015649 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 8 ┆ ┆ │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n" ] } ], "execution_count": 7 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:20.933369Z", "start_time": "2026-03-08T12:42:19.615723Z" } }, "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, 53)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_r │\n", "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ eturn_5 │\n", "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ -0.492311 ┆ 2.080178 ┆ … ┆ 1.441327 ┆ 2.715295 ┆ 1.645238 ┆ -0.00474 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 6 │\n", "│ 000002.SZ ┆ 20200102 ┆ -0.40826 ┆ 0.478477 ┆ … ┆ 1.5879 ┆ -0.110121 ┆ 2.111027 ┆ -0.01105 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 7 │\n", "│ 000004.SZ ┆ 20200102 ┆ -0.036785 ┆ -0.239526 ┆ … ┆ -0.651808 ┆ -0.221369 ┆ -0.574193 ┆ -0.00044 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 1 │\n", "│ 000005.SZ ┆ 20200102 ┆ -0.42734 ┆ 0.552119 ┆ … ┆ -0.090517 ┆ 0.267338 ┆ -0.037305 ┆ 0.022337 │\n", "│ 000006.SZ ┆ 20200102 ┆ -0.446951 ┆ 1.049198 ┆ … ┆ 1.207844 ┆ 0.563309 ┆ 1.370863 ┆ 0.012964 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", " 训练集特征统计:\n", " 特征数: 34\n", " 样本数: 2991506\n", " 缺失值统计:\n", " ma5: 11541 (0.39%)\n", " ma10: 25950 (0.87%)\n", " ma20: 54850 (1.83%)\n", " ma_ratio: 54850 (1.83%)\n", " volatility_5: 11541 (0.39%)\n" ] } ], "execution_count": 8 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:38.165178Z", "start_time": "2026-03-08T12:42:20.939484Z" } }, "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", " 特征数: 34\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": 9 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:38.355756Z", "start_time": "2026-03-08T12:42:38.169740Z" } }, "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": 10 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:39.677665Z", "start_time": "2026-03-08T12:42:38.364128Z" } }, "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.000501\n", " 标准差: 0.008088\n", " 最小值: -0.154524\n", " 最大值: 0.096327\n" ] } ], "execution_count": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3 训练指标曲线" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:42.772470Z", "start_time": "2026-03-08T12:42:39.683522Z" } }, "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", "[31]\ttrain's l1: 0.0428788\tval's l1: 0.0539432\n", "训练完成,指标已收集\n", "\n", "评估指标: l1\n", "\n", "[早停信息]\n", " 配置的最大轮数: 1000\n", " 实际训练轮数: 131\n", " 早停状态: 已触发(连续100轮验证指标未改善)\n", "\n", "最终指标:\n", " 训练 l1: 0.042513\n", " 验证 l1: 0.053961\n" ] } ], "execution_count": 12 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:43.013683Z", "start_time": "2026-03-08T12:42:42.777555Z" } }, "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": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdsRJREFUeJzt3Ql8E2X+x/Ff2vQAuY9y36DIIQgIggcqCCirIoiKKIcsnlziCSLIoqJ/BUFBkV1FdxcEu4onogjqqqCAoIgr3ohyFVBueuf/+j0wMUmTNm3TyTT9vH2NmcxMkknydEi++T3PuDwej0cAAAAAAAAAG8XZ+WAAAAAAAACAIpQCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAAAAAACA7QilAAAAAAAAYDtCKQAAAAAAANiOUAoAAAAAAAC2I5QCAMCBnn/+eXG5XN4pEho3buy9v/vvvz8i9xmr9PWxXit93ZzIt31oeylu24nGcy6Jdg4AAEoPQikAAIKENuFOH3zwAa8f5OGHH/ZrF2vXrg35qgwfPty7XWJiouzZsycmX8FYCZx8wzqdtm7dWuBtVqxYIWPHjpVu3bpJ+fLlC337UDwejyxbtkyuu+46Ofnkk6VSpUqSkJAgtWrVkh49esgjjzwiO3fuLPL9AwBgN7ftjwgAAAp0xhlnyKOPPhrRV+ree++VAwcOmHn9sozI0ZBAX9/c3Fxz/V//+pd07tw5z3bHjh2Tl19+2Xu9b9++UrNmTce3nZJSmva1MObOnSuvvfZaRO/z119/lWuuuUY+/vjjPOvS0tJk1apVZvrmm2/8KucAAHAyQikAAIKENuqPP/6Qhx56yHv9wgsvlF69evm9Xs2aNQv5+h08eNBUMhRF69atzRRJI0eOjOj94U/16tUz7eOdd94x1xcvXiwzZ840VSy+li5dKocOHfJeHzZsWMRfxpJoOyWlNO1rYWhFVP369aVTp06Sk5Mjb7zxRrHub/fu3dK9e3f5+eefvcuaNGkil156qamS0mPVp59+GjSwijR9PhkZGaYCDACA4qL7HgAAPqHNHXfc4Z0CQxytLvJdf8UVV0jDhg39uvI9++yz0qFDBylXrpyce+655nb6RXLcuHFyzjnnSIMGDeSkk06SpKQkE2RccsklQb+w5tf16bzzzvMu11Dj+++/l0GDBkmNGjUkOTnZPH6wKo1QY0rpfvs+1k8//SRPPfWUnHbaaeb+UlJS5K9//av54hvo6NGjMmHCBPM66LYaMMybN88856J0c9TtRowYYZ5DnTp1zOukX36bN29uur199dVXeW6jr4H1OPraaPelG264wXv7U089Vf7+978HfTy9v7/85S8mPNSpT58+smHDBikK3T/L3r175e23386zjVZQWfR11UoppdVC/fr1M12yqlWrZsKsKlWqmGqrBx98UI4cORKxbnNFec4apmk1mLYJDUG022GFChWkVatWMmrUKL8uaTqvj+v7eijffbLaX0H7qpVljz/+uJx11llStWpV87j6+BdffLG89NJLebYvTluOpEWLFpnKJn3d+vfvX+z70+OHbyB18803y3fffSezZs0yf3//93//J//973/l22+/NeFoqL+N/F4r3/cw8Hbbtm0z77++9to29TUt6O+7S5cu3vWBx9Ivv/xSrr/+ehPq67FS29Lpp59ufgQoTFsHAMQADwAACOrnn3/26D+V1jRlypR8159zzjl+19u1a2e2e+ONN/yWB5umTp3qd98LFizwW++re/fu3uWnnXaap2LFinnuz+Vyed577z2/2zVq1Cjoc3n//ff9bnv22WcH3cdzzz3X7/4yMzPzPGdruuSSS/yu62OE4/bbb8/3dUpMTPSsWLHC7zZDhw71rm/atKmnTp06QW/77LPP+t1u3bp1ngoVKuTZLjk52dOjRw/vdX3dwpGenu6pUqWK93ZXXHGF3/qdO3d64uPjvetvu+0277rq1avn+7zbtm3rOXTokN/9+a7X9hJO2ynqcx4wYEC++1epUiXPpk2bgv5dBJus9pffvurr1bp163zvR/crKyur2G05P7qvvrfV51cYgc+xsLffsWOH+Xu2bt++fXtPTk5OWLf1/dvQ44avwNfKd798b9eiRQtP7dq1/bZdunSp39/+DTfc4HffP/zwg9/2q1ev9q576qmnPG63O+R72qpVK/PeAwDKBrrvAQAQIR999JE0atRIBgwYYKp7dJwX5Xa7pX379qYrj44fpNUpWg3wySefyPvvv2+2mTZtmqkQ0uqpwti0aZOpILnttttMVYlWBGn3Gs0stPpGBz8uLO0CpLfTyrBXX33VW52klRjaRejMM88012fPnm2es0WrUS677DJTBfH6669LUWgVmXZTatu2rakY0iqKffv2yVtvvWXGysnMzJQxY8bI//73v6C318oYrYjRShK97dNPP21eF6XVJFqdofT10fnDhw+b61rNoeP1aDWZjvm0cuXKQu+7VmVdffXVplJMaQXc/v37TcWTVT2j702wrnva1ev888837UffT90/rYxZsmSJaSv6Hmh1yl133SVFVZznrM9Bu65q1ZlVsaRdyrQSSKtotKvq3XffbQbh1vdN29769evN/lt8x44KZ0yzwYMHy9dff+29rpWJWpmlg4ivWbPGLNP91uqayZMnF6stO5keI45nkMcNHTpU4uLs6+yglZhKK77atWsnv/zyi1SuXNlUwll////5z39kzpw53u6qL774ovf2LVu2lK5du5r51atXm8o6a+w1ff21Uk+7tL7wwgumwlD/tocMGSLvvvuubc8RABA9hFIAAESIjvGi3aCsEMKiX7p00u42GzduNGdb0y9v2gXps88+M13gsrOzzSDF2kWmMDRY0DBBu74oDWS0S49at25dkZ7H5Zdfbr7s631rtyHt8mSFKXqf1hf5f/zjH97baLChX/I1CLICF/2SWVhTp041X1g10NAQSkMd7TJ00UUXmetKL7VrlHaFDEbHc9JwTGm3Qn0OSrs26ZffihUrmtfdtyugjiemwaDS4Ee7FekX5MLSL+pWKKXj7mgXM+1KGNh1T98vDfEsX3zxhRnPTL+0a8ijQZQGQB07djQBitLxqooTShXnOet7nZWVZd5jDSk0hNIgTQOfBQsWmG20/eo2Grpq91btmucbSumycOnrofdn0f3TM8spDaC0K6wVTGk4OmnSpKBBTbht2cm2b9/ud11DHrvpMUXPJuhL26gGxBpy/v7776Z9arfQwFDKtxvnY4895g2ktFugHrus9+2qq67ynhxAg0cN3H3/RgAAsYlQCgCACLn11lvzBFJKx2rRqg8NHPLz22+/FfoxtQLBCqTUKaec4p0v6rg5WmVkje+jVS86VpVWxfjep34R1ZDHMnDgQG8gZX0RLUoopV9GdcwfDWYKeq2ChVJ169b1BlKBr4e1/xpKaejlS98fi4YqOtaXFbYUhn6p1moeq5JLgygNpTZv3myClmBf1PVL+j333GPCFa0Ey+85F0dxnvPChQtNqJNfUKchnK7XsbyKywqcfKuDLPHx8XLttdd6t9FARNuihnhFacvI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K1fKd999Z65/+eWX8vHHH8tFF11EG0OJCOe4pZfaZU+PfxbdXr8jaGUVUJTvAtrNT9sVbQyF4S7U1iiV9u7da8YzqFWrlt9yvb5ly5ao7RdiR25urhnnR7vAtGnTxizTD0OJiYnef5h8252uA8KxePFiUxau3fcC0cYQCT/99JPpWqVd3CdOnGja2pgxY8zxa+jQod7jVbB/QzmWIRz33HOPHDx40PwwEx8fbz6TPfjgg6Zbi3Uso40hksJpU3qpQbwvt9ttflzk2IbC0m6hOsbUoEGDzBhltDEUBqEUgIhUsmzevNn88gtEyq+//ipjx441Y13oCRqAkgrVtVLgoYceMte1UkqPZzoOi4ZSQHG99NJLsnDhQlm0aJG0bt1avvjiC/NDjg4MTBsDUNppz4grr7zSDK6vP/IAhUX3vTKgRo0a5pe5wLOe6fXatWtHbb8QG0aNGmUGx3z//felfv363uXatrTr6P79+/22p90hXNoFVE/G0KFDB/PrrU46YL4O3Krz+osvbQzFpWematWqld+yU089VbZt2+Y9llnHLo5lKIo777zTVEtdffXV5kxV1113nTlJg57FljaGkhDOcUsvA094lJ2dbc7Ix/cDFDaQ+uWXX8yPiFaVFG0MhUEoVQZoF4SOHTua8Qx8fxnW6127do3qvqH00l9DNJBaunSprFq1ypzq2pe2OT2blW+707Ny6Bc92h3C0aNHD/nqq69MVYE1aUWLdnmx5mljKC7tdqzHJl869k+jRo3MvB7b9Aua77FMu2LpmCscyxAOPUuVjtPjS38s1M9itDGUhHCOW3qpPxzqD0AW/Tyn7VLHngLCDaS+//57ee+996R69ep+62ljCBfd98oIHStDS8T1S1znzp1l1qxZ5jSfw4cPj/auoRR32dOuCK+99ppUrFjRO/6ADqRZrlw5czlixAjT9nR8Av3lZPTo0eYfqDPPPDPau49SQNuVNUaZRU9prR96rOW0MRSXVqzoQNTafU8/XK9du1bmz59vJqWDtmpXqwceeEBatGhhvuzpKbC161W/fv14A1CgSy65xIwhpSf60O57GzdulJkzZ8r1119PG0ORHT58WH744Qe/wc31Bxv9zKVtraDjllaE9unTR0aOHGm6K2vAoD82akWfbgfk18a0yviKK64w435qjwkdK8/6LqDrtSiCNoawFe5kfSjN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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[指标分析]\n", " 最佳验证 l1: 0.053943\n", " 最佳迭代轮数: 31\n", " 早停建议: 如果验证指标连续10轮不下降,建议在第 31 轮停止训练\n", "\n", "[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\n" ] } ], "execution_count": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 查看结果" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:43.064939Z", "start_time": "2026-03-08T12:42:43.030137Z" } }, "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, 54)\n", "结果列: ['ts_code', 'trade_date', 'turnover_rate', 'volume_ratio', 'high', 'vol', 'close', 'low', 'total_mv', 'f_ann_date', 'total_profit', 'operate_profit', 'ebit', 'n_income', 'ebitda', 'money_cap', 'total_liab', 'n_cashflow_act', 'ma5', 'ma10', 'ma20', 'ma_ratio', 'volatility_5', 'volatility_20', 'vol_ratio', 'return_10', 'return_20', 'return_diff', 'vol_ma5', 'vol_ma20', 'market_cap_rank', 'high_low_ratio', 'turnover_rate_mean_5', 'bbi_ratio_factor', 'volume_change_rate', 'turnover_deviation', 'vol_std_5', 'std_return_5', 'std_return_90', 'cs_rank_volume_ratio', 'cs_rank_turnover_rate', 'n_income_rank', 'operate_profit_rank', 'total_profit_rank', 'ebit_rank', 'ebitda_rank', 'total_liab_rank', 'money_cap_rank', 'n_cashflow_act_rank', 'profit_to_market_cap', 'cashflow_to_market_cap', 'operate_profit_to_market_cap', 'future_return_5', 'prediction']\n", "\n", "结果前10行预览:\n", "shape: (10, 54)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ cashflow_ ┆ operate_p ┆ future_re ┆ predicti │\n", "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ to_market ┆ rofit_to_ ┆ turn_5 ┆ on │\n", "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ _cap ┆ market_ca ┆ --- ┆ --- │\n", "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ p ┆ f64 ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ --- ┆ ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 000001.SZ ┆ 20250102 ┆ -0.442803 ┆ 0.60735 ┆ … ┆ 4.430923 ┆ 3.905767 ┆ -0.002622 ┆ -0.01380 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 2 │\n", "│ 000002.SZ ┆ 20250102 ┆ -0.350092 ┆ 0.018219 ┆ … ┆ -1.401378 ┆ -3.606928 ┆ -0.022509 ┆ -0.01000 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 2 │\n", "│ 000004.SZ ┆ 20250102 ┆ 2.392751 ┆ -0.46045 ┆ … ┆ -0.304204 ┆ -0.971788 ┆ -0.064897 ┆ -0.00486 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 4 │\n", "│ 000006.SZ ┆ 20250102 ┆ 0.001109 ┆ -0.478861 ┆ … ┆ -0.525691 ┆ -1.986389 ┆ -0.048278 ┆ -0.00030 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 9 │\n", "│ 000007.SZ ┆ 20250102 ┆ -0.100561 ┆ -0.000192 ┆ … ┆ -0.041212 ┆ -0.464999 ┆ 0.015649 ┆ 0.000112 │\n", "│ 000008.SZ ┆ 20250102 ┆ 0.59965 ┆ -0.810247 ┆ … ┆ -0.360266 ┆ -1.189503 ┆ -0.066939 ┆ -0.01029 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 8 │\n", "│ 000009.SZ ┆ 20250102 ┆ -0.443002 ┆ 1.178071 ┆ … ┆ 0.296618 ┆ 0.676674 ┆ -0.036045 ┆ -0.00890 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 9 │\n", "│ 000010.SZ ┆ 20250102 ┆ 1.435875 ┆ 0.478477 ┆ … ┆ -0.214012 ┆ -1.156491 ┆ 0.092123 ┆ -0.00856 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 6 │\n", "│ 000011.SZ ┆ 20250102 ┆ -0.487201 ┆ -0.073833 ┆ … ┆ -1.762282 ┆ -0.517669 ┆ -0.022094 ┆ -0.00446 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 2 │\n", "│ 000012.SZ ┆ 20250102 ┆ -0.47635 ┆ 0.496888 ┆ … ┆ 0.793245 ┆ 0.662619 ┆ -0.029188 ┆ -0.01157 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 2 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", "结果后5行预览:\n", "shape: (5, 54)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ turnover_ ┆ volume_ra ┆ … ┆ cashflow_ ┆ operate_p ┆ future_re ┆ predicti │\n", "│ --- ┆ e ┆ rate ┆ tio ┆ ┆ to_market ┆ rofit_to_ ┆ turn_5 ┆ on │\n", "│ str ┆ --- ┆ --- ┆ --- ┆ ┆ _cap ┆ market_ca ┆ --- ┆ --- │\n", "│ ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ p ┆ f64 ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ --- ┆ ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 605588.SH ┆ 20251231 ┆ -0.287278 ┆ -0.478861 ┆ … ┆ 0.245664 ┆ -0.750859 ┆ null ┆ -0.00085 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 3 │\n", "│ 605589.SH ┆ 20251231 ┆ -0.211755 ┆ -0.828658 ┆ … ┆ -0.316701 ┆ 0.328847 ┆ null ┆ -0.00538 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 4 │\n", "│ 605598.SH ┆ 20251231 ┆ 0.754611 ┆ -0.552502 ┆ … ┆ -0.157841 ┆ -0.386306 ┆ null ┆ -0.00914 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 6 │\n", "│ 605599.SH ┆ 20251231 ┆ -0.565809 ┆ 0.404836 ┆ … ┆ 1.377021 ┆ 1.078554 ┆ null ┆ -0.00074 │\n", "│ 689009.SH ┆ 20251231 ┆ -0.486869 ┆ -0.570913 ┆ … ┆ 1.185366 ┆ 0.848817 ┆ null ┆ -0.00457 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 1 │\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", "│ 000001.SZ ┆ 20250102 ┆ -0.002622 ┆ -0.013802 │\n", "│ 000002.SZ ┆ 20250102 ┆ -0.022509 ┆ -0.010002 │\n", "│ 000004.SZ ┆ 20250102 ┆ -0.064897 ┆ -0.004864 │\n", "│ 000006.SZ ┆ 20250102 ┆ -0.048278 ┆ -0.000309 │\n", "│ 000007.SZ ┆ 20250102 ┆ 0.015649 ┆ 0.000112 │\n", "│ 000008.SZ ┆ 20250102 ┆ -0.066939 ┆ -0.010298 │\n", "│ 000009.SZ ┆ 20250102 ┆ -0.036045 ┆ -0.008909 │\n", "│ 000010.SZ ┆ 20250102 ┆ 0.092123 ┆ -0.008566 │\n", "│ 000011.SZ ┆ 20250102 ┆ -0.022094 ┆ -0.004462 │\n", "│ 000012.SZ ┆ 20250102 ┆ -0.029188 ┆ -0.011572 │\n", "└───────────┴────────────┴─────────────────┴────────────┘\n" ] } ], "execution_count": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 保存结果" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:43.409508Z", "start_time": "2026-03-08T12:42:43.073624Z" } }, "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.086703 ┆ 603007.SH │\n", "│ 2025-01-02 ┆ 0.073642 ┆ 603559.SH │\n", "│ 2025-01-02 ┆ 0.047455 ┆ 603959.SH │\n", "│ 2025-01-02 ┆ 0.019551 ┆ 600530.SH │\n", "│ 2025-01-02 ┆ 0.014435 ┆ 600608.SH │\n", "│ … ┆ … ┆ … │\n", "│ 2025-01-06 ┆ 0.087354 ┆ 603007.SH │\n", "│ 2025-01-06 ┆ 0.053317 ┆ 603959.SH │\n", "│ 2025-01-06 ┆ 0.033367 ┆ 000573.SZ │\n", "│ 2025-01-06 ┆ 0.019381 ┆ 603848.SH │\n", "│ 2025-01-06 ┆ 0.017292 ┆ 603226.SH │\n", "└────────────┴──────────┴───────────┘\n" ] } ], "execution_count": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.5 特征重要性" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:43.418164Z", "start_time": "2026-03-08T12:42:43.414098Z" } }, "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", "ebitda_rank 14994.629439\n", "bbi_ratio_factor 1948.020045\n", "cs_rank_turnover_rate 1686.329153\n", "std_return_90 1566.943976\n", "return_10 1430.825613\n", "std_return_5 1242.399894\n", "ma_ratio 979.636333\n", "high_low_ratio 932.793097\n", "volume_change_rate 652.408669\n", "vol_ratio 651.873589\n", "cs_rank_volume_ratio 649.430382\n", "vol_ma20 649.122400\n", "turnover_rate_mean_5 615.645898\n", "ma20 535.948738\n", "return_20 452.979679\n", "market_cap_rank 407.870511\n", "return_diff 304.914024\n", "ebit_rank 294.325396\n", "profit_to_market_cap 287.904060\n", "vol_std_5 243.944097\n", "operate_profit_to_market_cap 232.366538\n", "ma10 201.935446\n", "volatility_20 169.372244\n", "volatility_5 161.736089\n", "ma5 111.549055\n", "n_income_rank 79.050783\n", "vol_ma5 73.284933\n", "operate_profit_rank 57.328938\n", "total_profit_rank 35.760864\n", "n_cashflow_act_rank 34.917162\n", "money_cap_rank 32.511166\n", "total_liab_rank 24.127689\n", "cashflow_to_market_cap 20.326702\n", "turnover_deviation 0.000000\n", "dtype: float64\n", "\n", "================================================================================\n", "训练完成!\n", "================================================================================\n" ] } ], "execution_count": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. 可视化分析\n", "\n", "使用训练好的模型直接绘图。\n", "- **特征重要性图**:辅助特征选择\n", "- **决策树图**:理解决策逻辑" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:43.429903Z", "start_time": "2026-03-08T12:42:43.423547Z" } }, "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", "特征数量: 34\n" ] } ], "execution_count": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 绘制特征重要性(辅助特征选择)\n", "\n", "**解读**:\n", "- 重要性高的特征对模型贡献大\n", "- 重要性为0的特征可以考虑删除\n", "- 可以帮助理解哪些因子最有效" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T12:42:43.605795Z", "start_time": "2026-03-08T12:42:43.439482Z" } }, "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": "iVBORw0KGgoAAAANSUhEUgAAA9kAAAMWCAYAAADlCkWLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAA8BVJREFUeJzs3Qm4TeX7//HbPCZDpoQyRSIyZcg8RaKEyhiVypCppFSIEEXfTM2iuVQUkhTxlSlDKEqIMpYpZD7/6/N8/2v/9tln7+Mcds5yzvt1XTvn7L322sOzdPms+36elSomJibGAAAAAADAeUt9/rsAAAAAAACEbAAAAAAAoohKNgAAAAAAUULIBgAAAAAgSgjZAAAAAABECSEbAAAAAIAoIWQDAAAAABAlhGwAAAAAAKKEkA0AAAAAQJQQsgEAAC6w7du3W8aMGe2///3vBXm9Tp062ZVXXnlOz3300UetSpUqUX9PAJBcEbIBAMnK5MmTLVWqVGFvCgv/hsWLF9ugQYPswIED5tfvY8WKFXaxmjBhgvscycmQIUNccK1evXqcxxYuXGitW7e2AgUKWPr06e3SSy912+o5u3fvvuDvtVevXrZmzRqbMWPGBX9tALgYpU3qNwAAwL9BgeSqq66Kdd+11177r4XswYMHu2ph9uzZ/5XXSMkUsi+77DL3/SYHe/futTfffNPdQj355JP29NNPW5EiRdzn1Z/Hjh2z77//3p577jn3nF9//TXRr/nKK6/YmTNnzun95suXz5o3b26jR4+2W2655Zz2AQApCSEbAJAs3XTTTVaxYkW7mB05csSyZMliKdXRo0ctc+bMlty89dZbljZtWmvWrFms+99//30XsFXFnjp1qqtiBxszZoy7nYt06dKd13vWe2rVqpVt3rzZBX8AQGS0iwMAUqTZs2fbjTfe6ELsJZdcYk2bNrX169fH2uaHH34IVBM1f1YVvc6dO9tff/0V2EZt4g8//LD7WZVzrzV969at7qafw7U66349N3g/uu/HH3+0u+66y3LkyGE1atSIFcwqVKhgmTJlspw5c9odd9zh5vWeC32mrFmz2rZt2+zmm292P6s1efz48e7xtWvXWt26dd13U7hwYXvnnXfCtqB/++231rVrV8uVK5dly5bNOnToYPv37w9biS5durRlyJDBLr/8cuvWrVuc1vratWu7TgNVbGvWrOnC9WOPPebmEWtcFixYEPhuta3s27fP+vXrZ2XKlHGfQe9BJ1fU2hxs/vz57nkffPCBDRs2zK644go3nvXq1bNNmzbFeb9Lly61Jk2auDHQd1C2bFl74YUXYm2zYcMGu/32291YaF86oZPQdupPP/3UtX/rPYdWsVWxf+211+IEbFHbePAxI9OnT3fHrr5Xfb9FixZ1Qf306dPxzsn2jk1Vp19++WX3PD2/UqVKtnz58jivXb9+/cDrAQDiRyUbAJAsHTx40P78889Y9ynAiKqEHTt2tEaNGtnIkSNdxXTixIku1K5atSoQRubOnesqd3fffbcL2Ap7CiT6c8mSJS6k3Hbbbfbzzz/bu+++66qM3mvkzp3btQUnlqqFxYsXt2eeecZiYmLcfQqGTzzxhKsm3nPPPW6/L774ogujer/n0qKuEKZAqn08++yz9vbbb1v37t1dqHz88cetbdu27rNNmjTJheeqVavGab/X9nptBb+NGze67/C3334LhFrRY2qlV0h74IEHAtspyGnRr+AKq05e6D3pBEK7du0sb968LlD36NHDBVK9L9H9orFRYNV3pvem+covvfSS1apVy52sUPAMNmLECEudOrUL5jo+9Ln1ORWqPRpznXjInz+/PfTQQ27cf/rpJ/v888/d76Lx11xqnZjQPH99ZwrwLVq0sGnTptmtt94a8Xs/efKk++z6LoLpGNJN4xsavuOjEx7avk+fPu7Pr7/+2oX1Q4cO2ahRo876fJ1A+fvvv93JEo2ZvhONu77b4LFRwFcQ15j17t07we8PAFKkGAAAkpE33nhDyTTsTf7++++Y7Nmzx9x7772xnrdr166YSy+9NNb9R48ejbP/d9991+3r22+/Ddw3atQod9+WLVtibavfdb/eUyjd/9RTTwV+18+6784774y13datW2PSpEkTM2zYsFj3r127NiZt2rRx7o/0fSxfvjxwX8eOHd19zzzzTOC+/fv3x2TKlCkmVapUMe+9917g/g0bNsR5r94+K1SoEHPixInA/c8++6y7f/r06e73PXv2xKRPnz6mYcOGMadPnw5sN27cOLfd66+/HrivVq1a7r5JkybF+QylS5d2j4c6duxYrP1633mGDBlihgwZErjvm2++cfsuVapUzPHjxwP3v/DCC+5+fZdy6tSpmKuuuiqmcOHC7vsIdubMmcDP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G0CCHDlyxK666qqw4VShuUWLFrZ582abPn26rVq1yoXx+vXru+eFGjt2rAvYoQ4fPuzCeaFChWzp0qW2aNEiu+SSS1zQPnnyZMT31rt3b/vss8/sww8/tAULFtiOHTvstttuCzz+/fffW548eeytt96y9evX2+OPP24DBgywcePGBbbZsmWLNW3a1OrUqWOrV6+2Xr162T333GNz5szhCAEAAECKkOQhe9euXdajRw8rUqSIq3ypStasWTObN2+eJScKJaoMXnnllS4YKSCFO2Ggx4JvJUuWTJL3i3+Hwm/btm1dmA6livWSJUts4sSJVqlSJbv66qvdz//884+9++67sbZVgH3uuefs9ddfj7OfDRs22L59+2zIkCFuH6VLl7annnrKVaV/++23sO/r4MGD9tprr9nzzz9vdevWtQoVKtgbb7xhixcvdu9JOnfu7E4O1KpVy/19bdeund1999328ccfB/YzadIkdxJB702V7u7du9vtt99uY8aMicK3BwAAAPhf2qR88a1bt1r16tVdS+uoUaOsTJkyrtKmqpfaVhUWkoujR4+6YNKqVStXMYxEgeirr74K/J427bkNUZXh8+xU2izn9Fz8O7aOaBrv48ePH3d/ZsyYMXBf6tSp3cknVaNVEfaOpbvuusvGjx9v+fLli7MfBWu1fCs0P/bYY3b69Gn3s0KvTvKEoyq1/u6pau7RCR5Vw7/77ju74YYbIobznDlzBn7XtsH7EFXQVdEGAAAAUoIkrWQ/+OCDrlq7bNkyV+UtUaKEC5l9+vQJVM+2bdtmzZs3d3NEs2XLZq1bt441TzRU7dq14/yDXlVDzXP1KGhoXmyHDh3cftWSO2PGDNu7d2/gtcqWLWsrVqwIPEfzSnUyQCcAFFa0jaqSO3fuTNBnVWVSJxLuuOMOF5oiUahWcPJul112WYL2j4ufF2rVgr1//347ceKEjRw50n7//fdYx5lO0lSrVs0dq+GoNVzzotXWrbnTOla/+OILmz17dsSTNuooSZ8+vTvGg+XNm9c9Fo6q3O+//77dd999sfaj54Tu49ChQ64iDwAAACR3SVbJVjur/uE/bNgwy5IlbsVV/9g/c+ZMIPRqjuipU6dchbtNmzYuRJwPta8+88wz9sQTT7if27dv74KLWmIVhvv37+9CuNq8vXmvqiCOHj3apk6d6iqMapft16+f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LHPmzFa4cGEbNWrUOX5bAAAAQMqQLEK2AoWCAHAhHTlyxK677jobP3582Md//fVXq1Gjhgu78+fPtx9++MEee+wxS5cuXWCbDh062MaNG23GjBm2du1au+2226x169a2atWqwDYK3Qrid999t61Zs8b++9//2l133RXveytRooSNGzfO7XPRokV25ZVXWsOGDQMBf8OGDXbmzBl76aWXbP369TZmzBibNGmSe3+e2bNnW9u2be3++++3devW2YQJE9x22i8AAAAAH4dsVfN69OhhRYoUsQwZMljBggVdhXDevHmWnLzyyit24403usqiV11ctmxZ4PGTJ09a//79rUyZMq4CqQqpQtiOHTuS9H0jvJtuusmGDh1qt956a9jHH3/8cWvSpIk9++yzVr58eVct1nGdPXv2wDaLFy92x37lypXd8T9w4ED3+Pfff+8eP3XqlD300EOugqywq/B8zTXXuCAeH4VwHV/aZ+nSpe3555+3Q4cOuaAvjRs3tjfeeMMFb22janu/fv3s448/Duxj6tSprmKu19U2TZs2tQEDBtjIkSMtJiaGwwIAAAAII60lMbWtVq9e3QULBQkFTIXNOXPmWLdu3VzFLblQNfPOO++0atWqWcaMGV1YUchRJbFAgQJ29OhRW7lypT3xxBOuQrp//34XsBSAVqxYkajXqjJ8np1Km+Vf+ywp2dYRTc+6jarEavF+5JFHrFGjRq4yrdbshx9+OFYlW8fC+++/7wKs/g6oPfvYsWNWu3Zt97iOhz/++MNSp07tgrpOSKlrQ39Xrr322gS9X7WAv/zyy65lXcdVJAcPHrScOXMGfj9+/LhrEw+m1vLff//dfvvtN1cdBwAAAOCzSvaDDz7o5rOqotuyZUtXqVPlrU+fPrZkyRK3zbZt26x58+aWNWtWy5Ytm6vi7d69O+I+FVB69eoV6z5V5Dp16hT4XQFBVUhVirVfzTdVy67aab3XKlu2bKxwO3nyZBeEdAKgVKlSbhtVBHfu3Jmgz/r222+7z6uQpBbiV1991YUxr2KvEDR37lz3+a6++mq74YYbXGuuqpr6DnDx2LNnjx0+fNhGjBjhjpEvv/zSVbw1tmq99ihU66RSrly5XBdH165d7ZNPPrFixYq5xzdv3hyYEqEq9+eff+66IHSM79u3L973oG11jOqEjtq8dWxddtllYbfdtGmT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2YMGDbJy5col9dtAMvTtt99as2bN7PLLL7dUqVLZp59+GuvxTp06ufuDb40bN46zn5kzZ1qVKlUsW7Zs1rZtW2vZsmWcbSZPnmxly5a1jBkzWp48eaxbt27xvrdff/3Vbr31VsudO7fbb+vWrW337t1htz1+/Lj7O6L3t3r16rDbbNq0yS655BLLnj37Wb4VAAAAAL4O2bt27bIePXpYkSJFLEOGDFawYEEXbObNm2fJySuvvGI33nij5ciRw93q169vy5Yti7VNTEyMPfnkk5Y/f37LlCmT2+aXX35Jsvec0h05csSuu+46Gz9+fMRtFKp37twZuL377ruxHp82bZq1b9/e7r77bluxYoWNGDHC7rjjjljbPP/88/b444/bo48+auvXr7evvvrKGjVqFO/7atiwoQvNX3/9tf33v/+1EydOuL83Z86cibP9I4884k4URHLy5Em788473fEJAAAA4NyltSS2detWq169uquejRo1ysqUKeP+wT9nzhxXyduwYYMlF/Pnz3dBplq1aq5aOXLkSBeUFKoKFCjgtnn22WftP//5j7355pt21VVX2RNPPOHC1o8//uiek1BVhs+zU2mz/IufJvnbOqKp3XTTTe4WH50YypcvX9jHTp06ZQ899JA7trt06eKObVWMmzRpEthm//79NnDgQPvss8+sXr16gftV1Y5EoVp/d1atWuWq2KJjRidvFLp1csYze/Zs+/LLL13Y18/h6PVLlizpXn/x4sXxfl4AAAAAPq5kP/jgg64ap4quWmhLlChhpUuXtj59+tiSJUvcNtu2bbPmzZtb1qxZz9oWK7Vr17ZevXrFuq9Fixautddz5ZVX2tChQ61Dhw5uv4ULF7YZM2bY3r17A6+lkKPKY3A7r04G6ARAqVKl3DZeFTMh3n77bfd51barQPPqq6+6qqNXsVcVe+zYsS7w6D3o9adMmWI7duyI06YMf508UXv31VdfbQ888ID99ddfgcdWrlxpf/zxh6VOndrKly9vhQoVsiFDhti6desC28ydO9cdB9pOx9UVV1zhjvHt27dHfE21f+vvjQK+Rydh9DqLFi0K3Ke/J/fee69NnTrVMmfOHHZfCuUffvhhvNV6AAAAABdByN63b5998cUXrmKdJUvcqqsCrcKHAqe2XbBggQskmzdvtjZt2pz3648ZM8ZV0VUNbNq0qWvp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mtnll19uqVKlsk8//TTid3L//fe7bcaOHRvr/ltuucUKFSpkGTNmtPz581v79u1tx44dsbb54YcfrE6dOtaqVSsrUqSIPfvss2f97pcvX2716tWz7NmzW44cOaxRo0a2Zs2awOPz58+35s2bu9fMkiWLlStXzt5+++04+zlw4IB169bNbZchQwYrUaKEzZo1K8WPPQAAABBtKSJkDxo0yIUPIJwjR47YddddZ+PHj4/3C/rkk09syZIlLoyHUnj+4IMPbOPGjTZt2jT79ddf7fbbbw88fujQIWvYsKEL4s8995wNHz7cHZcvv/xyxNc7fPiwNW7c2D1n6dKltmjRIrvkkktc0D558qTbZvHixVa2bFn3mgrxd999t3Xo0ME+//zzwH5OnDhhDRo0sK1bt9pHH33k3uMrr7xiBQoU4IAAAAAAoiytXQR27dplw4YNs5kzZ9off/xhefLkcaG5V69ersqXXNSuXdsWLFgQ5/4mTZq4z45/x0033eRu8dFx16NHD5szZ441bdo0zuO9e/cO/Fy4cGF79NFHrUWLFi4Mp0uXzlWXFXYVbr/66is3puvWrbPnn3/e7rvvvrCvuWHDBtu3b58NGTLEChYs6O576qmnXKj+7bffrFixYvbYY4/Fes5DDz1kX375pX388cd28803u/tef/11tx8Fcr0XufLKK8/hmwIAAABw0YdsVd+qV6/u2mVHjRplZcqUccFFYUftrwoiyYWCkYKY56+//nIVVrUXJ1aV4fPsVNosUX6Hyc/WEXEDc6gzZ8649u+HH37YSpcufdbtFWgVqqtVqxYItd99953VrFnT0qdPH9hOFemRI0fa/v37XSt4qKuvvtpy5cplr732mgvTp0+fdj+XKlUq3pB88OBBt41nxowZVrVqVff3Zfr06ZY7d2676667rH///pYmTZqzfh4AAAAAyahd/MEHH3RzYJctW2YtW7Z0c0kVdPr06eNad2Xbtm1uXmrWrFktW7Zs1rp1a9u9e3e8FWNVwYOp6tipU6fA7woxQ4cOda232q+qkwore/fuDbyWKoorVqwIPGfy5MnuZIBOACjkaBu1++7cuTNBnzVnzpyWL1++wG3u3LmWOXPmcwrZiB4F4bRp01rPnj3j3U6hVfOiFYx1TCrQBndj5M2bN9b23u96LBy1hmvO9VtvvWWZMmVyx9MXX3xhs2fP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QKzHtO/rr7/eMmTIYMWKFbPJkyfHef748ePtyiuvtIwZM1qVKlVs2bJlCX5tAAAAAMkwZO/atct69OhhRYoUcWGiYMGCLhjNmzfPkpP169dby5YtXSBSoBo7dmycbf7++2/r1auXFS5c2DJlymTVqlWz5cuXJ8n7TQ6OHDli1113nQuioY4ePWorV660J554wv358ccf28aNG+2WW24Ju69HHnnEBfFQixcvtrJly9q0adPshx9+sLvvvtuF9c8//zxB77FLly7u+aG2bNliTZs2tTp16rhQr+PinnvusTlz5gS2ef/9961Pnz721FNPuc+gz9qoUSPbs2dPgl4bAAAAQPSltSS0detWq169umXPnt1GjRrlqoqqMCpIdOvWzTZs2GDJhUKdTiS0atXKevfuHXYbhah169bZ1KlTXaB76623rH79+vbjjz9agQIFEvV6VYbPs1Nps1hKtXVEU7vpppvcLZxLL73U5s6dG+u+cePGWeXKlW3btm1WqFChwP2zZ8+2L7/80gVp/Rzssccei/X7Qw895LZVaL/55pvjfY8TJ0501esnn3wyzn4nTZpkV111lT333HPu91KlStmiRYtszJgxLkjL888/b/fee68L9t5zZs6caa+//ro9+uijCfiWAAAAACSrSvaDDz7oqrpqcVWVt0SJEla6dGlXnVuyZInbRoFH7bhZs2a1bNmyWevWrW337t0R91m7dm1X9QvWokUL69SpU+B3VZOHDh3qKo7aryrHM2bMsL179wZeS9XFFStWBJ6jVl2dDNAJAAUebdO4cWPbuXNngj5rpUqV3ImEO+64w1XsQ/3zzz8uxD377LNWs2ZN1x6sVnj9qTCGf9/Bgwfd8ahx9uhYU5DViY/MmTMneD85c+aMdxudOBkyZIhNmTLFUqeO+9fwu+++cydYgilc6345ceKEff/997G20X70u7cNAAAAgBQUsvft22dffPGFq1hrLmsoBZ0zZ8640KttFyxY4CqPmzdvtjZt2pz366siqCr6qlWrXFtu+/btXehu166da70tWrSo+z0mJiZWNXr06NEucGm+r04A9OvXz6Lh1KlTdvr0aTe3NpjaxlXBxL/r2LFjbo72nXfe6U7miMZeJ2fuv/9+q1ixYoL288EHH7gWf6+6HI66NXS86aRLcMU8dBpF3rx5Y92n3w8dOuROyPz555/u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LV261L744gv3fXbq1Cne1z5y5IjVqFHDRo4cGfZx7Ve30aNH27p162zy5Mlu3126dAls8/3331uePHnsrbfecq/5+OOP24ABA2zcuHHn/J0AAAAASL7SJuWLb9261QUwVSdHjRrlKpwnT560OXPmWLdu3WzDhg2WXBw9etSdSGjVqpX17t07Yii87rrrrHPnznbbbbed1+tVGT7PTqXNYklp64imLuDqxMkbb7wRuP+qq64KW+3WyRaNfdOmTWM99vnnn7uQPn78eEud+n/nhSZNmmRly5a1TZs2ufAdTvv27f/3PrZuDfv4tddea9OmTQv8XrRoURs2bJirup86dcrSpk3rxiKYxvC7775zVfLu3bsn6vsAAAAAkPwlaSX7wQcfdBXbZcuWuSpviRIlrHTp0tanTx9X0ZRt27ZZ8+bNLWvWrJYtWzZr3bq17d69O+I+a9eubb169Yp1X4sWLWJVPVVNHjp0qHXo0MHtt3DhwjZjxgzbu3dv4LUU4IJbmlXl1MkAhUC1DGubxo0b286dOxP0WStVquROJNxxxx2uYh/OTTfd5N7XrbfeasmFvteKFSu6kwuqCJcvX95eeeWVWNucOXPGBeKHH37YjX+o48ePW/r06QMBW9S6LYsWLYrq+1WruI4zBez4tsmZM2dUXxcAAABA8pBkIVvzYdWaq4p1lixxK64KtApfCr3adsGCBTZ37lzbvHmztWnT5rxff8yYMa6KvmrVKlc5VchT6FYVU/N/VdXU7zExMbGq0Wotnjp1qmvt1gmAfv36nfd7Sc40XhMnTrTixYu7ExQPPPCAm/f85ptvBrZRtVuhVveHU7duXTetQCcpTpw44VrQH330UfdYQk9yJMSff/5pTz/9tJvvHcnixYvt/fffj3cbAAAAAClXkrWLq81XAbZkyZIRt9G87LVr19qWLVtcy7FMmTLFVTuXL1/uqsPnqkmTJta1a1f385NPPumCoPaniqv079/fqlat6qrm+fLlc/eplV1tygrgonbhIUOGWFJSlVc3z6FDh9yfGVLHWJo0/3eCICno+9KJkgoVKtjgwYMDLdo//PCD+77vuusud0JDC4lprrVatD2nT592zxd1OLz22mv2yCOPuPnQadKkcd993rx53THkbRff+/D+jLStvjcdE+pS0LzrcNtp3rZO+gwcONDq1Klz1tc923uB/zA+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yAYAAAAAIEoI2QAAAAAARAkhGwAAAACAKCFkAwAAAAAQJYRsAAAAAACihJANAAAAAECUELIBAAAAAIgSQjYAAAAAAFFCyAYAAAAAIEoI2QAAAAAARAkhGwAAAACAKCFkAwAAAAAQJYRsAAAAAACihJANAAAAAECUELIRFYMGDbJUqVLFupUsWTLweNeuXa1o0aKWKVMmy507tzVv3tw2bNgQax+hz9ftvffei/d1V65caQ0aNLDs2bNbrly57L777rPDhw+H3favv/6yK664wu33wIEDsR4bP368lSpVyr2/q6++2qZMmXJe3wcAAACAlCl1SgmA5cqVS+q3keyVLl3adu7cGbgtWrQo8FiFChXsjTfesJ9++snmzJljMTEx1rBhQzt9+nSsfWib4H20aNEi4uvt2LHD6tevb8WKFbOlS5faF198YevXr7dOnTqF3b5Lly5WtmzZOPdPnDjRBgwY4I4TPX/w4MHWrVs3++yzz87r+wAAAACQ8lwUIXvXrl3Wo0cPK1KkiGXIkMEKFixozZo1s3nz5lly8sorr9iNN95oOXLkcDcFyGXLltnFIm3atJYvX77A7bLLLgs8pgpzzZo17corr7Trr7/ehg4datu3b7etW7fG2ocq0sH7yJgxY8TX+/zzzy1dunSuCq3qc6VKlWzSpEk2bdo027RpU5wgrep1v3794uxn6tSprtLepk0bd4zdcccd7v2OHDkyKt8LAAAAgJQjrfmcQlj16tVd+Bo1apSVKVPGTp486aqhqjaGthxfzObPn2933nmnVatWzYVLhTxVe1VdLVCgQKL2VWX4PDuVNotdCFtHNHV//vLLL3b55Ze79161alUbPny4FSpUKM72R44ccRXrq666yp0wCaYxveeee1zYvf/+++3uu+927d3hHD9+3NKnT2+pU//fuSK1e4uq6Kpwy48//mhDhgxx1e7NmzeH3U9omNd+dIJDx5qCPAAAAAAki0r2gw8+6EKWAk/Lli2tRIkSri25T58+tmTJErfNtm3b3BzfrFmzWrZs2ax169a2e/fuiPusXbu29erVK9Z9aksObjNWxVXV1g4dOrj9Fi5c2GbMmGF79+4NvJZaj1esWBF4zuTJk93JAJ0A0PxebdO4cWPX9pwQb7/9tvu8am3XfOZXX33Vzpw5c1FU7KtUqeI+v1q2VTXesmWLq8r//fffgW0mTJjgvhPdZs+ebXPnznUh2aMg/MEHH7j7Ndb6Ll588cWIr1m3bl3X5aCTLydOnLD9+/fbo48+6h7zvnMFaJ240DbhAr80atTIfdfff/+9a2PXmOp3Bew///wzit8SAAAAgOTO15Xsffv2udA2bNgwy5IlblVWgVYh1Au9CxYssFOnTrlqqFp/VRk+H2PGjLFnnnnGnnjiCfdz+/btXZW5c+fOLrT179/fhXBVmr1q69GjR2306NGuBVkV1nbt2rkWZQXoxNK+FPRy5swZcRuFSN08hw4dcn9mSB1jadLE2IWg96jWdo9OMKglXJXkd99911WjRSc/dIJDwfj555+3Vq1auTHzqsheQJZrr73WfRZ9zw888EDY19UJl9dee80eeeQRN6c6TZo01r17d8ubN68Ly3pfGiO1kut40O86Prz3rJv3uprffcMNN7jn6fkat+eee87NGfe2i9Z3Ffwn/IXx8TfGx98YH39jfPyPMfI3xsffTl6Af2MnZt++DtmaV6vQE7xKdShVedeuXesqp17rsVaGVrV7+fLlbp7uuWrSpImbqytPPvmkq9BqfwqHogCntmhVzTV/2PvyNS9YK2mLQp8qtOdC+1f7dXCADaWWbC3UFWpg+TOWOXPsRcX+LbNmzQp7f548eezLL790oTWUugYUZLXYmOZqh6OTFL///rtNnz49Ysv2pZdeai+99JKbb635+jrZMXbsWPe73peeq04HzdMOpvHSOKrKLbfeequb56/naT683rdaxnUMBbejR4uq9fAvxsffGB9/Y3z8jfHxP8bI3xiflDs+R48eTR4hWwH7bLRatcJ18Nzea665xlW59dj5hOzglai9oKg54aH37dmzJxCyM2fOHAjYkj9/fvd4Yo0YMcJdvkrV+PgW/1IFV63zHlV/9V0MXZXaTqVLYxfCukGN4tyny2jpklmaT6+TFaFUfVd41ViFe1zWrFnjAq86FRJKLev6vh5++GF3DKiK/c8//wQeV0v4vffe675XzfvWiYBwFNRvueUWu/nmmy2adBJGf/l12THmevsP4+NvjI+/MT7+xvj4H2Pkb4yPv528AP/G9jqGL/qQXbx4cVeZjPbiZgp3oQE+XPk/eIC8dvBw96llPdxzvG0ScrIgmNrNFbK/+uqrsJecCqbqrW6hjp9JZadOh18wLNr0mdUSr0qw5q6r9fqpp55y7duqVmsV8ffff98t4qZrZKs6rc+nSrGeo+frclnqCFDLtkKy/pJo4Tft1/tONS9f7fnqXvAWghs3bpxr4dd0AT1H4Vr71utIaBfEwYMHAydLFMLl559/dvvWvHLN61Yru6YAqCPi3/pLqv0Ssv2L8fE3xsffGB9/Y3z8jzHyN8Yn5Y5PukTs19chW3ORtSiVLtHUs2fPOPOy1dqr+b8Kcbp51WytJq3HVCUNRwEseDEyzbtdt26d1alTx5Las88+6+aga/G0ihUrnvN+lg6oZ7ly5bILRcFZrdeqXuv7rVGjhluYTj/rBMbChQtddVghVh0AahFfvHhxoJLsXYqrd+/e7qSE5nMr7KrqHNyisXHjxlgnRBSOFehVOVegVuu45s4nhsZf86+1b70PHQd6b1r8DgAAAAASw9chWxS81HJcuXJlN7dZlV0tXqWqpeZIK1CrKtm2bVsX4vSYVqWuVatWxJCqVanVYj1z5kzX2q0wp1Ce1FS51dzvd955xwU8LRAm3orcfqbW9kg0rzzSvG2PVmHXLT5aNC20K0DV5sQItw+dqFm1alWi9gMAAAAAF+UlvDRvduXKla662LdvX7fqtHrt1TKskK12bC1upbm7qo5qkTA9R+3JkWh18I4dO7rWY4Vxbe+HKrY+jy5Fdfvtt7u53N5N7eMAAAAAAP/zfSVbFDQ191a3cHT9YwXtSLSCtW4etQTrms26RbJ169Y494VWQFVtDr5PK2YHX2vbu/52Qudkh3tNAAAAAMDFw/eVbAAAAAAALhaE7AvIm1sd7qaFwQAAAAAAF7eLol08uVi9enXEx7xLUgEAAAAALl6E7AtIl6UCAAAAACRftIsDAAAAABAlhGwAAAAAAKKEkA0AAAAAQJQQsgEAAAAAiBJCNgAAAAAAUULIBgAAAAAgSgjZAAAAAABECSEbAAAAAIAoIWQDAAAAABAlhGwAAAAAAKKEkA0AAAAAQJQQsgEAAAAAiBJCNgAAAAAAUULIBgAAAAAgSgjZAAAAAABECSEbAAAAAIAoIWTjvI0YMcJSpUplvXr1CtxXu3Ztd1/w7f777w88vmbNGrvzzjutYMGClilTJitVqpS98MILZ32tlStXWoMGDSx79uyWK1cuu+++++zw4cOxtlm+fLnVq1fPbZMjRw5r1KiRe71gP/zwg914442WMWNG9x6effZZjgQAAAAA5y1FhOxBgwZZuXLlkvptJEsKtC+99JKVLVs2zmP33nuv7dy5M3ALDrLff/+95cmTx9566y1bv369Pf744zZgwAAbN25cxNfasWOH1a9f34oVK2ZLly61L774wj23U6dOgW0UuBs3bmyFChVy2yxatMguueQSF7RPnjzptjl06JA1bNjQChcu7N7HqFGj3DHy8ssvR/37AQAAAJCyXBQhe9euXdajRw8rUqSIZciQwVUemzVrZvPmzbPkZuzYsXb11Ve76q4+Z+/eve3YsWPmRwq0bdu2tVdeecVVjENlzpzZ8uXLF7hly5Yt8Fjnzp1d5bpWrVpuXNu1a2d33323ffzxxxFf7/PPP7d06dLZ+PHj3XdUqVIlmzRpkk2bNs02bdrkttmwYYPt27fPhgwZ4rYpXbq0PfXUU7Z792777bff3DZvv/22nThxwl5//XX3+B133GE9e/a0559//l/5ngAAAACkHGnN57Zu3WrVq1d3rb+qOJYpU8ZVJOfMmWPdunVzoSq5eOedd+zRRx914a9atWr2888/uyqtWq0TGwCrDJ9np9Jm+Vfe59YRTd2f+v6bNm3qqstDhw6Ns53CrCrVCtg6KfLEE0+44B3JwYMHLWfOnBEfP378uKVPn95Sp/6/c0M6GSGqWKvCrWCtNvLXXnvNHnvsMTt9+rT7We3oV155pdv2u+++s5o1a7p9eVTpHjlypO3fvz/sCQMAAAAASBaV7AcffNCFzGXLllnLli2tRIkSrvrYp08fW7Jkidtm27Zt1rx5c8uaNaurlrZu3dpVLiPRfOHg+cPSokWLWG3HCmQKjh06dHD7VWvxjBkzbO/evYHXUov0ihUrAs+ZPHmyOxmgEwAKddpGrctqlU6IxYsXuxMKd911l3t9tTRr3rI+u9+89957bn708OHDwz6uz6CA/c0337g28KlTp7pqdXyf/f3333dzrCOpW7eu62rQyRZVohWIdVJCvO9YreHz5893r60ArjFQW/ns2bMtbdr/nVPSPvLmzRtr397vegwAAAAAkmUlW22/CkjDhg2zLFniVmUVaM+cORMIvQsWLLBTp065CmubNm1c2DofY8aMsWeeecZVYPVz+/btXYVZrc4Kev3793chXPOCdSJAjh49aqNHj3ahUhVXBct+/fq5qu7ZaN8KhwrVlStXts2bN9usWbPc68ZX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AACECUE2AAAAAABhQpANAAAAAECYEGQDAAAAABAmBNkAAAAAAIQJQTYAAAAAAGFCkA0AAAAAQJgQZAMAAAAAECYE2QAAAAAAhAlBNgAAAAAAYUKQDQAAAABAmBBkAwAAAAAQJgTZAAAAAACECUE2AAAAAABhQpCNWI0YMcJq1qxpWbJksbx581qrVq1s+/bt0bb5+eefrXXr1pYnTx7LmjWrtW3b1g4ePBjr/k6dOmVVq1a1FClS2Pr16+O96g8++KCVLFnSMmTI4PbdsmVL++GHH4LPb9iwwdq3b2+FCxd225QvX95effXVaPtYvHixO1bM24EDB2hxAAAAAFfMVR9kDx061AVvCK8lS5bYww8/bCtWrLD58+fbmTNn7Pbbb7e//vrLPa+vuq/AddGiRfbtt9/a6dOnrUWLFnb+/PkL9vfEE09YgQIFEnTs6tWr28SJE23btm02b948CwQC7ljnzp1zz69Zs8YF/h999JFt2bLFnn76aRs0aJC9/vrrF+xLHQP79+8P3vQ6AAAAALhSUluEKbM4fPhwmz17tu3bt88FQQqaH330UWvYsKElF++884598MEHtnnz5mAg+eKLL1qtWrWibafAcuDAgS7IPXv2rFWoUME+++wzK1KkSJKe79y5c6PdnzRpkmsbBbj169d3QfXu3btt3bp1Lost77//vuXIkcMF3Y0aNQq+9quvvrL//d//de9D31/MAw88EPy+WLFiNmzYMLv++uvd8ZTh7tatW7TtS5QoYcuXL7fp06db7969oz2nc86ePfslXwcAAAAAuGqCbAVN9erVc0HQyy+/bJUrV3YZU2UvlUUNLRG+2ql8WSXOdevWtfTp09u///1vl51VJrZgwYLB8uubbrrJunfvbs8995wLXvW8tk+s2iMW2tnUmRL9ut0jm8f6+PHjx93XnDlzBsu/lcVOly5dcBudZ8qUKW3ZsmXBIFvl4z169LAZM2ZYxowZE30+ypgrq128eHFXHh4XnZ93bqHUYaNzrVSpkqt60M8bAAAAACTLcvFevXq5QG3VqlV29913W5kyZaxixYrWr18/V6Yse/bscWNyM2fOfNFxv3LLLbe4LHgojSfu2rXrBdnRzp07u/0WLVrUZs6cab///nvwWFWqVLHVq1dHy+SqM0AdABoDrG2aNm3qSpATYvLkye79KugrV66c/ec//3Fl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AAAAQJgQZAMAAAAAECYE2QAAAAAAhMlVH2QPHTrUqlatGunTSFZGjBhhNWvWtCxZsljevHmtVatWtn379mjbHDhwwDp16mT58+e3TJky2Q033GCfffZZ8PnFixdbihQpYr19//33cR77559/ttatW1uePHksa9as1rZtWzt48GC0bY4cOWIdOnRwz2fPnt26d+9uJ0+ejHV/O3bscO9D2wEAAABAsg+yFaz16dPHSpQoYenSpbPChQtbixYtbOHChZacTJ8+3WrUqOGCPQWl6hj48MMPL9jm9ttvt1y5crlgdP369RE51yVLltjDDz9sK1assPnz59uZM2fcef3111/BbTp37uwC75kzZ9qmTZvsrrvucgHxunXr3PN169a1/fv3R7vdf//9Vrx4cXcdYqP96zh674sWLbJvv/3WTp8+7X4ezp8/H9xOAfaWLVvcuX355Zf2zTff2AMPPHDB/nTe7du3t5tvvvmKXCcAAAAAiCm1RdDu3butXr16LvB8+eWXrXLlyi4wmjdvngvyfvjhB0sucubMaU8//bSVK1fO0qZN64LD++67z2WKmzRpEgwyb7rpJhes9ujR47KOV3vEQjubOlOiX7d7ZHObO3dutMcmTZrkznPNmjVWv35999h3331nEyZMsFq1arn7gwcPtjFjxrhtqlWr5t6jstwetesXX3zhOlQURMdGQbV+JhSoK0st77//vuXIkcMF3Y0aNbJt27a581M23AvWx40bZ82aNbNRo0ZZgQIFgvvTOel6N2zY0J0vAAAAACTrTHavXr1cwLVq1Sq7++67rUyZMlaxYkXr16+fy6LKnj17rGXLlpY5c+Y4y4dD3XLLLfboo49Ge0zlzl27dg3eL1asmA0bNsxlY7XfokWLuozs77//HjxWlSpVbPXq1dECTXUGqAOgfPnybpumTZu6DG1C6LxUBq3XlixZ0h555BF3jGXLlgW3Ufn1kCFDXDDpJ8ePHw92FHiUqf7kk09c6bayzFOnTrV//vnHvc/Y6PoePnzYdSzE5dSpU+7nQRUNnvTp01vKlCmD12n58uWuHUKz4bpe2mblypXBxxSUf/rppzZ+/PjLfPcAAAAAcBUE2QrOlJFUxlrl0zEpkFLwpqBX26qEWeXBO3futHbt2l328ZV1VRZdWdPmzZu7AFdBd8eOHW3t2rUuENb9QCAQfE1UVJTL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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[特征重要性排名 - Gain]\n", "ebitda_rank 14994.629439\n", "bbi_ratio_factor 1948.020045\n", "cs_rank_turnover_rate 1686.329153\n", "std_return_90 1566.943976\n", "return_10 1430.825613\n", "std_return_5 1242.399894\n", "ma_ratio 979.636333\n", "high_low_ratio 932.793097\n", "volume_change_rate 652.408669\n", "vol_ratio 651.873589\n", "cs_rank_volume_ratio 649.430382\n", "vol_ma20 649.122400\n", "turnover_rate_mean_5 615.645898\n", "ma20 535.948738\n", "return_20 452.979679\n", "market_cap_rank 407.870511\n", "return_diff 304.914024\n", "ebit_rank 294.325396\n", "profit_to_market_cap 287.904060\n", "vol_std_5 243.944097\n", "operate_profit_to_market_cap 232.366538\n", "ma10 201.935446\n", "volatility_20 169.372244\n", "volatility_5 161.736089\n", "ma5 111.549055\n", "n_income_rank 79.050783\n", "vol_ma5 73.284933\n", "operate_profit_rank 57.328938\n", "total_profit_rank 35.760864\n", "n_cashflow_act_rank 34.917162\n", "money_cap_rank 32.511166\n", "total_liab_rank 24.127689\n", "cashflow_to_market_cap 20.326702\n", "turnover_deviation 0.000000\n", "dtype: float64\n", "\n", "[低重要性特征] 以下1个特征重要性为0,可考虑删除:\n", " - turnover_deviation\n" ] } ], "execution_count": 18 } ], "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 }