{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. 导入依赖" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-09T14:21:04.748286Z", "start_time": "2026-03-09T14:21:04.170825Z" } }, "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-09T14:21:04.761117Z", "start_time": "2026-03-09T14:21:04.756245Z" } }, "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-09T14:21:04.770022Z", "start_time": "2026-03-09T14:21:04.766036Z" } }, "cell_type": "code", "source": [ "# 特征因子定义字典:新增因子只需在此处添加一行\n", "LABEL_NAME = 'future_return_5'\n", "\n", "FACTOR_DEFINITIONS = {\n", " # 1. 趋势因子\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", " \"bbi_ratio\": \"(ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / (4 * close + 1e-8)\",\n", "\n", " # 2. 动量与反转\n", " \"return_5\": \"(close / ts_delay(close, 5)) - 1\",\n", " \"return_20\": \"(close / ts_delay(close, 20)) - 1\",\n", " \"momentum_accel\": \"(close / ts_delay(close, 5)) - (close / ts_delay(close, 20))\",\n", " \"volatility_ratio\": \"ts_std(close, 5) / (ts_std(close, 20) + 1e-8)\",\n", " \"reversal_1\": \"close / ts_delay(close, 1) - 1\",\n", "\n", " # 3. 量能与微观结构\n", " \"volume_ratio\": \"ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\",\n", " \"turnover_rate_mean_5\": \"ts_mean(turnover_rate, 5)\",\n", " # \"vol_price_corr\": \"ts_corr(close, vol, 10)\",\n", " \"turnover_deviation\": \"(turnover_rate - ts_mean(turnover_rate, 10)) / (ts_std(turnover_rate, 10) + 1e-8)\",\n", "\n", " # 4. 财务动量与质量\n", " \"net_profit_growth\": \"(n_income / ts_delay(n_income, 4)) - 1\",\n", " \"revenue_growth\": \"(revenue / ts_delay(revenue, 4)) - 1\",\n", " \"roe\": \"n_income / (total_hldr_eqy_exc_min_int + 1e-8)\",\n", " \"roe_delta\": \"roe - ts_delay(roe, 4)\",\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", " # 5. 财务估值与排名\n", " \"EP_rank\": \"cs_rank(n_income / (total_mv * 10000 + 1e-8))\",\n", " \"BP_rank\": \"cs_rank(total_hldr_eqy_exc_min_int / (total_mv * 10000 + 1e-8))\",\n", " \"market_cap_rank\": \"cs_rank(total_mv)\",\n", " \"cashflow_act_rank\": \"cs_rank(n_cashflow_act)\",\n", " \"ebitda_rank\": \"cs_rank(ebitda)\"\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-09T14:21:04.778317Z", "start_time": "2026-03-09T14:21:04.773776Z" } }, "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-09T14:21:11.178131Z", "start_time": "2026-03-09T14:21:04.783890Z" } }, "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", " - bbi_ratio: (ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / (4 * close + 1e-8)\n", " - return_5: (close / ts_delay(close, 5)) - 1\n", " - return_20: (close / ts_delay(close, 20)) - 1\n", " - momentum_accel: (close / ts_delay(close, 5)) - (close / ts_delay(close, 20))\n", " - volatility_ratio: ts_std(close, 5) / (ts_std(close, 20) + 1e-8)\n", " - reversal_1: close / ts_delay(close, 1) - 1\n", " - volume_ratio: 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", " - net_profit_growth: (n_income / ts_delay(n_income, 4)) - 1\n", " - revenue_growth: (revenue / ts_delay(revenue, 4)) - 1\n", " - roe: n_income / (total_hldr_eqy_exc_min_int + 1e-8)\n", " - roe_delta: roe - ts_delay(roe, 4)\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", " - EP_rank: cs_rank(n_income / (total_mv * 10000 + 1e-8))\n", " - BP_rank: cs_rank(total_hldr_eqy_exc_min_int / (total_mv * 10000 + 1e-8))\n", " - market_cap_rank: cs_rank(total_mv)\n", " - cashflow_act_rank: cs_rank(n_cashflow_act)\n", " - ebitda_rank: cs_rank(ebitda)\n", "\n", "注册 Label 因子:\n", " - future_return_5: (ts_delay(close, -5) / ts_delay(open, -1)) - 1\n", "\n", "特征因子数: 24\n", "Label: future_return_5\n", "已注册因子总数: 25\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, 41)\n", "数据列: ['ts_code', 'trade_date', 'turnover_rate', 'open', 'vol', 'close', 'total_mv', 'f_ann_date', 'revenue', 'n_income', 'total_hldr_eqy_exc_min_int', 'total_cur_assets', 'total_liab', 'total_cur_liab', 'roe', 'ebitda', 'n_cashflow_act', 'ma_5', 'ma_20', 'ma_ratio_5_20', 'bias_10', 'bbi_ratio', 'return_5', 'return_20', 'momentum_accel', 'volatility_ratio', 'reversal_1', 'volume_ratio', 'turnover_rate_mean_5', 'turnover_deviation', 'net_profit_growth', 'revenue_growth', 'roe_delta', 'debt_to_equity', 'current_ratio', 'EP_rank', 'BP_rank', 'market_cap_rank', 'cashflow_act_rank', 'ebitda_rank', 'future_return_5']\n", "\n", "前5行预览:\n", "shape: (5, 41)\n", "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ turnover_ ┆ open ┆ … ┆ market_ca ┆ cashflow_ ┆ ebitda_ra ┆ future_re │\n", "│ --- ┆ --- ┆ rate ┆ --- ┆ ┆ p_rank ┆ act_rank ┆ nk ┆ turn_5 │\n", "│ str ┆ str ┆ --- ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ ┆ f64 ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 0.7885 ┆ 1817.67 ┆ … ┆ 0.993583 ┆ 0.997594 ┆ null ┆ -0.008857 │\n", "│ 000001.SZ ┆ 20200103 ┆ 0.5752 ┆ 1849.33 ┆ … ┆ 0.993585 ┆ 0.997594 ┆ null ┆ -0.01881 │\n", "│ 000001.SZ ┆ 20200106 ┆ 0.4442 ┆ 1856.97 ┆ … ┆ 0.993588 ┆ 0.997596 ┆ null ┆ -0.008171 │\n", "│ 000001.SZ ┆ 20200107 ┆ 0.3755 ┆ 1870.07 ┆ … ┆ 0.993588 ┆ 0.997596 ┆ null ┆ -0.014117 │\n", "│ 000001.SZ ┆ 20200108 ┆ 0.4369 ┆ 1855.88 ┆ … ┆ 0.993586 ┆ 0.997595 ┆ null ┆ -0.017252 │\n", "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", "[配置] 训练期: 20200101 - 20231231\n", "[配置] 验证期: 20240101 - 20241231\n", "[配置] 测试期: 20250101 - 20261231\n", "[配置] 特征数: 24\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-09T14:21:13.936037Z", "start_time": "2026-03-09T14:21:11.188410Z" } }, "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_29904\\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, 41)\n", " 筛选后数据规模: (1494000, 41)\n", " 筛选前股票数: 5694\n", " 筛选后股票数: 2252\n", " 删除记录数: 5761513\n" ] } ], "execution_count": 6 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T14:21:13.998861Z", "start_time": "2026-03-09T14:21:13.946130Z" } }, "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, 41)\n", " 验证集数据规模: (242000, 41)\n", " 测试集数据规模: (282000, 41)\n", " 训练集股票数: 1888\n", " 验证集股票数: 1377\n", " 测试集股票数: 1682\n", " 训练集日期范围: 20200102 - 20231229\n", " 验证集日期范围: 20240102 - 20241231\n", " 测试集日期范围: 20250102 - 20260306\n", "\n", " 训练集前5行预览:\n", "shape: (5, 41)\n", "┌───────────┬────────────┬────────────┬───────┬───┬────────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ turnover_r ┆ open ┆ … ┆ market_cap ┆ cashflow_ ┆ ebitda_ra ┆ future_re │\n", "│ --- ┆ --- ┆ ate ┆ --- ┆ ┆ _rank ┆ act_rank ┆ nk ┆ turn_5 │\n", "│ str ┆ str ┆ --- ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ ┆ f64 ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪════════════╪═══════╪═══╪════════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000004.SZ ┆ 20200102 ┆ 2.1613 ┆ 92.05 ┆ … ┆ 0.057219 ┆ 0.284759 ┆ null ┆ 0.000441 │\n", "│ 000004.SZ ┆ 20200103 ┆ 1.6198 ┆ 90.67 ┆ … ┆ 0.0556 ┆ 0.284416 ┆ null ┆ 0.005875 │\n", "│ 000004.SZ ┆ 20200106 ┆ 2.4595 ┆ 90.22 ┆ … ┆ 0.049158 ┆ 0.284264 ┆ null ┆ 0.05644 │\n", "│ 000004.SZ ┆ 20200107 ┆ 2.1104 ┆ 88.59 ┆ … ┆ 0.049158 ┆ 0.283997 ┆ null ┆ 0.049753 │\n", "│ 000004.SZ ┆ 20200108 ┆ 1.8769 ┆ 89.04 ┆ … ┆ 0.048904 ┆ 0.284073 ┆ null ┆ 0.019922 │\n", "└───────────┴────────────┴────────────┴───────┴───┴────────────┴───────────┴───────────┴───────────┘\n", "\n", " 验证集前5行预览:\n", "shape: (5, 41)\n", "┌───────────┬────────────┬────────────┬───────┬───┬────────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ turnover_r ┆ open ┆ … ┆ market_cap ┆ cashflow_ ┆ ebitda_ra ┆ future_re │\n", "│ --- ┆ --- ┆ ate ┆ --- ┆ ┆ _rank ┆ act_rank ┆ nk ┆ turn_5 │\n", "│ str ┆ str ┆ --- ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ ┆ f64 ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪════════════╪═══════╪═══╪════════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000004.SZ ┆ 20240102 ┆ 2.2858 ┆ 65.43 ┆ … ┆ 0.07789 ┆ 0.247079 ┆ null ┆ -0.014188 │\n", "│ 000004.SZ ┆ 20240103 ┆ 2.4017 ┆ 65.55 ┆ … ┆ 0.081629 ┆ 0.247079 ┆ null ┆ 0.002432 │\n", "│ 000004.SZ ┆ 20240104 ┆ 12.6841 ┆ 65.8 ┆ … ┆ 0.0927 ┆ 0.247079 ┆ null ┆ 0.016919 │\n", "│ 000004.SZ ┆ 20240105 ┆ 10.2752 ┆ 67.38 ┆ … ┆ 0.087038 ┆ 0.246986 ┆ null ┆ -0.013477 │\n", "│ 000004.SZ ┆ 20240108 ┆ 6.5832 ┆ 66.04 ┆ … ┆ 0.091165 ┆ 0.246986 ┆ null ┆ -0.024684 │\n", "└───────────┴────────────┴────────────┴───────┴───┴────────────┴───────────┴───────────┴───────────┘\n", "\n", " 测试集前5行预览:\n", "shape: (5, 41)\n", "┌───────────┬────────────┬────────────┬───────┬───┬────────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ turnover_r ┆ open ┆ … ┆ market_cap ┆ cashflow_ ┆ ebitda_ra ┆ future_re │\n", "│ --- ┆ --- ┆ ate ┆ --- ┆ ┆ _rank ┆ act_rank ┆ nk ┆ turn_5 │\n", "│ str ┆ str ┆ --- ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ ┆ f64 ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪════════════╪═══════╪═══╪════════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000004.SZ ┆ 20250102 ┆ 9.4831 ┆ 55.8 ┆ … ┆ 0.099106 ┆ 0.310371 ┆ null ┆ -0.066193 │\n", "│ 000004.SZ ┆ 20250103 ┆ 9.8133 ┆ 57.71 ┆ … ┆ 0.083783 ┆ 0.310313 ┆ null ┆ 0.00893 │\n", "│ 000004.SZ ┆ 20250106 ┆ 6.7156 ┆ 50.39 ┆ … ┆ 0.079717 ┆ 0.310429 ┆ null ┆ -0.0142 │\n", "│ 000004.SZ ┆ 20250107 ┆ 6.8175 ┆ 51.41 ┆ … ┆ 0.082837 ┆ 0.310254 ┆ null ┆ 0.013031 │\n", "│ 000004.SZ ┆ 20250108 ┆ 7.9011 ┆ 52.95 ┆ … ┆ 0.088421 ┆ 0.310254 ┆ null ┆ 0.00442 │\n", "└───────────┴────────────┴────────────┴───────┴───┴────────────┴───────────┴───────────┴───────────┘\n" ] } ], "execution_count": 7 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T14:21:14.315924Z", "start_time": "2026-03-09T14:21:14.008258Z" } }, "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, 41)\n", "┌───────────┬───────────┬───────────┬──────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_dat ┆ turnover_ ┆ open ┆ … ┆ market_ca ┆ cashflow_ ┆ ebitda_ra ┆ future_re │\n", "│ --- ┆ e ┆ rate ┆ --- ┆ ┆ p_rank ┆ act_rank ┆ nk ┆ turn_5 │\n", "│ str ┆ --- ┆ --- ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ str ┆ f64 ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪═══════════╪═══════════╪══════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000004.SZ ┆ 20200102 ┆ -0.158161 ┆ 4.205157 ┆ … ┆ -1.231095 ┆ -0.740158 ┆ null ┆ 0.000441 │\n", "│ 000004.SZ ┆ 20200103 ┆ -0.308973 ┆ 4.205157 ┆ … ┆ -1.248088 ┆ -0.741819 ┆ null ┆ 0.005875 │\n", "│ 000004.SZ ┆ 20200106 ┆ -0.07511 ┆ 4.205157 ┆ … ┆ -1.315695 ┆ -0.742554 ┆ null ┆ 0.05644 │\n", "│ 000004.SZ ┆ 20200107 ┆ -0.172337 ┆ 4.205157 ┆ … ┆ -1.315695 ┆ -0.743846 ┆ null ┆ 0.049753 │\n", "│ 000004.SZ ┆ 20200108 ┆ -0.237369 ┆ 4.205157 ┆ … ┆ -1.318362 ┆ -0.743479 ┆ null ┆ 0.019922 │\n", "└───────────┴───────────┴───────────┴──────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", " 训练集特征统计:\n", " 特征数: 24\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", " bbi_ratio: 23000 (2.37%)\n" ] } ], "execution_count": 8 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T14:21:20.028734Z", "start_time": "2026-03-09T14:21:14.320887Z" } }, "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", " 特征数: 24\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-09T14:21:20.079300Z", "start_time": "2026-03-09T14:21:20.035212Z" } }, "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-09T14:21:20.557802Z", "start_time": "2026-03-09T14:21:20.083857Z" } }, "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.003423\n", " 标准差: 0.007422\n", " 最小值: -0.117124\n", " 最大值: 0.068818\n" ] } ], "execution_count": 11 }, { "metadata": {}, "cell_type": "markdown", "source": "### 4.3 训练指标曲线" }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T14:21:21.403754Z", "start_time": "2026-03-09T14:21:20.562703Z" } }, "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", "[16]\ttrain's l1: 0.042162\tval's l1: 0.0636982\n", "训练完成,指标已收集\n", "\n", "评估指标: l1\n", "\n", "[早停信息]\n", " 配置的最大轮数: 1000\n", " 实际训练轮数: 116\n", " 早停状态: 已触发(连续100轮验证指标未改善)\n", "\n", "最终指标:\n", " 训练 l1: 0.041670\n", " 验证 l1: 0.063778\n" ] } ], "execution_count": 12 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-09T14:21:21.662005Z", "start_time": "2026-03-09T14:21:21.419111Z" } }, "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+naQAAa1FJREFUeJzt3QecXFXZB+CzJZslhFACIYCELr036SJIKIK0IAhSP1SkY6FIRwUUEBQUsWCjmU9BkfYBAha6gAgCAoK0QOgJJWV35/u9B2ec2cxudpOdyW72efhd5s6dO/feuXt2MvPf95zbUCgUCgkAAAAA6qixnjsDAAAAgCCUAgAAAKDuhFIAAAAA1J1QCgAAAIC6E0oBAAAAUHdCKQAAAADqTigFAAAAQN0JpQAAAACoO6EUAAAAAHUnlAKAfuanP/1pamhoKE19Yemlly5t79RTT+2Tbc6t4vwUz1Wct/6ovH1Ee5ndtjMnXnMt2jkAMLAIpQCgU2jT0+n222937khnnXVWRbu49957uzwrBxxwQGm9lpaW9Oqrr86VZ3BuCZzKw7qYnn322Zk+5+abb05HHnlk2njjjdOwYcN6/fyuFAqFdP3116fPfOYz6cMf/nAaMWJEGjJkSFp00UXTVlttlc4+++w0YcKEWd4+AMwJzXNkrwBAl9Zff/30rW99q0/P0Fe/+tX09ttv5/n4skzfiZAgzm9HR0e+/4tf/CJtsMEGM6z3/vvvp1//+tel+zvssENaZJFF+n3bqZWBdKy9cdFFF6Xf/va3fbrN559/Pn36059Of/7zn2d4bOLEiekPf/hDnh577LGKyjkA6O+EUgDQKbQJb775ZvrGN75Ruv/xj388bbPNNhXnarnlluvy3E2aNClXMsyKVVddNU996eCDD+7T7fFfSyyxRG4fN910U75/5ZVXpvPOOy9XsZS7+uqr0+TJk0v3999//z4/jbVoO7UykI61N6Ii6kMf+lBab731Unt7e7r22mtna3uvvPJK2mKLLdIzzzxTWrbMMsuknXbaKVdJxXvV3XffXTWw6mvxeqZOnZorwACgL+i+BwD/CW2+9KUvlabOIU5UF5U/vvvuu6cxY8ZUdOX78Y9/nNZZZ500zzzzpM033zw/L75IHnXUUWmzzTZLSy65ZJp33nnT0KFDc5Cx4447Vv3C2l3Xp49+9KOl5RFqPPnkk2mvvfZKCy+8cGptbc37r1al0dWYUnHc5fv617/+lb73ve+lNdZYI29v1KhR6X/+53/yF9/O3nvvvXT88cfn8xDrRsBw8cUX59c8K90cY72DDjoov4bFFlssn6f48rv88svnbm9///vfZ3hOnIPifuLcRPelz372s6Xnr7zyyumHP/xh1f3F9j7xiU/k8DCmbbfdNj3wwANpVsTxFb322mvphhtumGGdqKAqivMalVIhqoV23nnn3CVroYUWymHWAgsskKutvv71r6d33323z7rNzcprjjAtqsGiTUQIEt0Ohw8fnlZZZZV02GGHVXRJi/nYb/n5COXHVGx/MzvWqCz79re/nTbZZJO04IIL5v3G/rfffvv0q1/9aob1Z6ct96XLL788VzbFedt1111ne3vx/lEeSB1yyCHpn//8Zzr//PPz7983v/nN9Mc//jE98cQTORzt6neju3NV/jPs/Lznnnsu//zj3EfbjHM6s9/vDTfcsPR45/fSv/3tb+nAAw/MoX68V0ZbWnvttfMfAXrT1gGYSxQAgBk888wzhfhnsjidcsop3T6+2WabVdxfc80183rXXnttxfJq02mnnVax7UsvvbTi8XJbbLFFafkaa6xRmG+++WbYXkNDQ+GWW26peN5SSy1V9bXcdtttFc/ddNNNqx7j5ptvXrG9adOmzfCai9OOO+5YcT/20RNf/OIXuz1PLS0thZtvvrniOfvtt1/p8WWXXbaw2GKLVX3uj3/844rn3XfffYXhw4fPsF5ra2thq622Kt2P89YTU6ZMKSywwAKl5+2+++4Vj0+YMKHQ1NRUevzoo48uPTZy5MhuX/fqq69emDx5csX2yh+P9tKTtjOrr3m33Xbr9vhGjBhRePjhh6v+XlSbiu2vu2ON87Xqqqt2u504runTp892W+5OHGv5c+P19Ubn19jb57/00kv597n4/LXWWqvQ3t7eo+eW/27E+0a5zueq/LjKn7fCCisURo8eXbHu1VdfXfG7/9nPfrZi20899VTF+nfeeWfpse9973uF5ubmLn+mq6yySv7ZAzB46L4HAH3gT3/6U1pqqaXSbrvtlqt7YpyX0NzcnNZaa63clSfGD4rqlKgG+Mtf/pJuu+22vM4ZZ5yRK4Sieqo3Hn744VxBcvTRR+eqkqgIiu41kVlE9U0Mftxb0QUonheVYddcc02pOikqMaKL0Ec+8pF8/4ILLsivuSiqUT75yU/mKojf/e53aVZEFVl0U1p99dVzxVBUUbz++uvpuuuuy2PlTJs2LR1xxBHpH//4R9XnR2VMVMREJUk89/vf/34+LyGqSaI6I8T5ifl33nkn349qjhivJ6rJYsynW2+9tdfHHlVZe+65Z64UC1EB99Zbb+WKp2L1TPxsqnXdi65eW265ZW4/8fOM44vKmKuuuiq3lfgZRHXKV77ylTSrZuc1x2uIrqtRdVasWIouZVEJFFU00VX12GOPzYNwx88t2t7999+fj7+ofOyonoxptvfee6dHH320dD8qE6MyKwYRv+uuu/KyOO6orjn55JNnqy33Z/Ee8UEG+YH99tsvNTbWr6NDVGKGqPhac80107///e80//zz50q44u////7v/6YLL7yw1F31iiuuKD1/pZVWShtttFGev/POO3NlXXHstTj/UakXXVp/9rOf5QrD+N3ed9990//93//V7TUCMGcJpQCgD8QYL9ENqhhCFMWXrpiiu82DDz6Yr7YWX96iC9I999yTu8C1tbXlQYqji0xvRLAQYUJ0fQkRyESXnnDffffN0uvYZZdd8pf92HZ0G4ouT8UwJbZZ/CL/ox/9qPScCDbiS34EQcXAJb5k9tZpp52Wv7BGoBEhVIQ60WVou+22y/dD3EbXqOgKWU2M5xThWIhuhfEaQnRtii+/8803Xz7v5V0BYzyxCAZDBD/RrSi+IPdWfFEvhlIx7k50MYuuhJ277sXPK0K8ooceeiiPZxZf2iPkiSAqAqB11103ByghxquanVBqdl5z/KynT5+ef8YRUkQIFUFaBD6XXnppXifab6wToWt0b42ueeWhVCzrqTgfsb2iOL64slyIACq6whaDqQhHTzzxxKpBTU/bcn/24osvVtyPkKfe4j0lriZYLtpoBMQRcr7xxhu5fUa30M6hVHk3znPOOacUSEW3wHjvKv7cPvWpT5UuDhDBYwTu5b8jAMy9hFIA0AcOPfTQGQKpEGO1RNVHBA7deeGFF3q9z6hAKAZSYcUVVyzNz+q4OVFlVBzfJ6peYqyqqIop32Z8EY2Qp2jcuHGlQKr4RXRWQqn4Mhpj/kQwM7NzVS2UWnzxxUuBVOfzUTz+CKUi9CoXP5+iCFVirK9i2NIb8aU6qnmKlVwRREUo9cgjj+SgpdoX9fiSftxxx+VwJSrBunvNs2N2XvNll12WQ53ugroI4eLxGMtrdhUDp/LqoKKmpqa0zz77lNaJQCTaYoR4s9KW6V5UxsV7W7Wqxvi9L7aZCKIilIowqdj+42dVHrRHdWhRjEMVj3cl3i+FUgCDg4HOAaAPdFXBEANYzyyQKn6p762oUOrchayovMtPX22zWOUQFUzlRo8e3e39nnjppZfyuZpZINXdueru2Ls7/qigKRfVWbOqPECJL+HRDe/nP/95aVl0fYtuc0Xf+c53cte27gKpWW0f5Wb1NUf1X3Sn6knl2OweY1EETd0dW+f7XQVMPWnL/V3nLr2PP/74LG2n8/tBT39WUUEXXZCrKXaHDXFxhaj6jG6qRVHhWB5Sdv65dicqSgEYHIRSANAHonKgs6jgiDGWiiKMiIqX+EIcXxJjjKnZURzDpajaFcxqsc0YU6ZccfysopdffrnX+40xmOJLbdG5556bg5Q4T+VjC/XF+ehc0db5+IvVNLMiKkOKFSBx7NGNrfyLelSTjBw5snS/vItbVHpFN7sIDOK5X/7yl1NfmdXXPH78+FKAE+czKmKiUi6OL8b6qoWoauru2Drfj2qeev1+1FuMNVZ+3BFw9jRQK+/SWBxbrfNYUbPyvla06aabphVWWKHUnS+Cqeg+W9T5CozlP9d4boSxXU2zMh4eAAOTUAoAaiQG6S4XgzVH5UPxMuoDtRogusCVd437zW9+U1HpMytd3zqfq/hCWwy/YmymvhSDznfunlYU4yVFQDarojJk7NixFePolI8L1PmLevnrjuOKLoBRTTVlypTZOo6+es3lxxc/jz322KMUVHT3c+kcCJUHjjPTeSD08q6gMSbUL3/5y4qgo3M3zblJtKc450UxLl2M71Q+aH550FT+cy0PIiMgL1bLxfhlF110UZ8cX3l7jnHKYiD0EF0lo0toVz/XCK6ja2uMNVY+RVfBqOLryWD4AMwdjCkFADWy/PLL52qFYmVDfJmMsYXii/6sBDf9ycEHH1wavDq+DMf4VlEFFJVhUTHRW52DhR122CF3/4kxauLqXn1pww03TKuuumqpAuvrX/96HvsrunvFvmZlkPNyMdB7XImucxgT3Rpj0PvOr7tYtfL73/8+fe5zn8vrxXHMaletvnzN5T+XCDXi5xKBQVzZrrsrpHXudhZVgvG8+H2IarLuukjGVd6iUqZ4RcC4cmJcWTGOP/ZZPuZU/E7V82p0O+20Uw4NO4sA5pRTTilVvxUvNNC5yi+uFhhjeIW4WmPnsLCab3/723mQ+WLgE1e6u+GGG/I+4zxGt7iosIur4UVXy+J4Yeuvv35F8Bjjz0XoGd1KOw+gPqtifyeddFIOyaKralGM+9U5mPziF7+Y3xuiyu6pp55Kq622Wr6qX7yGCMpiIP477rgjV13FdgEYJAoAwAyeeeaZGISlNJ1yyindPn7bbbdVPYuf//znK9YrTltttVVhiSWWqLr9Sy+9tGLdcltssUVp+X777VfxWHfPW2qpparuK467/DnxunryvGnTphU222yzqq9tu+22q7h/xx13zLSFxfZWX331qtuL19nVuS5/LM5Nue5e2z333FOYd955Z9jXkCFDChtvvHHpfrz+3poyZUphoYUWmmHbX/ziF2dY909/+lOhubl5hnWHDx9e2HXXXbs8jvJ14+fekzYwK6/59ddfLyy++OI9+rmUn984B4sttljV5913330zPdYJEyYUVllllarPL0677bZbYfr06T36eXfXlrsT63V3DNV+Fzufl66m8p/bzDz77LOFjTbaqFfH8f777xdWWGGFquttv/32XZ6r7n6nqun8+x7Tww8/XHXdiy66qGp77zwBMHjovgcANfTd7343nX766WmppZbKlQNjxozJYwVFd6muBhAeCOK13HjjjenYY49NH/rQh3L1SFTVRFXHiSeeWLFutasSVtveH/7wh1xlFGMuxaDUUUlxySWXpFNPPbXPj79YMRLVWMOHD89TVOdEt8qPf/zjs7XtOPa99tprhuXx2jqLsXVuuummXEUUz4sucttvv30eHH/11VdPc/o1R/e4qIqKipao8ImrLEYFTnTZrPZ6iuK1RLXYNttsU6oM6o2oFotqoxhbLKrw4rzE70uMwxbVZjF2UVR4DeTfod6I94/42cX7RlRCRRVmdKOM1x/d3bbeeuvcJS+qyopaW1tztVl0/4vfwbgfFXNXX311n45X1rlL6rrrrttl2/3CF76QuyBG170Pf/jDadiwYfk1RLXUFltskauuysfhA2Du1xDJ1Jw+CABg4InBkyOk6Cy69UWYECL4iO6K1bo8AQAwuA2OPy8BADW5Mtiyyy6bNttss7TkkkumN998M1dPxRXaimKMJIEUAADVqJQCAGbJWmut1W1XmxgU+9e//nXuygUAAJ0ZUwoAmCWHHXZYGjt2bL7SWoxXE+FTjC+188475/F+4mpyAikAALqiUgoAAACAulMpBQAAAEDdCaUAAAAAqDtX3+sjHR0d6aWXXkrzzTdfamho6KvNAgAAAAwohUIhTZ48OS2++OKpsbHreiihVB+JQCouhw0AAABASs8//3y+EI5QqsaiQqp4wkeMGNFvq7leffXVtMgii3SbVDK4TWmbkva9et88//Ndfp5am1vn2LFos5V22GGHdO+996YhQ4bkisx4cz/uuOPSLrvsMtvnev75509/+tOf0hprrNHj50yfPj0df/zx6Ve/+lU+nj322COdeeaZqbm5eZbXv/7669M3vvGN9PTTT+f30q985SvpoIMOyo995jOfSffcc09677330oILLpj23Xff9OUvf7nirzHnnXde+ulPf5pee+21tNhii6VLLrkkrbfeevnxuBrc2WefnV588cX04Q9/OJ177rlp3XXXLT3/Zz/7WbrgggvSK6+8kp977LHHpnHjxvX6XGq3DDTaLAORdstAo80y2NrtpEmTcuFOMSvpikqpPlLsshdfovpzKDVlypR8fEIputLS1pKGDBuS56OtzOlQSpv9r6amphyqHHXUUTmAiQAnAqmPfvSjaamllprt8z18+PBevX+dcsopOSR77LHH8v3tttsuXXjhhenkk0+epfVvvPHG9KUvfSn98pe/TJtttln+hywCouIxfe1rX8th0tChQ9Nzzz2Xtt1227TiiiumffbZJz9+wgknpD/+8Y/p1ltvTcstt1xep6WlJT//L3/5Szr66KPT//3f/+WQ6kc/+lEOxZ566qkcyD344IPpi1/8Yrrpppvy+fzDH/6QQ8CNNtoorbLKKr06j9otA402y0Ck3TLQaLMM1nbbMJPhjZTLABWGNg1NP97px3mKefqneHOP0GSBBRZITzzxRGn5Aw88kLbccsu00EILpeWXXz798Ic/rHjsIx/5SP5HZeGFF0477rhjXr7BBhvk24033jgHU1Gp1BM/+clP0oknnpirimL66le/mn784x/P8vonnXRSDqgiFIoALqqhVlpppdLjq6++eg6kiq8//mF88skn8/033ngjV0nFPuJ1x+MR1MV+wm9/+9v0yU9+Mm244YZ525/73Ofya7366qvz488880xaeuml87mL52611Vb5Lzv/+Mc/evgTAQAAeksoBVSIL+Sj5h2VJ4P29++/WkTQ8v7776e11lorL3v55ZfTxz/+8XTIIYfkMttrrrkmVydF5VA47LDDchD11ltv5S5sxa5vUb0U7rzzzvTOO+/kiqPwiU98Ip111llV9//mm2+mF154obTvEPNRnfT222/3ev133303/fWvfy11rRs9enTuOjdhwoSK7XzhC19Iw4YNS2PGjMnHuv/+++fld999dw6srrjiijyYYgRM0f1u2rRppfMV1WXl4v7DDz+c58eOHZtLi2+++ea8blRMxXnadNNNZ+GnAwAA9IRQCmAAiTGZojpq3nnnTbvuumuuPBo1alR+7Be/+EXafPPNc7e0qAZabbXV0gEHHJAuv/zy/HiMRfXvf/87X5ghApxYtzu///3v85hV1UQgFOJYiorzcZWN3q4foVWERBGkRTAU3eriGItd84q+973v5W3dd999eUypqKYqVkpFd7+onPrnP/+Zu/HdcMMNubtj2H777XNVVHTji7GtLrroohyIxXNCBF2xr5122il3+Yvb888/P4djAABAbQilgAptHW3pJw/+JE8xT/8SA4NHBU9USEW3vRic+wc/+EF+7Nlnn83jTEXYU5y+853vlKqNomtb9AmPwb2jW1yM5zSroutbKK+KKs5XG8xwZusXHz/iiCNyt7u4f9ppp6XbbrstV1GVi257MS5UPC/GoCrffjwn5qOS6sgjj0zXXnttXv6xj30sh0wHH3xwDpoi1Np6663TyJEjS+fmnHPOyRVXUV0V1WMRyF133XWzfI4AAIDuCaWAChFEXf341XkSSvVvMXZSVABFRVOIMZBi4PMIrYpTVCFFUBVi8O+f//znuZtfDPQdgU50mQu97aoZFUpx9b+HHnqotCzm4xhi4PDerh8BWgRJ1XTudlcUFU/FMaXWXHPNmR7z//zP/+Qxol5//fU81lbMb7HFFvmxGOg8Bl6P7UToFbfbbLNNrrYCAABqQygFMEAVK6NiAPDwmc98Jl817te//nUObGKK4CeqgkIEUnE1uwigIgSK8CW6+YVFF100Pf30073af3QN/PrXv55DrphigPQIfmZ1/c9+9rPpu9/9bh5XKirBTj/99DzgeFQ+RbfDeF3RdS/GfIrxr6IKLMaCCssss0yufIrnvPfee7mLYmwrBjcPxXMRz41QKsbXiufEFfxCXGUvxpF69NFH8/24jftrr712L38qAABATwmlAAaQGLw7QpqYYhDuCGLiinVhiSWWyEFKdOeLq85F0HTooYeWxk265ZZbcgVQPDfCmm9961ulgcfPOOOM3HUuKpqKg5tH5VB3V+KLq+VFmLPyyivnaZNNNikNkh4+//nP56mn60d3uQih4hijgirCpRgnqyi630W1VQRqBx54YDr88MMrxry67LLLcpfAeN3rr79+Dqy+8pWvlEKpCMXiyoMxkHpbW1vu2le8tO3ee++dB1GPgeDj/EQFWuwjJgAAoDYaCl31i6BX4ktfdEGJL0Txpac/igqBiRMn5kGRi1/EoLMpbVPSuPHj8vz4ceNTa3PrHDtJ2iwDkXbLQKPNMhBptww02iyDrd1O6mFGIpkAAAAAoO6EUgAAAADUnVAKAAAAgLprrv8ugf5saNPQdNH2F5XmAQAAoBaEUkCFhoaGNGb+Mc4KAAAANaX7HsAA8dGPfjSdf/75ef72229PCyywQM33+cgjj6SxY8emhRdeOAeWb7311gzr/OMf/8jrzDfffGmhhRZKBx10UM2PCwAAGPhUSgEVprdPTz958CdpStuU9KnVPpUWnXfRHEYwawqFQnp3+rtp8tTJadLUSWnytMkzzJcvi/N+1EeOSisvsnLNT/n06dPTkCFDul0nHt9jjz3S4YcfnnbccccZHn/ppZfSxz72sfT1r389XXPNNflSsY8++mgNjxoAAJhbCKWA7K0pb6WfPfSz9J17vpP+9da/8rKjbjoqLbfgcunwDQ5P+621X1qgtfaVOf09sIsAKQdK/wmTup2fNjm9M+2d1FHomGFbLU0tacTQEWm+lvnyFPOLzbdYmn/o/Gnx+Rbv9jhef/31tN1226UpU6ak4cOH52U33HBD2myzzdItt9ySTjjhhPTPf/4zLbHEEunMM89MO+20U15n//33T01NTWny5MnpxhtvzEFShE3dWXHFFfP07LPPVn3829/+dg6lyquj1llnnR6dTwAAYHATSgHppqduSrv9arf03vT3Zjgb/3rzX+nom45OX/3DV9Ov9/h1Grv82Lmieilea1eVS1Xnp03OVUydNaSGNLxl+H8DpqHz5VDpwyM/XLGs83yEUrNq5MiROYTaeeedK7rTPfzww2ncuHHp17/+de7qd+edd6Yddtgh3XvvvTlYCldccUW6+uqr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Wppa0plbn+msAAAAUFPKIAAAAACoO6EUAAAAAHUnlAIqTGmbkvb+zd55inkAAACoBWNKATOYNHWSswIAAEBNqZQCAAAAoO6EUgAAAADUnVAKAAAAgLoTSgEAAABQd0IpAAAAAOrO1feACo0NjWmFhVYozQMAAEAtCKWACi1NLem8sec5KwAAANSUMggAAAAA6k4oBQAAAEDdCaWAClPbpqaDfntQnmIeAAAAasGYUkCFQiqkie9NLM0DAABALaiUAgAAAKDuhFIAAAAA1J1QCgAAAIC6E0oBAAAAUHdCKQAAAADqztX3gAoNqSEtOWLJ0jwAAADUglAKqDC0eWj63g7fc1YAAACoKd33AAAAAKg7oRQAAAAAdSeUAipMbZuavnDdF/IU8wAAAFALxpQCKhRSIT0/6fnSPAAAANSCSikAAAAA6k4oBQAAAEDdCaUAAAAAqLt+GUpddNFFaemll06tra1pww03TPfee2+3648fPz6ttNJKef3VV189XX/99RWP77///qmhoaFi2nbbbSvWif11Xuess86qyesDAAAAGOz6XSh11VVXpWOOOSadcsop6YEHHkhrrrlmGjt2bJo4cWLV9e+888601157pYMOOig9+OCDaeedd87TI488UrFehFATJkwoTVdcccUM2zr99NMr1jn88MNr9joBAAAABrN+F0qdd9556eCDD04HHHBAWmWVVdLFF1+chg0bln7yk59UXf+CCy7IgdOXv/zltPLKK6czzjgjrbPOOunCCy+sWG/o0KFp9OjRpWnBBRecYVvzzTdfxTrzzjtvzV4n9FcNqSGNGjYqTzEPAAAAtdCc+pFp06alv/71r+n4448vLWtsbExbb711uuuuu6o+J5ZHZVW5qKy65pprKpbdfvvtadSoUTmM+tjHPpa+9rWvpZEjR1asE931ItQaM2ZM+vSnP52OPvro1Nxc/RRNnTo1T0WTJk3Ktx0dHXnqj+K4CoVCvz0++ochjUPSD3f8Yen+nGwv2iwDkXbLQKPNMhBptww02iyDrd129PA5/SqUeu2111J7e3tadNFFK5bH/ccff7zqc15++eWq68fyoqik2nXXXdMyyyyTnn766XTCCSek7bbbLgdaTU1NeZ0jjjgiV1gttNBCuUtgBGPRhS8qt6o588wz02mnnTbD8ldffTVNmTIl9UfRKN5+++3cqCLsg/5Om2Ug0m4ZaLRZBiLtloFGm2WwtdvJkycPvFCqVvbcc8/SfAyEvsYaa6TlllsuV09ttdVWeXl5tVU83tLSkj73uc/l8Cm6/nUWoVX5c6JSaskll0yLLLJIGjFiROqvDSoGcI9jFEoxEGizDETaLQONNstApN0y0GizDLZ229raOvBCqYUXXjhXLr3yyisVy+N+jPFUTSzvzfph2WWXzft66qmnSqFUZ3HVv7a2tvTss8+mFVdccYbHI6iqFlbFD6o/Bz7RoPr7MTJnTWuflo675bg8f9bWZ6WWppY5ejzaLAORdstAo80yEGm3DDTaLIOp3Tb2cP1+lUxEddK6666bbr311opkLu5vtNFGVZ8Ty8vXDzfffHOX64cXXnghvf7662mxxRbrcp2HHnoon8QYhwoGk45CR3ryjSfzFPMAAABQC/2qUipEl7j99tsvrbfeemmDDTZI559/fnr33Xfz1fjCvvvum5ZYYoncrS4ceeSRaYsttkjnnntu2mGHHdKVV16Z7r///nTJJZfkx99555089tNuu+2Wq6diTKmvfOUrafnll88DoocYW+qee+5JW265Zb4CX9yPQc732WefqlfpAwAAAGAuC6U+9alP5cHCTz755DxY+VprrZVuvPHG0mDmzz33XEUZ2MYbb5wuv/zydOKJJ+YBzFdYYYV85b3VVlstPx7dAR9++OH0s5/9LL311ltp8cUXT9tss02+yl6x+13cRph16qmn5ivqxYDoEUp1vqofAAAAAHNpKBUOO+ywPFUTg5N3Nm7cuDxVM88886Sbbrqp2/3FVffuvvvuWTxaAAAAAHqrX40pBQAAAMDgIJQCAAAAoO76Zfc9YM4aMXSEHwEAAAA1JZQCKrQ2t6bLdr3MWQEAAKCmdN8DAAAAoO6EUgAAAADUnVAKqDCtfVo6/pbj8xTzAAAAUAvGlAIqdBQ60iOvPlKaBwAAgFpQKQUAAABA3QmlAAAAAKg7oRQAAAAAdSeUAgAAAKDuhFIAAAAA1J2r7wEzGNo01FkBAACgpoRSQIXW5tb0v3v8r7MCAABATem+BwAAAEDdqZQCAAAAutXe3p6mT5/uLA0iHR0d+Wc+ZcqU1NhYWdM0ZMiQ1NTUNNv7EEoBFaa1T0tn/unMPH/8ZsenlqYWZwgAAAapQqGQXn755fTWW2/N6UNhDvzsI5iaPHlyamhomOHxBRZYII0ePbrqYz0llAIqdBQ60v0T7i/NAwAAg1cxkBo1alQaNmzYbAUQDLxQqq2tLTU3N1f83GP5e++9lyZOnJjvL7bYYrO8D6EUAAAAULXLXjGQGjlypDM0yBS6CKXCPPPMk28jmIr2Matd+Qx0DgAAAMygOIZUVEhBZ8V2MTtjjQmlAAAAgC7psket2oVQCgAAAIC6E0oBAAAAdGPppZdO559//hzfxtxGKAUAAADMNV3KuptOPfXUWdrufffdlz772c/26bFecskl6aMf/WgaMWJEPrYYVH6wcfU9oEJrc2u6dq9rnRUAAGDAmTBhQmn+qquuSieffHJ64oknSsuGDx9ecXW5uMJgXF1uZhZZZJE+P9b33nsvbbvttnk6/vjj02CkUgoAAACYK4wePbo0zT///LkCqXj/8ccfT/PNN1+64YYb0rrrrpuGDh2a/vznP6enn346ffKTn0yLLrpoDq3WX3/9dMstt3Tb9S62+6Mf/Sjtsssu+Sp0K6ywQvrd737Xq2M96qij0nHHHZc+8pGPpMFKKAUAAAAMGhEEnXXWWemxxx5La6yxRnrnnXfS9ttvn2699db04IMP5sqlHXfcMT333HPdbue0005Le+yxR3r44Yfz8/fee+/0xhtv1O11zA103wMqTGufls6767w8f8xGx6SWphZnCAAAyNZbL6WXX67/yRg9OqX77++bbZ1++unp4x//eOn+QgstlNZcc83S/TPOOCNdffXVufLpsMMO63I7+++/f9prr73y/De+8Y30ne98J91777051KJnhFJAhY5CR/rL83/J80d95ChnBwAAKIlA6sUXB/YJWS+StTJRKRUDoF933XV5TKq2trb0/vvvz7RSKqqsiuadd948YPnEiRNrdtxzI6EUAAAA0OOKpYG+3wiQyn3pS19KN998czrnnHPS8ssvn+aZZ560++67p2nTpnW7nSFDhlTcj3GmOjo6+u5ABwGhFAAAANAjfdWFrj/5y1/+krvixaDlxcqpZ599dk4f1qAglAIAAAAGrbhy3m9+85s8uHlUO5100kl1qXh6+eWX8/TUU0/l+3//+9/z1QHHjBmTx7kaDFx9DwAAABi0zjvvvLTgggumjTfeOAdTY8eOTeuss07N93vxxRentddeOx188MH5/uabb57vxwDrg0VDoVAo1GrjjzzySHrggQfSvvvum+Z2kyZNSvPPP396++238+Bm/VEkvTHo2qhRo1JjozyS6qa0TUnjxo/L8+PHjU+tza1z7FRpswxE2i0DjTbLQKTdMtAM1DY7ZcqU9Mwzz6RlllkmtbbOue8FzBkRF8Wg783NzbmCrDfto6cZSU1/G37729+mAw44oJa7AAAAAGAAMqYUUGFo09BcIVWcBwAAgH4RSh144IE9Xvdvf/tbbzcPzGFRljknu+wBAAAwOPQ6lPrpT3+ahgwZklpaWma67vTp02f1uAAAAACYi/V6TKkll1wybb311mny5MkznU488cTaHDVQM9Pbp6fz7z4/TzEPAAAA/SKU2nDDDdO9997bo3Wrjc4O9G/thfZ06zO35inmAQAAoF+EUltuuWUaPnx4ev7552e67pprrpn23XffWT02AAAAAOZSvR5T6pBDDslTTwOsddZZZ1aOCwAAAIC5WK8rpXrj/PPPT2PGjKnlLgAAAAAYgGoaSoVCoVDrXQAAAAD0mY9+9KPpqKOOKt1feumlc+HNzMbVvuaaa2Z73w19tJ3unHrqqWmttdZKc30oBQAAAFAPO+64Y9p2222rPvanP/0pBz4PP/xwr7d73333pc9+9rOpHsHQhAkT0nbbbZfq6dFHH0277bZbDt/iHM0sgOsrQikAAABgrnDQQQelm2++Ob3wwgszPHbppZem9dZbL62xxhq93u4iiyyShg0bluph9OjRaejQoame3nvvvbTsssums846K++/XoRSQIWhTUPTL3f5ZZ5iHgAAYKD4xCc+kQOkn/70pxXL33nnnTR+/PgcWr3++utpr732SksssUQOmlZfffV0xRVXdLvdzt33nnzyybT55pun1tbWtMoqq+QgrLNjjz02ffjDH877iMDnpJNOStOnT8+PxfGddtpp6W9/+1uuTIqpeMydu+/9/e9/Tx/72MfSPPPMk0aOHJkrtuL1FO2///5p5513Tuecc05abLHF8jqHHnpoaV89sf7666dvfetbac8996xrINbrq+898MADPV73pZde6u3mgTks3gDnb51/Th8GAABArzU3N6d99903Bzxf/epX8/ebEIFUe3t7DqMi0Fl33XVzaDRixIh03XXXpc985jNpueWWSxtssMFM99HR0ZF23XXXtOiii6Z77rknvf322xXjTxXNN998+TgWX3zxHCwdfPDBedlXvvKV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mmuumcaOHZsmTpxYdf0777wz7bXXXjlEevDBB9POO++cp0ceeaRivQihJkyYUJquuOKKiscjkHr00UfTzTffnH7/+9+nP/7xj+mzn/1sTV8rAAAAwGDV70Kp8847Lx188MHpgAMOSKusskq6+OKL07Bhw9JPfvKTqutfcMEFOXD68pe/nFZeeeV0xhlnpHXWWSddeOGFFesNHTo0jR49ujQtuOCCpccee+yxdOONN6Yf/ehHuTJr0003Td/97nfTlVdemV566aWav2boT9o62tJ1/7wuTzEPAAAAc/2YUtOmTUt//etf0/HHH19a1tjYmLbeeut01113VX1OLI/KqnJRWXXNNddULLv99tvTqFGjchj1sY99LH3ta19LI0eOLG0juuytt956pfVjn7Hve+65J+2yyy4z7Hfq1Kl5Kpo0aVK+7ejoyFN/FMdVKBT67fHRP0xrm5a+f//38/yWS2+ZGpvnXHatzTIQabcMNNosA5F2y0CjzTLY2m1HD5/Tr0Kp1157LbW3t6dFF120Ynncf/zxx6s+5+WXX666fiwvikqqXXfdNS2zzDLp6aefTieccELabrvtchjV1NSU143Aqlxzc3NaaKGFKrZT7swzz0ynnXbaDMtfffXVNGXKlNQfRaN4++23c6OKwA2qmdI2JU2bOi3PR7fZ1ubWOXaitFkGIu2WgUabZSDSbhlotFkGW7udPHnywAulamXPPfcszcdA6GussUZabrnlcvXUVlttNUvbjGqu8gqtqJRacskl0yKLLJIHS++vDSoGeY9jFErRXSjVMvSDq+5FWDunQyltloFGu2Wg0WYZiLRbBhptlsHWbltbWwdeKLXwwgvnyqVXXnmlYnncj3GgqonlvVk/LLvssnlfTz31VA6lYt3OA6m3tbXlK/J1tZ0YoyqmzuIH1Z8Dn2hQ/f0YmbOibUQ7Kc7P6baizTIQabcMNNosA5F2y0CjzTKY2m1jD9fvV8lES0tLWnfdddOtt95akczF/Y022qjqc2J5+fohrqDX1frhhRdeSK+//npabLHFStt466238nhWRX/4wx/yvmPgcwAAAAD6Vr8KpUJ0ifvhD3+Yfvazn+Wr4h1yyCHp3XffzVfjC/vuu2/FQOhHHnlkvnLeueeem8edOvXUU9P999+fDjvssPz4O++8k6/Md/fdd6dnn302B1if/OQn0/LL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DkrvvPNOnV8Jg8kfu2m306dPT8cee2z+jDDvvPPmdfbdd9/00ksv1azdCqUGgauuuiodc8wxedT8Bx54IK255ppp7NixaeLEiXP60CC74447cuB09913p5tvvjm/GW6zzTbp3XffLZ2ho48+Ol177bVp/Pjxef14Y9x1112dQea4++67L/3gBz9Ia6yxRsVybZb+5M0330ybbLJJGjJkSLrhhhvSP/7xj3TuueemBRdcsLTON7/5zfSd73wnXXzxxemee+7JH0bj80IErDAnnH322en73/9+uvDCC9Njjz2W70c7/e53v6vd0i/EZ9X4bhUFANX05H01vtg/+uij+TPw73//+xwYfPazn63jq2Cwebebdvvee+/lzCD+IBC3v/nNb3KxwE477VSxXp+22wJzvQ022KBw6KGHlu63t7cXFl988cKZZ545R48LujJx4sT4E2jhjjvuyPffeuutwpAhQwrjx48vrfPYY4/lde666y4nkjlm8uTJhRVWWKFw8803F7bYYovCkUcemZdrs/Q3xx57bGHTTTft8vGOjo7C6NGjC9/61rdKy6IdDx06tHDFFVfU6Sih0g477FA48MADK5btuuuuhb333jvPa7f0J/G59Oqrry7d70n7/Mc//pGfd99995XWueGGGwoNDQ2FF198sc6vgMEodWq31dx77715vX//+981abcqpeZy06ZNS3/9619zqWhRY2Njvn/XXXfN0WODrrz99tv5dqGFFsq30Yajeqq8Ha+00kppzJgx2jFzVFT47bDDDhVtM2iz9De/+93v0nrrrZfGjRuXu0mvvfba6Yc//GHp8WeeeSa9/PLLFW15/vnnz13+fV5gTtl4443Trbfemv75z3/m+3/729/Sn//857Tddtvl+9ot/VlP2mfcRteneH8uivXj+1pUVkF/+W4W3fyirdai3Tb36dHS77z22mu5P/6iiy5asTzuP/7443PsuKArHR0deVye6Gay2mqr5WXxD3pLS0vpjbC8HcdjMCdceeWVuaw5uu91ps3S3/zrX//K3aCiO/8JJ5yQ2+0RRxyR31v322+/0ntptc8L3meZU4477rg0adKk/Ieopqam/Jn261//eu42ErRb+rOetM+4jT8UlGtubs5/mPXeS38QXU1jjKm99torjx9Vi3YrlAL6XeXJI488kv8SCv3V888/n4488sjcjz4uIAEDIfCPv2h+4xvfyPejUirea2OckwiloD/61a9+lS677LJ0+eWXp1VXXTU99NBD+Q9XMfCudgtQW9FTZY899sgD9scftmpF97253MILL5z/stT5KmVxf/To0XPsuKCaww47LA+Ud9ttt6UPfehDpeXRVqMr6ltvvVWxvnbMnBLd8+JiEeuss07+y1BMMQB/DGYa8/FXUG2W/iSu/LTKKqtULFt55ZXTc889l+eLnwl8XqA/+fKXv5yrpfbcc898JajPfOYz+SIScdXeoN3Sn/WkfcZt54tPtbW15Sub+a5Gfwik/v3vf+c/wharpGrRboVSc7koy1933XVzf/zyv5bG/Y022miOHhsURfoegdTVV1+d/vCHP+RLP5eLNhxXjCpvx3EViPgypR0zJ2y11Vbp73//e/6rfXGKKpToUlKc12bpT6JLdLxvlotxepZaaqk8H++78UGy/H02uk3F2BDeZ5lT4ipQMUZJufhja3yWDdot/VlP2mfcxh9d449dRfFZONp4jD0FczKQevLJJ9Mtt9ySRo4cWfF4X7db3fcGgRg/Ikqc40vSBhtskM4///x8GcgDDjhgTh8alLrsRWn+b3/72zTffPOV+iLHYJDzzDNPvj3ooINyW46+ypHUH3744fkN8SMf+YizSN1FOy2OeVYUl3mOf7SLy7VZ+pOoLolBo6P7XnzQvPfee9Mll1ySpxADmEa3qK997WtphRVWyF+m4nLQ0U1q5513ntOHzyC144475jGk4sIm0X3vwQcfTOedd1468MAD8+PaLXPaO++8k5566qmKwc3jj1PxeTXa7czeV6Niddttt00HH3xw7k4dYUD8oTaqA2M9qHe7jcrq3XffPY+bGj1YYiy/4nezeDyKXvq83c7CVQMZgL773e8WxowZU2hpaSlssMEGhbvvvntOHxKUxFtRtenSSy8trfP+++8XvvCFLxQWXHDBwrBhwwq77LJLYcKECc4i/cYWW2xROPLII0v3tVn6m2uvvbaw2mqr5cuRr7TSSoVLLrmk4vG4fPlJJ51UWHTRRfM6W221VeGJJ56YY8cLkyZNyu+r8Rm2tbW1sOyyyxa++tWvFqZOnVo6Odotc9Jtt91W9TPsfvvt1+P2+frrrxf22muvwvDhwwsjRowoHHDAAYXJkyfPoVfEYG+3zzzzTJffzeJ5tWi3DfG/vkzdAAAAAGBmjCkFAAAAQN0JpQAAAACoO6EUAAAAAHUnlAIAAACg7oRSAAAAANSdUAoAAACAuhNKAQAAAFB3QikAAAAA6k4oBQAwSN1+++2poaEh3wIA1JtQCgCgj/z0pz/NIc/999+f719//fXp1FNPnePn93vf+14+NgCA/kQoBQBQIxFKnXbaaf02lNp8883T+++/n28BAOpNKAUAMIAUCoUcJPWFxsbG1Nramm8BAOrNJxAAgBrYf//900UXXZTno0tfcSrq6OhI559/flp11VVzMLToooumz33uc+nNN9+s2M7SSy+dPvGJT6SbbroprbfeemmeeeZJP/jBD/Jjl156afrYxz6WRo0alYYOHZpWWWWV9P3vf3+G5z/66KPpjjvuKB3DRz/60W7HlBo/fnxad911874WXnjhtM8++6QXX3xxhtc3fPjwvHznnXfO84ssskj60pe+lNrb2/v4bAIAc6PmOX0AAABzowiYXnrppXTzzTenX/ziF1Ufjy51BxxwQDriiCPSM888ky688ML04IMPpr/85S9pyJAhpXWfeOKJtNdee+XnHHzwwWnFFVfMyyOAilBrp512Ss3Nzenaa69NX/jCF3Lgdeihh+Z1Ivg6/PDDc2j01a9+NS+LAKwrxWNaf/3105lnnpleeeWVdMEFF+RjimNbYIEFSutG+DR27Ni04YYbpnPOOSfdcsst6dxzz03LLbdcOuSQQ/r0fAIAc5+GQtSAAwAw24qBzn333Zermg477LBcLdX549af//zntNlmm6XLLrssffrTny4tj2qobbfdtmJ5VDr9+9//TjfeeGMOgMpFN76oZioXz3/yySfT008/XVq22mqr5YqnzhVRcX/LLbdMt912W66emj59evrQhz6UK6/iNUQFV7juuutytdbJJ59cGiMrKqV+9rOfpdNPPz2ddNJJpW2us846uTtgcbB3AICu6L4HAFBn0T1u/vnnTx//+MfTa6+9Vpqiy1xUNEVIVG6ZZZaZIZAK5YHU22+/nbexxRZbpH/961/5fm9FkDRx4sRcbVUMpMIOO+yQVlpppRxOdfb5z3++4n6EbbF/AICZ0X0PAKDOopIpQqOoSKomgqHOoVQ10aXulFNOSXfddVd67733Kh6L7Ufw1RtRkRWK3QPLRSgVFV7lIriKcaTKLbjggjOMiwUAUI1QCgCgzmLMpwikopteNZ2Dns5d9EJ0z9tqq61yWHTeeeelJZdcMrW0tKTrr78+ffvb3877qLWmpqaa7wMAmHsJpQAAaqT8anvlYiDwGBR8k002qRo49UQMaj516tT0u9/9Lo0ZM6a0vHPXv+6Oo7OlllqqNLB6XNWvXCwrPg4A0BeMKQUAUCPzzjtvvn3rrbcqlu+xxx75ynVnnHHGDM9pa2ubYf3uqpTKB1GPLnuXXnpp1ePoyTZjcPao4Lr44otz4FV0ww03pMceeyyPLQUA0FdUSgEA1EgMXB6OOOKIPFB5BEl77rlnHoz8c5/7XDrzzDPTQw89lLbZZps0ZMiQPNZUDIJ+wQUXpN13373bbcdzorvejjvumLf1zjvvpB/+8Ic5VJowYcIMx/H9738/fe1rX0vLL798XqdzJVSIYzj77LPzFQTjGPfaa6/0yiuv5OOJqwAeffTRfXyGAIDBTCgFAFAju+66azr88MPTlVdemX75y1/mqqYIpUJUI0VY9IMf/CCdcMIJqbm5OQc/++yzT+7WNzMxGPn//u//phNPPDF96UtfSqNHj06HHHJIHo/qwAMPrFj35JNPzoOYf/Ob30yTJ0/OgVO1UCrsv//+adiwYemss85Kxx57bK6y2mWXXXJYtcACC/TRmQEASKmhUF7zDQAAAAB1YEwpAAAAAOpOKAUAAABA3QmlAAAAAKg7oRQAAAAAdSeUAgAAAKDuhFIAAAAA1J1QCgAAAIC6E0oBAAAAUHdCKQAAAADqTigFAAAAQN0JpQAAAACoO6EUAAAAAHUnlAIAAAAg1dv/A5veoFSnjFAtAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[指标分析]\n", " 最佳验证 l1: 0.063698\n", " 最佳迭代轮数: 16\n", " 早停建议: 如果验证指标连续10轮不下降,建议在第 16 轮停止训练\n", "\n", "[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\n" ] } ], "execution_count": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 查看结果" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-09T14:21:21.684871Z", "start_time": "2026-03-09T14:21:21.668727Z" } }, "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, 42)\n", "结果列: ['ts_code', 'trade_date', 'turnover_rate', 'open', 'vol', 'close', 'total_mv', 'f_ann_date', 'revenue', 'n_income', 'total_hldr_eqy_exc_min_int', 'total_cur_assets', 'total_liab', 'total_cur_liab', 'roe', 'ebitda', 'n_cashflow_act', 'ma_5', 'ma_20', 'ma_ratio_5_20', 'bias_10', 'bbi_ratio', 'return_5', 'return_20', 'momentum_accel', 'volatility_ratio', 'reversal_1', 'volume_ratio', 'turnover_rate_mean_5', 'turnover_deviation', 'net_profit_growth', 'revenue_growth', 'roe_delta', 'debt_to_equity', 'current_ratio', 'EP_rank', 'BP_rank', 'market_cap_rank', 'cashflow_act_rank', 'ebitda_rank', 'future_return_5', 'prediction']\n", "\n", "结果前10行预览:\n", "shape: (10, 42)\n", "┌───────────┬───────────┬───────────┬──────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_dat ┆ turnover_ ┆ open ┆ … ┆ cashflow_ ┆ ebitda_ra ┆ future_re ┆ predictio │\n", "│ --- ┆ e ┆ rate ┆ --- ┆ ┆ act_rank ┆ nk ┆ turn_5 ┆ n │\n", "│ str ┆ --- ┆ --- ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ str ┆ f64 ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪═══════════╪═══════════╪══════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000004.SZ ┆ 20250102 ┆ 1.881022 ┆ 2.213796 ┆ … ┆ -0.616292 ┆ null ┆ -0.066193 ┆ 0.008414 │\n", "│ 000004.SZ ┆ 20250103 ┆ 1.972985 ┆ 2.34744 ┆ … ┆ -0.616573 ┆ null ┆ 0.00893 ┆ 0.004788 │\n", "│ 000004.SZ ┆ 20250106 ┆ 1.11025 ┆ 1.835256 ┆ … ┆ -0.616011 ┆ null ┆ -0.0142 ┆ 0.011516 │\n", "│ 000004.SZ ┆ 20250107 ┆ 1.13863 ┆ 1.906626 ┆ … ┆ -0.616854 ┆ null ┆ 0.013031 ┆ 0.01138 │\n", "│ 000004.SZ ┆ 20250108 ┆ 1.440421 ┆ 2.01438 ┆ … ┆ -0.616854 ┆ null ┆ 0.00442 ┆ -0.000694 │\n", "│ 000004.SZ ┆ 20250109 ┆ 1.067777 ┆ 2.10884 ┆ … ┆ -0.617135 ┆ null ┆ 0.024865 ┆ -0.004267 │\n", "│ 000004.SZ ┆ 20250110 ┆ 1.048783 ┆ 2.080153 ┆ … ┆ -0.616854 ┆ null ┆ 0.073486 ┆ -0.005361 │\n", "│ 000004.SZ ┆ 20250113 ┆ 0.783364 ┆ 1.832457 ┆ … ┆ -0.615668 ┆ null ┆ -0.04458 ┆ 0.001935 │\n", "│ 000004.SZ ┆ 20250114 ┆ 0.971525 ┆ 1.87234 ┆ … ┆ -0.613797 ┆ null ┆ -0.152621 ┆ 0.003452 │\n", "│ 000004.SZ ┆ 20250115 ┆ 1.829191 ┆ 2.168315 ┆ … ┆ -0.613797 ┆ null ┆ -0.152621 ┆ 0.007143 │\n", "└───────────┴───────────┴───────────┴──────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", "结果后5行预览:\n", "shape: (5, 42)\n", "┌───────────┬───────────┬───────────┬──────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_dat ┆ turnover_ ┆ open ┆ … ┆ cashflow_ ┆ ebitda_ra ┆ future_re ┆ predictio │\n", "│ --- ┆ e ┆ rate ┆ --- ┆ ┆ act_rank ┆ nk ┆ turn_5 ┆ n │\n", "│ str ┆ --- ┆ --- ┆ f64 ┆ ┆ --- ┆ --- ┆ --- ┆ --- │\n", "│ ┆ str ┆ f64 ┆ ┆ ┆ f64 ┆ f64 ┆ f64 ┆ f64 │\n", "╞═══════════╪═══════════╪═══════════╪══════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 605588.SH ┆ 20260302 ┆ 0.009947 ┆ 2.541258 ┆ … ┆ 1.00409 ┆ null ┆ null ┆ 0.00702 │\n", "│ 605588.SH ┆ 20260303 ┆ 0.133214 ┆ 2.553853 ┆ … ┆ 1.372931 ┆ null ┆ null ┆ 0.021044 │\n", "│ 605588.SH ┆ 20260304 ┆ 0.021087 ┆ 2.167616 ┆ … ┆ 1.004146 ┆ null ┆ null ┆ 0.01389 │\n", "│ 605588.SH ┆ 20260305 ┆ -0.069317 ┆ 2.15852 ┆ … ┆ 1.003572 ┆ null ┆ null ┆ 0.010792 │\n", "│ 605588.SH ┆ 20260306 ┆ -0.288642 ┆ 2.173913 ┆ … ┆ 1.002681 ┆ null ┆ null ┆ 0.009205 │\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.008414 │\n", "│ 000007.SZ ┆ 20250102 ┆ 0.019858 ┆ -0.000127 │\n", "│ 000010.SZ ┆ 20250102 ┆ 0.076274 ┆ -0.002403 │\n", "│ 000014.SZ ┆ 20250102 ┆ -0.064651 ┆ -0.002853 │\n", "│ 000040.SZ ┆ 20250102 ┆ -0.093583 ┆ -0.077776 │\n", "│ 000042.SZ ┆ 20250102 ┆ -0.035958 ┆ 0.003656 │\n", "│ 000056.SZ ┆ 20250102 ┆ -0.033205 ┆ 0.018378 │\n", "│ 000068.SZ ┆ 20250102 ┆ -0.021277 ┆ 0.010857 │\n", "│ 000153.SZ ┆ 20250102 ┆ -0.018193 ┆ 0.001929 │\n", "│ 000159.SZ ┆ 20250102 ┆ -0.067833 ┆ 0.003916 │\n", "└───────────┴────────────┴─────────────────┴────────────┘\n" ] } ], "execution_count": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 保存结果" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T14:21:21.992341Z", "start_time": "2026-03-09T14:21:21.689211Z" } }, "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.030035 ┆ 002427.SZ │\n", "│ 2025-01-02 ┆ 0.02861 ┆ 002076.SZ │\n", "│ 2025-01-02 ┆ 0.026407 ┆ 000518.SZ │\n", "│ 2025-01-02 ┆ 0.026051 ┆ 603838.SH │\n", "│ 2025-01-02 ┆ 0.025572 ┆ 002199.SZ │\n", "│ … ┆ … ┆ … │\n", "│ 2025-01-06 ┆ 0.035263 ┆ 002427.SZ │\n", "│ 2025-01-06 ┆ 0.032408 ┆ 600962.SH │\n", "│ 2025-01-06 ┆ 0.03104 ┆ 605298.SH │\n", "│ 2025-01-06 ┆ 0.030765 ┆ 301006.SZ │\n", "│ 2025-01-06 ┆ 0.030541 ┆ 002522.SZ │\n", "└────────────┴──────────┴───────────┘\n" ] } ], "execution_count": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.5 特征重要性" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-09T14:21:22.000983Z", "start_time": "2026-03-09T14:21:21.996749Z" } }, "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 883.242468\n", "bbi_ratio 719.403482\n", "reversal_1 616.343038\n", "turnover_deviation 563.883571\n", "turnover_rate_mean_5 553.710151\n", "ma_ratio_5_20 493.930772\n", "return_20 477.078960\n", "return_5 465.129010\n", "volume_ratio 438.578614\n", "roe 386.244247\n", "EP_rank 324.897361\n", "ma_20 313.170879\n", "momentum_accel 273.272078\n", "net_profit_growth 227.346561\n", "BP_rank 210.965235\n", "volatility_ratio 200.314833\n", "roe_delta 153.102754\n", "cashflow_act_rank 136.542178\n", "ma_5 116.355596\n", "market_cap_rank 89.142452\n", "debt_to_equity 68.378507\n", "current_ratio 63.483876\n", "revenue_growth 0.000000\n", "ebitda_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-09T14:21:22.011078Z", "start_time": "2026-03-09T14:21:22.007446Z" } }, "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", "特征数量: 24\n" ] } ], "execution_count": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 绘制特征重要性(辅助特征选择)\n", "\n", "**解读**:\n", "- 重要性高的特征对模型贡献大\n", "- 重要性为0的特征可以考虑删除\n", "- 可以帮助理解哪些因子最有效" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-09T14:21:22.149719Z", "start_time": "2026-03-09T14:21:22.016953Z" } }, "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+naQAA4spJREFUeJzs3QmcjeX///GPGbLvCUl2kSWylCVrIr6iBZUlaVGhJCVljwhFyZd2UdoXKiUp0jdrKHspouwJlawz/8f7+j/u8ztznDMGc5s5Z17Px+OYmXPf577vOXM79/25Pp/rujIlJiYmGgAAAAAASHVxqb9JAAAAAABA0A0AAAAAgI/IdAMAAAAA4BOCbgAAAAAAfELQDQAAAACATwi6AQAAAADwCUE3AAAAAAA+IegGAAAAAMAnBN0AAAAAAPiEoBsAACCNbN261bJly2b/+9//zsr+unbtaiVLljyt1z788MN22WWXpfoxAUCsI+gGAMSkKVOmWKZMmcI+FDz44dtvv7UhQ4bYvn37LL2+H8uWLbNo9d///tf9HrFk2LBhLpCtV6/eCcsWLFhg7du3t2LFitk555xjefPmdevqNTt37jzrx9q7d2/7/vvvbebMmWd93wAQzTKn9QEAAOAnBSilSpVK8lzlypV9C7qHDh3qson58uXzZR8ZmYLuc889172/sWD37t326quvukeoQYMG2WOPPWalS5d2v6++Hjp0yL777jt78skn3Wt+/vnnU97nCy+8YAkJCad1vEWKFLE2bdrY2LFj7ZprrjmtbQBARkTQDQCIaVdffbXVrFnTotk///xjOXPmtIzq4MGDliNHDos1r732mmXOnNlat26d5Pm33nrLBdzKck+bNs1luYONGzfOPU5HlixZzuiYdUzt2rWzX375xTUEAABOjvJyAECG9umnn9oVV1zhgtrcuXNbq1atbM2aNUnW+eGHHwLZRvW/VcavW7du9scffwTWUVn5gw8+6L5XZt0rZd+8ebN76PtwpdF6Xq8N3o6eW7t2rd18882WP39+q1+/fpJArUaNGpY9e3YrUKCA3Xjjja5f8OnQ75QrVy7bsmWL/ec//3Hfq5R54sSJbvmqVausSZMm7r0pUaKETZ8+PWzJ+tdff23du3e3ggULWp48eaxLly72559/hs1UV6pUybJmzWrnn3++9ejR44RS/EaNGrlK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r1/fvvrqq7Db++OPP+yCCy5wx79v374zek8AIFqkedC9Y8cO69Wrl5UuXdqyZs1qxYsXt9atW9vcuXMtlqxZs8auv/56K1mypLvQjB8//oR1Ro4cabVq1bLcuXPbeeedZ23btrUNGzakyfECAID0pVKlSrZ9+/bA45tvvkkScLdo0cKuuuoqW7JkiS1dutR69uxpcXH/d6vXuHFje/vtt929hQLnn3/+2W644YZk96n7FQXVM2fOtFWrVtl1111n7du3txUrVgTW+c9//mPHjh2zL7/80r777ju75JJL3HO6xwt12223WdWqVVPtPQGAaJA5LXe+efNmq1evnuXLl8/GjBljVapUsaNHj9rs2bOtR48etn79eosVBw8edA0L7dq1s/vvvz/sOvPnz3e/twJvXbweeeQRd/Fcu3ata10+FZeNnGvHMp/aa4D0Imt8oo2ubVZ5yGw7fDxTWh8OcMo4h5FaNo9qFfg+c+bMLuMcju4t7r33Xnv44YcDz1100UUnrOMpUaKEW1cN/Lr3ypIlS9jtKkD/73//a7Vr13Y/DxgwwMaNG+eC6+rVq9uePXvsp59+spdeeikQTI8aNcq9ZvXq1UmOd9KkSS67PWjQIPv0009P+z0BgGiTppnue+65x2V91SKrLHD58uVdK26fPn1s0aJFbp0tW7a4kqVcuXK5kiW1ru7cuTPiNhs1amS9e/dO8pwuKCqN8ijbPHz4cOvSpYvbri48asHdvXt3YF+6cCxbtizwmilTprjGATUIVKxY0a2jFmW1NKeEAmk1LNx4440uox/OZ5995o5T74FaibVP/f66sAEAgIxNwe3555/vGvE7duzo7hFk165dtnjxYlclV7duXStcuLA1bNgwSSY81N69e+31119360cKuL3A/d1333XrJyQk2JtvvmmHDh1y91tSsGBBt87UqVPtn3/+cUmD5557zh1LjRo1AttRAmHYsGFuveDsOwBkBGn2qacPbwWZyuyGy+IqwNWHu4Jgrass8Jw5c+yXX36xDh06nPH+1UqrLLvKo1q1auX6NSkI79Spky1fvtzKlCnjfk5MTEySrR47dqxNmzbNvv76a3ex69u3r/ll//797muBAgV82wcAAEj/LrvsMtcYr3snZYw3bdpkV1xxhf3111/u3sjr933HHXe4ddT3umnTpi5QD9avXz9336VgWfcx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utSee+45q1q1auC54sWL2/bt25M8hg4darly5bKrr77ardOhQ4cT1mnevLk1bNjQzjvvvIjvsQLuNWvW2Jw5c+zjjz+2r7/+2u68887A8r59+56w3YsvvtjatWsXWGfAgAHumCdMmGBr1661u+66y6699lpbsWIFf1sAQPQG3Tt27LBevXpZ6dKlLWvWrO6C3Lp1a5s7d67Fmn379lmPHj2saNGi7nctX768zZo1K60PCwCAVKUMs4LgF154wfLnzx94Pj4+3ooUKZLk8cEHH1j79u1d4C3Zs2dPslyv+fLLL13mOpJ169a5jPSLL75ol112mdWvX98Fzm+++aZt27bNraPtB293586dLrAO3u60adPskUcesZYtW7r7krvvvtt9/+STT3KGAADCymzpnMrM6tWr58rAxowZY1WqVHGlXbNnz3bB6fr16y1WHDlyxJo1a+Za6d99910rVqyY/frrr+53P1WXjZxrxzL/XzkcEE2yxifa6NpmlYfMtsPHM6X14QCnjHM4vM2jWgW+1zW8VatWduWVV9rw4cMjvpffffedrVy50iZOnBhxnalTp1qOHDnshhtuiLjOwoUL3fW0Zs2agee077i4OFu8eLHLVodSgK7G7yuuuCLw3OHDh11ZeTA1AnzzzTcR9w0AyNjSfab7nnvucf2plixZYtdff727+FWqVMn69OljixYtcuts2bLF2rRp41qo1U9LreFqnY6kUaNGgb5jnrZt21rXrl0DP5csWdLdBHTp0sVtt0SJEjZz5kzbvXt3YF8qh1u2bFngNepjpgu6GgQqVqzo1mnRooUrT0uJl19+2fU3+/DDD11Dg45BpXLqLwYAQKxQdnn58uU2cuTIk6770ksvuWtq3bp1k13n5ptvdsFvclVzoaXnmTNntgIFCrhloQ4dOmSvv/76CdlzlbE/9dRT9tNPP1lCQoIrVX///fdTfK0HAGQ86TrTrQBUpWAjRoxIMoiJRwGuLnheEDx//nw7duyYaz1Xf6958+ad0f7HjRtnjz/+uA0cONB937lzZ3fR79atm8u69+vXzwXl6h+mhgE5ePCgjR071pWfqfW8U6dOro+YLtwno6C+Tp067vhnzJhhhQoVcjcR2o9K58JRi7sengMHDrivWeMSLT4+8Yx+fyCt6PwN/gpEG87h8FSptnXrVrvvvvtc1yld2/RcYmKi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pKWMdA5vHtUqyc9///23C15feOEFGz58eJJl999/v91777328MMPB5676KKLTthm7ty5rUiRIik+Bi+bPm/evLDLFZDr4VEjvq61kyZNsrFjx7rnpk2bZm3btnVBt7dO//797YknnnD3G6d7PQYAIN1nuu+55x53oVOL+PXXX2/ly5e3SpUqWZ8+fWzRokVunS1btlibNm0sV65cLmht37697dy5M+I2VYIWWu6mC23Xrl2TlLfpZqFLly5uuyozmzlzpu3evTuwL7XgL1u2LEmmWo0DahCoWLGiW0cXebXSp5R+V91oeI/ChQuf4jsGAEDaUYDaqlUru/LKK5M8v2vXLlu8eLGdd955VrduXXd9a9iwoX3zzTcnbEPl5AULFrTq1au7Bvdjx46l+nHu37/fChQoEPj58OHDJ1SXqRT9t99+s19//TXV9w8AyDjSddC9d+9e++yzz9wFXH2/QinAVbmYgmCtO3/+fJszZ4798ssv1qFDhzPev8rKlGVfsWKFu4Ho3LmzC8I7depky5cvd33C9HNiYmKSEje1mqvF/Ouvv3YNAn379k3xPpUhUICvEnr9XiqDAwAgGrz55pvu+jhy5MgTluna7I2zcscdd7jr+6WXXmpNmza1n376KbCeMuHazldffWXdu3e3xx9/3B566KFUPc6NGzfahAkT3PY9zZs3t/fff991XdO9xY8//mhPPvmkW3YqjecAAERVebkuigpoK1SoEHEdXRxXrVplmzZtcoGqTJ061WXD1VesVq1ap73/li1bBi7IgwYNcmVo2l67du3cc/369bM6deq4rLpXBqfSd/UTU0Au6qumvmkpoRK7l19+2WXQ1QKv4F3ZAAXeF1xwQdjXqGVeD8+BAwfc16xxiRYf/3+NAUA00fkb/BWINhnpHNZ1T7Zu3Wr33XefzZo1y+Lj493zuoYrgNX33qBlt99+u2u8ltGjR9sXX3zhStFHjBjhngvuv62qMW1LVW+6lmpcl+R4GXHtzzuuUL///rurQlP1nCrcvPX0vQLt//znP+45Vc7pGv7YY48FfoeMxvudM+LvjtjBeQw/pfTzMV0H3cEZ5EjWrVvngm0v4JaLL77YZcG17EyC7uABYLwyb/UpD31OJXNe0K0RT72AW4oWLeqWp4QCeD08Crh1w6GBX3TRD0fZhKFDh57w/IDqCZYjx/EU7RdIrx6rmZDWhwCckYxwDivIFnX50vWudu3agWUKVhcsWGATJ050D1Hw7b1G8ubN68rOg58LdujQIRdMq0G9WLFiyR6LGuHl888/d128QqkqbsCAAa6rmgZkDd3nFVdc4a69Gv1cQfcPP/zgnv/5559tz549llGpihCIdpzH8IOqnKM+6C5Xrpzr45zag6VplNTQgD5cK0WWLFkC33sDqIR7TjcV4V7jrZOSxoNwtC31Z1PGPxIN8qL+7cGZbjVADF8RZ8eyxJ/WfoG0puyggpWBy+LscAKDFyH6ZKRzePWQ5oGAVWOqBFMZuaq41M1KFWhqQFY/aVWSeTR1l0q7g58LNn36dHfdvuGGGyx//vzJHovXFU2jo6vxPTTD3axZM6tfv769+uqrLoN+Mh9++KFdfvnldtNNN1lGpHsjBSp630Lvb4BowXkMP3lVxlEddGuAE12I1TquPl6h/brVEq1MsEra9PCy3WvXrnXLlPEOp1ChQkn6Zx0/ftxND9K4cWNLT3RcarWPdCMiKrULV26nm7xjMT5iLmKfzuNYH/kZsS0jnMNeMKZrdvDAZKJss665akCWBx980AXZ6sut+bAV/GoU8ffee89tR1OKKeut67FGMNfPeo3K0TUAmxc8qx+4Mt9eVl1Ti+qhGU9EjfV6/YUXXuiOyQu4NWbKU089lWQeb69STZnsd9991w22quz6K6+84o5L48Vk9IBTv39Gfw8Q/TiP4YeUfjam66BbFHBrMDNdWNWfSyXfKjNTy6v6WCvAVsm3picZP368W6a+XxoRtWbNmmG32aRJE5cd/uSTT1wpeOgFOK3o91OLetmyZd3xaMRWjZiq/m+nanH/pm7kVyBaW6VV9qkMGjd6iEacw+Fp5hAFtJo6TKXel1xyibuee92y1IisQdQ02JrGKylVqpRbN7iiS++tAvXgkj6NpRLc1apBgwbuqwJn9dXWPlQ1pkfoGCnB1WhqBFBWXs+pu5emIAsulwcA4HSk+6Bb82RqJFQNsPLAAw+4DLVazWvUqOGCbpVvz5gxww28oousStA0QIpGJY2kW7du9v3337uRxzNnzuwu6Okhy/3nn3+6Ujy11quETr/jt99+GzFjDwBAehZu3mzN0R08T3cwZcC96UAj0ZSeod22FKTrEYkC7+BpQcM599xzXWYdAIDUlinxdDscI932K9CgNCqTI9ONaM8SqmsFmW5EI85hxALOY8QCzmOcjdhLM09pAM6onKcbAAAAAIBoRtB9FmlAmUgPTakCAAAAAIgt6b5PdyxZuXJlxGUnm3sUAAAAABB9CLrPIo1KDgAAAADIOCgvBwAAAADAJwTdAAAAAAD4hKAbAAAAAACfEHQDAAAAAOATgm4AAAAAAHxC0A0AAAAAgE8IugEAAAAA8AlBNwAAAAAAPiHoBgAAAADAJwTdAAAAAAD4hKAbAAAAAACfEHQDAAAAAOATgm4AAAAAAHxC0A0AAAAAgE8IugEAAAAA8AlBNwAAAAAAPiHoBgAAAADAJwTdAABkQKNGjbJMmTJZ7969A891797dypQpY9mzZ7dChQpZmzZtbP369Ulet3TpUmvatKnly5fP8ufPb82bN7fvv/8+2X01atTI7Sv4cddddwWWT5ky5YTl3mPXrl2B9SZOnGgVK1Z0x3fRRRfZ1KlTU/U9AQDAD1EfdA8ZMsSqVauW1ocBAEDUUOD83HPPWdWqVZM8X6NGDXvllVds3bp1Nnv2bEtMTLSrrrrKjh8/7pb//fff1qJFC7vwwgtt8eLF9s0331ju3Lld4H306NFk93nHHXfY9u3bA4/Ro0cHlnXo0CHJMj20zYYNG9p5553n1pk0aZL179/fXffXrFljQ4cOtR49ethHH33ky3sEAEDMBN07duywXr16WenSpS1r1qxWvHhxa926tc2dO9diiW4Qrr/+eitZsqRruR8/fnzY9dSKr3WyZctml112mS1ZsuSsHysAIHYpcO7YsaO98MILLlMd7M4777QGDRq469Cll15qw4cPt61bt9rmzZvdcmW99+7da8OGDXOZ5kqVKtngwYNt586d9uuvvya73xw5cliRIkUCjzx58gSWKXMdvCw+Pt6+/PJLu+222wLrTJs2zWXiFaDrnuHGG290x/vEE0+k+nsEAEBqymxpSBfxevXquRK1MWPGWJUqVVxLuVrX1XodWtIWzQ4ePOhuEtq1a2f3339/2HXeeust69Onj02ePNkF3ArM1dK/YcOGQEt/Sl02cq4dy5wzlY4eOLuyxifa6NpmlYfMtsPHM/H2I+qkt3N486hWge91fW3VqpVdeeWVLqiO5J9//nFZ71KlSrkGcVGgXbBgQXvppZfskUcecRlwfa+SbwXqyXn99dfttddec0G1GtcHDhzoAvFwVDauZTfccEPgucOHD7sG6WAK1tU4rXuHLFmypPj9AAAgw2S677nnHpf11QVTWeDy5cu7VnMFnosWLXLrbNmyxfUpy5Url2sVb9++vWtRT67fWHD/NGnbtq117do18LNuDHSj0aVLF7fdEiVK2MyZM2337t2BfankbtmyZUn6m6lxQA0CurnQOiqxUwlcStSqVcs1LKhlXhn9cJ566ilXfnfrrbfaxRdf7IJv3XS8/PLLKdoHAADJefPNN2358uU2cuTIiOv897//ddc4PT799FObM2eOnXPOOW6ZSsnnzZvngmcFvFrns88+c+tlzhy5Hf/mm292r/nqq69cibiy1p06dYq4vgJ5vUb78KgR+sUXX7TvvvvOlb3rGq2fFXDv2bOHPzwAIN1Ks0y3ytN0oR4xYoTlzHliRlYBbkJCQiAInj9/vh07dsy10Ku0TBf9MzFu3Dh7/PHHXUu7vu/cubPVrVvXunXr5oLjfv36uaBcZeFqGPCy1WPHjnU3C3Fxce6GoW/fvq71/kwdOXLE3UjoZsSjfSgTsXDhwoivU8u/Hp4DBw64r1njEi0+PvGMjwtICzp/g78C0Sa9ncMKTFUmft9999msWbNc+baeU/Cqa21wf2w1bqsBW92/1BisCi1dg5Vl/vfff911sk6dOu5aqEy31mnZsqW7VgUHycHUmOypUKGCG6RNQbQq2jRwWzA1uqtPubLswcf18MMP27Zt2+zyyy93x124cGF3HX7yySfdcZysTzlO77wJ/gpEI85j+Cmln49pFnRv3LjRXTR18Y1E/bpXrVplmzZtCpS2qeRM2XANAqPs8enSDYL6hsmgQYPcAC3anm4uREG3biqUVVcpnPemKvvs3SD07NnT9WtLDWql102DbiKC6efkyuyVrdBgMqEGVE+wHDn+/8A3QLR6rGZCWh8CEBPnsAJtBbMaCbx27dqB5xVwL1iwwI0n8s4777hgPJiqxBTYavAy9fVW1vvHH390DcTeqOLKSGsdXQ+vuOKKFB3PoUOHApn36tWrJ1k2YcIEV9KuoF/HHezaa691pen79u1z/dE///xzF+jrnkAN1fCH/u5AtOM8hh+UlE3XQbcC7pNRS7eCbS/gFpVdKwuuZWcSdAeP2OoFuupTHvqcbiq8oFul3sEt8kWLFk0ylUla0I2PyvGDM916v4aviLNjWZLePAHRQtlBBSsDl8XZ4YS07w8LRPs5vHpIcxcQK4sdTF2a1E9bVVuVK1c+4XWqpFIwq2uvGqvVCK4gV33CvSowVaGptFzXVa2TEt9++637qgA6+HqsQd4UwKsLWEq2pbFPrrnmGvvPf/6Tov3i1CjZoEClWbNm9JlH1OI8hp+8KuN0G3SXK1fOXbBTe7A03RyEBvTh0v7BA654Nw7hnlMWINxrvHVS0niQEueee67LMIT2Vw/OtIej/uHh+ojrJu9YOhi8BzgTOo/TwyBUQLSfw7p+FShQwD2CqfuWSr2Vbf7ll1/cgJ6aIkzP/fbbb24ubwXZCo61DY1lojJvjZ2imUd0jdQ6Crq9wOz3339383irMk1Z9Z9//tmmT5/ugmgNwvbDDz+4AUWVOdcUZcHef/99F8TfcsstJ1xzlWHXGDAaaPTPP/90Ze3qAqb9MIia/+cP7zGiHecx/JDSz8Y0q8XShV/9uVTSphFSQ6l0TAOWqQ+aHp61a9e6ZWp1D0c3CsGDm6lke/Xq1ZbeaZAa3XwET5Wmmxn9rDJ3AAD8pD7bKjVXcFy2bFk3fooGTlNW2ptBQ13CNC+2Amddm5Q9Vz9rjdGi6i+voVuzbngld7q+ffHFFy6Y1+sfeOABN3hquPm1NYDadddd5yraQul6rv7bl1xyiQvwVaKuYzvZqOkAAGToKcMUcGvKMLWEqy+YSszUwq1SJvWxVoCtkm/NJ6oSMi3TiOcNGza0mjVrht1mkyZNXLn1J5984krB1RKuID2taaA0/T7e98oErFy50mUZdHMjOm617ut303ui31kNEsED0KTU4v5NXUYBiEa6aVdfTpXEkl1BNIqWczh4UNLzzz//hD7U4Sjg1SMSBcHBVWDq8qSB2E6l7DwcNcSvWLEiRdsBACA9SdOgW/NWa+oSjWCulm9lqJWpVsZXQbfKt2fMmOFK2FSGptJxlbZpkJVINKrq999/70YeV7mbStgaN25saU2ZgODBYjQKuh5qQPBuepRV0LRlGthNA8hUq1bNZQ9CB1cDAAAAAESHTImp1SkZ6aYzf968ed1o6GS6Ee1ZQpW5pucsIRAJ5zBiAecxYgHnMc5G7LV//37LkydPxPWYXwMAAAAAAJ8QdKcS9c2O9NDANAAAAACAjCdN+3THEg2KFkmxYsXO6rEAAAAAANIHgu5U4o1ADgAAAACAh/JyAAAAAAB8QtANAAAAAIBPCLoBAAAAAPAJQTcAAAAAAD4h6AYAAAAAwCcE3QAAAAAA+ISgGwAAAAAAnxB0AwAAAADgE4JuAAAAAAB8QtANAAAAAIBPCLoBAAAAAPAJQTcAAAAAAOk96N63b19qbQoAAAAAgIwbdD/xxBP21ltvBX5u3769FSxY0IoVK2bff/99ah4fAAAAAAAZK+iePHmyFS9e3H0/Z84c9/j000/t6quvtgcffDC1jxEAAAAAgKiU+XRetGPHjkDQ/fHHH7tM91VXXWUlS5a0yy67LLWPEQAAAACAjJPpzp8/v23dutV9/9lnn9mVV17pvk9MTLTjx4+n7hECAAAAAJCRgu7rrrvObr75ZmvWrJn98ccfrqxcVqxYYWXLlrWzaciQIVatWrWzuk8AQMY1adIkq1q1quXJk8c96tSp47pYBVeDde3a1T3y5ctnl156qb333nsnbOeTTz5x1WHZs2d3jdlt27aNuM+jR49av379rEqVKpYzZ047//zzrUuXLrZt27aw6x8+fNhdGzNlymQrV64Mu87GjRstd+7c7hgBAEA6C7rHjRtnPXv2tIsvvtj1586VK5d7fvv27XbPPfec0rZ0c9KrVy8rXbq0Zc2a1ZWtt27d2ubOnWuxZM2aNXb99de7EnzdBI0fPz5sA4KWBT8qVKiQJscLAAjvggsusFGjRtl3331ny5YtsyZNmlibNm3c57woGP7xxx/tkUceseXLl7uGanXDUsO0R0F4586d7dZbb3UDkP7vf/9zjdmRHDx40G1r4MCB7uv7779vGzZssGuuuSbs+g899JALzJML4m+66Sa74oor+DMDAJAe+3RnyZLF+vbte8Lz999//yltZ/PmzVavXj3Xyj5mzBjXgq8bgdmzZ1uPHj1s/fr1Fit0w6SGhXbt2iX7PlWqVMm++OKLwM+ZM5/Wn8guGznXjmXOeVqvBdJa1vhEG13brPKQ2Xb4eKa0PhzA2TyqlfuqhuFgI0aMcNnvRYsWuc/wb7/91iZMmGAFChRwn/sDBgxwjdUK0qtXr27Hjh2z++67z133brvttsB21JAdSd68eV0jd7Bnn33WateubVu2bLELL7ww8Lyy7p9//rkL7IMz8MF0TGrUbdq0qTteAACQDufpnjZtmtWvX9+1pP/666/uOWVvZ8yYkeJtKCuubO6SJUtcFrh8+fLuhqVPnz7u5kV0M6EMgrLpKuNTtmDnzp0Rt9moUSPr3bt3kudUsqcyP4+yzcOHD3fZCG23RIkSNnPmTNu9e3dgXyodVAbDM2XKFNc4oAaBihUrunVatGjhsvspUatWLXeDdeONN7qMfiQKsosUKRJ4nHvuuSnaPgDg7NM4Jm+++ab9888/rsxc6tata++++6799ddflpCQ4JYfOnTIXZ9Emerff//d4uLiXBBetGhR101r9erVp7Tv/fv3u2tocHm4ro933HGHu0bnyJEj7Ou+/PJLe+edd2zixIln9LsDAAAfg2616Csw1k3Cvn37AoOn6cIfrmw6nL1797pB2JTRVv+0UNqWblYUBGvd+fPnu1b+X375xTp06GBnSlkHZdlV7teqVStX5qcgvFOnTu6GqEyZMu5nDQ4XnK0eO3asu5n5+uuvXYNAuIz/mfjpp59cQ4ayIx07dnT7AACkL6tWrXKNr2pEveuuu+yDDz4IZKrffvttV7Wl64rW6d69u1vujXmi65jXpUgZZ80Coj7dCsp1vUsJBfHq460ScTVIi65XamDW8dSsWTPs6zQOi9ZRQ7L3OgAA4K/Tql1W2dwLL7zgMsjq1+bRRT6lQagGcNENQnJ9ltWvWzc2mzZtCkxRNnXqVJcNX7p0qcsen66WLVu6GyEZNGiQa0jQ9lT+LbqZUdZCWQNlnEU3UZqjXAG5qF/7sGHDLLVoQB3dCF100UUugz506FDX307ZDw12E2mwHD08Bw4ccF+zxiVafPz/NRgA0UTnb/BXID3QNcCjhlFdh/SZqzLuW265xXUNUuD96KOP2p9//uk+wzWd5qxZs1yVljLM6kZ15MgRt42HH3440Cf7+eeft1KlSrmsuDLVJzsObU8N088880zguFRuruPRdVjPec8Hf69ydjVc6/qm57xG8+DfDQg95zk/EM04j+GnlH4+nlbQrSBYJXGh1OKvEruUCM4gR7Ju3ToXbHsBt+iGRllwLTuToFvl457ChQu7r7oZCn1u165dgaBbpXpewC0qCdTy1OKNAu8dn4Jwlb4raxLc7y/YyJEj3Y1dqAHVEyxHDqZvQ3R7rGZCWh8CEKDgORxVTanrkQYvu/baa+2///2vC4bVz1oNtzVq1HCf5RpY7e677w5UMKlSLHibynZ/9dVXVqxYsYjvuvqDq6uStqtG32+++SawTAG7ukWFVo9dfvnl1rBhQ9ePXBVjH330kT311FOB5Qres2XL5rp8eVOAAsFCxxMAohHnMfygSmjfgm61xmsKEt1EBFO5uPo7p0S5cuVcX7TUHixNfeRCA/pwLRAaDM6j44j0nG5Gwr3GWycljQenS40L6ueuqoBI+vfv70r9PcpyqJFi+Io4O5Yl3rdjA/ykDLcC7oHL4uxwAgOpIX1YPaR5xGXqWqXGWg1s5gXiW7dudVNr6tqh/tMa9VxVVhoPReOKFCxY0P3sXafUR1sjoXvPRRpxXH3FNdp5oUKFkiyvXLlyoNpJVDGl7lPTp093x6X9L1y4MJDdFgXg6jalLlwK9hX4A8HnnAIV7zwGohHnMfwUfN1N9aBbQZ76YqtPmYJODYT2xhtvuKzriy++mKJtaFTX5s2buxuRe++994SWeWUAFMDrpkUPL9u9du1atyzSKK+6CQke3Ew3FyrPbty4sUWbv//+237++WfXLzASVReEG5hNgcoxRn1GlNN5zOjlSC+8oEONnapMUiZbAbCCWgWtynarYkp9t5VVVum4ugtpPm6VnqvvtrahYFv9rpWp1sCeasBW9lo02Ka3H3W/0nVV2XMv4NaYI9qOGpjVP9u7np5zzjlJKrHEC6B1DGosD63yEk1X5g3oBiR37hN0I9pxHsMPKf1sPK2g+/bbb7fs2bO7AWCUUtfcohr86+mnn3Y3DCmlgFvZALXA6+ZDNwMqnVOrqvpYK8DWDYwGFFMWQctU/qYyuUiDxChLoEYB3eToBkQldArS05r68On38b7XyLWqFtAgO97gOuqHp6lodAO2bds2Gzx4sMXHx7sbrVO1uH9Td2MHRCMFGCq7VWaRGz2kN+pWpIE21cCrqbx07VLArWyg6NxVqbmmEtNgafqMf/XVV5NksBVka7YKNar++++/rjuR+nwHZ5o1D7ey36JrhmbZkGrVqiU5HpWkeyOjAwCA9OeUg24FvmrVV5ZawbCCbmVkzzvvvFPeuQaiUau9bkweeOABdwOjTLX6vynoVvm2piDr1auXNWjQwLXGa5ouDeQWSbdu3VzLvW6IdEOjObHTQ5ZbQXRwJkHlfHqoAWHevHnuud9++80F2Mpe6H1QCaKmTgstIQQApJ2XXnrppN2nNBaHgm8F2uEajvScdx2IJLj7kjLip9qdKSWv0UjmwVNqAgCA1Jcp8TQ6JWtAMQ1kFtqnG+mjX4EyL3v27CHTjajPdEcKWID0jnMYsYDzGLGA8xhnI/ZSZVpyU3Ge1jzdKgfX/NYAAAAAACCV+3SrX7XKwVUOrVLw0EHQQgdqyQjUNzuSTz/91M23DQAAAADIWE4r6PYGS9Oo46HTZ+lr8HQkGYUGRYskuTlXAQAAAACx67SC7k2bNqX+kUQ5bwRyAAAAAADOKOhmADUAAAAAAHwKuqdOnZrsck3XBQAAAABARndaQfd99913wlD8mq/7nHPOcdOJEXQDAAAAAHCaU4b9+eefSR5///23bdiwwerXr29vvPEG7ysAAAAAAKcbdIdTrlw5GzVq1AlZcAAAAAAAMqpUC7olc+bMtm3bttTcJAAAAAAAGatP98yZM5P8rPm5t2/fbs8++6zVq1cvtY4NAAAAAICMF3S3bds2yc+ZMmWyQoUKWZMmTezJJ59MrWMDAAAAACDjBd0JCQmpfyQAAAAAAMSY0+rTPWzYMDdFWKh///3XLQMAAAAAAKcZdA8dOtRNExZKgbiWAQAAAACA0wy6NXCa+nGH+v77761AgQK8rwAAAAAAnGqf7vz587tgW4/y5csnCbyPHz/ust933XUXbywAAAAAAKcadI8fP95lubt16+bKyPPmzRtYds4551jJkiWtTp06vLEAAAAAAJxq0H3LLbe4r6VKlbK6detalixZeBMBAAAAAEjNKcMaNmwY+P7QoUN25MiRJMvz5MlzOpsFAAAAACCmnNZAahqlvGfPnnbeeedZzpw5XV/v4AcAAAAAADjNoPvBBx+0L7/80iZNmmRZs2a1F1980fXxPv/8823q1Km8rwAAd42oWrWqq37SQ2N+fPrpp+6d2bt3r/Xq1csuuugiy549u1144YV277332v79+8O+c3/88YddcMEFbgDPffv2Jfvu/vjjj9amTRs799xz3X7r169vX331VZJ15s6d67pJ5c6d24oUKWL9+vWzY8eOBZYPGTIkMHBo8EMNzQAAAL4H3R999JH997//teuvv94yZ85sV1xxhQ0YMMAef/xxe/311+1s0o1RtWrVzuo+AQAnpyB51KhR9t1339myZcusSZMmLhhes2aNbdu2zT3Gjh1rq1evtilTpthnn31mt912W9ht6XkF8Cnxn//8xwXQahzWvi+55BL33I4dOwLTW7Zs2dJatGhhK1assLfeestmzpxpDz/8cGAb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AAAAAABEM4Lus0h9syM9FixYcDYPBQAAAABwFqT7Pt2xRIOiRVKsWLGzeiwAAAAAAP8RdJ9FpzoCOQAAAAAgulFeDgAAAACATwi6AQAAAADwCUE3AAAAAAA+IegGAAAAAMAnBN0AAAAAAPiEoBsAAAAAAJ8QdAMAAAAA4BOCbgAAAAAAfELQDQAAAACATwi6AQAAAADwCUE3AAAAAAA+IegGAAAAAMAnBN0AAAAAAPiEoBsAAAAAAJ8QdAMAAAAA4BOCbgAAAAAAfELQDQAAAACATwi6ASCdGzlypNWqVcty585t5513nrVt29Y2bNgQWL5582bLlClT2Mc777zj1vnjjz+sRYsWdv7551vWrFmtePHi1rNnTztw4EDE/Wq7t912m5UqVcqyZ89uZcqUscGDB9uRI0cC6wwZMiTsfnPmzBlY54UXXrArrrjC8ufP7x5XXnmlLVmyxLf3CwAAID3JEEG3bgqrVauW1ocBAKdl/vz51qNHD1u0aJHNmTPHjh49aldddZX9888/brkC6O3btyd5DB061HLlymVXX321WycuLs7atGljM2fOtB9//NGmTJliX3zxhd11110R97t+/XpLSEiw5557ztasWWPjxo2zyZMn2yOPPBJYp2/fvifs++KLL7Z27doF1pk3b57ddNNN9tVXX9nChQvd8er4f//9d84IAAAQ8zJbFNixY4eNGDHCPvnkE3eTpkyPgujevXtb06ZNLVY0atTI3VyHatmypfvdAWRMn332WZKfFTDrc/C7776zBg0aWHx8vBUpUiTJOh988IG1b9/eBd6iDPPdd98dWF6iRAm75557bMyYMRH3q8y4Hp7SpUu7DPukSZNs7Nix7jlt39uHfP/997Z27VoXnHtef/31JNt98cUX7b333rO5c+daly5dTuMdAQAAiB7pPuhWeWO9evUsX7587uawSpUqLssze/Zsl/lRJiZWvP/++0nKNlUOeskllyTJGKXUZSPn2rHM/1feCUSTrPGJNrq2WeUhs+3w8UyWUW0e1Srs8/v373dfCxQoEHa5gvGVK1faxIkTI25727Zt7jOnYcOGp3RM2nek/XoBdfny5V05eSQHDx50n+PJbQcAACBWpPvycmVi1D9Q/f+uv/56dzNXqVIl69Onjyu1lC1btriySWVb8uTJ47I7O3fuTDajrCx5MPWR7Nq1a+Dn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SCV5uhFWgK2S744dO7p5rbVMWSmVXdasWTPsNjWHrsqtP/nkE5cxUl9IBelp7ciRI+738b7//fffXTmr+m17N/IqFb/66qvtwgsvtL/++stl3zRgnEZMB+CPk1WrKBhPaUXLt99+m+Lt6LNN04GdCjUCBM/EENwtJbWrbgAAABADQbfmrVYWSSOYP/DAAy5DrUy1yqoVdKt8WyWfvXr1sgYNGriySmWCNFBRcgMRqQRTZZyaQ1dzYqeHLPe2bduSlISqX6YeakDwRmJX/3Adt94HlbaqEUIBt/oEAgAAAACiT6ZE0iMxRf1PFbBrLmEGU0K0l5drMDL6wyIacQ4jFnAeIxZwHuNsxF4aBDtPnjwR14vz9SgAAAAAAMjACLpTifpmR3osWLAgtXYDAAAAAIgiadqnO5ZoULRIND0QAAAAACDjIehOJaFTCQEAAAAAQHk5AAAAAAA+IegGAAAAAMAnBN0AAAAAAPiEoBsAAAAAAJ8QdAMAAAAA4BOCbgAAAAAAfELQDQAAAACATwi6AQAAAADwCUE3AAAAAAA+IegGAAAAAMAnBN0AAAAAAPiEoBsAAAAAAJ8QdAMAAAAA4BOCbgAAAAAAfELQDQAAAACATwi6AQAAAADwCUE3gKg3cuRIq1WrluXOndvOO+88a9u2rW3YsCHJOs8//7w1atTI8uTJY5kyZbJ9+/adsJ29e/dax44d3Tr58uWz2267zf7+++9k9/3zzz/btddea4UKFXKva9++ve3cufOE9T755BO77LLLLHv27JY/f353jMF0TKGPN99887TfEwAAAKQPMRF0DxkyxKpVq5bWhwEgjcyfP9969OhhixYtsjlz5tjRo0ftqquusn/++SewzsGDB61Fixb2yCOPRNyOAu41a9a4bXz88cf29ddf25133hlxfW1f+1GA/OWXX9r//vc/O3LkiLVu3doSEhIC67333nvWuXNnu/XWW+3777936918880nbO+VV16x7du3Bx6hgTkAAACiT2ZLB3bs2GEjRoxwmaDff//dZaoURPfu3duaNm1qseKFF16wqVOn2urVq93PNWrUsMcff9xq164dWCcxMdEGDx7s1lUmrl69ejZp0iQrV65cGh45kL599tlnSX6eMmWK+xz57rvvrEGDBu45fZ7IvHnzwm5j3bp1bjtLly61mjVruucmTJhgLVu2tLFj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ypWulFTjQB999NGoyDopg6bno6/Kiul5KuDWcwcAAAAAxJ50gbOtW0bUD+bXWFfNgk55OWK9vFyl24yHRSyiDSMe0I4RD2jHuBCx18GDB928QuH8fWYuAAAAAACQJgi6LyDNkhzuNm/evAt5KQAAAACACyDqx3THE60zHI6WKAIAAAAAxBeC7guofPnyF/J0AAAAAIAIo7wcAAAAAACfEHQDAAAAAOATgm4AAAAAAHxC0A0AAAAAgE8IugEAAAAA8AlBNwAAAAAAPiHoBgAAAADAJwTdAAAAAAD4hKAbAAAAAACfEHQDAAAAAOATgm4AAAAAAHxC0A0AAAAAgE8IugEAAAAA8AlBNwAAAAAAPiHoBgAAAADAJwTdAAAAAAD4hKAbAAAAAACfxHzQPXDgQLvyyisjfRlATPruu+/spptusmLFilm6dOnsyy+/TLS9Y8eO7vHQW4sWLRLt869//ctKlixpWbNmtUsuucTat29v27dvT/G8o0ePtmuvvdZy587tjnngwIG/7XP48GG755573D558+a1++67z44cORLcvn79ervuuuusSJEi7txly5a1fv362cmTJ8/7dQEAAADiJujeuXOndevWzX1gzpIli5UoUcIFAbNnz7Z4smbNGrv11lutdOnSLsh47bXXkt1v27Ztdvfdd1uBAgUsW7ZsVq1aNVu6dOkFv15cHI4ePWpXXHGFvfnmm2H3UZC9Y8eO4O3jjz9OtF2B76effuqC4M8//9x+/fVXu+2221I877Fjx9xxn3rqqbD7vPrqq7Z27VqbOXOmffXVV66D4MEHHwxuz5QpkwvK//3vf7tz6z01ZswYe+aZZ87qNQAAAAD8lNEiaPPmzVa/fn2XxXrxxRddgKks1ddff21dunSxn376yeKFggx1LLRp08YeffTRZPfZv3+/ez0UxEyfPt0KFSpkGzZssHz58p31+eoMm20JGXOkwZUj3mwe3jL4/Q033OBuKVFnWNGiRcNuD23PpUqVsieffNJat27t3ssKjJPTs2dP9/Xbb79Ndvu6dets2bJltmDBAqtTp457bMSIEXbjjTfaSy+95DLzej/pFnpuHW/evHkpPh8AAADgosl0d+7c2WV9Fy9e7LLAl112mVWpUsV69eplCxcudPts2bLFWrVqZTlz5nRlprfffrvt2rUr7DFVsup9oPcoAFCZrEfZ5sGDB7ssmY6rD+uTJ0+233//PXiu6tWrJ8owjx071nUOqEOgUqVKbh8vA5gatWrVch0Lbdu2dUFMcp5//nmX6X/vvfesdu3aVqZMGWvWrJmVK1cuVecA/KBAtnDhwnb55ZfbI488Ynv37g277759+2zcuHFWr169sAF3aixatMhy5MhhV199dfCxJk2aWPr06d225Pzyyy82Y8YMa9So0TmfFwAAAIiboFsfzvUBWRltfbhOSgHu6dOnXRCsfefOnevKTDdu3Gh33HHHeZ9fpavKKi9fvtxatmzpxqEqCFdptzJsCnR1PxAIJMpWK8v24YcfulJXdQg89thjllYU+NesWdNlwxXk1KhRw5XLApGijqUPPvjADfdQp5Deh8qMnzp1KtF+ffr0ce9jDYvQ+2LSpEnnPewkT548iR7LmDGj5c+f320LpQBfY7orVKhg11xzjT333HPndW4AAAAgLsrLlZVSQFuxYsWw++iD/qpVq2zTpk0uAywKAJQNX7JkicsenyuVqT700EPu+wEDBtioUaPc8RTwekFE3bp1XVbdK61Vuexbb70VzDx37do1TT/gq0NB16FMv8a66jl2797dMmfObB06dEj2Z44fP+5unkOHDrmvWdIHLEOG/+8wADwpTTSWkJCQaLsqUDx6r6rKQ19nzZpl119/fXCbqkvUSaWAW1Uk6sTSpGyqZEmJzuddU+h51eEW7loV8Ic+/tFHH7lJ13788Ufr27ev6xxIy84w4Fx4bZSJ/RDLaMeIB7Rj+Cm1/89HLOgOzSCHo3GdCra9gFsqV67ssuDadj5Bt8rHPZr9WDSmPOlju3fvDgbd2bNnT1TqrZmatT2tKNBQpnvo0KHuvjLdq1evdoF+uKB72LBh9uyzz/7t8X41Tlv27ImzkYBMmzYt7Avxww8/nLEsXMM8lMn+888/k93eqVMnu//++101SUqdaqJONdFkaBqy4dmzZ48dPHjQVbeEBtsqbddkg8k9B12XOs20ooFK4TNkyMAvHBEX2oaBWEU7RjygHcMPqoSO6qBbpaDKgqX1ZGka85k0oE+uByI0sPCycck95mXckm739klN50FqKYhXp0IoZRY1I3Q4yuwpMx6a6VYnxeDl6S0hE0EH/m71wOZhXxaNoVYVSDi//fabyyprfHW4/ZTt9o51pvHV3tASzV2gzjSP2vDIkSOtYMGCbn4D7z9Lvd8efvhhN5FachSU6z2rsvjzGVMOnC/9v6M227RpU9oiYhbtGPGAdgw/eVXGURt0a2xm8+bN3VJFKqFOOq5b6/Yq4Ny6dau7edluLSGkbUmDU49m/A6d3EzZMWWLNSN4tNMYcy19FOrnn392E72Fo0nZkpuY7fjpdJZwKuXSXlycQoNRrXutoR4evde0vJ3en7qpikIl5qr20FJgTzzxhJUvX97Ng6DjaFIzDYNo0KCBm2Vf+/Tv399VhGh8tfZRZrpx48ZuaIgXQGtctm5awUDU+ZYrVy633rfOq6qTq666yg3hePvtt91/mCph10SE3vtBE7bp+NpX7wFNfKhza84HVaUA0UBtlA4gxDraMeIB7Rh+SO3/8RFdMkwBtwJNfRDX2GiVfGuMp7IDGtusAFsfqNu1a+fW4NU2zXiu7JnKsJOjcabK/E6dOtV98H/llVdckB5pJ06ccM/H+16ByIoVK1xJrYIYb+klTQql8nLN0q5Z3UePHu1uZ2tR38ZuUisgJQpUQzukvKoJDWfQe1DjpN9//333HlJ2WRnpQYMGBTt6FNxOnDjRrY2tNb9VraEsc79+/YL7KGBWZ1Jo+Y2GTIQOi2jYsKH7qpn7vZUG9H7Q+twK2FXBouD/jTfeSDSxmsZvq2NKGXAF4wrSwy3JBwAAAERCRINurbGrmcKHDBlivXv3dhlqZapVlqoP/Crf1tjRbt26uQ/l+uCtD/RarzccjSdduXKlm9RJH8r1ATwastzbt293Y7Q9mgVdN3UgeGsVa4z6F1984UrG1QmhJcPU2aBOB8APWmIvpSESWiIvJeoUmzNnTor7aIm+pOfQuGvdUqLMt1YKCNeDqIx2WqxkAAAAAPgpXSAtByUjKsYVaKklTURFphuxStlxTZamceOU5iIW0YYRD2jHiAe0Y1yI2EsTAGtS36hbpxsAAAAAgHhH0J1GNDY73G3evHlpdRoAAAAAQAyJ6JjueKJJ0cIpXrz4Bb0WAAAAAEB0IOhOI94M5AAAAAAAeCgvBwAAAADAJwTdAAAAAAD4hKAbAAAAAACfEHQDAAAAAOATgm4AAAAAAHxC0A0AAAAAgE8IugEAAAAA8AlBNwAAAAAAPiHoBgAAAADAJwTdAAAAAAD4hKAbAAAAAACfEHQDAAAAAOATgm4AAAAAAHxC0A0AAAAAgE8IugEAAAAA8AlBNwAAAAAAPiHoBgAAAADAJwTdQIz77rvv7KabbrJixYpZunTp7Msvv0y0feDAgVaxYkXLkSOH5cuXz5o0aWKLFi3623GmTp1qderUsWzZsrn9WrduneJ5O3bs6M4XemvRokWy+x4/ftyuvPJKt8+KFSuCj3/77bfWqlUru+SSS9z1aZ9x48ad82sBAAAARJu4CLoVVOjDOnAxOnr0qF1xxRX25ptvJrv9sssus5EjR9qqVats/vz5Vrp0aWvWrJn9/vvvwX0+//xza9++vd177722cuVK+89//mN33XXXGc+tIHvHjh3B28cff5zsfk888YTrFEjq+++/t+rVq7vz//jjj+7899xzj+sAAAAAAOJBVATdO3futG7dulnZsmUtS5YsVqJECZe5mz17tsWTMWPG2DXXXOOyiF7GcfHixcHtJ0+etD59+li1atVc1k9BigKQ7du3R/S6Ed1uuOEGGzx4sN18883JblfwrLam91eVKlXslVdesUOHDrkgVxISEqxHjx724osv2sMPP+yC9MqVK9vtt99+xnPr/Vq0aNHgTe06qenTp9u///1ve+mll/627amnnrJBgwZZvXr1rFy5cu46FMgnzdYDAAAAsSpjpC9g8+bNVr9+fcubN6/70K+AU8Hn119/bV26dLGffvrJ4oVKae+8804XYGTNmtWef/55l3Fcs2aNFS9e3I4dO2bLli2z/v37u8zl/v37XRDyr3/9y5YuXXpW56ozbLYlZMzh23NBZG0e3vKcfu7EiRM2evRoy5Mnj2tjoja3bds2S58+vdWoUcN1gqlyRO/HqlWrnrFNFy5c2AXb119/vQv+CxQoENy+a9cue+CBB1wQnT179lRd48GDB+3yyy8/p+cHAAAARJuIZ7o7d+7sxnkq43vrrbe6LJuycb169bKFCxe6fbZs2eLGfebMmdNy587tMnD6MB/Otddeaz179kz0mManagyqRyW2ChCUSdZxS5UqZZMnT3Ylt965VPYaGuyOHTvWdQ6oQ6BSpUpuH6+8NjU0VlXPVwGNxti+8847dvr06WBGX4HQzJkz3fNT0PGPf/zDlQX/8MMP7jUAztVXX33l2qs6e1599VXXzgoWLOi2bdy4MThMo1+/fm5fBdF6H+3bty/sMdX2P/jgA9d+1YE0d+5cl3U/deqU2x4IBNx7TtnzmjVrpuo6P/30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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[特征重要性排名 - Gain]\n", "bias_10 883.242468\n", "bbi_ratio 719.403482\n", "reversal_1 616.343038\n", "turnover_deviation 563.883571\n", "turnover_rate_mean_5 553.710151\n", "ma_ratio_5_20 493.930772\n", "return_20 477.078960\n", "return_5 465.129010\n", "volume_ratio 438.578614\n", "roe 386.244247\n", "EP_rank 324.897361\n", "ma_20 313.170879\n", "momentum_accel 273.272078\n", "net_profit_growth 227.346561\n", "BP_rank 210.965235\n", "volatility_ratio 200.314833\n", "roe_delta 153.102754\n", "cashflow_act_rank 136.542178\n", "ma_5 116.355596\n", "market_cap_rank 89.142452\n", "debt_to_equity 68.378507\n", "current_ratio 63.483876\n", "revenue_growth 0.000000\n", "ebitda_rank 0.000000\n", "dtype: float64\n", "\n", "[低重要性特征] 以下2个特征重要性为0,可考虑删除:\n", " - revenue_growth\n", " - ebitda_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 }