{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. 导入依赖" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:26:35.493553Z", "start_time": "2026-03-09T15:26:34.919597Z" } }, "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, # 已删除,使用 StockPoolManager + filter_func 替代\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-09T15:26:35.507113Z", "start_time": "2026-03-09T15:26:35.502592Z" } }, "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-09T15:26:35.516098Z", "start_time": "2026-03-09T15:26:35.511343Z" } }, "cell_type": "code", "source": [ "# 特征因子定义字典:新增因子只需在此处添加一行\n", "LABEL_NAME = 'future_return_5'\n", "\n", "FACTOR_DEFINITIONS = FACTOR_DICT = {\n", " # ================= 1. 价格、趋势与路径依赖 (Trend, Momentum & Path Dependency) =================\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)\", # 威廉指标变形\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) + 1e-8)) - 1\", # 5日动量\n", " \"return_20\": \"(close / (ts_delay(close, 20) + 1e-8)) - 1\", # 20日动量\n", "\n", " # [高阶] Kaufman 趋势效率 (极高价值) - 衡量趋势流畅度,剔除无序震荡\n", " \"kaufman_ER_20\": \"abs(close - ts_delay(close, 20)) / (ts_sum(abs(close - ts_delay(close, 1)), 20) + 1e-8)\",\n", " # [高阶] 动量加速度 - 寻找二阶导数大于0,正在加速爆发的股票\n", " \"mom_acceleration_10_20\": \"(close / (ts_delay(close, 10) + 1e-8) - 1) - (ts_delay(close, 10) / (ts_delay(close, 20) + 1e-8) - 1)\",\n", " #[高阶] 高点距离衰减 - 衡量套牢盘压力\n", " \"drawdown_from_high_60\": \"close / (ts_max(high, 60) + 1e-8) - 1\",\n", " # [高阶] 趋势一致性 - 过去20天内收红的天数比例\n", " \"up_days_ratio_20\": \"ts_sum(close > ts_delay(close, 1), 20) / 20\",\n", "\n", " # ================= 2. 波动率、风险调整与高阶矩 (Volatility & Risk-Adjusted Returns) =================\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_20\": \"ts_std((close / (ts_delay(close, 1) + 1e-8)) - 1, 20)\", # 真实收益率波动率\n", "\n", " # [高阶] 夏普趋势比率 - 惩罚暴涨暴跌,奖励稳健爬坡\n", " \"sharpe_ratio_20\": \"ts_mean(close / (ts_delay(close, 1) + 1e-8) - 1, 20) / (ts_std(close / (ts_delay(close, 1) + 1e-8) - 1, 20) + 1e-8)\",\n", " #[高阶] 尾部崩盘风险 - 过去一个月最大单日跌幅\n", " \"min_ret_20\": \"ts_min(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\",\n", " # [高阶] 波动率挤压比 - 寻找盘整到极致面临变盘的股票 (布林带收口)\n", " \"volatility_squeeze_5_60\": \"ts_std(close, 5) / (ts_std(close, 60) + 1e-8)\",\n", "\n", " # ================= 3. 日内微观结构与异象 (Intraday Microstructure & Anomalies) =================\n", " # [高阶] 隔夜与日内背离 - 差值越小说明主力越喜欢在盘中吸筹\n", " \"overnight_intraday_diff\": \"(open / (ts_delay(close, 1) + 1e-8) - 1) - (close / (open + 1e-8) - 1)\",\n", " #[高阶] 上影线抛压极值 - 冲高回落被套牢的概率\n", " \"upper_shadow_ratio\": \"(high - ((open + close + abs(open - close)) / 2)) / (high - low + 1e-8)\",\n", " # [高阶] 资金沉淀率 - 衡量主力日内高抛低吸洗盘的剧烈程度\n", " \"capital_retention_20\": \"ts_sum(abs(close - open), 20) / (ts_sum(high - low, 20) + 1e-8)\",\n", " # [高阶] MAX 彩票效应 - 反转因子,剔除近期有过妖股连板特征的标的\n", " \"max_ret_20\": \"ts_max(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\",\n", "\n", " # ================= 4. 量能、流动性与量价背离 (Volume, Liquidity & Divergence) =================\n", " \"volume_ratio_5_20\": \"ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\", # 相对放量比\n", " \"turnover_rate_mean_5\": \"ts_mean(turnover_rate, 5)\", # 活跃度\n", " \"turnover_deviation\": \"(turnover_rate - ts_mean(turnover_rate, 10)) / (ts_std(turnover_rate, 10) + 1e-8)\", # 换手率偏离度\n", "\n", " # [高阶] Amihud 非流动性异象 (绝对核心) - 衡量砸盘/拉升的摩擦成本\n", " \"amihud_illiq_20\": \"ts_mean(abs(close / (ts_delay(close, 1) + 1e-8) - 1) / (amount + 1e-8), 20)\",\n", " # [高阶] 换手率惩罚因子 - 换手率忽高忽低说明游资接力,行情极不稳定\n", " \"turnover_cv_20\": \"ts_std(turnover_rate, 20) / (ts_mean(turnover_rate, 20) + 1e-8)\",\n", " # [高阶] 纯粹量价相关性 - 检验是否是\"放量上涨,缩量下跌\"的良性多头\n", " \"pv_corr_20\": \"ts_corr(close / (ts_delay(close, 1) + 1e-8) - 1, vol, 20)\",\n", " # [高阶] 收盘价与均价背离 - 专门抓尾盘突袭拉升骗线的股票\n", " \"close_vwap_deviation\": \"close / (amount / (vol * 100 + 1e-8) + 1e-8) - 1\",\n", "\n", " # ================= 5. 基本面财务特征 (Fundamental Quality & Structure) =================\n", " \"roe\": \"n_income / (total_hldr_eqy_exc_min_int + 1e-8)\", # 净资产收益率\n", " \"roa\": \"n_income / (total_assets + 1e-8)\", # 总资产收益率\n", " \"profit_margin\": \"n_income / (revenue + 1e-8)\", # 销售净利率\n", " \"debt_to_equity\": \"total_liab / (total_hldr_eqy_exc_min_int + 1e-8)\", # 杠杆率\n", " \"current_ratio\": \"total_cur_assets / (total_cur_liab + 1e-8)\", # 短期偿债安全垫\n", "\n", " #[高阶] 利润同比增速 (日频延后252天等于去年同期)\n", " \"net_profit_yoy\": \"(n_income / (ts_delay(n_income, 252) + 1e-8)) - 1\",\n", " # [高阶] 营收同比增速\n", " \"revenue_yoy\": \"(revenue / (ts_delay(revenue, 252) + 1e-8)) - 1\",\n", " # [高阶] 资产负债表扩张斜率 - 剔除单纯靠举债扩张的公司\n", " \"healthy_expansion_velocity\": \"(total_assets / (ts_delay(total_assets, 252) + 1e-8) - 1) - (total_liab / (ts_delay(total_liab, 252) + 1e-8) - 1)\",\n", "\n", " # ================= 6. 基本面估值与截面动量共振 (Valuation & Cross-Sectional Ranking) =================\n", " # 估值水平绝对值 (Tushare 市值单位需要 * 10000 转换为元)\n", " \"EP\": \"n_income / (total_mv * 10000 + 1e-8)\", # 盈利收益率 (1/PE)\n", " \"BP\": \"total_hldr_eqy_exc_min_int / (total_mv * 10000 + 1e-8)\", # 账面市值比 (1/PB)\n", " \"CP\": \"n_cashflow_act / (total_mv * 10000 + 1e-8)\", # 经营现金流收益率 (1/PCF)\n", "\n", " # 全市场截面排名因子\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) + 1e-8)) - 1)\",\n", " \"EP_rank\": \"cs_rank(n_income / (total_mv + 1e-8))\", # 谁最便宜\n", "\n", " # [高阶] 戴维斯双击动量 - 估值相对上一年是否在扩张\n", " \"pe_expansion_trend\": \"(total_mv / (n_income + 1e-8)) / (ts_delay(total_mv, 60) / (ts_delay(n_income, 60) + 1e-8) + 1e-8) - 1\",\n", " # [高阶] 业绩与价格背离度 - 截面做差:利润排名全市场第一,但近20日价格排名倒数第一,捕捉被错杀的潜伏股\n", " \"value_price_divergence\": \"cs_rank((n_income - ts_delay(n_income, 252)) / (abs(ts_delay(n_income, 252)) + 1e-8)) - cs_rank(close / (ts_delay(close, 20) + 1e-8))\",\n", " # [高阶] 流动性溢价调整后市值 - 识别僵尸大盘股和极度活跃的小微盘\n", " \"active_market_cap\": \"total_mv * ts_mean(turnover_rate, 20)\",\n", " \"ebit_rank\": \"cs_rank(ebit)\",\n", "}\n", "\n", "# Label 因子定义(不参与训练,用于计算目标)\n", "LABEL_FACTOR = {\n", " LABEL_NAME: \"(ts_delay(close, -5) / ts_delay(open, -1)) - 1\", # 未来5日收益率\n", "}" ], "outputs": [], "execution_count": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 训练参数配置" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:26:35.526730Z", "start_time": "2026-03-09T15:26:35.522343Z" } }, "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 = \"20261231\"\n", "\n", "# 模型参数配置\n", "MODEL_PARAMS = {\n", " \"objective\": \"regression\",\n", " \"metric\": \"mae\", # 改为 MAE,对异常值更稳健\n", " # 树结构控制(防过拟合核心)\n", " \"num_leaves\": 20, # 从31降为20,降低模型复杂度\n", " \"max_depth\": 5, # 显式限制深度,防止过度拟合噪声\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", "# 股票池筛选函数\n", "# 使用新的 StockPoolManager API:传入自定义筛选函数和所需列/因子\n", "# 筛选函数接收单日 DataFrame,返回布尔 Series\n", "#\n", "# 筛选逻辑(针对单日数据):\n", "# 1. 先排除创业板、科创板、北交所(ST过滤由STFilter组件处理)\n", "# 2. 然后选取市值最小的500只股票\n", "def stock_pool_filter(df: pl.DataFrame) -> pl.Series:\n", " \"\"\"股票池筛选函数(单日数据)\n", "\n", " 筛选条件:\n", " 1. 排除创业板(代码以 300 开头)\n", " 2. 排除科创板(代码以 688 开头)\n", " 3. 排除北交所(代码以 8、9 或 4 开头)\n", " 4. 选取当日市值最小的500只股票\n", " \"\"\"\n", " # 代码筛选(排除创业板、科创板、北交所)\n", " code_filter = (\n", " ~df[\"ts_code\"].str.starts_with(\"300\") & # 排除创业板\n", " ~df[\"ts_code\"].str.starts_with(\"688\") & # 排除科创板\n", " ~df[\"ts_code\"].str.starts_with(\"8\") & # 排除北交所\n", " ~df[\"ts_code\"].str.starts_with(\"9\") & # 排除北交所\n", " ~df[\"ts_code\"].str.starts_with(\"4\") # 排除北交所\n", " )\n", "\n", " # 在已筛选的股票中,选取市值最小的500只\n", " # 按市值升序排序,取前500\n", " valid_df = df.filter(code_filter)\n", " n = min(1000, len(valid_df))\n", " small_cap_codes = valid_df.sort(\"total_mv\").head(n)[\"ts_code\"]\n", "\n", " # 返回布尔 Series:是否在被选中的股票中\n", " return df[\"ts_code\"].is_in(small_cap_codes)\n", "\n", "\n", "# 定义筛选所需的基础列\n", "STOCK_FILTER_REQUIRED_COLUMNS = [\"total_mv\"] # ST过滤由STFilter组件处理\n", "\n", "# 可选:定义筛选所需的因子(如果需要用因子进行筛选)\n", "# STOCK_FILTER_REQUIRED_FACTORS = {\n", "# \"market_cap_rank\": \"cs_rank(total_mv)\",\n", "# }\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 初始化组件" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:26:58.293090Z", "start_time": "2026-03-09T15:26:35.532653Z" } }, "cell_type": "code", "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", "# 使用新的 API:传入自定义筛选函数和所需列\n", "pool_manager = StockPoolManager(\n", " filter_func=stock_pool_filter,\n", " required_columns=STOCK_FILTER_REQUIRED_COLUMNS, # 筛选所需的额外列\n", " # required_factors=STOCK_FILTER_REQUIRED_FACTORS, # 可选:筛选所需的因子\n", " data_router=engine.router,\n", ")\n", "print(\"[股票池筛选] 使用自定义函数进行股票池筛选\")\n", "print(f\"[股票池筛选] 所需基础列: {STOCK_FILTER_REQUIRED_COLUMNS}\")\n", "print(\"[股票池筛选] 筛选逻辑: 排除创业板/科创板/北交所后,每日选市值最小的500只\")\n", "# print(f\"[股票池筛选] 所需因子: {list(STOCK_FILTER_REQUIRED_FACTORS.keys())}\")\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], # 使用STFilter过滤ST股票\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) + 1e-8)) - 1\n", " - return_20: (close / (ts_delay(close, 20) + 1e-8)) - 1\n", " - kaufman_ER_20: abs(close - ts_delay(close, 20)) / (ts_sum(abs(close - ts_delay(close, 1)), 20) + 1e-8)\n", " - mom_acceleration_10_20: (close / (ts_delay(close, 10) + 1e-8) - 1) - (ts_delay(close, 10) / (ts_delay(close, 20) + 1e-8) - 1)\n", " - drawdown_from_high_60: close / (ts_max(high, 60) + 1e-8) - 1\n", " - up_days_ratio_20: ts_sum(close > ts_delay(close, 1), 20) / 20\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_20: ts_std((close / (ts_delay(close, 1) + 1e-8)) - 1, 20)\n", " - sharpe_ratio_20: ts_mean(close / (ts_delay(close, 1) + 1e-8) - 1, 20) / (ts_std(close / (ts_delay(close, 1) + 1e-8) - 1, 20) + 1e-8)\n", " - min_ret_20: ts_min(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\n", " - volatility_squeeze_5_60: ts_std(close, 5) / (ts_std(close, 60) + 1e-8)\n", " - overnight_intraday_diff: (open / (ts_delay(close, 1) + 1e-8) - 1) - (close / (open + 1e-8) - 1)\n", " - upper_shadow_ratio: (high - ((open + close + abs(open - close)) / 2)) / (high - low + 1e-8)\n", " - capital_retention_20: ts_sum(abs(close - open), 20) / (ts_sum(high - low, 20) + 1e-8)\n", " - max_ret_20: ts_max(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\n", " - volume_ratio_5_20: ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\n", " - turnover_rate_mean_5: ts_mean(turnover_rate, 5)\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) + 1e-8) - 1) / (amount + 1e-8), 20)\n", " - turnover_cv_20: ts_std(turnover_rate, 20) / (ts_mean(turnover_rate, 20) + 1e-8)\n", " - pv_corr_20: ts_corr(close / (ts_delay(close, 1) + 1e-8) - 1, vol, 20)\n", " - close_vwap_deviation: close / (amount / (vol * 100 + 1e-8) + 1e-8) - 1\n", " - roe: n_income / (total_hldr_eqy_exc_min_int + 1e-8)\n", " - roa: n_income / (total_assets + 1e-8)\n", " - profit_margin: n_income / (revenue + 1e-8)\n", " - debt_to_equity: total_liab / (total_hldr_eqy_exc_min_int + 1e-8)\n", " - current_ratio: total_cur_assets / (total_cur_liab + 1e-8)\n", " - net_profit_yoy: (n_income / (ts_delay(n_income, 252) + 1e-8)) - 1\n", " - revenue_yoy: (revenue / (ts_delay(revenue, 252) + 1e-8)) - 1\n", " - healthy_expansion_velocity: (total_assets / (ts_delay(total_assets, 252) + 1e-8) - 1) - (total_liab / (ts_delay(total_liab, 252) + 1e-8) - 1)\n", " - EP: n_income / (total_mv * 10000 + 1e-8)\n", " - BP: total_hldr_eqy_exc_min_int / (total_mv * 10000 + 1e-8)\n", " - CP: n_cashflow_act / (total_mv * 10000 + 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) + 1e-8)) - 1)\n", " - EP_rank: cs_rank(n_income / (total_mv + 1e-8))\n", " - pe_expansion_trend: (total_mv / (n_income + 1e-8)) / (ts_delay(total_mv, 60) / (ts_delay(n_income, 60) + 1e-8) + 1e-8) - 1\n", " - value_price_divergence: cs_rank((n_income - ts_delay(n_income, 252)) / (abs(ts_delay(n_income, 252)) + 1e-8)) - cs_rank(close / (ts_delay(close, 20) + 1e-8))\n", " - active_market_cap: total_mv * ts_mean(turnover_rate, 20)\n", " - ebit_rank: cs_rank(ebit)\n", "\n", "注册 Label 因子:\n", " - future_return_5: (ts_delay(close, -5) / ts_delay(open, -1)) - 1\n", "\n", "特征因子数: 49\n", "Label: future_return_5\n", "已注册因子总数: 50\n", "\n", "[3] 准备数据\n", "\n", "================================================================================\n", "准备数据\n", "================================================================================\n", "\n", "计算因子: 20200101 - 20261231\n", "[FinancialLoader] 加载 financial_fina_indicator 失败: Binder Error: Referenced column \"f_ann_date\" not found in FROM clause!\n", "Candidate bindings: \"ann_date\", \"end_date\", \"ocf_to_debt\", \"arturn_days\", \"nca_to_assets\"\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": [ "数据形状: (7255513, 70)\n", "数据列: ['ts_code', 'trade_date', 'high', 'low', 'amount', 'vol', 'close', 'turnover_rate', 'open', 'total_assets', 'total_mv', 'f_ann_date', 'total_cur_liab', 'total_cur_assets', 'total_hldr_eqy_exc_min_int', 'total_liab', 'revenue', 'n_income', 'n_cashflow_act', 'ebit', 'ma_5', 'ma_20', 'ma_ratio_5_20', 'bias_10', 'high_low_ratio', 'bbi_ratio', 'return_5', 'return_20', 'kaufman_ER_20', 'mom_acceleration_10_20', 'drawdown_from_high_60', 'up_days_ratio_20', 'volatility_5', 'volatility_20', 'volatility_ratio', 'std_return_20', 'sharpe_ratio_20', 'min_ret_20', 'volatility_squeeze_5_60', 'overnight_intraday_diff', 'upper_shadow_ratio', 'capital_retention_20', 'max_ret_20', 'volume_ratio_5_20', 'turnover_rate_mean_5', 'turnover_deviation', 'amihud_illiq_20', 'turnover_cv_20', 'pv_corr_20', 'close_vwap_deviation', 'roe', 'roa', 'profit_margin', 'debt_to_equity', 'current_ratio', 'net_profit_yoy', 'revenue_yoy', 'healthy_expansion_velocity', 'EP', 'BP', 'CP', 'market_cap_rank', 'turnover_rank', 'return_5_rank', 'EP_rank', 'pe_expansion_trend', 'value_price_divergence', 'active_market_cap', 'ebit_rank', 'future_return_5']\n", "\n", "前5行预览:\n", "shape: (5, 70)\n", "┌───────────┬────────────┬─────────┬─────────┬───┬────────────┬────────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ low ┆ … ┆ value_pric ┆ active_mar ┆ ebit_rank ┆ future_re │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ e_divergen ┆ ket_cap ┆ --- ┆ turn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ce ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ f64 ┆ ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ ┆ │\n", "╞═══════════╪════════════╪═════════╪═════════╪═══╪════════════╪════════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 1850.42 ┆ 1806.75 ┆ … ┆ null ┆ null ┆ null ┆ -0.008857 │\n", "│ 000001.SZ ┆ 20200103 ┆ 1889.72 ┆ 1847.15 ┆ … ┆ null ┆ null ┆ null ┆ -0.01881 │\n", "│ 000001.SZ ┆ 20200106 ┆ 1893.0 ┆ 1846.05 ┆ … ┆ null ┆ null ┆ null ┆ -0.008171 │\n", "│ 000001.SZ ┆ 20200107 ┆ 1886.45 ┆ 1850.42 ┆ … ┆ null ┆ null ┆ null ┆ -0.014117 │\n", "│ 000001.SZ ┆ 20200108 ┆ 1861.34 ┆ 1815.49 ┆ … ┆ null ┆ null ┆ null ┆ -0.017252 │\n", "└───────────┴────────────┴─────────┴─────────┴───┴────────────┴────────────┴───────────┴───────────┘\n", "\n", "[配置] 训练期: 20200101 - 20231231\n", "[配置] 验证期: 20240101 - 20241231\n", "[配置] 测试期: 20250101 - 20261231\n", "[配置] 特征数: 49\n", "[配置] 目标变量: future_return_5\n", "[股票池筛选] 使用自定义函数进行股票池筛选\n", "[股票池筛选] 所需基础列: ['total_mv']\n", "[股票池筛选] 筛选逻辑: 排除创业板/科创板/北交所后,每日选市值最小的500只\n" ] } ], "execution_count": 5 }, { "metadata": {}, "cell_type": "markdown", "source": "### 4.2 执行训练" }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:01.856502Z", "start_time": "2026-03-09T15:26:58.307450Z" } }, "cell_type": "code", "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" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\liaozhaorun\\AppData\\Local\\Temp\\ipykernel_37796\\547547317.py:75: DeprecationWarning: `is_in` with a collection of the same datatype is ambiguous and deprecated.\n", "Please use `implode` to return to previous behavior.\n", "\n", "See https://github.com/pola-rs/polars/issues/22149 for more information.\n", " return df[\"ts_code\"].is_in(small_cap_codes)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 筛选前数据规模: (7255513, 70)\n", " 筛选后数据规模: (1494000, 70)\n", " 筛选前股票数: 5694\n", " 筛选后股票数: 2252\n", " 删除记录数: 5761513\n" ] } ], "execution_count": 6 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:01.935567Z", "start_time": "2026-03-09T15:27:01.869943Z" } }, "cell_type": "code", "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", " 训练集数据规模: (970000, 70)\n", " 验证集数据规模: (242000, 70)\n", " 测试集数据规模: (282000, 70)\n", " 训练集股票数: 1888\n", " 验证集股票数: 1377\n", " 测试集股票数: 1682\n", " 训练集日期范围: 20200102 - 20231229\n", " 验证集日期范围: 20240102 - 20241231\n", " 测试集日期范围: 20250102 - 20260306\n", "\n", " 训练集前5行预览:\n", "shape: (5, 70)\n", "┌───────────┬────────────┬───────┬───────┬───┬─────────────┬─────────────┬───────────┬─────────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ low ┆ … ┆ value_price ┆ active_mark ┆ ebit_rank ┆ future_retu │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _divergence ┆ et_cap ┆ --- ┆ rn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ ┆ f64 │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪═════════════╪═════════════╪═══════════╪═════════════╡\n", "│ 000004.SZ ┆ 20200102 ┆ 93.06 ┆ 90.1 ┆ … ┆ null ┆ null ┆ null ┆ 0.000441 │\n", "│ 000004.SZ ┆ 20200103 ┆ 91.36 ┆ 89.53 ┆ … ┆ null ┆ null ┆ null ┆ 0.005875 │\n", "│ 000004.SZ ┆ 20200106 ┆ 90.22 ┆ 87.58 ┆ … ┆ null ┆ null ┆ null ┆ 0.05644 │\n", "│ 000004.SZ ┆ 20200107 ┆ 90.22 ┆ 88.06 ┆ … ┆ null ┆ null ┆ null ┆ 0.049753 │\n", "│ 000004.SZ ┆ 20200108 ┆ 92.54 ┆ 88.51 ┆ … ┆ null ┆ null ┆ null ┆ 0.019922 │\n", "└───────────┴────────────┴───────┴───────┴───┴─────────────┴─────────────┴───────────┴─────────────┘\n", "\n", " 验证集前5行预览:\n", "shape: (5, 70)\n", "┌───────────┬────────────┬───────┬───────┬───┬─────────────┬─────────────┬───────────┬─────────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ low ┆ … ┆ value_price ┆ active_mark ┆ ebit_rank ┆ future_retu │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _divergence ┆ et_cap ┆ --- ┆ rn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ ┆ f64 │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪═════════════╪═════════════╪═══════════╪═════════════╡\n", "│ 000004.SZ ┆ 20240102 ┆ 66.81 ┆ 65.23 ┆ … ┆ null ┆ 770442.9948 ┆ null ┆ -0.014188 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 33 ┆ ┆ │\n", "│ 000004.SZ ┆ 20240103 ┆ 66.24 ┆ 64.62 ┆ … ┆ null ┆ 751492.2017 ┆ null ┆ 0.002432 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 8 ┆ ┆ │\n", "│ 000004.SZ ┆ 20240104 ┆ 71.24 ┆ 64.7 ┆ … ┆ null ┆ 866443.5445 ┆ null ┆ 0.016919 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 25 ┆ ┆ │\n", "│ 000004.SZ ┆ 20240105 ┆ 71.08 ┆ 65.19 ┆ … ┆ null ┆ 907980.5905 ┆ null ┆ -0.013477 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 95 ┆ ┆ │\n", "│ 000004.SZ ┆ 20240108 ┆ 67.87 ┆ 65.02 ┆ … ┆ null ┆ 931205.3950 ┆ null ┆ -0.024684 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 63 ┆ ┆ │\n", "└───────────┴────────────┴───────┴───────┴───┴─────────────┴─────────────┴───────────┴─────────────┘\n", "\n", " 测试集前5行预览:\n", "shape: (5, 70)\n", "┌───────────┬────────────┬───────┬───────┬───┬─────────────┬─────────────┬───────────┬─────────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ low ┆ … ┆ value_price ┆ active_mark ┆ ebit_rank ┆ future_retu │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _divergence ┆ et_cap ┆ --- ┆ rn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ ┆ f64 │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪═════════════╪═════════════╪═══════════╪═════════════╡\n", "│ 000004.SZ ┆ 20250102 ┆ 58.48 ┆ 54.17 ┆ … ┆ null ┆ 2.3754e6 ┆ null ┆ -0.066193 │\n", "│ 000004.SZ ┆ 20250103 ┆ 58.52 ┆ 51.86 ┆ … ┆ null ┆ 2.1884e6 ┆ null ┆ 0.00893 │\n", "│ 000004.SZ ┆ 20250106 ┆ 52.55 ┆ 49.17 ┆ … ┆ null ┆ 2.1549e6 ┆ null ┆ -0.0142 │\n", "│ 000004.SZ ┆ 20250107 ┆ 53.32 ┆ 51.41 ┆ … ┆ null ┆ 2.2770e6 ┆ null ┆ 0.013031 │\n", "│ 000004.SZ ┆ 20250108 ┆ 54.78 ┆ 52.38 ┆ … ┆ null ┆ 2.3533e6 ┆ null ┆ 0.00442 │\n", "└───────────┴────────────┴───────┴───────┴───┴─────────────┴─────────────┴───────────┴─────────────┘\n" ] } ], "execution_count": 7 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:02.522387Z", "start_time": "2026-03-09T15:27:01.942140Z" } }, "cell_type": "code", "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", " 处理前记录数: 970000\n", " 处理后记录数: 970000\n", " [2/3] 应用处理器: Winsorizer\n", " 处理前记录数: 970000\n", " 处理后记录数: 970000\n", " [3/3] 应用处理器: StandardScaler\n", " 处理前记录数: 970000\n", " 处理后记录数: 970000\n", "\n", " 训练集处理后前5行预览:\n", "shape: (5, 70)\n", "┌───────────┬────────────┬──────────┬──────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ low ┆ … ┆ value_pri ┆ active_ma ┆ ebit_rank ┆ future_re │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ ce_diverg ┆ rket_cap ┆ --- ┆ turn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ence ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ f64 ┆ ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ ┆ │\n", "╞═══════════╪════════════╪══════════╪══════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000004.SZ ┆ 20200102 ┆ 4.202576 ┆ 4.206515 ┆ … ┆ null ┆ null ┆ null ┆ 0.000441 │\n", "│ 000004.SZ ┆ 20200103 ┆ 4.202576 ┆ 4.206515 ┆ … ┆ null ┆ null ┆ null ┆ 0.005875 │\n", "│ 000004.SZ ┆ 20200106 ┆ 4.202576 ┆ 4.206515 ┆ … ┆ null ┆ null ┆ null ┆ 0.05644 │\n", "│ 000004.SZ ┆ 20200107 ┆ 4.202576 ┆ 4.206515 ┆ … ┆ null ┆ null ┆ null ┆ 0.049753 │\n", "│ 000004.SZ ┆ 20200108 ┆ 4.202576 ┆ 4.206515 ┆ … ┆ null ┆ null ┆ null ┆ 0.019922 │\n", "└───────────┴────────────┴──────────┴──────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", " 训练集特征统计:\n", " 特征数: 49\n", " 样本数: 970000\n", " 缺失值统计:\n", " ma_5: 4000 (0.41%)\n", " ma_20: 19000 (1.96%)\n", " ma_ratio_5_20: 19000 (1.96%)\n", " bias_10: 9000 (0.93%)\n", " high_low_ratio: 19000 (1.96%)\n" ] } ], "execution_count": 8 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:10.946482Z", "start_time": "2026-03-09T15:27:02.528042Z" } }, "cell_type": "code", "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", " 训练样本数: 970000\n", " 特征数: 49\n", " 目标变量: future_return_5\n", "\n", " 目标变量统计:\n", " 均值: 0.004184\n", " 标准差: 0.058740\n", " 最小值: -0.152621\n", " 最大值: 0.216472\n", " 缺失值: 0\n", "\n", " 开始训练...\n", " 训练完成!\n" ] } ], "execution_count": 9 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:10.997637Z", "start_time": "2026-03-09T15:27:10.951980Z" } }, "cell_type": "code", "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", " 处理前记录数: 282000\n", " 处理后记录数: 282000\n", " [2/3] 应用处理器: Winsorizer\n", " 处理前记录数: 282000\n", " 处理后记录数: 282000\n", " [3/3] 应用处理器: StandardScaler\n", " 处理前记录数: 282000\n", " 处理后记录数: 282000\n" ] } ], "execution_count": 10 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:11.481411Z", "start_time": "2026-03-09T15:27:11.004438Z" } }, "cell_type": "code", "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", " 测试样本数: 282000\n", " 预测中...\n", " 预测完成!\n", "\n", " 预测结果统计:\n", " 均值: 0.002266\n", " 标准差: 0.009319\n", " 最小值: -0.117614\n", " 最大值: 0.080849\n" ] } ], "execution_count": 11 }, { "metadata": {}, "cell_type": "markdown", "source": "### 4.3 训练指标曲线" }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:15.029980Z", "start_time": "2026-03-09T15:27:11.487153Z" } }, "cell_type": "code", "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", "[285]\ttrain's l1: 0.0410031\tval's l1: 0.0634246\n", "训练完成,指标已收集\n", "\n", "评估指标: l1\n", "\n", "[早停信息]\n", " 配置的最大轮数: 1000\n", " 实际训练轮数: 385\n", " 早停状态: 已触发(连续100轮验证指标未改善)\n", "\n", "最终指标:\n", " 训练 l1: 0.040855\n", " 验证 l1: 0.063455\n" ] } ], "execution_count": 12 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:15.271749Z", "start_time": "2026-03-09T15:27:15.035816Z" } }, "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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BlC7d+/2TW+//Xaux3rooYcCthk3blyxvU4AAAAAAACnirpAasaMGTJy5EgZPny4tGjRQubMmSPly5eX1157LeT2s2bNMmHTvffeK2eddZY8/PDD0r59e3n++ecDtktISJDatWv7pqpVq+Z6rEqVKgVsU6FChWJ7nQAAAACcKz0rXW77+DYz6TwAOE1UjSGVkZEh3377rUyYMMG3LCYmRnr16iUrV64MeR9drhVV/rSiasGCBQHLli1bJsnJySaIuuiii+SRRx6R6tWrB2yjXfQ00GrQoIFcd911cuedd4rbHfoQpaenm8ly5MgR89Pj8ZipNNH99Xq9pW6/ETm0AdAOQBsAfxNAG7BXtidbdhze4ZuPps/ifDYE7QDhnguKcg6LqkBq//79kp2dLbVq1QpYrre3bNkS8j579uwJub0ut2gF1cCBA6Vx48aybds2mThxolxyySUmzIqNjTXb3H777aayqlq1aqYboIZi2m1PK7ZCmTZtmkydOjXX8n379klaWpqUJtpwDh8+bBqaBoBwHtoAaAegDYC/CaAN2CstK00y0jPMvA5PkuhOjJpGyGdD0A4Q7rng6NGjUqoDqeJy7bXX+uZ10PM2bdpIkyZNTNVUz549zXL/KitdHx8fL7fccosJnrS7XzANrPzvoxVS9evXl5o1a0pSUpKUtkamg7jrvhNIORNtALQD0AbA3wTQBuwPpOIT4s289uSItkCK7wegHcATxrlALzJXqgOpGjVqmIqlvXv3BizX2zqmUyi6PJzt1emnn26ea+vWrb5AKphe3S8rK0u2b98uZ555Zq71GlKFCqr0TSqNoY42stK674gM2gBoB6ANgL8JoA3YRz936+cvaz7aPofz2RC0A4RzLijKOSyqznpaldShQwdZsmRJQCKnt7t27RryPrrcf3u1ePHiPLdXO3fulAMHDkidOnXy3Gb9+vXmgOq/VgAAAAAAACByoqpCSmk3uGHDhknHjh2lc+fOMnPmTDl+/Li56p4aOnSo1KtXz3SlU3fccYf06NFDnn76aenXr5/MmzdP1qxZIy+//LJZf+zYMTPW06BBg0zVlI4h9ec//1maNm1qBj9XOpbUqlWr5MILLzRX2tPbOqD5DTfcEPJqfAAAAAAAAChDgdQ111xjBgafPHmyGZi8Xbt2smjRIt/A5Tt27AgoBevWrZvMnTtXJk2a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AABAcbn88sulb9++Idd98cUXJuzZsGFD2I/7zTffyKhRo8SOUGj37t1yySWXiJ02bdokgwYNMsGbHqOCwrdII5ACAAAAAACl1ogRI2Tx4sWyc+fOXOtef/116dixo7Rp0ybsx61Zs6aUL19e7FC7dm1JSEgQO504cUJOP/10mT59unl+uxFIAQAAAIDNEmIT5B8D/mEmnQdQdJdddpkJj954442A5ceOHZOUlBQTWB04cECGDBki9erVMyFT69at5e233873cYO77P3www9y/vnnS2JiorRo0cKEYMHuu+8+OeOMM8xzaNjzwAMPSGZmplmn+zd16lT573//ayqSdLL2ObjL3nfffScXXXSRlCtXTqpXr24qtfT1WG666Sbp37+/PPXUU1KnTh2zzZgxY3zPVRidOnWSJ598Uq699lrbw7AiXWVv7dq1hd52165d4T48AAAAAJR5+uWzcmLlkt4NoExwu90ydOhQE+785S9/Mb9fSsOo7OxsE0RpmNOhQwcTGCUlJcnHH38sN954ozRp0kQ6d+5c4HN4PB4ZOHCg1KpVS1atWiWHDx8OGG/KUqlSJbMfdevWNaHSyJEjzbI///nPcs0118jGjRtl0aJF8tlnn5ntK1fOfR44fvy49OnTR7p27Wq6Daampsqf/vQnGTt2bEDo9vnnn5swSn9u3brVPL52B9TnLA3CDqS01M16cwszoHlhtwUAAAAAAFGoY0eRPXvsf17tRrZmTaE2vfnmm021z/Lly83g5FZ3PR0jSUMfne655x7f9uPGjZNPP/1U3n333UIFUhogbdmyxdxHwyb12GOP5Rr3adKkSQEVVvqc8+bNM4GUVjtVrFjRBGi18+kiN3fuXElLS5O//e1vUqFCBbPs+eefN2NlPf744yYUU1WrVjXLY2NjpXnz5tKvXz9ZsmRJ2Q2k9A0FAAAAABRdZnamvLL2FTP/p/Z/krjYOA4nopeGUb/+KtFMA5lu3brJa6+9ZgIprRjSAc0feughs14rpTRA0gDq119/lYyMDElPTy/0GFGbN2+W+vXr+8IopRVMwd555x159tlnZdu2baYqKysry1RkhWPz5s3Stm1bXxilzj33XFOl9f333/sCqZYtW5owyqLVUlqVVVqEHUgNGzasePYEAAAAABwi25stC7cuNPPDzx4ucUIghShWAgNeF+V5daworXya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pUsXWb16db7bp6SkSPPmzc32rVu3loULF+a57a233ioul0tmzpwZsFyfT5f7T9OnT4/YawIAAAAAS1xsnIzuNNpMOg8AThN1gdQ777wjd911l0yZMkXWrl0rbdu2lT59+khqamrI7VesWCFDhgyRESNGyLp166R///5m2rhxY65t58+fL19//bXUrVs35GM99NBDsnv3bt80bty4iL8+AAAAAAAAp4u6QGrGjBkycuRIGT58uLRo0ULmzJkj5cuXl9deey3k9rNmzZK+ffvKvffeK2eddZY8/PDD0r59e3n++ecDtvv1119NwPTWW29JXFzof4GoVKmS1K5d2zdVqFChWF4jAAAAAGfzer1yOO2wmXQeAJwmqgKpjIwM+fbbb6VXr16+ZTExMeb2ypUrQ95Hl/tvr7Siyn97j8cjN954owmtWrZsmefzaxe96tWry9lnny1PPvmkZGVlReR1AQAAAIC/9Ox0uWH+DWbSeQBwmqga1Hz//v2SnZ0ttWrVCliut7ds2RLyPnv27Am5vS63PP744+J2u+X222/P87l1nVZWVatWzXQDnDBhgum2pxVboaSnp5vJcuTIEV/4pVNpovur/ypT2vYbkUMbAO0AtAHwNwG0gZL5/GXNR9NncT4bgnaAcM8FRTmHRVUgVRy04kq79el4VDpQeV503CpLmzZtJD4+Xm655RaZNm2aJCQk5Npel0+dOjXX8n379klaWpqUJtpwDh/OKRXWijQ4D20AtAPQBsDfBNAG7JWWlSYZ6RlmXsfLTXQnRk0j5LMhaAcI91xw9OhRKdWBVI0aNSQ2Nlb27t0bsFxv65hOoejy/Lb/4osvzAm+QYMGvvVahXX33XebK+1t37495OPq1f20y56uP/PMM3Ot1woq/xBLK6Tq168vNWvWlKSkJCltjUzDOt13Ailnog2AdgDaAPibANqA/YFUfEK8mU9OTo66QIrvB6AdwBPGuSAxMbF0B1JaldShQwdZsmSJuVKedQD09tixY0Pep2vXrmb9+PHjfcsWL15slisdOyrUGFO6XAdOz8v69evNAdc/DqFo1VSoyim9T2kMdbSRldZ9R2TQBkA7AG0A/E0AbcA++rnb6sERjZ/D+WwI2gHCORcU5RwWVYGU0qqjYcOGSceOHaVz586miun48eO+8Gjo0KFSr14902VO3XHHHdKjRw95+umn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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[指标分析]\n", " 最佳验证 l1: 0.063425\n", " 最佳迭代轮数: 285\n", " 早停建议: 如果验证指标连续10轮不下降,建议在第 285 轮停止训练\n", "\n", "[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\n" ] } ], "execution_count": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 查看结果" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:15.311741Z", "start_time": "2026-03-09T15:27:15.288652Z" } }, "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", "结果数据形状: (282000, 71)\n", "结果列: ['ts_code', 'trade_date', 'high', 'low', 'amount', 'vol', 'close', 'turnover_rate', 'open', 'total_assets', 'total_mv', 'f_ann_date', 'total_cur_liab', 'total_cur_assets', 'total_hldr_eqy_exc_min_int', 'total_liab', 'revenue', 'n_income', 'n_cashflow_act', 'ebit', 'ma_5', 'ma_20', 'ma_ratio_5_20', 'bias_10', 'high_low_ratio', 'bbi_ratio', 'return_5', 'return_20', 'kaufman_ER_20', 'mom_acceleration_10_20', 'drawdown_from_high_60', 'up_days_ratio_20', 'volatility_5', 'volatility_20', 'volatility_ratio', 'std_return_20', 'sharpe_ratio_20', 'min_ret_20', 'volatility_squeeze_5_60', 'overnight_intraday_diff', 'upper_shadow_ratio', 'capital_retention_20', 'max_ret_20', 'volume_ratio_5_20', 'turnover_rate_mean_5', 'turnover_deviation', 'amihud_illiq_20', 'turnover_cv_20', 'pv_corr_20', 'close_vwap_deviation', 'roe', 'roa', 'profit_margin', 'debt_to_equity', 'current_ratio', 'net_profit_yoy', 'revenue_yoy', 'healthy_expansion_velocity', 'EP', 'BP', 'CP', 'market_cap_rank', 'turnover_rank', 'return_5_rank', 'EP_rank', 'pe_expansion_trend', 'value_price_divergence', 'active_market_cap', 'ebit_rank', 'future_return_5', 'prediction']\n", "\n", "结果前10行预览:\n", "shape: (10, 71)\n", "┌───────────┬────────────┬──────────┬──────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ low ┆ … ┆ active_ma ┆ ebit_rank ┆ future_re ┆ predictio │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ rket_cap ┆ --- ┆ turn_5 ┆ n │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ f64 ┆ --- ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪══════════╪══════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000004.SZ ┆ 20250102 ┆ 2.325435 ┆ 2.168285 ┆ … ┆ 1.772242 ┆ null ┆ -0.066193 ┆ 0.023749 │\n", "│ 000004.SZ ┆ 20250103 ┆ 2.328181 ┆ 2.003659 ┆ … ┆ 1.567863 ┆ null ┆ 0.00893 ┆ 0.041868 │\n", "│ 000004.SZ ┆ 20250106 ┆ 1.918286 ┆ 1.811951 ┆ … ┆ 1.531265 ┆ null ┆ -0.0142 ┆ 0.054817 │\n", "│ 000004.SZ ┆ 20250107 ┆ 1.971154 ┆ 1.971589 ┆ … ┆ 1.664744 ┆ null ┆ 0.013031 ┆ 0.025283 │\n", "│ 000004.SZ ┆ 20250108 ┆ 2.071396 ┆ 2.040718 ┆ … ┆ 1.748053 ┆ null ┆ 0.00442 ┆ 0.013557 │\n", "│ 000004.SZ ┆ 20250109 ┆ 2.085814 ┆ 2.134077 ┆ … ┆ 1.752624 ┆ null ┆ 0.024865 ┆ 0.005967 │\n", "│ 000004.SZ ┆ 20250110 ┆ 2.03844 ┆ 1.928116 ┆ … ┆ 1.563176 ┆ null ┆ 0.073486 ┆ 0.012488 │\n", "│ 000004.SZ ┆ 20250113 ┆ 1.800879 ┆ 1.745673 ┆ … ┆ 1.354823 ┆ null ┆ -0.04458 ┆ 0.010749 │\n", "│ 000004.SZ ┆ 20250114 ┆ 1.993125 ┆ 1.936668 ┆ … ┆ 1.362504 ┆ null ┆ -0.152621 ┆ 0.004506 │\n", "│ 000004.SZ ┆ 20250115 ┆ 2.188803 ┆ 2.154032 ┆ … ┆ 1.361079 ┆ null ┆ -0.152621 ┆ 0.005335 │\n", "└───────────┴────────────┴──────────┴──────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", "结果后5行预览:\n", "shape: (5, 71)\n", "┌───────────┬────────────┬──────────┬──────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ high ┆ low ┆ … ┆ active_ma ┆ ebit_rank ┆ future_re ┆ predictio │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ rket_cap ┆ --- ┆ turn_5 ┆ n │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ f64 ┆ --- ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪══════════╪══════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 605588.SH ┆ 20260302 ┆ 2.566428 ┆ 2.53816 ┆ … ┆ 0.112914 ┆ null ┆ null ┆ -0.002814 │\n", "│ 605588.SH ┆ 20260303 ┆ 2.475112 ┆ 2.280174 ┆ … ┆ 0.061385 ┆ null ┆ null ┆ 0.021067 │\n", "│ 605588.SH ┆ 20260304 ┆ 2.173698 ┆ 2.114835 ┆ … ┆ 0.028725 ┆ null ┆ null ┆ 0.007579 │\n", "│ 605588.SH ┆ 20260305 ┆ 2.18537 ┆ 2.219597 ┆ … ┆ 0.044869 ┆ null ┆ null ┆ 0.006004 │\n", "│ 605588.SH ┆ 20260306 ┆ 2.171638 ┆ 2.201068 ┆ … ┆ 0.021626 ┆ null ┆ null ┆ 0.004578 │\n", "└───────────┴────────────┴──────────┴──────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", "每日预测样本数统计:\n", " 最小: 1000\n", " 最大: 1000\n", " 平均: 1000.00\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", "│ 000004.SZ ┆ 20250102 ┆ -0.066193 ┆ 0.023749 │\n", "│ 000007.SZ ┆ 20250102 ┆ 0.019858 ┆ 0.000582 │\n", "│ 000010.SZ ┆ 20250102 ┆ 0.076274 ┆ 0.004461 │\n", "│ 000014.SZ ┆ 20250102 ┆ -0.064651 ┆ 0.006334 │\n", "│ 000040.SZ ┆ 20250102 ┆ -0.093583 ┆ -0.102073 │\n", "│ 000042.SZ ┆ 20250102 ┆ -0.035958 ┆ 0.017509 │\n", "│ 000056.SZ ┆ 20250102 ┆ -0.033205 ┆ 0.020625 │\n", "│ 000068.SZ ┆ 20250102 ┆ -0.021277 ┆ 0.00916 │\n", "│ 000153.SZ ┆ 20250102 ┆ -0.018193 ┆ 0.003244 │\n", "│ 000159.SZ ┆ 20250102 ┆ -0.067833 ┆ 0.020453 │\n", "└───────────┴────────────┴─────────────────┴────────────┘\n" ] } ], "execution_count": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 保存结果" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:15.611776Z", "start_time": "2026-03-09T15:27:15.317283Z" } }, "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", " 保存行数: 1410(282个交易日 × 每日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.056168 ┆ 600421.SH │\n", "│ 2025-01-02 ┆ 0.048049 ┆ 000668.SZ │\n", "│ 2025-01-02 ┆ 0.042422 ┆ 000586.SZ │\n", "│ 2025-01-02 ┆ 0.036414 ┆ 002076.SZ │\n", "│ 2025-01-02 ┆ 0.035977 ┆ 301176.SZ │\n", "│ … ┆ … ┆ … │\n", "│ 2025-01-06 ┆ 0.069458 ┆ 600421.SH │\n", "│ 2025-01-06 ┆ 0.067984 ┆ 603316.SH │\n", "│ 2025-01-06 ┆ 0.062674 ┆ 301024.SZ │\n", "│ 2025-01-06 ┆ 0.062283 ┆ 002691.SZ │\n", "│ 2025-01-06 ┆ 0.060667 ┆ 000668.SZ │\n", "└────────────┴──────────┴───────────┘\n" ] } ], "execution_count": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.5 特征重要性" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:15.622544Z", "start_time": "2026-03-09T15:27:15.617560Z" } }, "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", "bias_10 966.502486\n", "return_5_rank 960.507971\n", "pe_expansion_trend 947.437883\n", "return_5 860.686048\n", "high_low_ratio 727.172214\n", "revenue_yoy 562.656819\n", "turnover_rank 558.328422\n", "amihud_illiq_20 388.591107\n", "overnight_intraday_diff 380.723414\n", "bbi_ratio 373.573519\n", "min_ret_20 366.693362\n", "drawdown_from_high_60 356.182625\n", "roa 334.564408\n", "active_market_cap 275.635468\n", "ma_ratio_5_20 261.307464\n", "turnover_deviation 194.988921\n", "return_20 192.620460\n", "net_profit_yoy 175.035165\n", "mom_acceleration_10_20 171.881004\n", "turnover_rate_mean_5 168.826981\n", "EP_rank 163.394623\n", "volume_ratio_5_20 158.494889\n", "turnover_cv_20 153.915966\n", "healthy_expansion_velocity 146.708935\n", "EP 142.683564\n", "max_ret_20 135.638350\n", "std_return_20 133.794949\n", "sharpe_ratio_20 108.012163\n", "close_vwap_deviation 103.748435\n", "ma_20 80.322421\n", "volatility_squeeze_5_60 77.509971\n", "BP 64.954998\n", "ma_5 60.884566\n", "roe 59.556815\n", "volatility_ratio 53.867742\n", "capital_retention_20 45.922123\n", "volatility_5 41.385944\n", "volatility_20 34.698196\n", "profit_margin 29.828428\n", "debt_to_equity 28.911864\n", "pv_corr_20 27.893618\n", "current_ratio 22.564712\n", "upper_shadow_ratio 16.570660\n", "kaufman_ER_20 16.416594\n", "market_cap_rank 15.822645\n", "CP 13.325475\n", "up_days_ratio_20 10.937868\n", "value_price_divergence 0.000000\n", "ebit_rank 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-09T15:27:15.634579Z", "start_time": "2026-03-09T15:27:15.631711Z" } }, "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", "特征数量: 49\n" ] } ], "execution_count": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 绘制特征重要性(辅助特征选择)\n", "\n", "**解读**:\n", "- 重要性高的特征对模型贡献大\n", "- 重要性为0的特征可以考虑删除\n", "- 可以帮助理解哪些因子最有效" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T15:27:15.796755Z", "start_time": "2026-03-09T15:27:15.641538Z" } }, "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+naQAA7B1JREFUeJzs3Qm8jPX7//HLOfZ9yZZK1pQlslVE9iLRgookKoVWbYqSbOEbfVV8W0WLvqWiVEKRNksospQiyp4sLXSOM//H+/P93/ObM2fmGJwxc+a8no/HdJy577nnnjl3M/f1ua7Pdefy+Xw+AwAAAAAAWS4p6zcJAAAAAAAIugEAAAAAiCIy3QAAAAAARAlBNwAAAAAAUULQDQAAAABAlBB0AwAAAAAQJQTdAAAAAABECUE3AAAAAABRQtANAAAAAECUEHQDAADEyJYtWyx//vz2+eefn5Dn69Wrl51++unH9Nj777/fGjdunOX7BACJjqAbAJCQpkyZYrly5Qp5U/AQDV988YUNHTrU9u7da/H6fixbtsyyq6efftq9jkQybNgwF8g2adIkw7JFixZZ165drUKFCpY3b14rVqyYW1eP2bFjxwnf1zvuuMO++eYbmzVr1gl/bgDIznLHegcAAIgmBSiVKlVKd1+tWrWiFnQ/8sgjLptYvHjxqDxHTqag+6STTnLvbyLYtWuXvfTSS+4W7KGHHrJHH33UKleu7F6vfh48eNC+/vpr+9e//uUe8+OPPx71cz777LOWlpZ2TPtbrlw569Spk40bN84uvfTSY9oGAOREBN0AgIR28cUXW4MGDSw7+/PPP61QoUKWU/31119WsGBBSzQvv/yy5c6d2zp27Jju/tdff90F3MpyT5s2zWW5A40fP97djkWePHmOa5+1T126dLGffvrJDQQAAI6M8nIAQI72wQcf2AUXXOCC2iJFiliHDh3su+++S7fOt99+6882av6tMn69e/e23377zb+Oysrvuece929l1r1S9k2bNrmb/h2qNFr367GB29F9a9assWuuucZKlChhTZs2TReo1a9f3woUKGAlS5a0q666ys0LPhZ6TYULF7bNmzfbJZdc4v6tUuannnrKLV+1apW1bNnSvTcVK1a0V199NWTJ+qeffmp9+/a1UqVKWdGiRa1nz572+++/h8xU16xZ0/Lly2cnn3yy9e/fP0Mp/oUXXugqEZTRbdasmQu2H3jgATcPWX+XhQsX+t9brSt79uyxu+++22rXru1eg/ZBgy0qhQ60YMEC97j//ve/NmLECDvllFPc37NVq1a2YcOGDPu7ePFia9++vfsb6D2oU6eOPfHEE+nWWbdunV155ZXub6FtaYAn0vLrd955x5WLa5+Ds9zK6D///PMZAm5RmXngMSMzZ850x67eV72/VapUcYH74cOHM53T7R2byl4/88wz7nF6fMOGDW3p0qUZnrt169b+5wMARIZMNwAgoe3bt892796d7j4FNKIs4nXXXWft2rWzxx57zGVUJ02a5ILcFStW+IOTuXPnusze9ddf7wJuBX8KUPTzq6++ckHL5Zdfbt9//7299tprLgvpPUfp0qVdGfHRUjaxWrVqNnLkSPP5fO4+BYpDhgxx2cYbbrjBbXfixIkuONX+HktJu4IyBajaxpgxY+yVV16xAQMGuCDzwQcftO7du7vXNnnyZBdMn3feeRnK9bW+nluB4Pr16917+PPPP/uDXNEyld4raLvlllv86ymwUxOxwAysBjO0TxpQ6NGjh5UtW9YF2LfeeqsLULVfovtFfxsFsHrPtG+a7/yf//zHmjdv7gYvFIgGGj16tCUlJblAXceHXrdep4Jsj/7mGogoX7683X777e7vvnbtWnvvvffc76K/v+Zia6BCfQL0nimg79y5s82YMcMuu+yysO97SkqKe+16LwLpGNJNf9/gYDwzGgDR+nfddZf7+fHHH7vgff/+/TZ27NgjPl4DKgcOHHCDJ/qb6T3R313vbeDfRgG/AnP9ze68886I9w8AcjQfAAAJ6MUXX1SkGvImBw4c8BUvXtx34403pnvc9u3bfcWKFUt3/19//ZVh+6+99prb1qeffuq/b+zYse6+jRs3pltXv+t+7VMw3f/www/7f9e/dd/VV1+dbr1Nmzb5kpOTfSNGjEh3/6pVq3y5c+fOcH+492Pp0qX++6677jp338iRI/33/f77774CBQr4cuXK5Zs+fbr//nXr1mXYV2+b9evX9/3zzz/++8eMGePunzlzpvt9586dvrx58/ratm3rO3z4sH+9J5980q33wgsv+O9r3ry5u2/y5MkZXkPNmjXd8mAHDx5Mt13vPc+XL59v2LBh/vs++eQTt+0zzzzTd+jQIf/9TzzxhLtf76Wkpqb6KlWq5KtY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06aF3M6+ffusdOnS9uqrr9qVV17p7lNsceaZZ9qXX35p5557bsjHHWm7oqy5BgUUVHuUTdfgwA033GCpqal2+umn2yOPPGJ9+vSxnCQlJcUlFdu3b+/ex+zMi710LBUtWjT7Zrr79etnuXLlsiVLlrj/kZT5rVmzpt1111321VdfuXVUytGpUyd3cOvFahQps7KQCy+80O64445096mUo1evXv7f9T/B8OHD3SiVtluxYkU3UrVr1y7/c9WpU8eWLVvmf8yUKVNcgKwBAf3PqnUuuugi27ZtW0Sv9YUXXrA9e/a4AQIF39qH5s2bRxxwAwAAADnB+eef76pev//+e/e7MsWfffaZXXzxxe73tLQ0V7qt2KFdu3YuqaUybp1ne77++msXALZu3dp/n7LXp512mgu6Q4lku97+vf766+7cXo+ZPn26K2VXHCLLly+3X3/91ZKSkqxevXquylX7vnr16qi8X4ituA66dZB++OGHrtxacyGCKcDVQawgWOuqJGTu3Ln2008/Wbdu3Y77+cePH++CX5WBdOjQwY1UKQjv0aOH+x9Fc0f0e2CxwF9//WXjxo1zI1+ffvqpGxC4++67I3o+BfXnnXeee70auatVq5aNHDnSzVkBAAAA8D/333+/yzgrSFa2VIGrkmrdu3d3y3fu3Gl//PGHjR492iXBPvroI7vssstcmbdiBm8Ka968eV1MEUjn4VoWSiTblf/+978uoFd2W1NG+/bta2+//bZVrVrVLVe84lXkDh482N577z03p1tBueIaJJbcFsc2bNjgAlr9zxSORrg0T2Ljxo1urrdMnTrVZcOXLl3qmhocK5U86H8Qeeihh1yJiLbXpUsXd999993ngmRl1dUkQfQ/1+TJk11ALgMGDHBl8ZHQ/3wff/yx+7BQyYVevzL92ubDDz8c8jGHDh1yt8ASB8mX5LPk5LieOYAEpuMv8CfAsYicjM9ExINEOg51bqws8iuvvOLO+8866yyX6VaiS5lnJcW882P1gdL5uCg+UDb86aefdplolXh72wuk+ENJr+D7JZLtyoMPPmi///67SyAq8FZyTdW4OtfXdFlNK/UGD9SQTTR1Vo3hlBW/8cYbLVGl/P/3NdT7m91E+hriOuiOZLq5Gico2PYCbtH/eBqx0rLjCbpVPh444iX6nyT4Po14eUF3wYIF/QG3qFREyyOh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7PwhV65c6W41atRIt86XX35pLVu2tEKFClnRokWtWbNm9vfff7tlmzZtsj59+lilSpWsQIECVqVKFXv44Yftn3/+OeJzZ7ZdOf300zPs2+jRozPdd920PQBA/Il50L19+3a79dZbrXLlypYvXz479dRTrWPHjjZ//nxLJG+99ZY1aNDAihcv7r4UNVAwbdq0DOutXbvWLr30UitWrJhbr2HDhrZ58+aY7DMAAImsZs2atm3bNv/ts88+SxcYX3TRRda2bVtbsmSJLV261AYMGGBJSf87dVq3bp2lpaXZf/7zH/vuu+9s/PjxNnnyZHvggQcyfc4jbdczbNiwdPumcyXP3XffnW6ZbmeddZZ16dIly98jAMDxy20xpFHiJk2auEB07NixVrt2bUtJSbE5c+ZY//793RdaoihZsqQ9+OCDbhQ9b9689t5779n1119vZcqUsXbt2rl1fvzxR2vatKkbOX/kkUfc6Le+yPPnz3/Uz9d41HxLzc2IN2IjX7LPxjQyqzV0jh06nIs/A2KGYxHBNo3u4P937ty5rVy5ciHfpDvvvNNuu+02u//++/33nXHGGf5/K3DWzaPkwfr1623SpEk2bty4sG/8kbbrKVKkSNh9K1y4sLt5vvnmG1uzZo0L+gEA8Semme5+/fq5ciiN9F5xxRVWvXp1N+p811132VdffeXWUZa3U6dO7stFQWjXrl1tx44dYbd54YUX2h133JHuvs6dO1uvXr3SlW0NHz7cevbs6bZbsWJFmzVrlu3atcv/XHXq1LFly5b5HzNlyhQ3OKABgTPPPNOtoy9bjS5HQvt12WWXuceqBO322293zxE4qq6gvH379jZmzBirV6+eW09ZbwXmAAAga/3www928sknu4C5e/fu/sqynTt32uLFi9337/nnn29ly5a15s2bp/vODmXfvn1ukD2co9muyslLlSrlzgeUmEhNTQ273eeee86dQ11wwQVH9foBAAkedO/Zs8c+/PBDl9EONQdJAa7KthQEa92FCxfa3Llz7aeffrJu3bod9/OrDExZ9hUrVliHDh3s2muvdUF4jx49bPny5S7g1e8+n8//mL/++suNXqss/NNPP3VfzirxOlrapsrnNSKueVyi1zp79mz3panMt76QGzdubO+8885xv1YAAJCevmM1oK5zEWWnN27c6ILWAwcOuHMNb+70jTfe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4J2SkhL2OevXr2/PPvusTZw40WbPnm0+n8/atm1rhw8fdsu//vprK1OmjL388sv23Xff2YMPPmiDBg2yJ5980r+Nzz//3Hr27Gl9+vRx67zxxhu2ZMkSt78AgPgXF0H39u3b7dZbb7XKlStbvnz53Ghvx44dbf78+Zaopk+f7kbRO3fu7L9PX9r33Xef1a5d2woVKuRGxPUlu3Xr1pjuKwAAiSB37txWrlw5/+2kk05Kt1xZ5MDlRYsW9S9TdnrPnj02bNgwO+OMM1wA//DDD9uOHTvs559/DvucN910k11wwQVWtmxZq1evng0fPty2bNlimzZtcsuVsVZmu3nz5u48qEePHnb99dfbW2+95d/Gl19+aaeffrrddtttVqlSJWvatKnLoCvwBgDEv9yx3gF96TRp0sSVao0dO9YFnAo+58yZY/37909XgpUo9Jrvvvtu9yUc6K+//rLly5fbkCFDXAnZ77//brfffrtdeumltmzZsqN6jsaj5ltq7kJZvOdAZPIl+2xMI7NaQ+fYocO5eNsQMxyL2DS6g/9N+OGHH9yAdv78+e28886zUaNGucx1YAm3Ms4KuDX4r+9jBeKiQLtUqVL2/PPP2wMPPOAy1fq3ysEVEEfizz//tBdffNEFzkowhLNv3z4rWbKk/3ftq57z/ffft4svvth27txpb775prVv354/MABkAzHPdPfr189lfDVae8UVV1j16tXd6PFdd91lX331lVtn8+bNbg5U4cKF3aiz5kVpZDkczcu644470t2njHKvXr38v+sLUqPNyiRruxUrVrRZs2bZrl27/M9Vp06ddMHulClT3OCABgT0Jat1VGqmErRI6Uu6e/fu9sgjj7gR7UDFihWzuXPnutenL/dzzz3XlZep9EzvAQAAODaNGzd23+MffvihTZo0yTZu3OgGvw8cOOCWX3PNNS7g/uSTT1x597Rp01zW2aNS8gULFrh1NPda5wDa1gcffOAy6JmZPHmyXXXVVW4euNbXd33evHlDrvvFF1/Y66+/7jLkHiUnNCDQrVs39zgNCuic4amnnuJwAIBsIKaZbpVp6QtrxIgRrpw6mALctLQ0fxC8cOFCS01NdRlwffHoy+94jB8/3kaOHOlGsvXva6+91s4//3xX6qWsu0q9FZRr/pQGBrxs9Lhx49yXcVJSkvtCVtZaX4aRUFma5m5p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ruf57LPPrHXr1hm2u2fPHlftxdU9AADAcZeXeyV8cv/999tTTz3lTkYUTGq+d6T69evnTmpUMqhS9erVq1vNmjXtrrvusq+++sqto/l1KjUsXLhw2Dl1gS688EK744470t2nk6hevXr5f9f1xIcPH249e/Z0261YsaLNmjXLdu3a5X8uzTFUqaNnypQpbnBAAwJnnnmmW0clj9u2bYvotWquoE4Cr7rqqnQncYE0b7BcuXL+23vvvWdVqlRJ1y0eABLNqlWr3GeqPhtvvvlme/vtt+2ss86yn376yT+N6MYbb7QPP/zQzjnnHGvVqpX98MMPblngOprmpM9NzenWd4GC4FAUzP/xxx+urF2f4x999JGbu3355ZfbwoUL3Trnnnuum+d93333uUFTDQTcfffdbmAg+HNf62jdUqVKue+smTNnRvkdAwAA2ckxZboDM7Ua7VdGWvPxqlat6oLVSOhkSCdQyljoZCWYAlxlI7wgWCdCqampLgPerVs3NwfveIwfP97NQdccPv1b8wGVnejdu7cLjnUSpaBc8wo1MCA68Ro3bpxNmzbNZTt69OjhTsKiMY9dcwdffvllNwDhPX8oysbo5tm/f7/7mS/JZ8nJqnYATjwdf4E/gWCqavKoCkiVPvr80rzo6667zubNm+e/HOUNN9zgPm9lzJgxbtmzzz7rvj+8dTQArKZm8swzz7jM9fTp0/0DroHP531man625oeLBnyVwVa/En0X6Dvotddes1tvvdX+/e9/u898ffcomx68PQ306vtCAbcGdPV98s4772T62Y2cxTteAo8bgOMQOVVKAn0mRvoajinoDqTrdCtTrNvR2LBhg+aTu1LBcObPn+8yICplP/XUU9196o6ukyOdoCl7fKzat29vffv2df9+6KGHXAddbc8r5VbQrfJGZdWVdfbe1MmTJ7vss+hkbdiwYRYNOmHbu3dvugx9KKNGjXKd44MNrpdmBQv+X6k6EAuPNvi/hlNAoPfffz/kG6IpR6ooUum3KqBEgXXg+uo2rrJz3ed1G9fnZeA6ynZ/8sknVqFCBff73Llz/cv0WZ6cnOxugY/Jmzeva6gWeN/jjz/uBgMUdGsAWJ/JGlwOt/8auNUggQZzM/t+Q84UeBwCscJxiHgxNwE+E5WUjVrQrfI6ZYkVgCoo/f77712mQlljlW736dPniNtQwB3J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rl07+/XXX2369Om2YsUKF5xfffXV7nWhnnnmGRdwn0xqt3vbbbfZhg0bbMaMGbZ69Wrr0KGD3XDDDW59+f33391rLrjgAlu8eLHNnj3b1q5d64J5AAAAIEMG3co89enTx8qXL285cuSwUqVKWZs2bWzu3LkWT15++WW7/PLLrWDBgu6hC/slS5YEraMLewUYgQ9l64CMRG22U6dOLggOpczzokWLbNKkSVavXj2rVKmS+/6vv/6yd999N2jdlStX2lNPPWWvvfbaSd8ztdv99ttv3fmmfv367pwzdOhQl9H+7rvv3PKZM2daYmKivfDCC24b2taLL77osuE///xzmvx+AAAAkHlkS+8d2LRpkzVq1Mhd9I4bN85q1KhhSUlJ9vnnn1uvXr3shx9+sHjx9ddf280332wNGza0nDlz2uOPP27Nmzd3WbSSJUsGBSyvv/66/2d1RJyqS8bMteRsedJs34GT2TS2dap+SUeOHHFfdQx4smTJ4tr5ggUL7M4773TPHT582G655RYX/KoUPK22q+Pvvffes9atW7vzzrRp0+zvv/+2K664wr+d7Nmzu9d6cuXK5b5qO8qAAwAAABkm092zZ0+XzVXG97rrrrMLL7zQqlWrZv3793dZK9m8ebO1bdvW8ubNa/ny5XOloBq7GYkunvv16xf0nDJugeWhZcuWdWNOVWqq7aoMVeWmf/zxh/+9atasacuWLfO/ZvLkye4iXR0CVapUcesoQN62bVuqPuuUKVPc51UpfOXKle2VV16x48ePn5DRV5CgIMN7KCsOxAu1/dKlS9vgwYNt7969dvToUdcB9dtvvwUdS/fdd58LkHU8puV2FWSrY09jtXWs3X333fbRRx/5g+mrrrrKVd+oE1Db0LYefPBBtyy1xzoAAAAQE5nuPXv2uPGSo0ePdhMahVKAq6DUC4LnzZtnycnJLgN+4403uszxmXj66aftscces2HDhrnvNbmSLvK7devmLrgHDRrkgnJlor0xpcq+Pfnkk/bWW2+5TNitt95q999/vwuoT5W2pYv/QoUKBT2vz1W0aFEXbCsAUOeAAoRwlJXzMnxy4MAB9zVHFp9lzeo75X0CTpfacuj33lcdt4HLFfhqcjK1/axZs1rTpk1dB5bGZWu9Tz75xL788kvXGRf4utDthDrZdmXIkCEukNa5R8eVOtvUkaf3U6WN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QTcAAAAAAFFC0A0AAAAAQJQQdAMAAAAAECUE3QAAAAAARAlBNwAAAAAAUULQDQAAAABAlBB0AwAAAAAQJQTdAAAAAABECUE3AAAAAABRQtANAAAAAECUEHQDAAAAABAlBN0ATvDNN99YmzZtrESJEpaQkGAff/xx0HI9F+4xbtw4/zp33XWXZc+ePWj52LFjU/xt//3339arVy8rXLiw5c2b16677jrbsWOHf/nu3butZcuWbr9y5MhhpUqVst69e9uBAwf863z99ddh92379u38TwMAAOCsi4uge8SIEVarVq303g0gbhw6dMguuugie+GFF8Iu37ZtW9Djtddec4GtguRADz/8cNB6ffr0SfF977vvPvvkk0/s/ffft3nz5tnvv/9uHTp08C/PkiWLtW3b1mbMmGE//vijTZ482b744gu75557TtjWhg0bgt67aNGip/37AAAAADJ00K0MlC7Gy5cv789eKcs2d+5ciycffvih1a1b1woUKGB58uRxHQVvvfVW0Dpdu3Y9IUOnzB5wNrVq1cpGjRpl7du3D7u8ePHiQY/p06fblVde6Y7hQOecc07Qemr3kezfv99effVVGz9+vF111VVWp04de/311+3bb7+1RYsWuXUKFixoPXr0cMdRmTJlrGnTptazZ0+bP3/+CdtTkB343grYAQAAgLMtm6WzTZs2WaNGjVwgqtLUGjVqWFJSkn3++eeuzPSHH36weFGoUCEbMmSIVa5c2ZXdzpw5026//XYXHLRo0cK/noJsBRsedUScqkvGzLXkbJEDHCDUprGtT+uXovLvTz/91N54440TlumYfuyxx6x06dJ2yy23uEx2tmzhTzvfffedO/avvvpq/3M6VvTahQsX2qWXXnrCa5QJV2dWkyZNTlimTq0jR45Y9erVXTWMzjMAAADA2ZbuqR9lqZTNXbJkiStNvfDCC61atWrWv39/f3Zr8+bNrqRUYzzz5ctnN9xwQ9A4z1BXXHGF9evXL+i5du3auSyyp2zZsi6Td9ttt7ntKmumktU//vjD/141a9a0ZcuW+V+jUlZ1DqhDoEqVKm4dBcgqXU0N7Zcyh3pthQoV7N5773XvsWDBgqD1FGQHZuiU3QNilYJtZbQDy8DlH//4h7399tv21Vdf2d133+2C7wceeCDFihd1RukYC1SsWLETxmPffPPNljt3bitZ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+R9L0B1H3nvvPevfv7+bDXD58uV20UUXWYsWLWznzp3pvWuIA/PmzXMB9aJFi2zOnDmWlJRkzZs3t0OHDvnXue++++yTTz6x999/363/+++/W4cOHYIuDhRwHz161L799lt74403bPLkye6kDJyqpUuX2ksvvWQ1a9YMep52iLNh79691qhRI0tMTLTPPvvM1q1bZ0899ZQVLFjQv44uDp977jl78cUXbfHixZYnTx73d1kdQx5dcK5du9adV2fOnOkuZLt3785/IlLl8ccft0mTJtnzzz9v69evdz+r3U2YMIF2iKjS9Z9iDSX8wkmL89+BAwfctWaZMmXsu+++s3HjxtmIESPsn//8Z8b739Xs5YgP9evX9/Xq1cv/87Fjx3wlSpTwjRkzJl33C/Fp586d6kb3zZs3z/28b98+X2Jiou/999/3r7N+/Xq3zsKFC93Ps2bN8mXJksW3fft2/zqTJk3y5cuXz3fkyJF0+BTIqP78809fxYoVfXPmzPE1adLEd++997rnaYc4WwYNGuS77LLLIi4/fvy4r3jx4r5x48b5n1P7zJEjh+/dd991P69bt86dI5cuXepf57PPPvMlJCT4tm7dGuVPgHjQunVrX7du3YKe69Chg69Tp07ue9ohzgadxz766CP/z2nV7iZOnOgrWLBg0DWizr2VKlXKcP+xZLrjhDKH6gFS6YYnS5Ys7ueFCxem674hPu3fv999LVSokPuq9qfsd2AbrFy5spUuXdrfBvVV5ZfFihXzr6NeT/VkqqcTSC1VXahqIrC90Q5xNs2YMcPq1q1rHTt2dENlateubS+//LJ/+caNG2379u1BbTR//vxu6FfgOVElldqOR+vr77cyQ8DJNGzY0ObOnWs//vij+/n777+3BQsWWKtWrWiHSDdpdf5buHChNW7c2LJnzx503ajhjao2ykiypfcOIG3s2rXLle4GBjOin3/44Qd+zUhTx48fd2NoVVpZvXp195xOrjop6gQa2ga1zFsnXBv1lgGpMXXqVDeERuXloWiHOFt+/fVXV9arYV0PPfSQa499+/Z158EuXbr4z2nhznmB50QF7IGyZcvmOjM5JyI1HnzwQddxrU7urFmzumvB0aNHu7Jdr43RDnG2pVW72759u5uvIHQb3rLA4TyxjqAbwGllGdesWeN604GzacuWLXbvvfe68V+aVAVI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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[特征重要性排名 - Gain]\n", "bias_10 966.502486\n", "return_5_rank 960.507971\n", "pe_expansion_trend 947.437883\n", "return_5 860.686048\n", "high_low_ratio 727.172214\n", "revenue_yoy 562.656819\n", "turnover_rank 558.328422\n", "amihud_illiq_20 388.591107\n", "overnight_intraday_diff 380.723414\n", "bbi_ratio 373.573519\n", "min_ret_20 366.693362\n", "drawdown_from_high_60 356.182625\n", "roa 334.564408\n", "active_market_cap 275.635468\n", "ma_ratio_5_20 261.307464\n", "turnover_deviation 194.988921\n", "return_20 192.620460\n", "net_profit_yoy 175.035165\n", "mom_acceleration_10_20 171.881004\n", "turnover_rate_mean_5 168.826981\n", "EP_rank 163.394623\n", "volume_ratio_5_20 158.494889\n", "turnover_cv_20 153.915966\n", "healthy_expansion_velocity 146.708935\n", "EP 142.683564\n", "max_ret_20 135.638350\n", "std_return_20 133.794949\n", "sharpe_ratio_20 108.012163\n", "close_vwap_deviation 103.748435\n", "ma_20 80.322421\n", "volatility_squeeze_5_60 77.509971\n", "BP 64.954998\n", "ma_5 60.884566\n", "roe 59.556815\n", "volatility_ratio 53.867742\n", "capital_retention_20 45.922123\n", "volatility_5 41.385944\n", "volatility_20 34.698196\n", "profit_margin 29.828428\n", "debt_to_equity 28.911864\n", "pv_corr_20 27.893618\n", "current_ratio 22.564712\n", "upper_shadow_ratio 16.570660\n", "kaufman_ER_20 16.416594\n", "market_cap_rank 15.822645\n", "CP 13.325475\n", "up_days_ratio_20 10.937868\n", "value_price_divergence 0.000000\n", "ebit_rank 0.000000\n", "dtype: float64\n", "\n", "[低重要性特征] 以下2个特征重要性为0,可考虑删除:\n", " - value_price_divergence\n", " - ebit_rank\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 }