{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. 导入依赖" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T06:10:19.495013Z", "start_time": "2026-03-08T06:10:18.913682Z" } }, "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-08T06:10:19.508163Z", "start_time": "2026-03-08T06:10:19.502562Z" } }, "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-08T06:10:19.519954Z", "start_time": "2026-03-08T06:10:19.515047Z" } }, "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-08T06:10:19.527636Z", "start_time": "2026-03-08T06:10:19.523669Z" } }, "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\": 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 = 2 # 可调整为 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-08T06:10:27.660787Z", "start_time": "2026-03-08T06:10:19.531220Z" } }, "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 - 20261231\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "D:\\PyProject\\ProStock\\src\\data\\financial_loader.py:123: 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, 53)\n", "数据列: ['ts_code', 'trade_date', 'vol', 'low', 'high', 'volume_ratio', 'turnover_rate', 'close', 'total_mv', 'f_ann_date', 'total_profit', 'ebit', 'operate_profit', 'ebitda', 'n_income', '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_date ┆ vol ┆ low ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_re │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ turn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 1.5302e6 ┆ 1806.75 ┆ … ┆ 721.52104 ┆ 2580.5045 ┆ 938.15146 ┆ -0.004746 │\n", "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ 33 ┆ 4 ┆ │\n", "│ 000001.SZ ┆ 20200103 ┆ 1.1162e6 ┆ 1847.15 ┆ … ┆ 708.50174 ┆ 2533.9412 ┆ 921.22323 ┆ -0.02852 │\n", "│ ┆ ┆ ┆ ┆ ┆ 4 ┆ 96 ┆ 7 ┆ │\n", "│ 000001.SZ ┆ 20200106 ┆ 862083.5 ┆ 1846.05 ┆ … ┆ 713.06736 ┆ 2550.2701 ┆ 927.15964 ┆ -0.004685 │\n", "│ ┆ ┆ ┆ ┆ ┆ 8 ┆ 5 ┆ 9 ┆ │\n", "│ 000001.SZ ┆ 20200107 ┆ 728607.56 ┆ 1850.42 ┆ … ┆ 709.74110 ┆ 2538.3738 ┆ 922.83470 ┆ -0.022743 │\n", "│ ┆ ┆ ┆ ┆ ┆ 6 ┆ 46 ┆ 6 ┆ │\n", "│ 000001.SZ ┆ 20200108 ┆ 847824.12 ┆ 1815.49 ┆ … ┆ 730.61584 ┆ 2613.0319 ┆ 949.97690 ┆ -0.008401 │\n", "│ ┆ ┆ ┆ ┆ ┆ 4 ┆ 01 ┆ 3 ┆ │\n", "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", "[配置] 训练期: 20200101 - 20231231\n", "[配置] 验证期: 20240101 - 20241231\n", "[配置] 测试期: 20250101 - 20261231\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-08T06:10:37.221864Z", "start_time": "2026-03-08T06:10:27.670279Z" } }, "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", " 筛选前数据规模: (7255513, 53)\n", " 筛选后数据规模: (4654331, 53)\n", " 筛选前股票数: 5694\n", " 筛选后股票数: 3364\n", " 删除记录数: 2601182\n" ] } ], "execution_count": 6 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T06:10:39.192697Z", "start_time": "2026-03-08T06:10:37.226314Z" } }, "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", " 测试集数据规模: (893340, 53)\n", " 训练集股票数: 3297\n", " 验证集股票数: 3220\n", " 测试集股票数: 3220\n", " 训练集日期范围: 20200102 - 20231229\n", " 验证集日期范围: 20240102 - 20241231\n", " 测试集日期范围: 20250102 - 20260306\n", "\n", " 训练集前5行预览:\n", "shape: (5, 53)\n", "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ vol ┆ low ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_re │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ turn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 1.5302e6 ┆ 1806.75 ┆ … ┆ 721.52104 ┆ 2580.5045 ┆ 938.15146 ┆ -0.004746 │\n", "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ 33 ┆ 4 ┆ │\n", "│ 000002.SZ ┆ 20200102 ┆ 1012130.4 ┆ 4824.87 ┆ … ┆ 776.91820 ┆ 47.131053 ┆ 1140.2493 ┆ -0.011057 │\n", "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ ┆ 95 ┆ │\n", "│ 000004.SZ ┆ 20200102 ┆ 17853.2 ┆ 90.1 ┆ … ┆ -69.58089 ┆ -52.61755 ┆ -24.82135 ┆ -0.000441 │\n", "│ ┆ ┆ ┆ ┆ ┆ 5 ┆ 4 ┆ 9 ┆ │\n", "│ 000005.SZ ┆ 20200102 ┆ 104134.12 ┆ 28.82 ┆ … ┆ 142.55925 ┆ 385.57490 ┆ 208.12520 ┆ 0.022337 │\n", "│ ┆ ┆ ┆ ┆ ┆ 6 ┆ 4 ┆ 2 ┆ │\n", "│ 000006.SZ ┆ 20200102 ┆ 124751.76 ┆ 190.24 ┆ … ┆ 633.27582 ┆ 650.95370 ┆ 819.10495 ┆ 0.012964 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 3 ┆ 5 ┆ │\n", "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", " 验证集前5行预览:\n", "shape: (5, 53)\n", "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ vol ┆ low ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_re │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ turn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20240102 ┆ 1.1584e6 ┆ 1074.93 ┆ … ┆ 2217.6093 ┆ 6486.3743 ┆ 2744.2180 ┆ -0.003256 │\n", "│ ┆ ┆ ┆ ┆ ┆ 09 ┆ 45 ┆ 84 ┆ │\n", "│ 000002.SZ ┆ 20240102 ┆ 811106.29 ┆ 1844.3 ┆ … ┆ 1736.4093 ┆ 19.432701 ┆ 2329.7434 ┆ -0.026601 │\n", "│ ┆ ┆ ┆ ┆ ┆ 99 ┆ ┆ 1 ┆ │\n", "│ 000004.SZ ┆ 20240102 ┆ 28867.0 ┆ 65.23 ┆ … ┆ -168.7552 ┆ -184.4013 ┆ -192.7135 ┆ -0.014789 │\n", "│ ┆ ┆ ┆ ┆ ┆ 72 ┆ 85 ┆ 84 ┆ │\n", "│ 000005.SZ ┆ 20240102 ┆ 63028.0 ┆ 10.01 ┆ … ┆ -96.94997 ┆ -295.0388 ┆ -46.06373 ┆ -0.05395 │\n", "│ ┆ ┆ ┆ ┆ ┆ 7 ┆ 72 ┆ 6 ┆ │\n", "│ 000006.SZ ┆ 20240102 ┆ 261947.19 ┆ 176.84 ┆ … ┆ -6.971845 ┆ -51.5536 ┆ -5.32671 ┆ -0.013454 │\n", "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", " 测试集前5行预览:\n", "shape: (5, 53)\n", "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ vol ┆ low ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_re │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ turn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20250102 ┆ 1.8196e6 ┆ 1455.46 ┆ … ┆ 1791.1304 ┆ 6183.5904 ┆ 2158.1117 ┆ -0.002622 │\n", "│ ┆ ┆ ┆ ┆ ┆ 08 ┆ 38 ┆ 45 ┆ │\n", "│ 000002.SZ ┆ 20250102 ┆ 1.1827e6 ┆ 1284.65 ┆ … ┆ -1933.116 ┆ -1110.658 ┆ -1729.069 ┆ -0.022509 │\n", "│ ┆ ┆ ┆ ┆ ┆ 105 ┆ 303 ┆ 737 ┆ │\n", "│ 000004.SZ ┆ 20250102 ┆ 119760.37 ┆ 54.17 ┆ … ┆ -199.1144 ┆ -126.8907 ┆ -197.3308 ┆ -0.064897 │\n", "│ ┆ ┆ ┆ ┆ ┆ 31 ┆ 63 ┆ 47 ┆ │\n", "│ 000006.SZ ┆ 20250102 ┆ 307195.1 ┆ 285.33 ┆ … ┆ -646.1294 ┆ 74.343232 ┆ -637.5489 ┆ -0.048278 │\n", "│ ┆ ┆ ┆ ┆ ┆ 33 ┆ ┆ 17 ┆ │\n", "│ 000007.SZ ┆ 20250102 ┆ 68219.01 ┆ 57.49 ┆ … ┆ 6.740918 ┆ 783.72753 ┆ 22.556002 ┆ 0.015649 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 9 ┆ ┆ │\n", "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n" ] } ], "execution_count": 7 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T06:10:40.545732Z", "start_time": "2026-03-08T06:10:39.198908Z" } }, "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 ┆ vol ┆ low ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ future_re │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ turn_5 │\n", "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ --- │\n", "│ ┆ str ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪═══════════╪═══════════╪══════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 4.749919 ┆ 7.140527 ┆ … ┆ 1.223327 ┆ 2.58711 ┆ 1.420902 ┆ -0.004746 │\n", "│ 000002.SZ ┆ 20200102 ┆ 2.92576 ┆ 7.140527 ┆ … ┆ 1.348024 ┆ -0.147052 ┆ 1.826328 ┆ -0.011057 │\n", "│ 000004.SZ ┆ 20200102 ┆ -0.574944 ┆ 0.102278 ┆ … ┆ -0.557417 ┆ -0.254707 ┆ -0.510901 ┆ -0.000441 │\n", "│ 000005.SZ ┆ 20200102 ┆ -0.271162 ┆ -0.29962 ┆ … ┆ -0.079896 ┆ 0.218216 ┆ -0.043591 ┆ 0.022337 │\n", "│ 000006.SZ ┆ 20200102 ┆ -0.19857 ┆ 0.759033 ┆ … ┆ 1.02469 ┆ 0.504628 ┆ 1.182085 ┆ 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-08T06:10:58.361151Z", "start_time": "2026-03-08T06:10:40.549989Z" } }, "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-08T06:10:58.523203Z", "start_time": "2026-03-08T06:10:58.364995Z" } }, "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", " 处理前记录数: 893340\n", " 处理后记录数: 893340\n", " [2/3] 应用处理器: Winsorizer\n", " 处理前记录数: 893340\n", " 处理后记录数: 893340\n", " [3/3] 应用处理器: StandardScaler\n", " 处理前记录数: 893340\n", " 处理后记录数: 893340\n" ] } ], "execution_count": 10 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T06:10:59.948592Z", "start_time": "2026-03-08T06:10:58.533879Z" } }, "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", " 测试样本数: 893340\n", " 预测中...\n", " 预测完成!\n", "\n", " 预测结果统计:\n", " 均值: -0.000990\n", " 标准差: 0.008152\n", " 最小值: -0.145569\n", " 最大值: 0.102702\n" ] } ], "execution_count": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3 训练指标曲线" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T06:11:05.252510Z", "start_time": "2026-03-08T06:10:59.952123Z" } }, "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", "[147]\ttrain's l1: 0.0424037\tval's l1: 0.0535696\n", "训练完成,指标已收集\n", "\n", "评估指标: l1\n", "\n", "[早停信息]\n", " 配置的最大轮数: 1000\n", " 实际训练轮数: 247\n", " 早停状态: 已触发(连续100轮验证指标未改善)\n", "\n", "最终指标:\n", " 训练 l1: 0.042166\n", " 验证 l1: 0.053583\n" ] } ], "execution_count": 12 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T06:11:05.495565Z", "start_time": "2026-03-08T06:11:05.256254Z" } }, "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+naQAAemRJREFUeJzt3QecE2X+x/Hf7mYLCyx96VWQLggIBxZQEBAUEUTFQpHDjiJWFEFExYqgougpqP+T4p5iRTkE9VSwICDCiV1BOoj07fm/fs/exElIstlsdjbZ/bx9PWYymSST2QyTfPN7nolzu91uAQAAAAAAABwU7+STAQAAAAAAAIpQCgAAAAAAAI4jlAIAAAAAAIDjCKUAAAAAAADgOEIpAAAAAAAAOI5QCgAAAAAAAI4jlAIAAAAAAIDjCKUAAAAAAADgOEIpAAAAAAAAOI5QCgCAKPTCCy9IXFycp0VCkyZNPI939913R+QxyyrdPta20u0WjezvD32/FPe9UxqvuSTe5wAAIHYQSgEA4Ce0CbV9+OGHbD/IAw884PW++OKLLwJuldGjR3uWS0pKkt27d5fJLVhWAid7WKft119/LfQ+y5YtkxtuuEF69OghqampRb5/IG63W5YsWSKXXXaZHH/88ZKWliaJiYlSu3Zt6d27tzz44IOyffv2sB8fAACnuRx/RgAAUKiTTjpJHn744YhuqTvvvFP2799vpvXLMiJHQwLdvvn5+eb6//3f/0nXrl2PWe7o0aPy6quveq4PHDhQatWqFfXvnZISS+taFLNnz5Y33ngjoo+5ZcsWufjii+WTTz455rZdu3bJihUrTPv222+9KucAAIhmhFIAAPgJbdS+ffvk/vvv91w/88wzpW/fvl7b67jjjgu4/Q4cOGAqGcLRtm1b0yJp7NixEX08/KV+/frm/bF06VJzfeHChTJjxgxTxWK3ePFiOXjwoOf6qFGjIr4ZS+K9U1JiaV2LQiuiGjRoIF26dJG8vDx56623ivV4O3fulJ49e8ovv/zimde0aVMZNGiQqZLSf6s+++wzv4FVpOnrycrKMhVgAAAUF933AACwhTY333yzp/mGOFpdZL/9/PPPl0aNGnl15Xv++eelU6dOUqFCBTnttNPM/fSL5Pjx4+XUU0+Vhg0bSsWKFSU5OdkEGeecc47fL6zBuj716tXLM19DjR9++EGGDx8uNWvWlJSUFPP8/qo0Ao0ppettf66ff/5ZnnrqKTnhhBPM46Wnp8vf//5388XX15EjR2TixIlmO+iyGjDMmTPHvOZwujnqcmPGjDGvoW7dumY76Zff5s2bm25v33zzzTH30W1gPY9uG+2+dMUVV3ju37p1a/nHP/7h9/n08c4++2wTHmrr37+/rFmzRsKh62fZs2ePvPvuu8csoxVUFt2uWimltFpo8ODBpktW9erVTZhVtWpVU2113333yeHDhyPWbS6c16xhmlaD6XtCQxDtdlipUiVp06aNXHfddV5d0nRan9e+PZR9naz3X2HrqpVljz32mJx88slSrVo187z6/AMGDJBXXnnlmOWL816OpPnz55vKJt1uQ4YMKfbj6b8f9kDq6quvlu+//15mzpxp9r+HHnpI/vOf/8h3331nwtFA+0awbWX/G/reb/Pmzebvr9te35u6TQvbv7t16+a53fff0q+//louv/xyE+rrv5X6XjrxxBPNjwBFea8DAMoANwAA8OuXX35x66HSalOmTAl6+6mnnup1vUOHDma5t956y2u+vzZ16lSvx543b57X7XY9e/b0zD/hhBPclStXPubx4uLi3O+//77X/Ro3buz3tXzwwQde9z3llFP8ruNpp53m9XjZ2dnHvGarnXPOOV7X9TlCcdNNNwXdTklJSe5ly5Z53WfkyJGe25s1a+auW7eu3/s+//zzXvf78ssv3ZUqVTpmuZSUFHfv3r0913W7hSIzM9NdtWpVz/3OP/98r9u3b9/uTkhI8Nx+4403em6rUaNG0Nfdvn1798GDB70ez367vl9Cee+E+5qHDh0adP3S0tLc69ev97tf+GvW+y/Yuur2atu2bdDH0fXKyckp9ns5GF1X+3319RWF72ss6v23bdtm9mfr/h07dnTn5eWFdF/7vqH/btj5biv7etnv16JFC3edOnW8ll28eLHXvn/FFVd4PfaPP/7otfzKlSs9tz311FNul8sV8G/apk0b87cHAJQPdN8DACBCPv74Y2ncuLEMHTrUVPfoOC/K5XJJx44dTVceHT9Iq1O0GuDTTz+VDz74wCwzbdo0UyGk1VNFsX79elNBcuONN5qqEq0I0u41mllo9Y0OflxU2gVI76eVYa+//rqnOkkrMbSL0N/+9jdzfdasWeY1W7Qa5dxzzzVVEG+++aaEQ6vItJtS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d9euXd2fffYZfw6UaxdeeKG7bt26Zp+oX7++uf7jjz96bj969Kj7mmuucVerVs2dmprqPu+889zbt28v1XUGStoHH3xgTkHs2/T09io/P9991113uWvXru1OTk529+7d2/3dd995PcbevXvdw4cPd1eqVMmchnj06NHugwcP8sdDudlXjhw54u7bt6+7Vq1a5nT3jRs3do8dO9brNN2KfQVlnb99RNu8efOK9Hnr119/dZ911lnuChUquGvWrOm+6aab3Dk5OaXwioDS2Vc2b97sPu2009zVq1c3n7+aN2/uvuWWW9z79++PuX0lTv9X2sEYAAAAAAAAyhfGlAIAAAAAAIDjCKUAAAAAAADgOEIpAAAAAAAAOI5QCgAAAAAAAI4jlAIAAAAAAIDjCKUAAAAAAADgOEIpAAAAAAAAOI5QCgAAAAAAAI4jlAIAACinPvzwQ4mLizOXAAAATiOUAgAAiJAXXnjBhDyrV68215csWSJ33313qW/fp556yqwbAABANCGUAgAAKCEaSk2dOjVqQ6nTTjtNjh49ai4BAACcRigFAAAQQ9xutwmSIiE+Pl5SUlLMJQAAgNP4BAIAAFACRo0aJbNnzzbT2qXPapb8/HyZOXOmtG3b1gRDtWvXliuvvFL27dvn9ThNmjSRs88+W5YuXSpdunSRChUqyDPPPGNumzdvnpxxxhmSnp4uycnJ0qZNG3n66aePuf/GjRvlo48+8qxDr169go4plZGRIZ07dzbPVbNmTbn00ktl69atx7y+SpUqmfmDBw8207Vq1ZKbb75Z8vLyIrw1AQBAWeQq7RUAAAAoizRg2rZtmyxbtkz+7//+z+/t2qVu9OjRcv3118svv/wiTz75pKxdu1Y+/fRTSUxM9Cz73XffyfDhw819xo4dKy1btjTzNYDSUGvQoEHicrnkrbfekmuuucYEXtdee61ZRoOvcePGmdDozjvvNPM0AAvEWqeTTjpJpk+fLjt37pRZs2aZddJ1q1q1qmdZDZ/69esn3bp1k0ceeUTef/99efTRR+W4446Tq6++OqLbEwAAlD1xbq0BBwAAQLFZgc6XX35pqpquu+46Uy3l+3Hrk08+kVNPPVVefvllufjiiz3ztRqqf//+XvO10um3336T9957zwRAdtqNT6uZ7PT+P/zwg/z000+eee3atTMVT74VUXr99NNPlw8++MBUT+Xk5EiDBg1M5ZW+Bq3gUu+8846p1po8ebJnjCytlHrxxRflnnvukbvuusvzmJ06dTLdAa3B3gEAAAKh+x4AAIDDtHtclSpV5Mwzz5Q9e/Z4mnaZ04omDYnsmjZtekwgpeyB1P79+81j9OzZU37++Wdzvag0SNq1a5eptrICKTVw4EBp1aqVCad8XXXVVV7XNWzT5wcAACgM3fcAAAAcppVMGhppRZI/Ggz5hlL+aJe6KVOmyKpVq+TIkSNet+nja/BVFFqRpazugXYaSmmFl50GVzqOlF21atWOGRcLAADAH0IpAAAAh+mYTxpIaTc9f3yDHt8uekq75/Xu3duERTNmzJCGDRtKUlKSLFmyRB577DHzHCUtISGhxJ8DAACUXYRSAAAAJcR+tj07HQhcBwU/+eST/QZOodBBzbOysuTNN9+URo0aeeb7dv0Lth6+Gjdu7BlYXc/qZ6fzrNsBAAAigTGlAAAASkjFihXN5Z9//uk1/4ILLjBnrps2bdox98nNzT1m+WBVSvZB1LXL3rx58/yuRyiPqYOzawXXnDlzTOBleffdd+Xbb781Y0sBAABECpVSAAAAJUQHLlfXX3+9Gahcg6SLLrrIDEZ+5ZVXyvTp02XdunXSt29fSUxMNGNN6SDos2bNkvPPPz/oY+t9tLveOeecYx7r0KFD8o9//MOEStu3bz9mPZ5++mm59957pXnz5mYZ30oopevw4IMPmjMI6joOHz5cdu7cadZHzwJ44403RngLAQCA8oxQCgAAoIQMGTJExo0bJwsXLpR//vOfpqpJQyml1UgaFj3zzDNyxx13iMvlMsHPpZdearr1FUYHI//Xv/4lkyZNkptvvlnq1KkjV199tRmP6vLLL/dadvLkyWYQ84ceekgOHjxoAid/oZQaNWqUpKamygMPPCC33XabqbI677zzTFhVtWrVCG0ZAAAAkTi3veYbAAAAAAAAcABjSgEAAAAAAMBxhFIAAAAAAABwHKEUAAAAAAAAHEcoBQAAAAAAAMcRSgEAAAAAAMBxhFIAAAAAAABwHKEUAAAAAAAAHEcoBQAAAAAAAMcRSgEAAAAAAMBxhFIAAAAAAABwHKEUAAAAAAAAHEcoBQAAAAAAAMcRSgEAAAAAAECc9v+IF9Spm0Li+gAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[指标分析]\n", " 最佳验证 l1: 0.053570\n", " 最佳迭代轮数: 147\n", " 早停建议: 如果验证指标连续10轮不下降,建议在第 147 轮停止训练\n", "\n", "[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\n" ] } ], "execution_count": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 查看结果" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T06:11:05.540372Z", "start_time": "2026-03-08T06:11:05.504804Z" } }, "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", "结果数据形状: (893340, 54)\n", "结果列: ['ts_code', 'trade_date', 'vol', 'low', 'high', 'volume_ratio', 'turnover_rate', 'close', 'total_mv', 'f_ann_date', 'total_profit', 'ebit', 'operate_profit', 'ebitda', 'n_income', '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 ┆ vol ┆ low ┆ … ┆ cashflow_ ┆ operate_p ┆ future_re ┆ predicti │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ to_market ┆ rofit_to_ ┆ turn_5 ┆ on │\n", "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ _cap ┆ market_ca ┆ --- ┆ --- │\n", "│ ┆ str ┆ ┆ ┆ ┆ --- ┆ p ┆ f64 ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ --- ┆ ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 000001.SZ ┆ 20250102 ┆ 5.587779 ┆ 7.140527 ┆ … ┆ 4.53796 ┆ 3.597925 ┆ -0.002622 ┆ -0.00503 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 1 │\n", "│ 000002.SZ ┆ 20250102 ┆ 3.526191 ┆ 7.140527 ┆ … ┆ -1.396605 ┆ -3.929764 ┆ -0.022509 ┆ 0.002998 │\n", "│ 000004.SZ ┆ 20250102 ┆ -0.216144 ┆ -0.133365 ┆ … ┆ -0.334867 ┆ -0.856969 ┆ -0.064897 ┆ 0.000258 │\n", "│ 000006.SZ ┆ 20250102 ┆ 0.443786 ┆ 1.382669 ┆ … ┆ -0.117683 ┆ -1.740083 ┆ -0.048278 ┆ 0.008562 │\n", "│ 000007.SZ ┆ 20250102 ┆ -0.397614 ┆ -0.111591 ┆ … ┆ 0.647925 ┆ -0.415858 ┆ 0.015649 ┆ -0.00104 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 9 │\n", "│ 000008.SZ ┆ 20250102 ┆ 3.219998 ┆ -0.075651 ┆ … ┆ -0.389118 ┆ -1.046469 ┆ -0.066939 ┆ -0.00301 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 4 │\n", "│ 000009.SZ ┆ 20250102 ┆ 0.204049 ┆ 0.03066 ┆ … ┆ 0.246551 ┆ 0.57786 ┆ -0.036045 ┆ 0.014509 │\n", "│ 000010.SZ ┆ 20250102 ┆ 0.584268 ┆ -0.299947 ┆ … ┆ -0.787198 ┆ -1.017736 ┆ 0.092123 ┆ -0.00703 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 3 │\n", "│ 000011.SZ ┆ 20250102 ┆ -0.488782 ┆ -0.241316 ┆ … ┆ -1.745853 ┆ -0.461702 ┆ -0.022094 ┆ 0.002963 │\n", "│ 000012.SZ ┆ 20250102 ┆ -0.060654 ┆ 0.51434 ┆ … ┆ 0.727138 ┆ 0.565626 ┆ -0.029188 ┆ 0.012271 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", "结果后5行预览:\n", "shape: (5, 54)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ vol ┆ low ┆ … ┆ cashflow_ ┆ operate_p ┆ future_re ┆ predicti │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ to_market ┆ rofit_to_ ┆ turn_5 ┆ on │\n", "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ _cap ┆ market_ca ┆ --- ┆ --- │\n", "│ ┆ str ┆ ┆ ┆ ┆ --- ┆ p ┆ f64 ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ --- ┆ ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 605588.SH ┆ 20260306 ┆ -0.594236 ┆ -0.130348 ┆ … ┆ 0.166521 ┆ -0.648847 ┆ null ┆ -0.00224 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 6 │\n", "│ 605589.SH ┆ 20260306 ┆ 0.108199 ┆ -0.253383 ┆ … ┆ -0.32234 ┆ 0.153492 ┆ null ┆ -0.00560 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 4 │\n", "│ 605598.SH ┆ 20260306 ┆ -0.54733 ┆ -0.01433 ┆ … ┆ -0.191519 ┆ -0.305813 ┆ null ┆ 0.003137 │\n", "│ 605599.SH ┆ 20260306 ┆ -0.409848 ┆ -0.309195 ┆ … ┆ 0.812476 ┆ 0.480653 ┆ null ┆ -0.00217 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 3 │\n", "│ 689009.SH ┆ 20260306 ┆ -0.419186 ┆ -0.168059 ┆ … ┆ 1.301768 ┆ 0.905556 ┆ null ┆ 0.001416 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", "每日预测样本数统计:\n", " 最小: 1040\n", " 最大: 3192\n", " 平均: 3167.87\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.005031 │\n", "│ 000002.SZ ┆ 20250102 ┆ -0.022509 ┆ 0.002998 │\n", "│ 000004.SZ ┆ 20250102 ┆ -0.064897 ┆ 0.000258 │\n", "│ 000006.SZ ┆ 20250102 ┆ -0.048278 ┆ 0.008562 │\n", "│ 000007.SZ ┆ 20250102 ┆ 0.015649 ┆ -0.001049 │\n", "│ 000008.SZ ┆ 20250102 ┆ -0.066939 ┆ -0.003014 │\n", "│ 000009.SZ ┆ 20250102 ┆ -0.036045 ┆ 0.014509 │\n", "│ 000010.SZ ┆ 20250102 ┆ 0.092123 ┆ -0.007033 │\n", "│ 000011.SZ ┆ 20250102 ┆ -0.022094 ┆ 0.002963 │\n", "│ 000012.SZ ┆ 20250102 ┆ -0.029188 ┆ 0.012271 │\n", "└───────────┴────────────┴─────────────────┴────────────┘\n" ] } ], "execution_count": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 保存结果" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T06:11:05.964933Z", "start_time": "2026-03-08T06:11:05.551387Z" } }, "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 2 股票...\n", " 保存路径: output\\regression_output.csv\n", " 保存行数: 564(282个交易日 × 每日top2)\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.081732 ┆ 603007.SH │\n", "│ 2025-01-02 ┆ 0.070111 ┆ 603559.SH │\n", "│ 2025-01-03 ┆ 0.088554 ┆ 603007.SH │\n", "│ 2025-01-03 ┆ 0.08042 ┆ 603559.SH │\n", "│ 2025-01-06 ┆ 0.087152 ┆ 603007.SH │\n", "│ … ┆ … ┆ … │\n", "│ 2025-01-09 ┆ 0.043328 ┆ 605118.SH │\n", "│ 2025-01-09 ┆ 0.039754 ┆ 603848.SH │\n", "│ 2025-01-10 ┆ 0.037324 ┆ 002309.SZ │\n", "│ 2025-01-10 ┆ 0.027656 ┆ 603848.SH │\n", "│ 2025-01-13 ┆ 0.050825 ┆ 002309.SZ │\n", "└────────────┴──────────┴───────────┘\n" ] } ], "execution_count": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.5 特征重要性" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T06:11:05.972569Z", "start_time": "2026-03-08T06:11:05.968651Z" } }, "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 12044.385847\n", "bbi_ratio_factor 1996.570270\n", "std_return_90 1900.096352\n", "return_10 1707.237531\n", "cs_rank_turnover_rate 1700.674361\n", "ma_ratio 1449.246176\n", "std_return_5 1112.916802\n", "high_low_ratio 1002.711145\n", "vol_ma20 800.361497\n", "ma20 743.156761\n", "cs_rank_volume_ratio 620.018650\n", "vol_ratio 614.280431\n", "turnover_rate_mean_5 574.150844\n", "return_20 530.409461\n", "volume_change_rate 516.283890\n", "return_diff 427.252813\n", "market_cap_rank 367.685596\n", "volatility_20 297.221084\n", "vol_std_5 245.201921\n", "volatility_5 210.447650\n", "ma10 175.131429\n", "ma5 137.251949\n", "vol_ma5 105.623339\n", "ebit_rank 102.653185\n", "profit_to_market_cap 65.704505\n", "operate_profit_rank 64.448026\n", "operate_profit_to_market_cap 59.952241\n", "cashflow_to_market_cap 40.900113\n", "n_income_rank 34.135645\n", "n_cashflow_act_rank 27.246159\n", "money_cap_rank 22.246325\n", "total_liab_rank 21.635597\n", "total_profit_rank 17.579179\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-08T06:11:05.983915Z", "start_time": "2026-03-08T06:11:05.981218Z" } }, "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-08T06:11:06.124862Z", "start_time": "2026-03-08T06:11:05.993617Z" } }, "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+naQAA6KFJREFUeJzs3QmcjfX7//HLvmbNnuyyZCuRKCJLJEpI1laVJUnJN7JEiFCIdtFeClmTSkq2LJGlFJF9yf61DPN/vD/f/31+Z86cMwY3M2Zez8fjZOY+97nPPefcM533fV2fz50iOjo62gAAAAAAwAVLeeGbAAAAAAAAhGwAAAAAAHxEJRsAAAAAAJ8QsgEAAAAA8AkhGwAAAAAAnxCyAQAAAADwCSEbAAAAAACfELIBAAAAAPAJIRsAAAAAAJ8QsgEAAC6xrVu3Wvr06e2nn366JM/XoUMHK1y48Hk99tlnn7WqVav6vk8AkFQRsgEAScqECRMsRYoUYW8KCxfDwoULrV+/fnbgwAFLrK/HsmXL7HL12muvuZ8jKRkwYIALrtWrV49134IFC6xFixZWoEABS5s2rWXNmtWtq8fs2rXrku9rt27dbNWqVTZt2rRL/twAcDlKndA7AADAxaBAUqRIkRjLrr322osWsvv37++qhdmyZbsoz5GcKWRfeeWV7vVNCvbs2WPvvfeeu4V6/vnn7YUXXrCiRYu6n1f/Hj9+3H755Rd7+eWX3WP+/PPPc37ON998086cOXNe+5s3b15r0qSJDR8+3O68887z2gYAJCeEbABAknT77bdb5cqV7XJ29OhRy5QpkyVXx44ds4wZM1pS8/7771vq1KmtcePGMZZ/8sknLmCrij1p0iRXxQ42cuRIdzsfadKkuaB91j41b97c/vrrLxf8AQCR0S4OAEiWZs2aZTfffLMLsVdccYU1atTIfvvttxjr/Prrr4FqosbPqqL3wAMP2L59+wLrqE386aefdl+rcu61pm/evNnd9HW4Vmct12ODt6Nla9eutfvuu8+yZ89uNWrUiBHMrr/+esuQIYPlyJHD7r33Xjeu93zoZ8qcObNt2bLF7rjjDve1WpPHjh3r7l+9erXVrl3bvTaFChWyDz/8MGwL+g8//GAdO3a0nDlzWpYsWaxdu3b277//hq1Ely1b1tKlS2f58+e3Tp06xWqtr1Wrlus0UMX2lltuceH6P//5jxtHrPdl/vz5gddW68r+/futR48eVq5cOfczaB90ckWtzcG+//5797hPP/3UBg0aZFdddZV7P+vUqWMbN26Mtb+LFy+2hg0buvdAr0H58uXtlVdeibHO+vXr7Z577nHvhbalEzrxbaeeMmWKa//WPodWsVWxf/vtt2MFbFHbePAxI1OnTnXHrl5Xvb7FihVzQf306dNxjsn2jk1Vp9944w33OD3+hhtusKVLl8Z67ttuuy3wfACAuFHJBgAkSQcPHrS9e/fGWKYAI6oStm/f3urXr29Dhw51FdNx48a5ULtixYpAGJk7d66r3N1///0uYCvsKZDo30WLFrmQcvfdd9vvv/9uH330kasyes+RK1cu1xZ8rlQtLFGihL344osWHR3tlikY9unTx1UTH3roIbfd0aNHuzCq/T2fFnWFMAVSbeOll16yDz74wDp37uxC5XPPPWetW7d2P9v48eNdeK5WrVqs9nutr+dW8NuwYYN7Df/+++9AqBXdp1Z6hbTHHnsssJ6CnCb9Cq6w6uSF9kknENq0aWN58uRxgbpLly4ukGq/RMtF740Cq14z7ZvGK7/++utWs2ZNd7JCwTPYkCFDLGXKlC6Y6/jQz62fU6Hao/dcJx7y5ctnTzzxhHvf161bZ9OnT3ffi95/jaXWiQmN89drpgDftGlTmzx5st11110RX/dTp065n12vRTAdQ7rp/Q0N33HRCQ+t3717d/fvt99+68L6oUOHbNiwYWd9vE6gHD582J0s0Xum10Tvu17b4PdGAV9BXO/Zk08+Ge/9A4BkKRoAgCTk3XffVTINe5PDhw9HZ8uWLfrhhx+O8bidO3dGZ82aNcbyY8eOxdr+Rx995Lb1ww8/BJYNGzbMLdu0aVOMdfW9lmufQml53759A9/ray1r1apVjPU2b94cnSpVquhBgwbFWL569ero1KlTx1oe6fVYunRpYFn79u3dshdffDGw7N9//43OkCFDdIoUKaI//vjjwPL169fH2ldvm9dff330yZMnA8tfeuklt3zq1Knu+927d0enTZs2ul69etGnT58OrDdmzBi33jvvvBNYVrNmTbds/PjxsX6GsmXLuvtDHT9+PMZ2vdc8Xbp00QMGDAgs++6779y2S5cuHX3ixInA8ldeecUt12spUVFR0UWKFIkuVKiQez2CnTlzJvB1nTp1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+OEHa9y4seXPn99SpEhhU6ZMiXF/dHS0Pf/885YvXz7LkCGD3XbbbfbHH3/EWGf//v3WunVry5Ili2XLls0efPBBO3LkSOD+77//3po0aeK2kSlTJnc8fvDBB3Hu14QJE9z+hLvt3r3brbNjxw677777rGTJkpYyZUrr1q1brO389ttv1qxZMytcuLB77KhRoy7wFQMAAABwWYfsnTt3WpcuXaxo0aKWLl06K1iwoAtF8+bNs6QkPmFo3LhxVr58eRfmdKtWrZrNmjUrQfY3qTh69KhVqFDBxo4dG/b+l156yV599VUbP368LV682IXk+vXr2/HjxwPrKGDr/Zs7d65Nnz7dBfdHHnkkcP/ChQvd+zZ58mT79ddf7f7777d27dq5dSNp2bKlC9HBNz1vzZo1LXfu3G6dEydOWK5cuax3797uZwjn2LFj7ndnyJAhljdv3gt4pQAAAAD4IbUloM2bN1v16tVddXDYsGFWrlw5O3XqlM2ZM8c6depk69evt6TCC0PNmze3J598Muw6V111lQtLJUqUcBXW9957z1VIV6xYYWXLlj2n56s6eJ5Fpc5kydXmIY3cv7fffru7haPXWCc7FGL1OsvEiRMtT548ruJ977332rp162z27Nm2dOlSq1y5sltn9OjR1rBhQxs+fLirkP/nP/+Jsd0nnnjCvv76a/viiy/sjjvuCPvcqprr5tmzZ499++239vbbbweW6YTMK6+84r5+5513wm7nhhtucDd59tlnz+k1AgAAAJDEKtmPP/64q+ouWbLEVXnVFqsw2b17d1u0aJFbZ8uWLS4AZc6c2VV3W7RoYbt27Yq4zVq1asVqq23atKl16NAhRngZOHCgqzZqu4UKFbJp06a5oOM9lyqTy5Yti9Heq5MBOgFQunRpt06DBg1cBTI+FIR0IkHBTRX7cFTBV3hTyNZrMWjQIPc83msBf23atMl1UqhF3JM1a1arWrWq/fzzz+57/av33QvYovXVvq3KdyQHDx60HDlyxHtfFO4zZsxo99xzz3n/PAAAAACSccjWOFdVCFWxVotuKAWbM2fOuNCrdefPn+/adf/66y/XanuhRo4c6aroqhI3atTI2rZt60J3mzZtbPny5VasWDH3vaqdwdVoVS8nTZrkWoZ1AqBHjx52MZw+fdo+/vhj1+6stnH4TwFbVLkOpu+9+/Sv177t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537WkiVL2syZMy2p+ffff6169eqWJk0amzVrlq1du9Zefvlly549e2Cdo0ePunA7dOjQs25v1KhRLmCfzbFjx2z58uXWp08f96+C/IYNG+zOO++Msd4dd9zhAvO3335rv/zyi1WoUMEt07Eop0+fdgH75MmTtnDhQnvvvfdswoQJ9vzzz5/X6wEAAAAgaUhtidzmzZtdGMuWLZsNGzbMVSBVjZwzZ44Lo+vXr7ekQoGtbt26rir6+eefW4ECBezvv/92P/u5qjp4nkWlzmSJ0eYhjVxw1smSd999N7C8SJEiMdZr27bt/9bfvDnO7anCrYCuKrhOTsQla9asNnfu3BjLxowZY1WqVHGV6auvvtr27t1rf/zxh7399ttWvnx5t86QIUPstddeszVr1ljevHnt66+/dicGvvnmG8uTJ4/rlHjhhRdclVydE2nTpj3n1wUAAADA5S/RV7Iff/xxV6FcsmSJNWvWzFV2y5Yta927d7dFixa5dRSO1NqbOXNm19rbokUL27VrV8Rt1qpVy7p16xZjWdOmTa1Dhw6B7wsXLmwDBw50rcTabqFChWzatGm2Z8+ewHMpgAW3N6uSqUCsEwClS5d26zRo0MB27NgRr5/1nXfesf3797t2Z51Y0D7UrFnTVVGTGr2WlStXtubNm7uTCpUqVbI333zznLejyvR9991nY8eOdeH3fBw8eNAdY97JDLWnX3PNNTZx4kRXTVdF+/XXX3f7ef3117t1fv75Z3fCRwHbU79+fTt06JD99ttv57UfAAAAAC5/iTpkK3DOnj3bVaw1fjaUQtGZM2dc6NW68+fPd1XKv/76y1q2bHnBzz9y5EgXdlesWOFag1VZVejWOGK1GhcrVsx9r/HAwaFv+PDhNmnSJPvhhx/cCYAePXrEO3hWq1bN/bwKb9dee629+OKLrjU5qdF7NG7cOCtRooQ7KfHYY49Z165dXdv1uXjyySftpptucsfA+Th+/LirPrdq1cqdoBEFblWo9b5fccUVlj59ehsxYoQ7Fr12drWNBwds8b73WsoBAAAAJD+Jul1848aNLsCWKlUq4joal7169WrbtGmTaz8WVSBV7V66dKndcMMN5/38DRs2tI4dO7qvNdZWoVDbU/VVFM4UilU196qoamUfP368C+DSuXNnGzBgQLyDp8YAt27d2o3D1s+vSr622bdv37CPOXHihLt5VEmVdCmjLVWq/wv/iYl+Hp0cUVW4f//+bplOKPz666/uNVZlOnR971/va/nqq6/c66Uuh+DlqjwHfx/XfqjrQfvy6quvBh6jY06hP1euXG6yM03Kpi4DzQOg8ddqSddjtF7w83hfx/f5L6bg1wzJE8cAOA7A3wNwDIDPBv6K72frRB2ygyvEkaxbt86Fay9gS5kyZVyVW/ddSMj2xuMGVynVIhy6bPfu3YGQrZmmvYAtCmS6Pz4U3NSS/MYbb1iqVKlcCNUM3BqLHilkDx48OBBUg/WudMYyZkycFXCdQND7o3b64EndFE41Fjp0ojev9f/HH3+MMQu4xnP/+eefbgbwYOpiULv+oEGDIu6Dnkuvq7atkyDatmfVqlVuH95//303EZ1umrlcnQa9e/d2wxYOHz4ca1+9/dTJkcQyWV3o+HMkPxwD4DgAfw/AMQA+G/hDXcuXfchWK7Fad/2e3CxlypSxAny4sxKa+drjzVwdbpnCcbjHeOvE52SBF8j1eAVsj8Ki2o81KVq4ybR69erlxqcHV7J1wmHgipQWleb/tpOYrOlX32rXrm3//POP6xbwqCqtMffBy4InPtNM48GXYrvuuuvcJGXBtEzt+mrvD51ILfi9Vnu4gvJPP/3kKtbBvPdT4+l1IsCjr3VMav90DGlyOo0r14kReeutt1zL+cMPP+xmhk9I+hkVrjSRXugxieSBYwAcB+DvATgGwGcDf3ldw5d1yM6RI4ebTEqTWmm8bui4bFUYFUK3bt3qbl41W7M+6z5VtMNRqAqejExjnjVr9K233moJSeO/P/zwQxfyFOK86zUrfEearVphLlygO3EmhUWdPvslrRKCQt9TTz3lxlKrmqyWbbV8K6Sqiu+FQo2z15h2r3qtdnrdp64B3UI7GDwK1wrrHg03UMX/rrvuCgRsjamfPn26e5337dsXON70Ot98881u7PVDDz3khgmoXVyTsins61Jf2gcFbR1fDzzwgL300kvuRIi6DTSePjiYJzTtKyE7eeMYAMcB+HsAjgHw2cAf8f1cnahDtihgK3zqEktq61ULt1p9VaXT+F0FarVwaxyzrpWs+zSOWbNyq8oYjqqoqv7OmDHDtXZrUiuF8oSmccC6nNQTTzzhrguudmRNfKYTDOdqca86bpbsxEpt/F9++aWrxOt9VTDW+6f30aP27Pvvvz/w/b333uv+VZjVZbLiS9fB1gziovZ7bVeCq+Ki8deaeV7t55rk7LnnnnPHioK5xvhPnTo1MNO7ug0U0vWeaVy+TgC1b98+3uPvAQAAACRNiT5kFy1a1FUdNb5W1U9VoFWJ1nhlhWy1Yyv8KJTecsstrjKpNt/Ro0dH3Kaqjxp3q5nBU6dO7WaoTugqtqgqq5m2tT86maDrZCtwa4K1pOiOO+5wt0h0SbXgy6rFR7jW/OBluixafNr3dYJG70VcdFm3xDL2GgAAAEDikCI6vgOGcdmME8iaNasbq5yYK9m4uFR91wkAtbXTLp48cQyA4wD8PQDHAPhscHGylrpkvcv/XnbXyQYAAAAA4HJCyL6ENCFWpNuCBQsu5a4AAAAAAJLjmOykZOXKlRHv0/hrAAAAAMDljZB9CRUvXvxSPh0AAAAA4BKjXRwAAAAAAJ8QsgEAAAAA8AkhGwAAAAAAnxCyAQAAAAAgZAMAAAAAkLhQyQYAAAAAwCeEbAAAAAAAfELIBgAAAADAJ4RsAAAAAAB8QsgGAAAAAMAnhGwAAAAAAHxCyAYAAAAAwCeEbAAAAAAAfELIBgAAAADAJ4RsAAAAAAB8QsgGAAAAAMAnhGwAAAAAAHxCyMYl069fP0uRIkWMW6lSpdx9mzdvjnWfd/vss89ibWvfvn121VVXufsPHDgQ5/MOGjTIbrrpJsuYMaNly5Yt7Drhnvfjjz8O3L9jxw677777rGTJkpYyZUrr1q3bBb8eAAAAAJKelEkhuFWsWDGhdwPxVLZsWRdYvduPP/7olhcsWDDGct369+9vmTNntttvvz3Wdh588EErX758vJ7z5MmT1rx5c3vsscfiXO/dd9+N8fxNmzYN3HfixAnLlSuX9e7d2ypUqMD7DQAAACBxhuydO3daly5drGjRopYuXToXtho3bmzz5s2zpOS3336zZs2aWeHChV2VdNSoUXGuP2TIELdeUquYpk6d2vLmzRu4XXnllW55qlSpYizX7csvv7QWLVq4oB1s3Lhxrnrdo0ePeD2nwvqTTz5p5cqVi3M9VbmDnz99+vSB+/S+vfLKK9auXTvLmjXref3sAAAAAJK+1An55GoRrl69ugs3w4YNcyHo1KlTNmfOHOvUqZOtX7/ekopjx465EwmqqCrwxWXp0qX2+uuvx7tSG07VwfMsKnUmSyw2D2nk/v3jjz8sf/78LsBWq1bNBg8ebFdffXWs9X/55RdbuXKljR07NsbytWvX2oABA2zx4sX2119/+bqPOuYeeugh9z49+uijdv/997sTHQAAAABwWVSyH3/8cRdilixZ4qq8Gu+qduLu3bvbokWL3DpbtmyxJk2auGpmlixZXGVz165dEbdZq1atWNVftf126NAhRlVy4MCBriqp7RYqVMimTZtme/bsCTyXAu6yZcsCj5kwYYI7GaATAKVLl3brNGjQwLUVx8cNN9zgTiTce++9rmIfyZEjR6x169b25ptvWvbs2S0pqVq1qnsdZ8+e7arRmzZtsptvvtkOHz4ca923337bvc4aSx3cst2qVSv3OoYL5hdCwf3TTz+1uXPnumNRx+bo0aN9fQ4AAAAASV+CVbL379/vwpYmpcqUKXbFVYH2zJkzgdA7f/58i4qKctXGli1b2vfff39Bzz9y5Eh78cUXrU+fPu7rtm3bukD3wAMPuBDXs2dPF8LV5u1VM1WNHj58uE2aNMlNftWmTRvXsvzBBx+YX/TzNWrUyG677TZ3IuBsFDx18xw6dMj9my5ltKVKFW2JhToU9DN5FKCvu+46K168uH300Ueuauz573//ax9++KH95z//cY/z6D255ppr3Puv5ToevG0HrxfJ6dOnA+uHevbZZwNfX3vtte511HEQbhx3dHS0Ozbj85wJxdu3xLyPuLg4BsBxAP4egGMAfDbwV3w/WydYyN64caMLK97s0uFoXPbq1atdxVNjtWXixImu2q2WalWHz1fDhg2tY8eO7uvnn3/eVVa1PbVze4FO7cyqmmt8rveijh8/3ooVK+a+79y5s6uA+kWzWS9fvtz9bPGldmuNOQ7Vu9IZy5jxf6EyMZg5c2bY5blz57avv/7a8uTJE1j23Xff2dGjR93rHvy4qVOnus6GyZMnx9iG1tP7pip3XFatWuXew0j7EkwnUf755x/3nGnSpIk1s7mOyfhsJ6GpMo/kjWMAHAfg7wE4BsBnA3+o6JqoQ7YC9tmsW7fOhWsvYEuZMmVclVv3XUjIDh7v7AW84ImxvGW7d+8OhGxdAsoL2JIvXz53vx+2bt1qTzzxhPtAHDzh1tn06tXLtdd7VIHV6zVwRUqLSpPKEos1/eqHbY1XYNW4fJ308IwYMcJNfhcamlXFVpU7eNz2ww8/7LoaNI5agT0ue/fudYE5+LniCuRq11cnRSjtX5EiReK1nYSikwk6lurWrRvrJAGSB44BcByAvwfgGACfDfzldQ0n2pBdokQJ14bt9+RmqkCGBvhwZf3g4OG1g4dbprbgcI/x1onPyYL4UGBUYFcLdXB78w8//GBjxoxxLeGagTuUxneHG+N94kwKizqdeCbt0mun1nqFZ42B3759u/Xt29f9TGq7915bdTgsWLDAVYlDX+/QroeDBw8GTo5417/W+H61+asLokCBAm6Zqt8anrBt2zb3mmoIgKhVXUMRvvrqK9excOONN7oTHAqnQ4cOdfsbvA+aiE1UZdfJAW0nbdq07sRPYqX9J2QnbxwD4DgAfw/AMQA+G/gjvp+rEyxk58iRw+rXr+9mj+7atWuscdm6RJPG7arCq5tXzdbs0rovUrDRtYyDJyNTqFqzZo3deuutlpjVqVPHtcYH0zhlBUu1rocL2JcbtV+rOq2AqvepRo0aboI7fe1555137KqrrrJ69eqddwvHhg0bYpxY0XCA9957L/B9pUqVAm3pmihPvyw6DjXru06aKHyrWq0qeTDvcd5JEY0b1wkDzZIPAAAAAAl+CS8FG7UKV6lSxY1tVgu3JrNSJVFjpBWoVaXUbNu6rrTu06zPNWvWtMqVK4fdZu3atV379IwZM1xrt8KSQnlCO3nypPt5vK9VVVVlVJVUhborrrjCTbgVTCcecubMGWt5fCzuVcc9NjHRmPOz0WR0usWHAnJoJ0G4ZZrRXLdINEu8bmfjV9cCAAAAgKQrQS/hpXG0muhLVeannnrKhUmNIVWrr0K22rE18ZTGxt5yyy1udmo95pNPPom4Tc0O3r59e9cyrDCu9RNDFVvt0aqE6qZKu2Yp19e6LjMAAAAAIGlIEU15LskNxs+aNaub5CuxVbJx6XizqGtyNsZkJ08cA+A4AH8PwDEAPhtcnKyluaGyZMmSOCvZAAAAAAAkJYRsn2hsdaSbZssGAAAAACR9CTrxWVLiXd4pHO9SUgAAAACApI2Q7RPNEA4AAAAASN5oFwcAAAAAwCeEbAAAAAAAfELIBgAAAADAJ4RsAAAAAAB8QsgGAAAAAMAnhGwAAAAAAHxCyAYAAAAAwCeEbAAAAAAAfELIBgAAAADAJ4RsAAAAAAB8QsgGAAAAAMAnhGwAAAAAAHxCyAYAAAAAwCeEbAAAAAAAfELIBgAAAADAJ4RsAAAAAAB8QsgGAAAAAMAnhGxcdP369bMUKVLEuJUqVSpwf8eOHa1YsWKWIUMGy5UrlzVp0sTWr18fYxtbtmyxRo0aWcaMGS137tz29NNPW1RUVLye/8SJE1axYkX3vCtXroxx36+//mo333yzpU+f3goWLGgvvfRSjPtPnTplAwYMcPundSpUqGCzZ8++oNcDAAAAQNKVMrmEPIUsJJyyZcvajh07Arcff/wxcN/1119v7777rq1bt87mzJlj0dHRVq9ePTt9+rS7X/8qYJ88edIWLlxo7733nk2YMMGef/75eD33M888Y/nz54+1/NChQ+55ChUqZL/88osNGzbMHStvvPFGYJ3evXvb66+/bqNHj7a1a9fao48+anfddZetWLHCl9cFAAAAQNJyWYTsnTt3WpcuXaxo0aKWLl06V3Fs3LixzZs3z5KaUaNG2TXXXOOquvo5n3zySTt+/Lhd7lKnTm158+YN3K688srAfY888ojdcsstVrhwYbvuuuts4MCBtnXrVtu8ebO7/+uvv3YB9/3333cnS26//XZ74YUXbOzYsS54x2XWrFnu8cOHD4913wcffOAe/84777iTAPfee6917drVRowYEVhn0qRJ9p///McaNmzojr/HHnvMff3yyy/7+voAAAAASBpSWyKnoFW9enXLli2bqzSWK1fOtfCq4tmpU6dYbcWXsw8//NCeffZZF/puuukm+/33361Dhw6uzTk4+MVH1cHzLCp1Jktom4c0cv/+8ccfrpqslutq1arZ4MGD7eqrr461/tGjR11Vu0iRIu4kg/z888/ufc+TJ09gvfr167vA+9tvv1mlSpXCPveuXbvs4YcftilTprg281DarsJ92rRpY2x36NCh9u+//1r27Nldq7n2OZhOgARX4gEAAADgsqlkP/744y5kLlmyxJo1a2YlS5Z0Vcfu3bvbokWLAuN1NY43c+bMliVLFmvRooULWJHUqlXLunXrFmNZ06ZNXaD1qKqqimq7du3cdtVSPG3aNNuzZ0/gucqXL2/Lli0LPEYtzDoZoBMApUuXdus0aNDAtUfHh1qhdULhvvvuc8+vVuZWrVq5n/1yVrVqVffaaCzzuHHjbNOmTW4c9OHDhwPrvPbaa+710k3V57lz5wbCrzoZggO2eN/rvnDUcq73U+3dlStXDrtOfLar0K0THDpJcObMGbdfX3zxRbzfUwAAAADJS6KuZO/fv98Fs0GDBlmmTLGrsgq0Cj5e6J0/f76bDEsV7pYtW9r3339/Qc8/cuRIe/HFF61Pnz7u67Zt27oK8wMPPOCq6j179nQhXNVUnQiQY8eOudZktRmnTJnS2rRpYz169HCtyWejbaslWqG6SpUq9tdff9nMmTPd80aiSqtuweOMJV3KaEuVKtoSmroObrvttsD3OvmglvDixYvbRx99ZPfff79brhMjOvmhcKtQ27x5c/d+qoqs91ihWdsK3q7o/Q5e7hkzZox7LfTa635vneCvtU1tO9x2vfX0Xiqoa6I2vcdqGW/fvr07aRDueROL4J8DyRPHADgOwN8DcAyAzwb+iu9n60Qdsjdu3OiCUPBM1KE0Lnv16tWuOuq1F0+cONFVu5cuXWo33HDDeT+/xt5q5mvRJFuqwmp7CoCikK3WZ1XNNc7Ye+HHjx/vZqOWzp07u9mp40MV7L1791qNGjXcz60AqYCnMcGRqO26f//+sZb3rnTGMmb838RhCUknCcLRDOEaKx1aSRZVoHVyQpOQqZ1bFW9VkoO35XUq6BgJ9xwff/yx6zIIPTlz4403Ws2aNe2JJ55wr69mFw9+vI4l718dU/Lggw+6Ex3ajxw5crjjS7OgR/rZEhNV3pG8cQyA4wD8PQDHAPhs4A8VVC/7kK2geTaakVrh2gvYUqZMGVfl1n0XErLVDu7xwqDGBocu2717dyBka+yvF7AlX7587v74UOVdlXO1TqvFWgFSYVCTfKmaHk6vXr1c67xH1Vu9FgNXpLSoNKksoa3pVz/WsiNHjti+fftca7xOZIRSZV5dAHofdb++/vzzz13bt8K5vPXWW25ogMZcazK8UNdee22gqi9q79YM5Rr3ri6Bq666yk2uppMndevWtTRp0gRa9jUkQZX1cHQSRdVxtfGH2/fEQvupcBX8syF54RgAxwH4ewCOAfDZwF/B+eKyDdklSpRwLbp+T26m0BYa4MOV/oPDidcOHm6ZWo7DPcZbJz4nC0RBWhXThx56KBDoNRGYZt9+7rnn3H6HUsAMFzJPnElhUaf/t38JSa+HQqlmg9e49u3bt1vfvn0tVapUrlqtoPvJJ5+48eeqDv/zzz82ZMgQN7mYHqPHK8wqcKtNX9exVku5tqFhARomIGqxV+u+OhsKFCgQ40SHaBIz0cztmlRN9Fpr3L26BdSVsGbNGtdmrqEB3vu4ePFi27Ztm5vVXP+quq73Wyc3Lofwqn28HPYTFw/HADgOwN8DcAyAzwb+iO/n6kQdstWaq4mndKkmXVoptPX3wIEDboyvgppuXjVbl3vSfQpm4SjMBU9cpeswK2DdeuutltDtB6FBWmFU4hvUPYt71bGcOXNaYqDgrMqvqtd67dUOr0nr9LVObixYsMBdukwzeqs7QC3iqih7VWu9BtOnT3ezias9X8eBxkUHt+HrtduwYcM5jUHOmjWra1lXWNe1unVZMVW2dVLDo8un6VrZGh+vQK/Ar/H26pQAAAAAgMsqZIsCttqK1eKrUKUWbo2lVSusxkgrUKvi27p1axfUdJ9mJNe420izSteuXdu1WM+YMcNVPDXRlkJ5QlPlVvuiS1J57eKqbmu5F7YvRxofHYku6xWfsc2qgse1niZNi+tEhGZrD3e/jieF/Eh0HOkYAwAAAIAkEbI1m/Py5cvdDONPPfWUq0CrAqrKo0K22rGnTp1qXbp0cRVQVYJ12azRo0dH3KbajletWuXai1OnTm1PPvlkglexRRVT/Tz6V63J+jkVsPWzAwAAAAASvxTR59qHjEQ/GF9t0JqlPLG0i+PSU9u8Kv9qb2dMdvLEMQCOA/D3ABwD4LPBxclaBw8edJMwRxJ7Ji0AAAAAAHBeCNmXkCbOinSLa1wwAAAAAODykOjHZCclK1eujHifLjsFAAAAALi8EbIvoeLFi1/KpwMAAAAAXGK0iwMAAAAA4BNCNgAAAAAAPiFkAwAAAADgE0I2AAAAAAA+IWQDAAAAAOATQjYAAAAAAD4hZAMAAAAA4BNCNgAAAAAAPiFkAwAAAADgE0I2AAAAAAA+IWQDAAAAAOATQjYAAAAAAD4hZAMAAAAA4BNCNgAAAAAAPiFkAwAAAADgE0I2AAAAAAA+IWTjourXr5+lSJEixq1UqVKB+9944w2rVauWZcmSxd134MCBsNuZMWOGVa1a1TJkyGDZs2e3pk2bRnzOU6dOWc+ePa1cuXKWKVMmy58/v7Vr1862b98eY73ff//dmjRpYldeeaV7/ho1ath3330Xdpv79u2zq666Ks59BAAAAICUSSHEVaxYMaF3A3EoW7as7dixI3D78ccfA/cdO3bMGjRoYP/5z38iPn7y5MnWtm1bu//++23VqlX2008/2X333RdxfW1z+fLl1qdPH/fvF198YRs2bLA777wzxnp33HGHRUVF2bfffmu//PKLVahQwS3buXNnrG0++OCDVr58ed5nAAAAAIk7ZCvQdOnSxYoWLWrp0qWzggULWuPGjW3evHmWlPz222/WrFkzK1y4sKuGjho1Kux627ZtszZt2ljOnDld1VbV2GXLltnlLHXq1JY3b97ATZVjT7du3ezZZ5+1G2+8MexjFYKfeOIJGzZsmD366KNWsmRJK1OmjLVo0SLi82XNmtXmzp3r1rnmmmvctseMGeOC9JYtW9w6e/futT/++MM9t8JziRIlbMiQIS6gr1mzJsb2xo0b56rXPXr08O01AQAAAJA0pU7IJ9+8ebNVr17dsmXL5kKUAqVafefMmWOdOnWy9evXJ+Tu+UrhTScSmjdvbk8++WTYdf7991/3etx66602a9Ysy5UrlwuCao8+V1UHz7Oo1JksIW0e0sj9q59BLdvp06e3atWq2eDBg+3qq6+O1zZUidaJh5QpU1qlSpXcSRl1Luh4ufbaa+O9LwcPHnQnN3SsiU5iKIBPnDjRrrvuOneC5/XXX7fcuXPb9ddfH3jc2rVrbcCAAbZ48WL766+/zvk1AAAAAJC8JGgl+/HHH3fBZ8mSJa7KqyqlWou7d+9uixYtcuuo8qhxs5kzZ3bjZlWd3LVrV8RtanyvqqPBNH63Q4cOge9VTR44cKAbp6vtFipUyKZNm2Z79uwJPJeqm8EV5AkTJriAphMApUuXduuozVntz/Fxww03uGB47733ukAXztChQ10l/91337UqVapYkSJFrF69elasWDG7XGkctV672bNnu4rwpk2b7Oabb7bDhw/H6/FesNWwgN69e9v06dPdSQe9z/v374/XNo4fP+7GaLdq1codQ6Lj7ptvvrEVK1bYFVdc4U4AjBgxwu2nd1LjxIkT7jF63+J7UgAAAABA8pZglWwFJAWaQYMGucmpQinQnjlzJhB658+f71qHVeFu2bKlff/99xf0/CNHjrQXX3zRjdvV1xrze9NNN9kDDzzgQpVCmUK42rwVyLxq9PDhw23SpEmusqq2brUQf/DBB+YHBf369eu7ard+3gIFCrgTEQ8//HDExygI6uY5dOiQ+zddymhLlSraEpK6Em677bbA9zo5oapx8eLF7aOPPnJjrD16b73H6OY5efKk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AAAAAD4hyAYAAAAAwCcE2QAAAAAA+IQgGwAAAAAAnxBkAwAAAADgE4JsAAAAAAB8QpANAAAAAIBPCLIBAAAAAPAJQTaSNGrUKKtXr57ly5fPihcvbm3btrWNGzeGrfPLL7/YjTfeaMWKFbP8+fNb+/btbc+ePcHlc+fOtUyZMkV8LF26NOJ+Dxw4YL169bILL7zQcuXKZWXLlrXevXvboUOHguusWrXKbr31VitTpoxbp1q1avbcc8+FbWfXrl1222232QUXXGCZM2e2Pn368K4DAAAAOCcyRJA9dOhQu+SSS1L7MNKtefPm2f3332+LFi2ymTNn2smTJ+3aa6+1v/76yy3XT/2tgHn27Nn23Xff2YkTJ+z666+3U6dOuXUaNWrkgt3Qx913320VKlSwunXrRtzvb7/95h5PP/20rV271iZOnGjTp0+3u+66K7jODz/84AL/d99919atW2ePPvqoDRw40F544YXgOsePH3fB/6BBg+ziiy8+59cLAAAAQMaV1dKB3bt32xNPPGFTp061nTt3uqBKQbMyks2aNbNYoSDyzjvvDHsuR44c9vfff1tqUmCb8Dj1HijAbdKkiQuqt27daitWrHBZbHnrrbesUKFCLui+5pprLHv27FayZMngNhSof/755y5TreA8kpo1a9rHH38c/LtSpUquHdx+++0WFxdnWbNmta5du4a9pmLFirZw4UL75JNPrGfPnu658uXLB7Pbb7zxho9XBgAAAADSWZCt4O3yyy+3ggUL2lNPPWUXXXSRC9BmzJjhsqs//vijxRIFqaGl2NEC0KQ0GDXL4rLmOevj2Tq69WnPeeXahQsXDmaKdZy6IeDJmTOnK81esGCBC7IT+uKLL2z//v2n3VRIivata6QAO7F1vGMDAAAAgJSU5svF77vvPhfALVmyxG6++WbXr7ZGjRrWt29fV74s27ZtszZt2ljevHkj9gdO6MorrzytX676GXfp0iX4t7KfI0aMsDvuuMNtt1y5ci4w/P3334P7qlWrli1btiwsw6ubAboBoL7BWqdly5auNDq5dK7K+HqPEiVKWFqi8m9dO934UKZZLrvsMsuTJ48NGDDAjh496srHH3roIYuPj4967q+//rq1aNHCSpcunex979u3z4YPH27dunWLus73339v77//fqLrAAAAAECGzGRr4CuVKqtEWEFcQgpo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TzYAAAAAAD4hyAYAAAAAwCcE2QAAAAAA+IQgGwAAAAAAnxBkAwAAAADgE4JsAAAAAAB8QpANAAAAAIBPCLIBAAAAAPAJQTYAAIhJ+/fvt+LFi9vWrVvPyfbLly9vY8eOTfb669evt9KlS9tff/11To4HAJA2EGQDAJAGdOnSxdq2bWtplQLVTJky2cqVKy29eOKJJ6xNmzYuGA718ccf29VXX22FChWyXLly2YUXXmhdu3a1FStWnNH2ly5dat26dUv2+tWrV7fLLrvMxowZc0b7AQCkLwTZAAAgUSdOnEh3V+jo0aP2+uuv21133RX2/IABA6xDhw52ySWX2BdffGEbN260yZMnW8WKFW3gwIFntI9ixYpZ7ty5z+g1d955p02YMMHi4uLO6HUAgPSDIBsAgDToyiuvtF69elmfPn1cxrVEiRL26quvulJjBWr58uWzypUr29dffx18zdy5c122eerUqVarVi3LmTOny5yuXbv2tExujRo1LEeOHC7L+8wzz4Qt13PDhw+3O+64w/Lnz++ytRUqVHDLateu7fah4/Oyuc2bN7eiRYtagQIFrGnTprZ8+fKw7Wn91157zW688UYXlFapUsUFuKHWrVtn//rXv9z+dG5XXHGF/fLLL8Hlen21atXcOVWtWtVefPHFRK/ftGnT3Pnp/D2LFi2yJ5980mWS9dA+ypYta5deeqkNGjQo7Fpq38qC67rnzZvX6tWrZ998802i5eLJOU9dqwMHDti8efMSPX4AQPpFkA0AQBr11ltvueB1yZIlLuDu0aOHtWvXzho1auQC2WuvvdY6derksrah+vfv7wJnBcDKtl5//fV28uRJt+yHH36w9u3b2y233GJr1qyxoUOH2uDBg23ixIlh23j66aft4osvdiXUWq5jEAWau3btsk8++cT9/eeff1rnzp1twYIFLohVYNmqVSv3fKhhw4a5/a5evdot79ixows2ZefOndakSRMXFM+ePdsdo8q3vWzvpEmTbMiQIa78e8OGDTZy5Eh3TLo+0cyfP98Fz6Hee+89FzDfd999EV+jINlz5MgRd5yzZs1y16Bly5buOm7bti3R9yyx85Ts2bO7LLqODwAQowIAACDVde7cOdCmTZvg302bNg00btw4+HdcXFwgT548gU6dOgWf27VrV0D/lC9cuND9PWfOHPf3lClTguvs378/kCtXrsD777/v/r7tttsCzZs3D9t3//79A9WrVw/+Xa5cuUDbtm3D1tmyZYvb9ooVKxI9j/j4+EC+fPkCX375ZfA5vW7QoEHBv48cOeKe+/rrr93fAwcODFSoUCFw4sSJiNusVKlSYPLkyWHPDR8+PNCwYcOox6Fr2bVr17DnWrZsGahVq1bYc88884y7rt7j4MGDUbdZo0aNwLhx48Ku07PPPpvs8/TceOONgS5dukTdDwAgfSOTDQBAGqWSb0+WLFmsSJEidtFFFwWfUymz7N27N+x1DRs2DP5euHBhN7CXMsCin5dffnnY+vr7559/tvj4+OBzdevWTdYx7tmzx+655x6XwVa5uMq9lQVOmPENPZc8efK49bzj1mBqKt3Oli3badtXebxKt9W3Wllo7zFixIiwcvKEjh075krLk6KMufb/8ssvu339L1b+Xyb7oYceciXqBQsWdPvUtUsqk53YeXo02FrC6gMAQOzImtoHAAAAIksYdKqcOfQ5r7z51KlTvl9CBYjJoVJxTZX13HPPWbly5VzJt4L8hIOlRToX77gVdEajYFfUH71BgwZhy3TjIRqV2f/xxx9hz+lGgMraVTrvHY8CaD127NgRtq4C7JkzZ7qyefV91zH++9//TnIQuMTO06Py8UqVKiW6HQBA+kUmGwCAGKO+0R4Fmj/99JPLyIp+fvfdd2Hr6+8LLrgg0aBVfYklNNvtvbZ3796u/7E3mNq+ffvO6HiV/VUfZa/feChl60uVKmWbN292wW7owxuMLRIN0KZ5qUPdeuutLmhPatA077w0rZoGMVP1QMmSJX2bb1sD0en4AACxiUw2AAAx5vHHH3el5QpQH330UZfV9ebg7tevnxspW6OHayqrhQsX2gsvvJBk4Fm8eHGXzZ0+fbqVLl3alWKrPFzZ4XfeeceVlx8+fNgNupZYZjqSnj172rhx49xgbJpGS9vVjYL69eu7UncNJqZAXs9rALLjx4/bsmXL3A2Evn37RtxmixYt3La0jkZnF2XYdf56/Prrr3bTTTdZmTJl3EBumu5LWefMmf+Xf9B5aXA3DXam5zXQmh8VAwrUNdDbNddcc9bbAgCkTWSyAQCIMaNHj7YHHnjAja69e/du+/LLL4OZ6Dp16tgHH3xgU6ZMsZo1a7pRuxWUK2ubmKxZs9rzzz/v+i4rs6zprUTBqQJZbVcjnSsYVkB+JnRDQKOKK8usKcB03CoP90qv7777bjc11ptvvumyylpHo6EnlsnWet65hlL5t+bF1ojhmjJMwbRGbFcArRsO6kMtmuJLwblGclegraBd2ztbGuFco8KrtB4AEJsyafSz1D4IAABw9jRP9lVXXeWCXvUzzug0X7gy6yrP9jLUqUn9uRXUK8hPOPgcACB2UC4OAABiUuvWrd2o6SrPVll4atPI5I888ggBNgDEODLZAADECDLZAACkPoJsAAAAAAB8kvodlAAAAAAAiBEE2QAAAAAA+IQgGwAAAAAAnxBkAwAAAADgE4JsAAAAAAB8QpANAAAAAIBPCLIBAAAAAPAJQTYAAAAAAD4hyAYAAAAAwPzx/wBUrbUNB11gugAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[特征重要性排名 - Gain]\n", "ebitda_rank 12044.385847\n", "bbi_ratio_factor 1996.570270\n", "std_return_90 1900.096352\n", "return_10 1707.237531\n", "cs_rank_turnover_rate 1700.674361\n", "ma_ratio 1449.246176\n", "std_return_5 1112.916802\n", "high_low_ratio 1002.711145\n", "vol_ma20 800.361497\n", "ma20 743.156761\n", "cs_rank_volume_ratio 620.018650\n", "vol_ratio 614.280431\n", "turnover_rate_mean_5 574.150844\n", "return_20 530.409461\n", "volume_change_rate 516.283890\n", "return_diff 427.252813\n", "market_cap_rank 367.685596\n", "volatility_20 297.221084\n", "vol_std_5 245.201921\n", "volatility_5 210.447650\n", "ma10 175.131429\n", "ma5 137.251949\n", "vol_ma5 105.623339\n", "ebit_rank 102.653185\n", "profit_to_market_cap 65.704505\n", "operate_profit_rank 64.448026\n", "operate_profit_to_market_cap 59.952241\n", "cashflow_to_market_cap 40.900113\n", "n_income_rank 34.135645\n", "n_cashflow_act_rank 27.246159\n", "money_cap_rank 22.246325\n", "total_liab_rank 21.635597\n", "total_profit_rank 17.579179\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 }