{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. 导入依赖" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:32:40.563481Z", "start_time": "2026-03-08T03:32:39.994884Z" } }, "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-08T03:32:40.574743Z", "start_time": "2026-03-08T03:32:40.571165Z" } }, "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 + [\"return_5\"] # 包含 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-08T03:32:40.585729Z", "start_time": "2026-03-08T03:32:40.579837Z" } }, "cell_type": "code", "source": [ "# 特征因子定义字典:新增因子只需在此处添加一行\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", " \"n_income_rank\": \"cs_rank(n_income)\", # 净利润截面排名\n", " # 8. 财务数据因子(来自利润表 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", " # 9. 财务数据因子(来自资产负债表 financial_balance)\n", " \"total_liab_rank\": \"cs_rank(total_liab)\", # 总负债截面排名\n", " \"money_cap_rank\": \"cs_rank(money_cap)\", # 货币资金截面排名\n", " # 10. 财务数据因子(来自现金流量表 financial_cashflow)\n", " \"n_cashflow_act_rank\": \"cs_rank(n_cashflow_act)\", # 经营活动现金流净额截面排名\n", " # 11. 财务估值因子\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", " \"return_5\": \"(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-08T03:32:40.593766Z", "start_time": "2026-03-08T03:32:40.590001Z" } }, "source": [ "# 日期范围配置(正确的 train/val/test 三分法)\n", "# Train: 用于训练模型参数\n", "# Val: 用于验证/早停/调参(位于 train 之后,test 之前)\n", "# Test: 仅用于最终评估,完全独立于训练过程\n", "TRAIN_START = \"20200101\"\n", "TRAIN_END = \"20231231\"\n", "VAL_START = \"20240101\"\n", "VAL_END = \"20241231\"\n", "TEST_START = \"20250101\"\n", "TEST_END = \"20251231\"\n", "\n", "# 模型参数配置\n", "MODEL_PARAMS = {\n", " \"objective\": \"regression\",\n", " \"metric\": \"mae\", # 改为 MAE,对异常值更稳健\n", " # 树结构控制(防过拟合核心)\n", " \"num_leaves\": 20, # 从31降为20,降低模型复杂度\n", " \"max_depth\": 4, # 显式限制深度,防止过度拟合噪声\n", " \"min_child_samples\": 50, # 叶子最小样本数,防止学习极端样本\n", " \"min_child_weight\": 0.001,\n", " # 学习参数\n", " \"learning_rate\": 0.01, # 降低学习率,配合更多树\n", " \"n_estimators\": 1000, # 增加树数量,配合早停\n", " # 采样策略(关键防过拟合)\n", " \"subsample\": 0.8, # 每棵树随机采样80%数据(行采样)\n", " \"subsample_freq\": 5, # 每5轮迭代进行一次 subsample\n", " \"colsample_bytree\": 0.8, # 每棵树随机选择80%特征(列采样)\n", " # 正则化\n", " \"reg_alpha\": 0.1, # L1正则,增加稀疏性\n", " \"reg_lambda\": 1.0, # L2正则,平滑权重\n", " # 数值稳定性\n", " \"verbose\": -1,\n", " \"random_state\": 42,\n", "}\n", "\n", "# 数据处理器配置\n", "PROCESSOR_CONFIGS = [\n", " {\"name\": \"winsorizer\", \"params\": {\"lower\": 0.01, \"upper\": 0.99}},\n", " {\"name\": \"cs_standard_scaler\", \"params\": {}},\n", "]\n", "\n", "# 股票池筛选配置\n", "STOCK_FILTER_CONFIG = {\n", " \"exclude_cyb\": True, # 排除创业板\n", " \"exclude_kcb\": True, # 排除科创板\n", " \"exclude_bj\": True, # 排除北交所\n", " \"exclude_st\": True, # 排除ST股票\n", "}\n", "\n", "# 输出配置(相对于本文件所在目录)\n", "OUTPUT_DIR = \"output\"\n", "SAVE_PREDICTIONS = True\n", "PERSIST_MODEL = False\n", "\n", "# Top N 配置:每日推荐股票数量\n", "TOP_N = 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-08T03:32:46.956583Z", "start_time": "2026-03-08T03:32:40.597894Z" } }, "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 = \"return_5\"\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", " - 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", " - return_5: (ts_delay(close, -5) / close) - 1\n", "\n", "特征因子数: 25\n", "Label: return_5\n", "已注册因子总数: 26\n", "\n", "[3] 准备数据\n", "\n", "================================================================================\n", "准备数据\n", "================================================================================\n", "\n", "计算因子: 20200101 - 20251231\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "D:\\PyProject\\ProStock\\src\\data\\financial_loader.py: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": [ "数据形状: (7044952, 42)\n", "数据列: ['ts_code', 'trade_date', 'vol', 'close', 'low', 'high', 'total_mv', 'f_ann_date', 'n_income', 'ebitda', 'total_profit', 'ebit', 'operate_profit', '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', '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', 'return_5']\n", "\n", "前5行预览:\n", "shape: (5, 42)\n", "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ vol ┆ close ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ return_5 │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ --- │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 1.5302e6 ┆ 1841.69 ┆ … ┆ 721.52104 ┆ 2580.5045 ┆ 938.15146 ┆ -0.004746 │\n", "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ 33 ┆ 4 ┆ │\n", "│ 000001.SZ ┆ 20200103 ┆ 1.1162e6 ┆ 1875.53 ┆ … ┆ 708.50174 ┆ 2533.9412 ┆ 921.22323 ┆ -0.02852 │\n", "│ ┆ ┆ ┆ ┆ ┆ 4 ┆ 96 ┆ 7 ┆ │\n", "│ 000001.SZ ┆ 20200106 ┆ 862083.5 ┆ 1863.52 ┆ … ┆ 713.06736 ┆ 2550.2701 ┆ 927.15964 ┆ -0.004685 │\n", "│ ┆ ┆ ┆ ┆ ┆ 8 ┆ 5 ┆ 9 ┆ │\n", "│ 000001.SZ ┆ 20200107 ┆ 728607.56 ┆ 1872.26 ┆ … ┆ 709.74110 ┆ 2538.3738 ┆ 922.83470 ┆ -0.022743 │\n", "│ ┆ ┆ ┆ ┆ ┆ 6 ┆ 46 ┆ 6 ┆ │\n", "│ 000001.SZ ┆ 20200108 ┆ 847824.12 ┆ 1818.76 ┆ … ┆ 730.61584 ┆ 2613.0319 ┆ 949.97690 ┆ -0.008401 │\n", "│ ┆ ┆ ┆ ┆ ┆ 4 ┆ 01 ┆ 3 ┆ │\n", "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", "[配置] 训练期: 20200101 - 20231231\n", "[配置] 验证期: 20240101 - 20241231\n", "[配置] 测试期: 20250101 - 20251231\n", "[配置] 特征数: 25\n", "[配置] 目标变量: return_5\n" ] } ], "execution_count": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2 执行训练" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:32:54.939339Z", "start_time": "2026-03-08T03:32:46.966714Z" } }, "source": [ "print(\"\\n\" + \"=\" * 80)\n", "print(\"开始训练\")\n", "print(\"=\" * 80)\n", "\n", "# 步骤 1: 股票池筛选\n", "print(\"\\n[步骤 1/6] 股票池筛选\")\n", "print(\"-\" * 60)\n", "if pool_manager:\n", " print(\" 执行每日独立筛选股票池...\")\n", " filtered_data = pool_manager.filter_and_select_daily(data)\n", " print(f\" 筛选前数据规模: {data.shape}\")\n", " print(f\" 筛选后数据规模: {filtered_data.shape}\")\n", " print(f\" 筛选前股票数: {data['ts_code'].n_unique()}\")\n", " print(f\" 筛选后股票数: {filtered_data['ts_code'].n_unique()}\")\n", " print(f\" 删除记录数: {len(data) - len(filtered_data)}\")\n", "else:\n", " filtered_data = data\n", " print(\" 未配置股票池管理器,跳过筛选\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "================================================================================\n", "开始训练\n", "================================================================================\n", "\n", "[步骤 1/6] 股票池筛选\n", "------------------------------------------------------------\n", " 执行每日独立筛选股票池...\n", " 筛选前数据规模: (7044952, 42)\n", " 筛选后数据规模: (4532198, 42)\n", " 筛选前股票数: 5678\n", " 筛选后股票数: 3359\n", " 删除记录数: 2512754\n" ] } ], "execution_count": 6 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:32:56.279010Z", "start_time": "2026-03-08T03:32:54.952714Z" } }, "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, 42)\n", " 验证集数据规模: (769485, 42)\n", " 测试集数据规模: (771207, 42)\n", " 训练集股票数: 3297\n", " 验证集股票数: 3220\n", " 测试集股票数: 3215\n", " 训练集日期范围: 20200102 - 20231229\n", " 验证集日期范围: 20240102 - 20241231\n", " 测试集日期范围: 20250102 - 20251231\n", "\n", " 训练集前5行预览:\n", "shape: (5, 42)\n", "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ vol ┆ close ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ return_5 │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ --- │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 1.5302e6 ┆ 1841.69 ┆ … ┆ 721.52104 ┆ 2580.5045 ┆ 938.15146 ┆ -0.004746 │\n", "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ 33 ┆ 4 ┆ │\n", "│ 000002.SZ ┆ 20200102 ┆ 1012130.4 ┆ 4832.29 ┆ … ┆ 776.91820 ┆ 47.131053 ┆ 1140.2493 ┆ -0.011057 │\n", "│ ┆ ┆ ┆ ┆ ┆ 1 ┆ ┆ 95 ┆ │\n", "│ 000004.SZ ┆ 20200102 ┆ 17853.2 ┆ 90.75 ┆ … ┆ -69.58089 ┆ -52.61755 ┆ -24.82135 ┆ -0.000441 │\n", "│ ┆ ┆ ┆ ┆ ┆ 5 ┆ 4 ┆ 9 ┆ │\n", "│ 000005.SZ ┆ 20200102 ┆ 104134.12 ┆ 29.1 ┆ … ┆ 142.55925 ┆ 385.57490 ┆ 208.12520 ┆ 0.022337 │\n", "│ ┆ ┆ ┆ ┆ ┆ 6 ┆ 4 ┆ 2 ┆ │\n", "│ 000006.SZ ┆ 20200102 ┆ 124751.76 ┆ 191.3 ┆ … ┆ 633.27582 ┆ 650.95370 ┆ 819.10495 ┆ 0.012964 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 3 ┆ 5 ┆ │\n", "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", " 验证集前5行预览:\n", "shape: (5, 42)\n", "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ vol ┆ close ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ return_5 │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ --- │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ │\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.59 ┆ … ┆ -168.7552 ┆ -184.4013 ┆ -192.7135 ┆ -0.014789 │\n", "│ ┆ ┆ ┆ ┆ ┆ 72 ┆ 85 ┆ 84 ┆ │\n", "│ 000005.SZ ┆ 20240102 ┆ 63028.0 ┆ 10.38 ┆ … ┆ -96.94997 ┆ -295.0388 ┆ -46.06373 ┆ -0.05395 │\n", "│ ┆ ┆ ┆ ┆ ┆ 7 ┆ 72 ┆ 6 ┆ │\n", "│ 000006.SZ ┆ 20240102 ┆ 261947.19 ┆ 177.64 ┆ … ┆ -6.971845 ┆ -51.5536 ┆ -5.32671 ┆ -0.013454 │\n", "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n", "\n", " 测试集前5行预览:\n", "shape: (5, 42)\n", "┌───────────┬────────────┬───────────┬─────────┬───┬───────────┬───────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ vol ┆ close ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ return_5 │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ --- │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪════════════╪═══════════╪═════════╪═══╪═══════════╪═══════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20250102 ┆ 1.8196e6 ┆ 1460.57 ┆ … ┆ 1791.1304 ┆ 6183.5904 ┆ 2158.1117 ┆ -0.002622 │\n", "│ ┆ ┆ ┆ ┆ ┆ 08 ┆ 38 ┆ 45 ┆ │\n", "│ 000002.SZ ┆ 20250102 ┆ 1.1827e6 ┆ 1291.92 ┆ … ┆ -1933.116 ┆ -1110.658 ┆ -1729.069 ┆ -0.022509 │\n", "│ ┆ ┆ ┆ ┆ ┆ 105 ┆ 303 ┆ 737 ┆ │\n", "│ 000004.SZ ┆ 20250102 ┆ 119760.37 ┆ 57.63 ┆ … ┆ -199.1144 ┆ -126.8907 ┆ -197.3308 ┆ -0.064897 │\n", "│ ┆ ┆ ┆ ┆ ┆ 31 ┆ 63 ┆ 47 ┆ │\n", "│ 000006.SZ ┆ 20250102 ┆ 307195.1 ┆ 288.12 ┆ … ┆ -646.1294 ┆ 74.343232 ┆ -637.5489 ┆ -0.048278 │\n", "│ ┆ ┆ ┆ ┆ ┆ 33 ┆ ┆ 17 ┆ │\n", "│ 000007.SZ ┆ 20250102 ┆ 68219.01 ┆ 58.15 ┆ … ┆ 6.740918 ┆ 108.91759 ┆ 22.556002 ┆ 0.015649 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 8 ┆ ┆ │\n", "└───────────┴────────────┴───────────┴─────────┴───┴───────────┴───────────┴───────────┴───────────┘\n" ] } ], "execution_count": 7 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:32:57.302228Z", "start_time": "2026-03-08T03:32:56.290367Z" } }, "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, 42)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ vol ┆ close ┆ … ┆ profit_to ┆ cashflow_ ┆ operate_p ┆ return_5 │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ _market_c ┆ to_market ┆ rofit_to_ ┆ --- │\n", "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ ap ┆ _cap ┆ market_ca ┆ f64 │\n", "│ ┆ str ┆ ┆ ┆ ┆ --- ┆ --- ┆ p ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ --- ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 4.749919 ┆ 7.139221 ┆ … ┆ 1.228197 ┆ 2.569741 ┆ 1.426297 ┆ -0.00474 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 6 │\n", "│ 000002.SZ ┆ 20200102 ┆ 2.92576 ┆ 7.139221 ┆ … ┆ 1.353457 ┆ -0.145372 ┆ 1.83338 ┆ -0.01105 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 7 │\n", "│ 000004.SZ ┆ 20200102 ┆ -0.574944 ┆ 0.095339 ┆ … ┆ -0.560579 ┆ -0.252276 ┆ -0.513404 ┆ -0.00044 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 1 │\n", "│ 000005.SZ ┆ 20200102 ┆ -0.271162 ┆ -0.301277 ┆ … ┆ -0.080905 ┆ 0.217351 ┆ -0.044183 ┆ 0.022337 │\n", "│ 000006.SZ ┆ 20200102 ┆ -0.19857 ┆ 0.742213 ┆ … ┆ 1.028664 ┆ 0.501768 ┆ 1.186504 ┆ 0.012964 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", " 训练集特征统计:\n", " 特征数: 25\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-08T03:33:14.426213Z", "start_time": "2026-03-08T03:32:57.306610Z" } }, "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", " 特征数: 25\n", " 目标变量: 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-08T03:33:14.547157Z", "start_time": "2026-03-08T03:33:14.431622Z" } }, "source": [ "# 步骤 5: 测试集数据处理\n", "print(\"\\n[步骤 5/6] 测试集数据处理\")\n", "print(\"-\" * 60)\n", "if processors and test_data is not train_data:\n", " for i, processor in enumerate(fitted_processors, 1):\n", " print(\n", " f\" [{i}/{len(fitted_processors)}] 应用处理器: {processor.__class__.__name__}\"\n", " )\n", " test_data_before = len(test_data)\n", " test_data = processor.transform(test_data)\n", " test_data_after = len(test_data)\n", " print(f\" 处理前记录数: {test_data_before}\")\n", " print(f\" 处理后记录数: {test_data_after}\")\n", "else:\n", " print(\" 跳过测试集处理\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[步骤 5/6] 测试集数据处理\n", "------------------------------------------------------------\n", " [1/3] 应用处理器: NullFiller\n", " 处理前记录数: 771207\n", " 处理后记录数: 771207\n", " [2/3] 应用处理器: Winsorizer\n", " 处理前记录数: 771207\n", " 处理后记录数: 771207\n", " [3/3] 应用处理器: StandardScaler\n", " 处理前记录数: 771207\n", " 处理后记录数: 771207\n" ] } ], "execution_count": 10 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:33:15.644580Z", "start_time": "2026-03-08T03:33:14.556580Z" } }, "source": [ "# 步骤 6: 生成预测\n", "print(\"\\n[步骤 6/6] 生成预测\")\n", "print(\"-\" * 60)\n", "X_test = test_data.select(feature_cols)\n", "print(f\" 测试样本数: {len(X_test)}\")\n", "print(\" 预测中...\")\n", "predictions = model.predict(X_test)\n", "print(f\" 预测完成!\")\n", "\n", "print(f\"\\n 预测结果统计:\")\n", "print(f\" 均值: {predictions.mean():.6f}\")\n", "print(f\" 标准差: {predictions.std():.6f}\")\n", "print(f\" 最小值: {predictions.min():.6f}\")\n", "print(f\" 最大值: {predictions.max():.6f}\")\n", "\n", "# 保存结果到 trainer\n", "trainer.results = test_data.with_columns([pl.Series(\"prediction\", predictions)])" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[步骤 6/6] 生成预测\n", "------------------------------------------------------------\n", " 测试样本数: 771207\n", " 预测中...\n", " 预测完成!\n", "\n", " 预测结果统计:\n", " 均值: -0.002611\n", " 标准差: 0.006952\n", " 最小值: -0.104909\n", " 最大值: 0.093437\n" ] } ], "execution_count": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3 训练指标曲线" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:33:20.917840Z", "start_time": "2026-03-08T03:33:15.648621Z" } }, "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", "[175]\ttrain's l1: 0.0422897\tval's l1: 0.0535436\n", "训练完成,指标已收集\n", "\n", "评估指标: l1\n", "\n", "[早停信息]\n", " 配置的最大轮数: 1000\n", " 实际训练轮数: 275\n", " 早停状态: 已触发(连续100轮验证指标未改善)\n", "\n", "最终指标:\n", " 训练 l1: 0.042114\n", " 验证 l1: 0.053595\n" ] } ], "execution_count": 12 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:33:21.167778Z", "start_time": "2026-03-08T03:33:20.923061Z" } }, "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+naQAAfYpJREFUeJzt3Qd4VGXaxvEnPfTepYggShGUJjZ0UUGwYEHFhsiHHcW2iiKI7oquDQu2VdHdFUvcxV4WewELNsRVbCBKB6WbhCTzXfcbzziZTJJJO5kc/j+v45yZOTNzZvIyydzzvM9JCoVCIQMAAAAAAAB8lOzngwEAAAAAAABCKAUAAAAAAADfEUoBAAAAAADAd4RSAAAAAAAA8B2hFAAAAAAAAHxHKAUAAAAAAADfEUoBAAAAAADAd4RSAAAAAAAA8B2hFAAAAAAAAHxHKAUAQAJ6+OGHLSkpKbxUhU6dOoXv75prrqmS+wwqvT7ea6XXLRFFjg+Nl8qOnZp4ztUxzgEAQO1BKAUAQIzQJt7lzTff5PWD3XDDDUXGxYcffljiqzJ27Njwdunp6bZ27dpAvoJBCZwiwzotS5cuLfM2c+fOtQsvvND22Wcfq1u3brlvX5JQKGQvvviinXrqqbbrrrtaw4YNLS0tzVq1amVDhgyxG2+80VauXFnh+wcAwG+pvj8iAAAoU//+/e2mm26q0lfqqquuso0bN7p1fVhG1VFIoNe3oKDAnf/nP/9pAwYMKLbdb7/9Zv/+97/D50eMGGEtWrRI+LFTXWrTvpbHzJkz7ZlnnqnS+/zpp5/spJNOsnfffbfYdWvWrLHXX3/dLV999VWRyjkAABIZoRQAADFCG/n111/t+uuvD58/5JBD7NBDDy3yeu2yyy4lvn6bNm1ylQwV0aNHD7dUpfHjx1fp/eEP7dq1c+PjlVdececff/xxu/XWW10VS6Q5c+bY5s2bw+dPP/30Kn8Zq2PsVJfatK/loYqonXbayfr162f5+fn23HPPVer+Vq9ebYMHD7YlS5aEL9t5553tyCOPdFVSeq96//33YwZWVU3PJycnx1WAAQBQWUzfAwAgIrS59NJLw0t0iKPqosjrjzvuOOvQoUORqXwPPvig7bXXXlanTh074IAD3O30QXLixIm2//77W/v27a1evXqWkZHhgowjjjgi5gfW0qY+HXjggeHLFWp8++23Nnr0aGvevLllZma6x49VpVFSTyntd+Rj/fDDD3b33XfbHnvs4e6vZcuW9n//93/ug2+0bdu22aRJk9zroG0VMNx7773uOVdkmqO2GzdunHsObdq0ca+TPvx26dLFTXv74osvit1Gr4H3OHptNH3pzDPPDN9+9913t7///e8xH0/3d/jhh7vwUMuwYcPsk08+sYrQ/nnWrVtnL730UrFtVEHl0euqSilRtdDIkSPdlKymTZu6MKtx48au2uqvf/2rbd26tcqmzVXkOStMUzWYxoRCEE07rF+/vnXv3t3OP//8IlPStK7HjXw9JHKfvPFX1r6qsuy2226zfffd15o0aeIeV48/fPhwe/LJJ4ttX5mxXJVmz57tKpv0uh1zzDGVvj+9f0QGUuecc4598803NmPGDPfv729/+5u9/fbbtnjxYheOlvRvo7TXKvJnGH27ZcuWuZ+/XnuNTb2mZf37HjhwYPj66PfSzz//3M444wwX6uu9UmNpzz33dF8ClGesAwACIAQAAGJasmRJSL8qvWXq1KmlXr///vsXOd+7d2+33XPPPVfk8ljLtGnTitz3rFmzilwfafDgweHL99hjj1CDBg2K3V9SUlLo1VdfLXK7jh07xnwub7zxRpHb7rfffjH38YADDihyf7m5ucWes7ccccQRRc7rMeJxySWXlPo6paenh+bOnVvkNmPGjAlf37lz51CbNm1i3vbBBx8scruPPvooVL9+/WLbZWZmhoYMGRI+r9ctHtnZ2aHGjRuHb3fccccVuX7lypWhlJSU8PUXXXRR+LpmzZqV+rx79eoV2rx5c5H7i7xe4yWesVPR53zssceWun8NGzYMLVy4MOa/i1iLN/5K21e9Xj169Cj1frRf27dvr/RYLo32NfK2en7lEf0cy3v7FStWuH/P3u379OkTys/Pj+u2kf829L4RKfq1ityvyNt17do11Lp16yLbzpkzp8i//TPPPLPIfX/33XdFtp83b174urvvvjuUmppa4s+0e/fu7mcPANgxMH0PAIAq8s4771jHjh3t2GOPddU96vMiqamp1qdPHzeVR/2DVJ2iaoD33nvP3njjDbfNdddd5yqEVD1VHgsXLnQVJBdddJGrKlFFkKbXKLNQ9Y2aH5eXpgDpdqoMe/rpp8PVSarE0BShvffe252//fbb3XP2qBrlqKOOclUQzz77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K41uoF5Reryrr77ahWSaqupR36/oYPKSSy5x7w2qsvvuu++sZ8+e7qh+eg4KytSI/6233nJVV7pfAMAOIAQAAGJasmSJmrCEl6lTp5Z6/RtvvBHzfs4+++wi23nLkCFDQu3atYt5/7NmzSqybaTBgweHLx8zZkyR60q7XceOHWM+lvY78jZ6XvHcLjc3N7T//vvHfG6HHXZYkfNvvfVWmaNM99erV6+Y96fnWdJrHXmdXptIpT23Dz74IFSvXr1ij5WWlhbaZ599wuf1/MsrOzs71LRp02L3fckllxTb9p133gmlpqYW27Z+/fqhY445psT9iNxWP/d4xkBFnvP69etDbdu2jevnEvn66jVo06ZNzNt99NFHZe7rypUrQ927d495e2859thjQ9u3b4/r513aWC6NtittH2L9W4x+XUpaIn9uZVm6dGlo0KBB5dqP3377LdS1a9eY2w0fPrzE16q0f1OxRP9717Jw4cKY286cOTPmeI9eAAA7BqbvAQBQze6880679tprrWPHjq5yoEOHDq5XkKZLldRAuDbQc3n55Zft8ssvt5122slVj6iqRlUdkydPLrJtrKMSxrq/119/3VUZqeeSmlKrkuL++++3a665psr336sYUTVW/fr13aLqHE2rPOSQQyp139r30aNHF7tczy2aeuu88sorropIt9MUueHDh7vm+L169bKafs6aHqeqKFW0qMJHR1lUBY6mbMZ6Ph49F1WLHXrooeHKoPJQtZiqjdRbTFV4el3070V92FRtpt5FqvCqzf+GykPvH/rZ6X1DlVCqwtQ0Sj1/TXc7+OCD3ZQ8VZV5MjMzXbWZpv/p36DOq2Juzpw5VdqvLHpKat++fUscu+eee66bgqipe7vuuqvVrVvXPQdVSw0ePNhVXUX24QMABFuSkqma3gkAAFA7qXmyQopomtanMEEUfGi6YqwpTwAAANhx7RhfLQEAgGo7Mljnzp1t//33t/bt29uvv/7qqqd0hDaPeiQRSAEAACAalVIAAKDC+vTpU+pUGzXF/ve//+2mcgEAAACR6CkFAAAq7Pzzz7ehQ4e6I62pX43CJ/WXGjlypOv3o6PJEUgBAAAgFiqlAAAAAAAA4DsqpQAAAAAAAOA7QikAAAAAAAD4jqPvVZGCggJbsWKFNWjQwJKSkqrqbgEAAAAAAGqVUChkmzdvtrZt21py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IM9mfTbLrQ/vOpxQCgCQMAilAFSMjg6oflJnnVU4FVJVUwqevGoqb/2338xef90sK0tN4cr3GJpdrP5kWi67rLBqSvcZ6frrzerWLQym1Hy9Xj1LqlfP6ivQ0nntp/pfqXItelph9Lp33gv+tKjUNBFCQAAAEDgHHnigjRw50iZOnGhvvvmmW1cf3Oq0aNEiu+SSS+zjjz+29evX26+//mqNdSCd3x122GH2zjvvhM/n5eVZbm6ua43QvHlze/jhh23cuHFWR9Xuv1M/YB1MCgDKi1AKQOUo/OnUqfRthg83u+kms48+Kgyo9MeWemYpyFJopeb1Xojlret0xQqzr7/+436iAymPphO++uofu6T2X1VZSde3r9ngwfrL0WzXXQunFSq80qm36LymHQIAkGDUQjY3P9dVTK3bts7aNWhnSfr9jQq9llu3b7XNOZttU84m25y7udj6xuyNturXVVaQVuAu256/3f76p79ax8Ydq/0V3759u6Xpb5JS6Prjjz/eJkyYYEeo52eUl156qch5bbd48WIXSHl69epln6l6HQAqiVAKgD/0x68aomspj2+/NXv6abNnny0Ms/bay2zvvQtPdd3cuYXLypXVs986AqLCNC0331z6tvqWUeGVemdp6dKlMKyK5w9/BW7ffFM4FVIVZQrDIvtsRffd8s574ZgqwbRoimP79vE9JgAg0DZkb7BHPnvE7vjgDvthww/usva3tbddmuxiEwZMsDF9xljjzD8qZHY0CosUGrlAKWdz2eu/h04hK36cqIyUDGuQ0cAapje0+un13dKmaRtrlNnImtZpam0atCl1X1SxpAql7Oxsq6+em7+HQ/vvv7+9+uqr7ijj33zzjbVr186mT59uRx55pNvm9NNPd0cb37x5szti+V//+lcXIpWmW7dublkax4F+tD+PPvqo3aN2DQBQDQilACS2rl0Lp+5piTZwoNkppxRO81uzprDyassWK9i0yTYsX26NU1MtWVVUqsqKbNYePcUw8rxOdYRDNZTX8v33Zl9+Gd++KjR75pnCJZIXHkUu3lRBLQqg9IdhVR1ZUQ32Ff7172/WpEnJwZbWvfBLwdbuuxNoAUBAvPLdK3bsk8fatu3bil33w68/2EWvXGRXvX6V/fv4f9vQLkOttlcv6XnGqloqcT13k2XnZRe7ryRLcoFSg/QGhSFTRkNr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x7yNLo/cXlRZFb39m2++6YKXbt262TnnnGPr168vdV/0wjVt2rRSzwcAAAAAAAC1oNH5unXrLD8/31q1alXkcp3XFLtYVq1aFXN7XR45de+YY45xPaO+//57Ny3vsMMOc8FVSkpKsfv87rvv7M4777Sbb765xH3NyclxS2QK6CXIWmoL7auK5WrTPgNlYVwjiBjXCCLGtb+vs7fO333+vN68zggSxjXKK973wIQKparLiSeeGF5XI/Q99tjDNTNX9dSQIUOKbLt8+XIXYo0aNcrGjx9f4n1Onz7dpk2bVuzytWvXWnZ2ttWmgaKqMP3iZPoegoJxjSBiXCOIGNf+Td/LzSk8gI/aNjB9r3oxrhFEjGuU1+bNm2tfKNW8eXNXubR69eoil+t869atY95Gl5dne+ncubN7LFVERYZSK1assIMOOsj22Wcfu//++0vd10mTJrmG7JGVUup91aJFi1rXU0pHI9R+E0ohKBjXCCLGNYKIce1fKJWeke7W1c6CUKp6Ma4RRIxrlFdmZmbtC6XS09Otb9++9tprr7kj6HmDX+fPP//8mLcZNGiQu37ixInhy+bOnesuL8nPP//sekq1adOmSIWUAik9/qxZs8oMaDIyMtwSTberbeGOQqnauN9AaRjXCCLGNYKIcV399DeeXmdvnb/5qh/jGkHEuEZ5xPu7JqFCKVH10ZgxY6xfv342YMAAmzFjhju63tixY931p512mrVr185Nn5MLL7zQBg8ebLfccouNGDHCHn/8cVuwYEG40mnLli1umt2xxx7rqqfUU+rPf/6zdenSxTVE9wKpAw880Dp27Oj6SGkKnqe0iisAAAAAAABUTMKFUieccIILhaZMmeKalffp08defvnlcDPzZcuWFUncNNVu9uzZNnnyZNfAvGvXrvb0009bz5493fWaDrhw4UJ75JFHbMOGDda2bVs79NBD7brrrgtXOqmySlP5tOy0005F9sdrCgkAAADURqnJqTa65+jwOgAAiSIpROpSJdRTqlGjRq5peG3rKaWGl+ovQCk3goJxjSBiXCOIGNcIIsY1gohxjerKSGgiBAAAAAAAAN9RvwsAAAAEmCZG/LTpJ7fevmH7cNNzAABqGqEUAAAAEGA5+Tl23ovnufWsUVmWmRrfYboBAKhuTN8DAAAAAACA7wilAAAAAAAA4DtCKQAAAAAAAPiO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kqWnpPNyAYhbKBSyVatW2fr1623Dhg2WlJTEqwencePG1rp160qNCSqlAAAAgAArCBXYgpULwusAUB4KpDZu3GitWrWy+vXrUykFU1C5bds2W7NmjXs12rRpU+FXhVAKAAAAAAAUk5+f76qjWrRoYY0aNbLU1FQqpeDUqVPHnSqYatmyZYWn8jEZFAAAAAAAFLN9+3Z3WrduXV4dFOONC2+cVAShFAAAAAAAKBF9pFBd44JQCgAAAAAAAL4jlAIAAAAAAChDp06dbMaMGTV+H0FCKAUAAAAAAAI1ray05ZprrqnQ/X700Ud25plnVum+3n///XbggQdaw4YN3b6psfyOhKPvAQAAAAGWmZppz41+rqZ3AwB8s3LlyvD6E088YVOmTLHFixeHL6tfv354PRQKuaMM6siCZdFRCKvatm3bbNiwYW6ZNGmS7WiolAIAAAAAAIHRunXr8NKoUSNXgeSd//rrr61Bgwb20ksvWd++fS0jI8Peffdd+/777+2oo46yVq1audCqf//+9uqrr5Y69U73+8ADD9jRRx/tjkTXtWtXe/bZZ8u1rxMnTrQrrrjC9t57b9sREUoBAAAAAIAdioKgG264wb766ivbY489bMuWLTZ8+HB77bXX7NNPP3WVS0cccYQtW7as1PuZNm2aHX/88bZw4UJ3+5NPPtl++eUX355Hbcf0PQAAACDAcvNz7db5t7r1iwddbOkp6TW9SwBquX79zFat8vcxW7c2W7Cg6u7v2muvtUMOOSR8vmnTpta7d+/w+euuu87mzJnjKp/OP//8Eu/n9NNPt9GjR7v166+/3u644w778MMPXaiFshFKAQAAAAFWECqw9356z61P3HtiTe8OgABQILV8udVq/ZSsRVCllBqgv/DCC64nVV5env32229lVkqpyspTr14917B8zZo11bbfQUMoBQAAAAAAylW1VNsfUwFSpEsvvdTmzp1rN998s3Xp0sXq1Kljxx13nOXm5pZ6P2lpaUXOq89UQUFB1e5sgBFKAQAAAACAuFXlNLpE8d5777mpeGpa7lVOLV26tKZ3K/AIpQAAAAAAwA5NR877z3/+45qbq9rp6quv9qXiadWqVW757rvv3PkvvvjCHR2wQ4cOrs9V0HH0PQAAAAAAsEO79dZbrUmTJrbPPvu4YGro0KG21157Vfvj3nvvvbbnnnva+PHj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HTvWunfvbvfee6/VrVvXHnrooZjb33777TZs2DC77LLLbPfdd7frrrvO9tprL7vrrruKbLd8+XKbMGGCPfroo5aWFvuX8UsvvWT//e9/7eabb66W5wYAAAAAAIAEDKVyc3Pt448/toMPPjh8WXJysjs/f/78mLfR5ZHbiyqrIrcvKCiwU0891QVXPXr0iHk/q1evdmHYP//5TxeCAQAAAEEQCoUsOy/bLVoHACBRpFoCWbduneXn51urVq2KXK7zX3/9dczbrFq1Kub2utxz4403Wmpqql1wwQUx70O/nE8//XTXb6pfv362dOnSMvdVvae0eDZt2hQOwLTUFtpXPf/atM9AWRjXCCLGNYKIce0PhVHHP3W8W3/yuCctMzXTp0feMTGuEUSMa5RXvBlDQoVS1UGVV5rip/5Ual4ey5133mmbN2+2SZMmxX2/06dPt2nTphW7fO3atZadnW21aaBs3LjRBVOqSgOCgHGNIGJcI4gY1/6FUrk5uW5dfVoJpaoX4xpBxLhGeSljqXWhVPPmzS0lJcVNpYuk861bt455G11e2vbvvPOO++XboUOH8PWqxrrkkkvcEfhUFfX666+76X4ZGRlF7kdVUyeffLI98sgjxR5XAZYaskdWSrVv395atGhhDRs2tNr05qKwTvtNKIWgYFwjiBjXCCLGtX+hVHpGultv2bIloVQ1Y1wjiBjXKK/MzMzaF0qlp6db37597bXXXnNH0PMGv86ff/75MW8zaNAgd/3EiRPDl82dO9ddLuolFavnlC5XM3W544477C9/+Uv4+hUrVrhtdCTAgQMHxnxcBVjRIZYo2Klt4Y5Cqdq430BpGNcIIsY1gohxXf30N543Y4C/+fzBuEYQMa5RHvHmCwkVSomqj8aMGeOqlAYMGOCqmbZu3RoOkE477TRr166dmz4nF154oQ0ePNhuueUWGzFihD3++OO2YMECu//++931zZo1c0skHX1PlVTdunVz5yOrqKR+/frudJdddrGddtrJl+cNAAAAAACwI0m4UOqEE05wfZmmTJnimpX36dPHXn755XAz82XLlhVJ3PbZZx+bPXu2TZ482a688krr2rWrPf3009azZ88afBYAAAAAAACoVaGUaKpeSdP13nzzzWKXjRo1yi3xKuvoep06deJwuQAAAAAAADtaKAUAAACgaiQnJdu+7fcNrwMA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Xx8aPXp0qH79+u6w4mPHjg1t3ry5hp4RUPq43rZtW+jQQw8NtWjRIpSWlhbq2LFjaPz48aFVq1YVeekY10g0sca0llmzZpXrb4+lS5eGDjvssFCdOnVCzZs3D11yySWh7du318AzAsoe18uWLQsdcMABoaZNm7q/Q7p06RK67LLLQhs3bizy8jGuURlJ+l/loy0AAAAAAAAgfvSUAgAAAAAAgO8IpQAAAAAAAOA7QikAAAAAAAD4jlAKAAAAAAAAviOUAgAAAAAAgO8IpQAAAAAAAOA7QikAAAAAAAD4jlAKAAAAAAAAviOUAgAA2EG9+eablpSU5E4BAAD8RigFAABQRR5++GEX8ixYsMCdf/HFF+2aa66p8df37rvvdvsGAACQSAilAAAAqolCqWnTpiVsKHXAAQfYb7/95k4BAAD8RigFAABQi4RCIRckVYXk5GTLzMx0pwAAAH7jLxAAAIBqcPrpp9vMmTPduqb0eYunoKDAZsyYYT169HDBUKtWreyss86yX3/9tcj9dOrUyQ4//HB75ZVXrF+/flanTh2777773HWzZs2yP/3pT9ayZUvLyMiw7t272z333FPs9l9++aW99dZb4X048MADS+0plZWVZX379nWP1bx5czvllFNs+fLlxZ5f/fr13eUjR4506y1atLBLL73U8vPzq/jVBAAAQZRa0zsAAAAQRAqYVqxYYXPnzrV//vOfMa/XlLqxY8faBRdcYEuWLLG77rrLPv30U3vvvfcsLS0tvO3ixYtt9OjR7jbjx4+3bt26ucsVQCnUOvLIIy01NdWee+45O/fcc13gdd5557ltFHxNmDDBhUZXXXWVu0wBWEm8ferfv79Nnz7dVq9ebbfffrvbJ+1b48aNw9sqfBo6dKgNHDjQbr75Znv11VftlltusV122cXOOeecKn09AQBA8CSFVAMOAACASvMCnY8++shVNZ1//vmuWir6z613333X9t9/f3v00UftpJNOCl+uaqhhw4YVuVyVTj/++KO9/PLLLgCKpGl8qmaKpNt/++239v3334cv69mzp6t4iq6I0vmDDjrI3njjDVc9tX37dttpp51c5ZWegyq45IUXXnDVWlOmTAn3yFKl1COPPGLXXnutXX311eH73Guvvdx0QK/ZOwAAQEmYvgcAAOAzTY9r1KiRHXLIIbZu3brwoilzqmhSSBRp5513LhZISWQgtXHjRncfgwcPth9++MGdLy8FSWvWrHHVVl4gJSNGjLDddtvNhVPRzj777CLnFbbp8QEAAMrC9D0AAACfqZJJoZEqkmJRMBQdSsWiKXVTp061+fPn27Zt24pcp/tX8FUeqsgSb3pgJIVSqvCKpOBKfaQiNWnSpFhfLAAAgFgIpQAAAHymnk8KpDRNL5booCd6ip5oet6QIUNcWHTrrbda+/btLT093V588UW77bbb3GNUt5SUlGp/DAAAEFyEUgAAANUk8mh7kdQIXE3B991335iBUzzU1DwnJ8eeffZZ69ChQ/jy6Kl/pe1HtI4dO4Ybq+uofpF0mXc9AABAVaCnFAAAQDWpV6+eO92wYUORy48//nh35Lrrrruu2G3y8vKKbV9alVJkE3VN2Zs1a1bM/YjnPtWcXRVc9957rwu8PC+99JJ99dVXrrcUAABAVaFSCgAAoJqocblccMEFrlG5gqQTTzzRNSM/66yzbPr06fbZZ5/ZoYceamlpaa7XlJqg33777XbccceVet+6jabrHXHEEe6+tmzZYn//+99dqLRy5cpi+3HPPffYX/7yF+vSpYvbJroSSrQPN954ozuCoPZx9OjRtnr1arc/OgrgRRddVMWvEAAA2JERSgEAAFSTY445xiZMmGCPP/64/etf/3JVTQqlRNVICovuu+8+u/LKKy01NdUFP6eccoqb1lcWNSN/6qmnbPLkyXbppZda69at7ZxzznH9qM4444wi206ZMsU1Mf/b3/5mmzdvdoFTrFBKTj/9dKtbt67dcMMNdvnll7sqq6OPPtqFVY0bN66iVwYAAMAsKRRZ8w0AAAAAAAD4gJ5SAAAAAAAA8B2hFAAAAAAAAHxHKAUAAAAAAADfEUoBAAAAAADAd4RSAAAAAAAA8B2hFAAAAAAAAHxHKAUAAAAAAADfEUoBAAAAAADAd4RSAAAAAAAA8B2hFAAAAAAAAHxHKAUAAAAAAADfEUoBAAAAAADAd4RSAAAAAAAAML/9PzBCQT1Rmp6+AAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[指标分析]\n", " 最佳验证 l1: 0.053544\n", " 最佳迭代轮数: 175\n", " 早停建议: 如果验证指标连续10轮不下降,建议在第 175 轮停止训练\n", "\n", "[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\n" ] } ], "execution_count": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 查看结果" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:33:21.213471Z", "start_time": "2026-03-08T03:33:21.183426Z" } }, "source": [ "print(\"\\n\" + \"=\" * 80)\n", "print(\"训练结果\")\n", "print(\"=\" * 80)\n", "\n", "results = trainer.results\n", "\n", "print(f\"\\n结果数据形状: {results.shape}\")\n", "print(f\"结果列: {results.columns}\")\n", "print(f\"\\n结果前10行预览:\")\n", "print(results.head(10))\n", "print(f\"\\n结果后5行预览:\")\n", "print(results.tail())\n", "\n", "print(f\"\\n每日预测样本数统计:\")\n", "daily_counts = results.group_by(\"trade_date\").agg(pl.len()).sort(\"trade_date\")\n", "print(f\" 最小: {daily_counts['len'].min()}\")\n", "print(f\" 最大: {daily_counts['len'].max()}\")\n", "print(f\" 平均: {daily_counts['len'].mean():.2f}\")\n", "\n", "# 展示某一天的前10个预测结果\n", "sample_date = results[\"trade_date\"][0]\n", "sample_data = results.filter(results[\"trade_date\"] == sample_date).head(10)\n", "print(f\"\\n示例日期 {sample_date} 的前10条预测:\")\n", "print(sample_data.select([\"ts_code\", \"trade_date\", target_col, \"prediction\"]))" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "================================================================================\n", "训练结果\n", "================================================================================\n", "\n", "结果数据形状: (771207, 43)\n", "结果列: ['ts_code', 'trade_date', 'vol', 'close', 'low', 'high', 'total_mv', 'f_ann_date', 'n_income', 'ebitda', 'total_profit', 'ebit', 'operate_profit', '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', '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', 'return_5', 'prediction']\n", "\n", "结果前10行预览:\n", "shape: (10, 43)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬───────────┬──────────┐\n", "│ ts_code ┆ trade_dat ┆ vol ┆ close ┆ … ┆ cashflow_ ┆ operate_p ┆ return_5 ┆ predicti │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ to_market ┆ rofit_to_ ┆ --- ┆ on │\n", "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ _cap ┆ market_ca ┆ f64 ┆ --- │\n", "│ ┆ str ┆ ┆ ┆ ┆ --- ┆ p ┆ ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ --- ┆ ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪═══════════╪══════════╡\n", "│ 000001.SZ ┆ 20250102 ┆ 5.587779 ┆ 7.139221 ┆ … ┆ 4.533499 ┆ 3.606645 ┆ -0.002622 ┆ -0.00794 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 7 │\n", "│ 000002.SZ ┆ 20250102 ┆ 3.526191 ┆ 7.139221 ┆ … ┆ -1.386218 ┆ -3.946245 ┆ -0.022509 ┆ -0.00197 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 2 │\n", "│ 000004.SZ ┆ 20250102 ┆ -0.216144 ┆ -0.117733 ┆ … ┆ -0.331877 ┆ -0.860887 ┆ -0.064897 ┆ 0.006379 │\n", "│ 000006.SZ ┆ 20250102 ┆ 0.443786 ┆ 1.365091 ┆ … ┆ -0.116207 ┆ -1.747611 ┆ -0.048278 ┆ 0.002845 │\n", "│ 000007.SZ ┆ 20250102 ┆ -0.397614 ┆ -0.114388 ┆ … ┆ -0.079153 ┆ -0.417972 ┆ 0.015649 ┆ -0.00445 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 4 │\n", "│ 000008.SZ ┆ 20250102 ┆ 3.219998 ┆ -0.079069 ┆ … ┆ -0.385751 ┆ -1.051162 ┆ -0.066939 ┆ -0.00372 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 9 │\n", "│ 000009.SZ ┆ 20250102 ┆ 0.204049 ┆ 0.025538 ┆ … ┆ 0.245489 ┆ 0.579808 ┆ -0.036045 ┆ 0.003052 │\n", "│ 000010.SZ ┆ 20250102 ┆ 0.584268 ┆ -0.300634 ┆ … ┆ -0.781057 ┆ -1.022311 ┆ 0.092123 ┆ -0.01003 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ ┆ ┆ 7 │\n", "│ 000011.SZ ┆ 20250102 ┆ -0.488782 ┆ -0.243891 ┆ … ┆ -1.733032 ┆ -0.464004 ┆ -0.022094 ┆ 0.000949 │\n", "│ 000012.SZ ┆ 20250102 ┆ -0.060654 ┆ 0.501156 ┆ … ┆ 0.722727 ┆ 0.567525 ┆ -0.029188 ┆ 0.001858 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴───────────┴──────────┘\n", "\n", "结果后5行预览:\n", "shape: (5, 43)\n", "┌───────────┬───────────┬───────────┬───────────┬───┬───────────┬───────────┬──────────┬───────────┐\n", "│ ts_code ┆ trade_dat ┆ vol ┆ close ┆ … ┆ cashflow_ ┆ operate_p ┆ return_5 ┆ predictio │\n", "│ --- ┆ e ┆ --- ┆ --- ┆ ┆ to_market ┆ rofit_to_ ┆ --- ┆ n │\n", "│ str ┆ --- ┆ f64 ┆ f64 ┆ ┆ _cap ┆ market_ca ┆ f64 ┆ --- │\n", "│ ┆ str ┆ ┆ ┆ ┆ --- ┆ p ┆ ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ --- ┆ ┆ │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ │\n", "╞═══════════╪═══════════╪═══════════╪═══════════╪═══╪═══════════╪═══════════╪══════════╪═══════════╡\n", "│ 605588.SH ┆ 20251231 ┆ -0.601605 ┆ -0.161094 ┆ … ┆ 0.196523 ┆ -0.667804 ┆ null ┆ 0.000246 │\n", "│ 605589.SH ┆ 20251231 ┆ -0.152478 ┆ -0.293364 ┆ … ┆ -0.343887 ┆ 0.27582 ┆ null ┆ -0.001414 │\n", "│ 605598.SH ┆ 20251231 ┆ -0.248806 ┆ 0.149122 ┆ … ┆ -0.191229 ┆ -0.349198 ┆ null ┆ -0.011185 │\n", "│ 605599.SH ┆ 20251231 ┆ -0.482522 ┆ -0.364967 ┆ … ┆ 1.283712 ┆ 0.931037 ┆ null ┆ 0.00215 │\n", "│ 689009.SH ┆ 20251231 ┆ -0.481066 ┆ -0.119084 ┆ … ┆ 1.09954 ┆ 0.730255 ┆ null ┆ -0.001826 │\n", "└───────────┴───────────┴───────────┴───────────┴───┴───────────┴───────────┴──────────┴───────────┘\n", "\n", "每日预测样本数统计:\n", " 最小: 3147\n", " 最大: 3186\n", " 平均: 3173.69\n", "\n", "示例日期 20250102 的前10条预测:\n", "shape: (10, 4)\n", "┌───────────┬────────────┬───────────┬────────────┐\n", "│ ts_code ┆ trade_date ┆ return_5 ┆ prediction │\n", "│ --- ┆ --- ┆ --- ┆ --- │\n", "│ str ┆ str ┆ f64 ┆ f64 │\n", "╞═══════════╪════════════╪═══════════╪════════════╡\n", "│ 000001.SZ ┆ 20250102 ┆ -0.002622 ┆ -0.007947 │\n", "│ 000002.SZ ┆ 20250102 ┆ -0.022509 ┆ -0.001972 │\n", "│ 000004.SZ ┆ 20250102 ┆ -0.064897 ┆ 0.006379 │\n", "│ 000006.SZ ┆ 20250102 ┆ -0.048278 ┆ 0.002845 │\n", "│ 000007.SZ ┆ 20250102 ┆ 0.015649 ┆ -0.004454 │\n", "│ 000008.SZ ┆ 20250102 ┆ -0.066939 ┆ -0.003729 │\n", "│ 000009.SZ ┆ 20250102 ┆ -0.036045 ┆ 0.003052 │\n", "│ 000010.SZ ┆ 20250102 ┆ 0.092123 ┆ -0.010037 │\n", "│ 000011.SZ ┆ 20250102 ┆ -0.022094 ┆ 0.000949 │\n", "│ 000012.SZ ┆ 20250102 ┆ -0.029188 ┆ 0.001858 │\n", "└───────────┴────────────┴───────────┴────────────┘\n" ] } ], "execution_count": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 保存结果" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:35:07.142015Z", "start_time": "2026-03-08T03:35:06.791043Z" } }, "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", " 保存行数: 486(243个交易日 × 每日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.078766 ┆ 603007.SH │\n", "│ 2025-01-02 ┆ 0.065013 ┆ 603559.SH │\n", "│ 2025-01-03 ┆ 0.087979 ┆ 603007.SH │\n", "│ 2025-01-03 ┆ 0.067351 ┆ 603559.SH │\n", "│ 2025-01-06 ┆ 0.087962 ┆ 603007.SH │\n", "│ … ┆ … ┆ … │\n", "│ 2025-01-09 ┆ 0.036131 ┆ 603848.SH │\n", "│ 2025-01-09 ┆ 0.027876 ┆ 603977.SH │\n", "│ 2025-01-10 ┆ 0.027436 ┆ 002952.SZ │\n", "│ 2025-01-10 ┆ 0.024641 ┆ 603848.SH │\n", "│ 2025-01-13 ┆ 0.024852 ┆ 603848.SH │\n", "└────────────┴──────────┴───────────┘\n" ] } ], "execution_count": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.5 特征重要性" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:35:07.151989Z", "start_time": "2026-03-08T03:35:07.148773Z" } }, "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 14616.823972\n", "return_10 2170.157647\n", "return_20 1597.996920\n", "ma_ratio 1346.640091\n", "vol_ratio 1307.361400\n", "high_low_ratio 918.782296\n", "vol_ma20 828.398926\n", "ma20 635.353193\n", "volatility_5 631.979581\n", "return_diff 617.399685\n", "vol_ma5 491.980673\n", "market_cap_rank 415.972949\n", "volatility_20 276.516502\n", "profit_to_market_cap 256.683738\n", "ma5 236.319446\n", "ma10 173.155782\n", "ebit_rank 142.423690\n", "operate_profit_to_market_cap 127.127625\n", "total_liab_rank 97.979562\n", "n_income_rank 77.705741\n", "operate_profit_rank 75.762452\n", "cashflow_to_market_cap 68.135267\n", "money_cap_rank 58.562898\n", "n_cashflow_act_rank 47.001317\n", "total_profit_rank 36.941945\n", "dtype: float64\n", "\n", "================================================================================\n", "训练完成!\n", "================================================================================\n" ] } ], "execution_count": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. 可视化分析\n", "\n", "使用训练好的模型直接绘图。\n", "- **特征重要性图**:辅助特征选择\n", "- **决策树图**:理解决策逻辑" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:35:07.163848Z", "start_time": "2026-03-08T03:35:07.158216Z" } }, "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", "特征数量: 25\n" ] } ], "execution_count": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 绘制特征重要性(辅助特征选择)\n", "\n", "**解读**:\n", "- 重要性高的特征对模型贡献大\n", "- 重要性为0的特征可以考虑删除\n", "- 可以帮助理解哪些因子最有效" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-08T03:35:07.289782Z", "start_time": "2026-03-08T03:35:07.170460Z" } }, "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+naQAA6I9JREFUeJzs3QmcjWX/x/GfXciavSJbJCJbqKwhEi2oLEmLSoQWKQkRRVGItIn2nVJ5SllabJEQSojsJQlZhvm/vtfz3Od/5sw5Y4Y5M/eZ+bxfr/MY59xz3/c51/G8+t6/33XdWeLj4+MNAAAAAACkuqypv0sAAAAAAEDoBgAAAAAgiqh0AwAAAAAQJYRuAAAAAACihNANAAAAAECUELoBAAAAAIgSQjcAAAAAAFFC6AYAAAAAIEoI3QAAAAAARAmhGwAAIAq2bNliuXPntm+++SZNPt/u3btb2bJlT+p3H3jgAatXr16qnxMAgNANAIhBU6dOtSxZsoR9KDxEw7fffmtDhgyxvXv3ml8/j6VLl1qsevbZZ937yEiGDRvmgmzDhg0TvbZgwQLr2LGjlS5d2nLmzGkFChRw2+p3du7cmebn2rdvX1uxYoXNnDkzzY8NABld9vQ+AQAATpYCyjnnnJPgufPPPz9qoXvo0KGumliwYMGoHCMzU+g+44wz3OebEezevdteeeUV9wg1ePBge/TRR61cuXLu/erPQ4cO2ffff29PPvmk+51ff/01xcd8/vnn7fjx4yd1viVKlLB27drZmDFj7MorrzypfQAAwiN0AwBi1uWXX261a9e2WHbgwAHLmzevZVYHDx60PHnyWEbz6quvWvbs2a1t27YJnn/rrbdc4FaVe/r06a7KHWzs2LHucTJy5MhxSuesc+rQoYNt2LDBXQgAAKQO5nQDADKsTz/91C655BIXak8//XRr06aNrV69OsE2P/74Y6DaqPm3qvj16NHD/vzzz8A2aiu/77773M+qrHut7Js2bXIP/RyuNVrP63eD96PnfvrpJ7vhhhusUKFCdvHFFycIarVq1bLTTjvNChcubNddd52bF3wy9J7y5ctnmzdvtiuuuML9rFbmiRMnutdXrlxpTZs2dZ9NmTJl7PXXXw/bsj5//nzr2bOnFSlSxPLnz2/dunWzv/76K2ylumrVqpYrVy4rVaqU9erVK1ErfuPGjV0ngiq6l156qQvbDz74oJuHrHGZN29e4LPVtrJnzx679957rVq1au496Bx0sUWt0MHmzp3rfu/tt9+2ESNG2JlnnunGs1mzZrZ+/fpE57to0SJr3bq1GwN9BtWrV7enn346wTZr1661a6+91o2F9qULPMltv/7www9du7jOObTKrYr+iy++mChwi9rMg78zMmPGDPfd1eeqz7d8+fIuuB87dizJOd3ed1PV6ylTprjf0+/XqVPHlixZkujYzZs3DxwPAJB6qHQDAGLW33//bX/88UeC5xRoRFXEG2+80Vq2bGmPP/64q6hOmjTJhdzly5cHwsnnn3/uKns33XSTC9wKfwoo+nPhwoUutFx99dX2888/2xtvvOGqkN4xihYt6tqIU0rVxIoVK9pjjz1m8fHx7jkFxYcffthVG2+55Ra33/Hjx7twqvM9mZZ2hTIFVO3jiSeesNdee83uuusuFzIfeugh69y5s3tvkydPdmG6fv36idr1tb2OrSC4bt069xn+9ttvgZArek2t9wptd9xxR2A7BTstIhZcgdXFDJ2TLih06dLFihcv7gJ27969XUDVeYmeF42NAqw+M52b5js/99xz1qhRI3fxQkE02KhRoyxr1qwuqOv7ofet96mQ7dGY60JEyZIl7e6773bjvmbNGvv444/d30Xjr7nYulChdQL0mSnQt2/f3t577z276qqrIn7uR48ede9dn0UwfYf00PiGhvGk6AKItu/fv7/788svv3Thfd++fTZ69OgT/r4uqPzzzz/u4onGTJ+Jxl2fbfDYKPArmGvM+vXrl+zzAwCcQDwAADHm5ZdfVlIN+5B//vknvmDBgvG33nprgt/bsWNHfIECBRI8f/DgwUT7f+ONN9y+5s+fH3hu9OjR7rmNGzcm2FZ/1/M6p1B6/pFHHgn8XT/rueuvvz7Bdps2bYrPli1b/IgRIxI8v3Llyvjs2bMnej7S57FkyZLAczfeeKN77rHHHgs899dff8Wfdtpp8VmyZIl/8803A8+vXbs20bl6+6xVq1b8kSNHAs8/8cQT7vkZM2a4v+/atSs+Z86c8S1atIg/duxYYLsJEya47V566aXAc40aNXLPTZ48OdF7qFq1qns91KFDhxLs1/vMc+XKFT9s2LDAc1999ZXbd5UqVeIPHz4ceP7pp592z+uzlLi4uPhzzjknvkyZMu7zCHb8+PHAz82aNYuvVq2aO37w6w0aNIivWLFifFLWr1/vjjl+/PgEz+sz0/Pjxo1LdNzdu3cneBw9ejTJ72jPnj3j8+TJk+D8NOZ6X8Gfk45XpEiR+D179iQ6j48++ijRfjWO+gwBAKmH9nIAQMxSq7SqlsEP0Z9qbb7++utdJdx7ZMuWzbX8fvXVV4F9qJXbo8WstN1FF13k/r5s2bKonPftt9+e4O/vv/++WwBLVe7g81UFVhXx4PNNKVVVPapYn3vuua5qq2N59JxeU+Uz1G233ZagGqrqreYqf/LJJ+7vX3zxhR05csStfq0Ks+fWW291reCzZs1KsD+1N6urILm0vbdfVe5VKVe1V+ccbny07+C2bU0vEO+9qWtg48aN7nxDuwe8yr1a2lVN1mekCrE3Hjq2Oid++eUX27p1a8Rz9qYmqHU9mCrTElrlVkVeXRPBjx9++CHsd9Q7H70vdW+oBf5EOnXqlOBcQj+TYNoutHsEAHBqaC8HAMSsunXrhl1ITaFINGc5HIVBjwKWWqPffPNN27VrV6IwFA2hLdw6XxXGFbBTc4EszUNWgAumFmLNd/YCZvDz4eZqh56TAqPasjVfWNRqLgrBwRR8NU/ee93j3SIruXQxQnOtNWdcYTl4HrPmmYc6++yzE/zdC5vee/NWBU9qlXvNAdd4qN1fj3D0XdF7SYo3dcCjdQVk//79iT5T74LRf/7zn0Qt42p1HzRokLsQ4AX3lHxHT/SZhJ5z6HcDAHBqCN0AgAzHu22S5nWrWhxKlVqPqpm6HZgWSqtRo4YLQPr9Vq1aJev2S5ECSugiV8GCK5fe+Wo/WvhN1fhQKZn/GyzcvpJ6PjQkRkPoez8RzXtX8NXidlo8TIuaqfKtSnW48UmN9+btV/PCVdkOp0KFChF/37sYEBpqK1eu7P5ctWpVou+jt4jZ77//nuA1dWxo/rouFOkWeZpzrYspqvIPGDAgWd/RlHwmOmdvzQIAQOogdAMAMhwFEylWrFggzISjgDFnzhxX6dbCVKGV8uSEa69qGLpSd2iF90TnqwCkCnilSpXMT/RZNGnSJPB3VWm3b9/uVv4WrXwuWjwt+DZTajlXZTqpzz85n++7777rjq/VvoPp8z6ZcOh9NxR8I52b9z7UYZDc8w+tLOvigt5/MHUDqHNAC8ONGzcuWbeK04J1alfXFAQtiOcJ3Xdq0X4vuOCCqOwbADIr5nQDADIcVSdVGVSVVCtJh/JWHPcqgKEVPwWiUF5ACg3XOo7Cn26tFUzt0MmllaR1Lgr/oeeivwffviytaSX34M9Qq5LHxcW5FchFoVTt4s8880yCc1dIVuuzbnWVHPp8Qz9b0ecS+pm88847Sc6pTsqFF17oLm5ojEOP5x1HF2u0orpWSdcFhlAnWrFeYV3THpYuXZroNa30rjnTmvMe7rsZ+l7DfUd1QSMl36/k0nip/b5Bgwapvm8AyMyodAMAMhwFYYXDrl27upCl21NpbrPuWa2FvXQrqAkTJrjtvNtpKQBpjq7m1IarIur+2aJbWml/ClZt27Z1YVGLlelWVfpTYUsBXLeGSkn1dfjw4TZw4EA3V1q3pdL8X53HBx984BYzU6tzelDA072u1YavarbCnm67duWVV7rX9bnqvHXBQC35et7bTveD1m3BkkOfr8ZMn4NatxV8NSdft/ZSW7UWSFMY1P3Fdeuz4Kp6Sqg1XcfR2Gk6gfarOepakExzp2fPnh1YpE/vU/cHV0DW8XS7su+++861gIfeJzxUu3bt3HdFc7CD1xDQ/dlVZR85cqQtXrzYfZd0EeDAgQPued2WTmPvdVDoPetn3f6uT58+riNA0yaiMRVAi+Jpvzp3AEAqSsWV0AEASBPhbpEVjm4j1bJlS3ebsNy5c8eXL18+vnv37vFLly4NbPP777/HX3XVVe4WY9quQ4cO8du2bUt0Cy159NFH40uXLh2fNWvWBLcP0y2dbr75Zvf7p59+enzHjh3drbQi3TJMt4QK57333ou/+OKL4/PmzeselStXju/Vq1f8unXrUvx56PZR2kco3ZZLt+cKpVtNtWnTJtE+582bF3/bbbfFFypUKD5fvnzxnTt3jv/zzz8T/b5uEabzzZEjR3zx4sXj77jjjkS35Ip0bO92bjq+Pj8d17t9mG6Jdc8998SXLFnS3e6sYcOG8d999517PfgWY94tw955551k3dLt66+/jr/sssvc8fQ5Va9ePdEtvn799df4bt26xZcoUcK9L439FVdcEf/uu+/Gn8jOnTvd7d6mT58e9vW5c+fGX3vtte59ad/58+ePr127tvuObN++PcG233zzTfxFF13k3n+pUqXi77///vjZs2e796X3faJbhul2d6HCfb87derkvn8AgNSVRf+TmiEeAADEvqlTp7oq8JIlS8KuEI8Tu/nmm13Hw4IFC3z/ce3YscNV3LWKP5VuAEhdzOkGAACIgkceecRdtPjmm298//lqjrta6QncAJD6mNMNAAAQBVrF/NChQzHx2WpNAgBAdFDpBgAAAAAgSpjTDQAAAABAlFDpBgAAAAAgSgjdAAAAAABECQupZTDHjx+3bdu22emnn25ZsmRJ79MBAAAAAF/RXbP/+ecfK1WqlGXNGv06NKE7g1HgPuuss9L7NAAAAADA17Zs2WJnnnlm1I9D6M5gVOGWjRs3WuHChdP7dBDG0aNH7T//+Y+1aNHCcuTIwWfkQ4yR/zFG/scY+R9jFBsYJ/9jjGJvjPbt2+cKlV52ijZCdwbjtZTrC5Q/f/70Ph1E+EefJ08eNz6Ebn9ijPyPMfI/xsj/GKPYwDj5H2MUu2OUJY2m47KQGgAAAAAAUULoBgAAAAAgSgjdAAAAAABECaEbAAAAAIAoIXQDAAAAABAlhG4AAAAAAKKE0A0AAAAAQJQQugEAAAAAiBJCNwAAAAAAUULoBgAAAAAgSgjdAAAAAABECaEbAAAAAIAoIXQDAAAAABAlhG4AAAAAAKKE0A0AAAAAQJQQugEAAAAAiBJCNwAAAAAAUULoBgAAAAAgSgjdAAAAAABECaEbAAAAAIAoIXQDAAAAABAlhG4AAAAAAKKE0A0AAAAAQJQQugEAAAAAiBJCNwAAAAAAUULoBgAAAIAMYP78+da2bVsrVaqUZcmSxT788MOI295+++1um3HjxiV6bdasWVavXj077bTTrFChQta+ffsEr/fp08dq1apluXLlsho1aoTdf3x8vI0ZM8YqVarktitdurSNGDEiyfP/+eefrV27dnbGGWdY/vz57eKLL7avvvoq8PqKFSvs+uuvt7POOsudW5UqVezpp5+OuL9vvvnGsmfPbrVr17b0FPOhe8iQIREHGgAAAAAyiwMHDtgFF1xgEydOTHK7Dz74wBYuXOjCeaj33nvPunbtajfddJMLuQquN9xwQ6LtevToYZ06dYp4jLvvvtteeOEFF7zXrl1rM2fOtLp16yZ5XldccYXFxcXZl19+ad9//717L3pux44d7nU9V6xYMXv11Vdt9erV9tBDD9nAgQNtwoQJifa1d+9e69atmzVr1szSW/b0PgF9gLrioaspW7dudR+iQnTfvn198QGlFn0pBg8e7L4ov/32m40dO9a9x2DHjh1zFxH0JdLnon8E3bt3t0GDBrmrUAAAAAAQyeWXX+4eSVHm6t27t82ePdvatGmT4DUFXoXl0aNH28033xx4/rzzzkuw3TPPPOP+3L17t/3444+JjrFmzRqbNGmSrVq1ys4991z33DnnnJPkef3xxx/2yy+/2IsvvmjVq1d3z40aNcqeffZZt58SJUq4oB+sXLly9t1339n7779vd911V6JKvi4WZMuWzV1kyLShe9OmTdawYUMrWLCgG9hq1arZ0aNH3RegV69e7opIRnHw4EH3pejQoYP169cv7DaPP/64+3K+8sorVrVqVVu6dKm7wlSgQAHXwpES9UbOsbjseVPp7JGacmWLtyfqmp0/ZLYdPsbFFD9ijPyPMfI/xsj/GKPYwDj5nx/GaNOohOE5kuPHj7sq9n333efyRqhly5a5UJ41a1arWbOmKwSqIKqsdv755yf7fD766COXfT7++GNr1aqVazVv3ry5PfHEE1a4cOGwv1OkSBEX0KdNm2YXXniha0l/7rnnXFFWreyR/P3334n2+fLLL9uGDRtcMXP48OGW3tK1vfzOO+90FdzFixfbNddc4/r9Nfj9+/d37Q6yefNm19efL18+19ffsWNH27lzZ8R9Nm7cOFEFWXMQVDH2lC1b1n34ajfQfsuUKePaHXSlxjuWrq4o9HqmTp3qLg7ogoDmDmgbfYG2b9+erPdap04d92W97rrr3BconG+//dYdX1ecdI7XXnuttWjRwn0+AAAAAHAqVOTTHOdIBT0FVVH3rbptFZo1p1sZa8+ePck+jvaj7t533nnHhWhlKXX8Kt9Eolz4xRdf2PLly+3000+33Llz21NPPWWfffaZO4dI+emtt96y2267LfCcquUPPPCAC9x6r36QbmehQdMHqNbyvHkTV2QVcHUlxgvB8+bNc+0OqoBr7sDcuXNP6fhq737sscfs4Ycfdj/rik+DBg1cy4LC8YABA1woV1u419qtarXmJEyfPt1d/enSpYvde++99tprr1lq0PGnTJniFhDQBQjNofj666/dly2Sw4cPu4dn37597s9cWeMtW7b4VDkvpC6NTfCf8B/GyP8YI/9jjPyPMYoNjJP/+WGM1C0cjvKT95qq2Fp0bNGiRe754Cmu3jZHjhxxfyq0Xnnlle5n5RO1hr/55pt26623Jti/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5uDBg9aqVSt78MEHw+6jQYMGtn379gSPW265xc455xyrXbu222bfvn1uv2XKlLHvv//eRo8e7f7dKNCfSI8ePaxTp05JbvPFF18kOL6Cuuf111+3Bx54wB555BFbs2aNvfjii/bWW29FfD8AAABALMluMWDHjh02YsQImzVrlm3dutVV/BSi+/bta82aNbOMQtVKhaxQrVu3du8dmc9nn32W4O9Tp051338F40svvdQ9p38HXkU7nJw5c1qJEiUCf1dwnzFjhvXu3dtVneW1116zI0eO2EsvveS2r1q1qv3www/21FNP2W233Rbx/J555hn35+7du12lPJIiRYokOIdg3377rTVs2NBuuOEG9/eyZcva9ddfb4sWLYq4PwAAACBW+D50qz1V/0FesGBBV32rVq2aCw2zZ892FcC1a9daRvH++++74OP5888/7YILLrAOHTqkeF/1Rs6xuOx5U/kMkRpyZYu3J+qanT9kth0+9t/QG86mUW0SPff333+7PwsXLnzSx585c6b7bt10002B57777jsX4hW4PS1btrTHH3/c/vrrLytUqJCdiiuvvNK1i1eqVMnuv/9+9/fgSvyrr75qixcvtrp169qGDRvsk08+sa5du57SMQEAAAA/8H17+Z133umqcfoP8muuucb9R7uqcP379w/MC928ebO1a9fO8uXL5+a1duzY0Xbu3JlkRdmrDno0V7Z79+6Bv6vaNnz4cOvWrZvbr9puFVZU0fOOVb16dVu6dGmCKqQuDuiCQJUqVdw2avtVO21yKEipGug91E6cJ0+ekwrdyHiOHz/uvre6CHX++eef9H7Uvq1AfeaZZyboJilevHiC7by/67WTpX8DTz75pL3zzjuuW+Piiy92/9b0b8mjCvewYcPcazly5LDy5cu7f6O0lwMAACAj8HWle8+ePa69Vq3lefMmrtoq4CqIeCFYrdlxcXGuAq45ppHabZNr7Nix9thjj9nDDz/sflblTVU5zWFV1X3AgAEulK9evTrQpqv5tWPGjLHp06db1qxZrUuXLnbvvfe69t2TCUfXXXdd2PfuOXz4sHt4NDdXcmWNt2zZ4k/qfSO6NDbBf0aijo5gd911l61atcq++uqrRK+Jvvve74V7XX7//Xd3UUjzqIO3iY+Pd/+Wgp/zfk5qf55jx465fYRuV6BAAdfG7tG0EJ2DFmm7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Fdl7FCpUKPCaQnaOHDnsmWeesdKlS1vt2rVt8uTJ9t5779n69evdNhr34N/Pli2bffnll3bzzTdHPKa3X10M0HenTp06ifarkF29enUbPHiwC+cK8U888YT7nX/++cdtky9fvgTH3rlzp/30009JHhsAAABA0rKbz23atMkaNmzo2mZVHaxWrZodPXrUZs+ebb169bK1a9daRvH666+7yuNLL73k2oB//vnnQMvyU089laJ91Rs5x+Ky0xacGjaNapPsbefOnesq0grbTZs2dSFd7d5y+PBhy5kzp2XN+v/XuhSy5euvv3ZhONS0adMsT548du2110Y8ZnL2q21y586d4Pe0jS7ofP/999a4ceNE+33hhResUqVKdskllyT7/QMAAACIsUr3nXfe6ULn4sWL7ZprrnEhoGrVqta/f39buHCh22bz5s3Wrl07V6nLnz+/dezY0VXpIlHA6Nu3b4Ln2rdvn6Adt2zZsi4wdevWze23TJkyrh139+7dgWOpcrh06dIE83F1cUAXBKpUqeK28dqNk+Pbb791Fxg031fHb9GihV1//fXuvcP/NNYKyerAePzxx23evHmuOn7s2DH3ukK4ujaefPJJd+Hor7/+CrR3R/qOvPjii+774IXocLz96qLUkSNHwu5XLer6fqndXeezdetWGzZsWMRjK4y/9tprVLkBAACAjFzp3rNnj5ufOmLEiLCLOSngHj9+PBCCFXK0MJQq4Jobq6rjqRg7dqw99thj9vDDD7ufu3bt6irQPXr0cAFHC1EplGv+rC4MyMGDB23MmDE2ffp0V3ns0qWLmyurAHMi2verr77qQnbdunVtw4YN9sknn7jjRqIKph6effv2uT9zZY23bNniT+n9478UkMPRdy34NV0U8lSuXNldeNGfX3zxhQvGumCkEH3ffffZH3/8YdmzZ7e77rrLihcvbvHx8YmOo4tKa9assZdffjniOYi33/vvv98GDhzoWtJD99ukSRMbNWqU3X777e77pDb4Bx980BYsWOD+DYXu/5133nFt5wr8SR07o/Lec2Z877GCMfI/xsj/GKPYwDj5H2MUe2N0NI3/G8/XoVvzURUaFFwiUVVx5cqVtnHjRjcHWlRtVDV8yZIlbn7rydLCUz179nQ/ay7spEmT3P68haUUuuvXr++q6poD6w2g5tNqsSxR+PEqiieigKMw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/2OM/I8x8j/GKDYwTv7HGMXeGO37X2bSNM38+fNn7vt0AwAAAAAQywjdaShfvnwRH5ovDAAAAADIWHw/pzsj0f23I9HK1QAAAACAjIXQnYa8+28DAAAAADIH2ssBAAAAAIgSQjcAAAAAAFFC6AYAAAAAIEoI3QAAAAAARAmhGwAAAACAKCF0AwAAAAAQJYRuAAAAAACihNANAAAAAECUELoBAAAAAIgSQjcAAAAAAFFC6AYAAAAAIEoI3QAAAAAARAmhGwAAAACAKCF0AwAAAAAQJYRuAAAAAACihNANAAAAAECUELoBAAAAAIgSQjcyjfnz51vbtm2tVKlSliVLFvvwww8TvD5kyBCrXLmy5c2b1woVKmTNmze3RYsWJdhmz5491rlzZ8ufP78VLFjQbr75Ztu/f3+CfWjfoQ/tM5I///zTWrVq5c4rV65cdtZZZ9ldd91l+/btS7Dd4cOH7aGHHrIyZcq47cqWLWsvvfRS4PXVq1fbNddc457XMceNG5cKnxoAAACAU5EpQreCUI0aNdL7NJDODhw4YBdccIFNnDgx7OuVKlWyCRMm2MqVK+3rr7924bVFixa2e/fuwDYK3Aq3n3/+uX388ccuyN92222B1++9917bvn17gsd5551nHTp0iHheWbNmtXbt2tnMmTPt559/tqlTp9oXX3xht99+e4LtOnbsaHPmzLEXX3zR1q1bZ2+88Yade+65gdcPHjxo5cqVs1GjRlmJEiVO8dMCAAAAkBqyWwzYsWOHjRgxwmbNmmVbt261YsWKuRDdt29fa9asmWUke/fuddXM999/31VVVdVUxbJ169bpfWox7/LLL3ePSG644YYEf3/qqadcwP3xxx/d92zNmjX22Wef2ZIlS6x27dpum/Hjx7uxGTNmjKtU58uXzz08K1assJ9++skmT54c8biqqt9xxx2Bv2vM77zzThs9enTgOR133rx5tmHDBitcuLB7ThcFgtWpU8c95IEHHkjBJwMAAAAg04buTZs2WcOGDV0rr0JItWrV7OjRozZ79mzr1auXrV271jKKI0eO2GWXXeYuKrz77rtWunRp++2339x7T6l6I+dYXPbILc2ZzaZRbVI8FlOmTLECBQq46rh89913biy8wC1qQVelWm3oV111VaL9vPDCC66CfskllyT72Nu2bXMXXRo1ahR4TlVwHfeJJ56w6dOnu3b1K6+80h599FE77bTTUvTeAAAAAKQd37eXq+Kn+amLFy9281UVYKpWrWr9+/e3hQsXum02b97s2nNVYdRcW7Xh7ty5M+I+Gzdu7Krkwdq3b2/du3cP/F1VxOHDh1u3bt3cflV9VPBRq7F3rOrVq9vSpUsDv6O2YIUyXRCoUqWK20ZzddVinByan6vqtuYa60KDzkHBywt9iD61jGvccufObWPHjnVt5GeccUag40IXRIJlz57dVZ71WqhDhw7Za6+95uZ9J8f1119vefLkcRdb9D1WYPeowq2W91WrVtkHH3zguh90YUb/PgAAAAD4l68r3QqgaqtVa3m4hagUcI8fPx4IwWq/jYuLcxXwTp062dy5c0/p+Apdjz32mD388MPu565du1qDBg2sR48eruo+YMAAF8o1x1cXBrx5tWo1VjVSFdAuXbq4eb4KXyeiUF+/fn13/jNmzLCiRYu6lmcdJ1u2bGF/R4tr6eHxFt/KlTXesmWLP6X3n5GoOyKUviuhz1988cWufVyLm6m1XBdwFHYVto8dO2bx8fFh96XXQp9/55137J9//nFjGPya93Po9qpiP/jgg/bLL7/YoEGD3IUhta97+9d3TBd2VH33tr/uuuvs6aefDlvtDndOSJ5IYwT/YIz8jzHyP8YoNjBO/scYxd4YHU3j/8bzdehev369CzlaUToSLSylha82btzoVn2WadOmuWq4wpM3x/VkaK5uz5493c+DBw+2SZMmuf15i2IpDCskq6ruLVylAdT83fLly7u/axXqYcOGJet4qmZ++eWXbrGuTz75xL1/VTK1z0ceeSTs74wcOdKGDh2a6PlBNY9bnjzHTvq9ZzT6PEN9//33liNHjoi/o+4HdS1ofvS1115ru3btcq3fwftSsFVA11oDocfQhZlatWq544SjKno4usCiCzwK4PXq1XOVdB1HF5m++eabwHY6H/370AUdzScPpos/mkse7n0j+SKNEfyDMfI/xsj/GKPYwDj5H2MUO2N08ODBND2ur0O3AsWJaHErhW0vcItWi1ZA0WunErrVPu4pXry4+1NzykOfU/jxQrfag73ALSVLlnSvJ4eq9qqoai6xgpcCm8Kcwluk0D1w4EDXah9c6dZnMXx5VovLEb46nhmtGtIy0XP6fE+0QJ0qyGrz13bnnHOOW91cY33hhRcG/uHqe6qVxoODry4CqRVcc7NDj6GLKPo9zd+PFPpPP/30QOVdx1fYv+eee+zSSy8NLNSmzgh1U+giTWilW99D/TtgAb6Tk5wxQvpijPyPMfI/xig2ME7+xxjF3hjtC7k1b6YO3RUrVnQttam9WJqCSmigD9diEPwf2177eLjnFJbD/Y63TXIuHngBXb8f3EquueGaL6yFvXLmzJnod3S/Zj1CHT6exeKO/ff88N9x0f201T3g2bJli5saoEpykSJF3DQGLU6mcfjjjz/crcV00UMt3Pp9XYTRHH2tNK5uBn1n1AKu1zXnP5imF2g/ui946NQAzdnv16+fC+bar6rR6pbQBSIFap3Tfffd5+b169+AqPKtqQ66PZk6G3R+uuCiqQ6a/y36jqi67f2s7432pX1WqFCBr8FJ0PgQuv2NMfI/xsj/GKPYwDj5H2MUO2OUI42LKr4O3QpDLVu2dOGnT58+ieZ16/ZaCqUKT3p41W4FD72mSl84misdvLiZWndVlWzSpImlJ4Ws119/3YV4XRgQ3bdZ4S1c4E7KooHNXJDE/9Oid8Fj7HUI3HjjjS5E6+LOK6+84gKtPjuF4AULFripCh61cmvKgG4hpjHS4n7PPPNMgo9Z46e511qYL9xcfF1ZU5j3qEr9/PPPuyCu+fn6Hl999dUJbvul4Kyrc71793armOv8NN9ci/15VA2vWbNm4O9aW0APLcZ3qusbAAAAAMiAoVsUuBVG69at6+ZGq9qoBbAUQDTHWgFbLd9qsdWKznpN86AVNIJv7RSsadOmLnDpvt9qBdf9mBXS05sqqGpfvvvuu1240oJaqm7qggNOnVatT6rrQK3gybkQpAsjSVEY10WgSLT4nrciuuhCwLfffnvCY2ttg6TmCqkNPbldFQAAAADShu9vGVauXDlbtmyZCyaa03r++ee7XnwtoKbQrfZtrfRdqFAhN99V903W77z11lsR96mWXFU3FX4UzrV9ele5RRVOLdylBeB0cUFhWwE8uOIJAAAAAIgdvq90i9qrVQHWI5yzzz7bBe9IhgwZ4h4e9fA/++yz7hHJpk2bEj0XWkUMrSyqnTj4Xt/eCtgpqT5qNXTv/uMAAAAAgNjm+0o3AAAAAACxitCdhrQYVqSHFuwCAAAAAGQsMdFenlH88MMPEV8rXbp0mp4LAAAAACD6CN1piHslAwAAAEDmQns5AAAAAABRQugGAAAAACBKCN0AAAAAAEQJoRsAAAAAgCghdAMAAAAAECWEbgAAAAAAooTQDQAAAABAlBC6AQAAAACIEkI3AAAAAABRQugGAAAAACBKCN0AAAAAAEQJoRsAAAAAgCghdAMAAAAAECWEbgAAAAAAooTQDQAAAABAlBC6AQAAAACIEkI3AAAAAABREvOhe8iQIVajRo30Pg1EwT///GN9+/a1MmXK2GmnnWYNGjSwJUuWBF5///33rUWLFlakSBHLkiWL/fDDD4n2sWPHDuvatauVKFHC8ubNaxdeeKG99957SR63bNmybn+hj169eiV7v5s2bbKbb77ZzjnnHHfu5cuXt0ceecSOHDmSap8PAAAAAP9L99Ct8NK7d28rV66c5cqVy8466yxr27atzZkzxzKS1atX2zXXXBMIdOPGjUu0zaRJk6x69eqWP39+96hfv759+umnllndcsst9vnnn9v06dNt5cqVLmA3b97ctm7d6l4/cOCAXXzxxfb4449H3Ee3bt1s3bp1NnPmTLePq6++2jp27GjLly+P+DsK9tu3bw88dA7SoUOHZO937dq1dvz4cXvuuefc2I8dO9YmT55sDz74YCp+QgAAAAD8Lnt6HlzVwIYNG1rBggVt9OjRVq1aNTt69KjNnj3bVRUVXDKKgwcPugsLCm79+vULu82ZZ55po0aNsooVK1p8fLy98sor1q5dOxfkqlatmqLj1Rs5x+Ky57VYtGlUG/v3339d5XjGjBl26aWXBroaPvroI3dxYvjw4a7S7LbftCnivr799lu3fd26dd3fBw0a5ALw999/bzVr1gz7O0WLFk3wd42JKtWNGjVK9n5btWrlHh6NvUK6fmfkyJGn9PkAAAAAiB3pWum+8847XdV38eLFrgpcqVIlFy779+9vCxcudNts3rzZBc98+fK56q+qiTt37oy4z8aNG7uW5GDt27e37t27B/6uarNCm6qV2q/al1Wx3L17d+BYqjgvXbo08DtTp051Fwd0QaBKlSpuG4UqVUKTo06dOu7CwnXXXecq+uGowt+6dWsXuvVZjBgxwh3H+ywyk7i4ODt27Jjlzp07wfNq1f7666+TvR+1pL/11lu2Z88eV3l+88037dChQ+57khxqB3/11VetR48e7rt6Kvv9+++/rXDhwsk+dwAAAACxL91Ct8LKZ5995iramhMb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2BPzoVuBqUaNGul9GjhFjz/+uE2aNMkmTJhga9ascX9/4oknbPz48e71gwcPuuCrYK4/33//fVu3bp1deeWVCfZzxRVXuKD75Zdf2vfff28XXHCBe27Hjh0Rj12pUiV33JUrV9rXX39tZcuWtRYtWtju3bvd6wr2CuIVKlRwYfyzzz6z1atXW/fu3QP7WLFihbVu3dpatWply5cvt7feestmzpxpDzzwAN8NAAAAIBNL99CtMNS7d28rV66c5cqVy8466yxr27atqxpmJApp11xzjQt0WbJksXHjxiXaZv78+e69q4qrbT788EPLLL799ltXoW7Tpo37jK699loXfBcvXuxeL1CggH3++efWsWNHO/fcc+2iiy5yQVnBevPmzW6bP/74w3755RcXdKtXr24VK1a0UaNGucC+atWqiMe+4YYbXKjWd7Bq1ar21FNP2b59++zHH390r3/88ceWI0cOmzhxojt2nTp1bPLkyfbee+/Z+vXr3TYK2Trm4MGDXThv1KiRu2ig3/nnn3/S5DMEAAAA4D/Z0/PgmzZtsoYNG7qW3dGjR7vWYbURz54923r16mVr1661jELBT6GuQ4cO1q9fv7DbHDhwwFVme/ToYVdfffUpHa/eyDkWlz2vxYJNo9q4tuwpU6a49nBVnlU5VtVZATiSv//+212c0PdH1PatUDxt2jS78MIL3UWc5557zooVK2a1atVK1rkcOXLEnYdCvsZCDh8+bDlz5rSsWf//GpVa4EXnqJCtbXLnzp1gX9rm0KFD7sJA48aNT+qzAQAAABDb0rXSfeedd7rQpGqmqsAKW6o09u/f3xYuXOi2URVTFdB8+fK5ObqqdO7cuTPiPhVu+vbtm+C59u3bJ2gFViV1+PDhbk6w9lumTBnXCqx2Yu9YqlouXbo08DtTp0514U4XBKpUqeK2USvx9u3bk/VeVR3VhYXrrrvOhcFwLr/8cndeV111lWU2qk7rs9HcalWVa9as6caxc+fOYbdXmNWc6euvv959L0TfpS+++MK1d2tetUKwQrvawTVXOymqZmtM9Ttjx451VXXNC5emTZu6jgyNn0L5X3/9FWgb98a/ZcuWrlr/xhtvuPnpW7dutWHDhiXYBgAAAEDmk26V7j179rgwNGLECLeAVSgF3OPHjwdC8Lx589xcXVXAO3XqZHPnzj2l4ytYPfbYY26O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wgtWr149u/jii238+PFubLZt25aqnxUAAACAjCm7+dymTZtctVRhaPTo0S54HT161GbPnm29evWytWvXWkaj93zvvffaJZdcctL7qDdyjsVlz2vpZdOoNq6C3LJlS1elnjdvnpUuXdruvPNOu/XWW8P+jiraU6ZMsQIFCtgFF1xw0sc+fPiw+zN37tyB57Jmzeou2Kiafsstt7jn1LL+1ltvWZs2bdz36+2337ZDhw5Z48aN3evfffede7527dqB/egCgfalFvirrrrqpM8RAAAAQObg+0q3QpoqvosXL7ZrrrnGtSOrItq/f39XzZTNmzdbu3btLF++fG7urVqENac3EoWqvn37JnhOFWXNAfaozXn48OGuBVn7VXuyQqTanr1jVa9ePcH85KlTp7qQpgsCVapUcdtoLvH27duT/X6PHTvmWppV3VX1NZapvVsV5ooVK7rPRO3hffr0sVdeeSXBdmrb1melkDx27FjXyn3GGWec9HE1R/zss8+2gQMHuhZ3hXlV3X///fcEY6GQrQs4mm+uQN6zZ0/74IMPrEKFCoEOi2LFiiXYd/bs2a1w4cLuNQAAAACI6Uq3FrFSe68W0tJCV6EUcI8fPx4IwaqmxsXFuQp4p06dbO7cuad0fAXAxx57zB5++GH3sxbdUnW0R48eruo+YMAAF8o151cXBuTgwYM2ZswYmz59uquIahExVa1fe+21ZB1z2LBhLuhpwa4FCxYkq6rrVXZFrdmSK2u8ZcsWb+lFYVZjU6tWLXcBQc4//3zXNq4grrZyj9q2lyxZYn/++ae9+OKL7qKJKtKhgVcXJLx9n4gCteZeKyBny5bNmjVr5i6AaL639/sPPfSQC+X6jil466KKjv3ll1+6jgodL3j70HNJznlE+myS+z6QPhgj/2OM/I8x8j/GKDYwTv7HGMXeGB1N4/8O93XoXr9+vQs9qlxGonndWgRr48aNbv6wTJs2zVXDFeQ0p/dktW7d2lU/ZfDgwYE5wmqXFoXu+vXru6q6VsD2BnDy5MmBect33XWXC9LJoaCp0PnDDz8k+xxHjhwZCLXBBtU8bnny/DekpodPPvnEXRTRxRD97NFFEc25Dn4utONAVfEHHnjArr322gSvrVixwn2+kX43lD53LZymY6pl/b777nNVbP2+Kt7PPvusPfPMM66lXKus6wKBOhoefPBBV5XftWuXm7sdfDyFbV0c0PbJPY9IVNGHvzFG/scY+R9j5H+MUWxgnPyPMYqdMTp48GCaHtfXoVuB+0S02JXCthe45bzzznOBT6+dSuhW+7inePHi7s/gxby85xTOvNCt21MFLxRWsmRJ9/qJ/PPPP66S/vzzz6eotVot1Gq1D65067MYvjyrxeXIZull1ZCW1rRpU9fSrYsXHlWRNUUg+LlQurWY2vtDt/njjz/cSuhJ/W4kCvq//vqrjRs3zi677DJ3oUYaNWrkpgJ4Jk6caGeeeaY7hhZ+08rqGlvdTsz7h6rv5e233+5uR3YydOFA+9F56P3Afxgj/2OM/I8x8j/GKDYwTv7HGMXeGO37X3dwWvF16NZcYLVtp/ZiaWr7Dg304VoMggOR1z4e7jm1UYf7HW+b5Fw8UCDUAmpald3j7VfziHVrq+Aw79FcZD1CHT6exeKO/ff80oM+h3vuuce146sVX23bmpevlcC1WJpeVxVaUweuvPJKd3FCoVqhV1Xk6667LvBZas6+phroeVWa1c4vqlqrki7qhlDV31vc7J133rGiRYu6ud0K2HfffberonuBXRdP9PvqRNB0ALWXf/jhh/bFF1+4OeY6ti66qCVdVW91L+g7orUAdG6qiKfGZ0To9jfGyP8YI/9jjPyPMYoNjJP/MUaxM0Y50rjw5euF1DQfV6tfK4gF31/Zs3fvXlel3LJli3t4dD9ovaaKdzgKY8ELainIrVq1ytKTQqPCoVrLvYfCaJMmTdzPwZX8WKEuAy1Mptt0aT73o48+6irNWihONNdaF1S8BfJ0wUGt25rLrukBHrX216xZ0x555BHbv3+/+1mP4EXsdFHi77//Dvxd46vOAX2uWrxNPwffLkz/0NQeru+CjquArWkJWuQtuJKuufjah+aE63nNP9dFAwAAAACI+Uq3KHDrlmG6l7Lm6CocaY6u2gM0x1oBW1VLBTkFOr2mFc/VNhx8q6dgantWS/asWbNc9Vj3hlZIT09auVvBNJha5CX0+eRYNLCZq96mtyuuuMI9Ir3n999//4T70KrweiQltJtAQVuPE3VSvPfeeye88PP666+f8BwBAAAAIOYq3aLbZi1btsxVfNWurACqXnwtoKbQrfbtGTNmWKFChezSSy9191HW7+j+y5Fo9fEbb7zRrTyucK7ttX8AAAAAADJVpVs031cLWukRjubtKnhHMmTIEPcIbi3WytV6RKL51Seqpmqxr+DndJ/v4Ht9i+YRJ2dOdzgnqu4CAAAAAPzN95VuAAAAAABiFaE7DWml7UgPLR4GAAAAAMhYYqK9PKPQKuSRlC5dOk3PBQAAAAAQfYTuNKT7QgMAAAAAMg/aywEAAAAAiBJCNwAAAAAAUULoBgAAAAAgSgjdAAAAAABECaEbAAAAAIAoIXQDAAAAABAlhG4AAAAAAKKE0A0AAAAAQJQQugEAAAAAiBJCNwAAAAAAUULoBgAAAAAgSgjdAAAAAAD4PXTv3bs3tXYFAAAAAEDmDd2PP/64vfXWW4G/d+zY0YoUKWKlS5e2FStWpOb5AQAAAACQuUL35MmT7ayzznI/f/755+7x6aef2uWXX2733Xdfap8jAAAAAAAxKfvJ/NKOHTsCofvjjz92le4WLVpY2bJlrV69eql9jgAAAAAAZJ5Kd6FChWzLli3u588++8yaN2/ufo6Pj7djx46l7hkCAAAAAJCZQvfVV19tN9xwg1122WX2559/urZyWb58uVWoUMH8ZsiQIVajRo30Po1MaevWrdalSxc35/+0006zatWq2dKlSwOvv//++65LQq9nyZLFfvjhhwS/v2nTJvd8uMc777yTrHO4/fbb3fbjxo1L8PyePXusc+fOlj9/fitYsKDdfPPNtn///gTb/Pjjj3bJJZdY7ty5XXfHE088cUqfBwAAAIDM5aRC99ixY+2uu+6y8847z83nzpcvn3t++/btduedd6b2Obp29t69e1u5cuUsV65cLvy0bdvW5syZYxnJ0aNHbdiwYVa+fHkX8i644ALXSRCr/vrrL2vYsKHlyJHDzfn/6aef7Mknn3SdEp4DBw7YxRdf7BbnC0djre9V8GPo0KHuO+dd7EnKBx98YAsXLrRSpUolek2Be/Xq1e47rGkS8+fPt9tuuy3w+r59+9wFgTJlytj3339vo0ePdhdwpkyZctKfCQAAAIDM5aTmdCtE3XvvvYme79evn6U2VToV3FSJVOhRpVThdPbs2darVy9bu3atZRSDBg2yV1991Z5//nmrXLmye49XXXWVffvtt1azZs0U7aveyDkWlz2vpZdNo9q4IK3Q/PLLLweeP+eccxJs17Vr1/9uv2lT2P1ky5bNSpQokShIax0B72JPUlV2XazR59imTZsEr61Zs8Zd0FiyZInVrl3bPTd+/Hhr3bq1jRkzxoX01157zY4cOWIvvfSS5cyZ06pWreoq8U899VSCcA4AAAAAqX6f7unTp7sKpcLJb7/95p5T++6MGTMsNalyrtbgxYsX2zXXXGOVKlVy4ad///6ugimbN2+2du3auRCmVmEFsp07d0bcZ+PGja1v374Jnmvfvr1179498HctCjd8+HDr1q2b26+qnTNnzrTdu3cHjlW9evUErdJTp051FwcU8qpUqeK2adWqlavOJvczffDBB13wU1X/jjvucD+rOhyL9Hkp0Hbo0MGKFSvmLhzogsKpUMVZwVet4Ek5fvy4C/RaTV/fl1DfffedGysvcIvWJsiaNastWrQosM2ll17qArenZcuWtm7dOlfFBwAAAICohO5Jkya50Kv23r179wYWT1OICZ03eyo051bVSFW08+ZNXLXV8RSuFIK17bx581yr8IYNG6xTp06nfHy10avKrrnqqpQqxCmEa47ysmXLXBu4/q4F5DwHDx50lVIFaLUr64JAuK6AcA4fPuzayoNpHvTXX39tsUjjoO9KxYoV3YUIXUTo06ePvfLKKye9zxdffNFd0GjQoEGS26nKnj17dne8SFMWdCEgmLYvXLiwe83bpnjx4gm28f7ubQMAAAAAqd5erjZcVSxVHR41alTgeVUNkxswk2P9+vUu0KrVOhLN6165cqVt3LgxcBuzadOmueqmWofr1Klz0sdXlblnz57u58GDB7sAqf2pcisDBgyw+vXru6q61wKt1nfdx1yBXDT3XfO0k0NVVLUuq7qq39d700JjSa0Ir6CuR/A8ZMmVNd6yZfv/iwFpTZ+DLojUqlXLzcGW888/3y1Mps9RC/GFbu/96f0c6t9//7XXX3/ddQNE2kZ0QeTpp592Feu4uLjA8/ocvd/Tz/puhduPt51e13sI3iY553kiwfuAPzFG/scY+R9j5H+MUWxgnPyPMYq9MTqaxv8dflKhWwE33BxjLXKmhbFSS3AFORLNzVXY9gK3aIE3VcH12qmEbrWPh1Y4Nac89Lldu3YFQneePHkCgVtKlizpXk8OBcVbb73VXWRQS732c9NNN7k5xZGMHDkyEGqDDap53PLkSb/bt33yySduDNRir589CsG//PJLgufEmw6gqv62bdvC7vOrr75y3y991qG/H9rWrs9cLfoehef777/fVcB1wUiv6zjB+1HY1mr8mguu53WuukgQvI0u8Hh/6t/BqVBXBvyNMfI/xsj/GCP/Y4xiA+Pkf4xR7IzRwYMH/R+6tRiW5tVqnnMwtYKr9Te1qC1Z4TO1F0vTvN3QQB/uaocWjPPoPCI9p0AX7ne8bZJz8UCKFi1qH374oR06dMiFP82Xf+CBBxKEx1ADBw50rf7BlW5dgBi+PKvF5chm6WXVkJbWtGlT+/33313HgOfLL7908/KDnwteSE3rBES6vZu6ALRq/fXXX5/ksevVq+c6DIJdccUVrrp+44032rnnnuu+wxMmTHAB/sILLwz8I9RY6RZj+ux1L3p1OOjWeN64alE7nb/WDThZ+q7pWMH7hb8wRv7HGPkfY+R/jFFsYJz8jzGKvTHa97/uYF+HboU8zbNWOFRI0SJnb7zxhqu6vvDCC6l2cppfq5briRMnurm5ofO6NZ9cIV/hSA+v2q1bU+k1Vbwjhdvgxc1U4Vy1apU1adLE/EDzukuXLu2+HO+9916SAU/dBXqEOnw8i8Ud++9FgfSgL/M999zj5l5r1Xm9B31P9P3QLbe8sKm5+Jr37lW3NQ9crykMB69arqkGCxYscFXncEFV3QH6/mm199Df9c5Hn6la3L0uBi1yp3nmmg6gz1qL61133XWBi0maw6/F9BTCNZVA3xEFdc31T42wrH0Quv2NMfI/xsj/GCP/Y4xiA+Pkf4xR7IxRjjQufJ1U6L7lllvcAl+6xZVK86ogqjKo9miFltSkwK3FzOrWrevmRissqe1XVyo0N1gBWy3fuueyFnHTa1rxvFGjRglWpg6mCqwuHMyaNcu1cKuCqpCe3jQHWa3NqvTqT90T2muLTvG+BjazIkWKWHpSa79u76VqvMZO1WWNkcYquBVcLfQe7/vzyCOPuPfvUYv9mWee6e6bHY5WFP/7779TdH66JZgq4s2aNXPdD1od/5lnngm8XqBAAfvPf/7jLjBpbvoZZ5zhKt/cLgwAAABA1EK3Qq0Ws1IFWuFJoXv//v2JVoJOLWqt1sJYI0aMcJVTVahVqVYIUuhW+7ZuU6b7MWsBMoUnVTC12FskPXr0sBUrVriVx7Vite4v7ocqtzoHdCFD1V7NhVYLtlZB19zoWKW2bj0i0W3agm/VFsljjz3mHpGcqIU/3H3A1Umh73JSdJFHFXYAAAAASJPQrZCqdlstUuYtHKZHNGkxMrX16hHO2WefneT9wVUxDa6aqp3g2WefdY+UhLTQYKd7eQc/Fy5AaoX35M7pVnVelXsAAAAAQCa+T7davXXvagAAAAAAkMpzujVnWq3eWplabd6hC5wF32oL/08t45F8+umndskll/BxAQAAAEBmD93eYldaUTz01lj6U6uBIzHdZi0SrawNAAAAAMhYTip0b9y4MfXPJBOoUKFCep8CAAAAAMDvodu7jzEAAAAAAEjl0D1t2rQkX9etuAAAAAAAyOxOKnTffffdCf5+9OhRd7/unDlzutuHEboBAAAAADjJW4b99ddfCR779++3devW2cUXX2xvvPEGnysAAAAAACcbusOpWLGijRo1KlEVHAAAAACAzCrVQrdkz57dtm3blpq7BAAAAAAgc83pnjlzZoK/6/7c27dvtwkTJljDhg1T69wAAAAAAMh8obt9+/YJ/p4lSxYrWrSoNW3a1J588snUOjcAAAAAADJf6D5+/HjqnwkAAAAAABnMSc3pHjZsmLtFWKh///3XvQYAAAAAAE4ydA8dOtTdJiyUgrheAwAAAAAAJxm6tXCa5nGHWrFihRUuXJjPFQAAAACAlM7pLlSokAvbelSqVClB8D527Jirft9+++18sAAAAAAApDR0jxs3zlW5e/To4drICxQoEHgtZ86cVrZsWatfvz4fLAAAAAAAKQ3dN954o/vznHPOsQYNGliOHDn4EAEAAAAASM1bhjVq1Cjw86FDh+zIkSMJXs+fP//J7BYAAAAAgAzlpBZS0yrld911lxUrVszy5s3r5noHPwAAAAAAwEmG7vvuu8++/PJLmzRpkuXKlcteeOEFN8e7VKlSNm3aND7XTGzUqFFugb2+ffsGnvv111/tqquusqJFi7ouiI4dO9rOnTsT/N6IESPclIU8efJYwYIFk3Us7aN79+7ue6ffa9Wqlf3yyy8JttmxY4d17drVSpQo4S4QXXjhhfbee++d8rEBAAAAIGqh+6OPPrJnn33WrrnmGsuePbtdcsklNmjQIHvsscfstddes7Q0ZMgQq1GjRpoeE+EtWbLEnnvuOatevXrguQMHDliLFi1cENeFmm+++cZNR2jbtq0dP348sJ2e69Chg91xxx3J+ni1oF/79u1tw4YNNmPGDFu+fLmVKVPGmjdv7o7p6datm61bt85mzpxpK1eutKuvvtqFfm1/sscGAAAAgKiG7j179li5cuXcz6pc6u9y8cUX2/z581O0L1Uie/fu7fanqvlZZ53lAtmcOXMsI1m9erW7SKEV3hVAtRJ8OBMnTnTb5M6d2+rVq2eLFy+2WKDbxXXu3Nmef/75BFMMFLI3bdpkU6dOtWrVqrnHK6+8YkuXLnUh3KNOiX79+rnXk0MV7YULF7puizp16ti5557rfv7333/tjTfeCGz37bffuu9X3bp13XdMF4dUzf7+++9P+tgAAAAAENWF1BReNm7caGeffbZVrlzZ3n77bRdqVAFPSXuuwljDhg3d74wePdqFnqNHj9rs2bOtV69etnbtWssoNA9en5sqqgp44bz11lvWv39/mzx5sgvcCuYtW7Z0lVrNn0+JeiPnWFz2vBZNm0a1Cfys8WrTpo2rNA8fPjzw/OHDh91FBl1Q8eiCQtasWe3rr792258M7dfbl0f71HG031tuucU9p7Zxfa46N33P9F3V4n+NGzc+qeMCAAAAQNQr3TfddJOtWLHC/fzAAw+46qzCj8Kk5nsn15133ukCmaq5qgJXqlTJqlat6oKnqpiyefNma9euneXLly/ifOBgClPB84lFbcia++tRJVnBUK3H2q/aktV+vHv37sCx1CKtaqxHlVqFNl0QqFKlittGc4i3b9+erPeqaqwuLFx33XUJAmiwp556ym699Vb3+Z533nkufGue8UsvvWR+9uabb9qyZcts5MiRiV676KKL3FzqAQMGuAsPav2+99577dixY8n+7MLRxR5d9Bk4cKD99ddfrkX88ccft99//z3BfhWydSGnSJEi7nPv2bOnffDBB1ahQoWTPjYAAAAARLXSHVypVaVSFWm16yrIBM/nTYpa0j/77DO3iJVCWSgFXM359ULwvHnzLC4uzlVUO3XqZHPnzrVTMXbsWDcH/eGHH3Y/a7EtVUV79OjhwrFCokK52sJ1YUAUGseMGWPTp093VdUuXbq4AJka89gVGvUZKkR6dAx9vt99912SFV+v6iv79u1zf+bKGm/ZssVbNCnMbtmyxe6++2775JNPLFu2bO45zbfW2OlnjaPavdXi/cwzz7j3pPGrWbNmYB/BFMbDPR+OAvVtt91mhQsXdsdu1qyZuxCi43u//9BDD7lQru+agrcurujCjVrbQ9vJU3LsU+HtP9rHwcljjPyPMfI/xsj/GKPYwDj5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+ulWrFgxa9++va1bty7BNo0bN7YsWbIkeNx+++2JPsmpU6da9erVLXfu3G5fvXr1OuGn/d1331nTpk0tb968lj9/frv00kvt33//Dbz+888/W7t27eyMM85wr1988cX21Vdfhd3Xn3/+aWeeeaY7v7179zLSAAAAANJchgjdQ4YMsRo1aqT3aWQI8+bNc+F44cKF9vnnn9vRo0etRYsWduDAgQTb3XrrrbZ9+/bA44knnkjw+lNPPWUPPfSQPfDAA7Z69Wr74osvrGXLlicM3K1atXLHW7x4sS1ZssTuuusuy5r1/7+mV1xxhcXFxdmXX35p33//vV1wwQXuuR07diTa38033+xCPwAAAABk6tCtwNS7d28rV66c5cqVy8466yxr27atzZkzxzKS559/3i655BIrVKiQezRv3tyFS48C7oABA6xatWqu0luqVCnr1q2bbdu2Lc3O8bPPPrPu3btb1apVXaBVtXrz5s0u4AbLkyePlShRIvBQ1dnz119/2aBBg2zatGl2ww03WPny5V34vfLKK5M8dr9+/axPnz4uqOv45557rnXs2NF9J+SPP/6wX375xb2u/VWsWNFGjRplBw8etFWrViXY16RJk1x1+957703VzwcAAAAAUiK7pbNNmzZZw4YNrWDBgjZ69GgXOBU+Z8+e7Squa9eutYxi7ty5dv3111uDBg1cy/Xjjz/uqrqqBJcuXdqFx2XLltnDDz/sAq/C69133+3C6tKlS1N0rHoj51hc9rwp+p1No9okeu7vv/92fxYuXDjB86+99pq9+uqrLnDrAonOWUFcVCE/fvy4bd261apUqWL//POPe89PPvmku6ASzq5du2zRokXWuXNnt+2vv/5qlStXthEjRrgWcilSpIgL4grzF154oQvjzz33nGtdr1WrVmBfP/30kw0bNsztb8OGDSn6DAAAAAAgQ1W677zzTjfnVhXfa665xipVquSqnP3793ctzqJKq+bx5suXz1VUVf3cuXNnxH1qznHfvn0TPKe5yargesqWLWvDhw93lWTtt0yZMjZz5kzbvXt34FiqpgaHXVV9dXFAFwQUJrWN2qHVXp0cCqp6v2qFV6B84YUXXDj1KvoFChRwgVXvT+HyoosusgkTJrgqsz6DtKZz0+eoiyLnn39+4HlVrxW4NZd64MCBNn36dOvSpUvgdQVd/e5jjz1m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aadZ0aJFrV27drZ27dpEn+LUqVOtevXqljt3brevXr16JflJJ2e/ffr0sVq1almuXLmsRo0aYffz9ttvu9fy5MljZcqUsdGjRzPCAAAAANJNpgjdQ4YMiRjS8P/mzZvnwvHChQvt888/t6NHj1qLFi3swIEDgW0Uel9++WVbs2aNzZ492+Lj4902x44dC2zz1FNP2UMPPWQPPPCArV692r744gtr2bJlkh91cvYrPXr0sE6dOoXdx6effmqdO3e222+/3VatWmXPPvusjR071iZMmMAwAwAAAEgX2S0G7Nixw0aMGGGzZs2yrVu3usqpQnTfvn2tWbNmlpG888479vDDD9umTZusYsWK9vjjj1vr1q3T5NifffZZomq1Puvvv//eLr30UvfcbbfdFni9bNmyNnz4cLvgggvc+apS/ddff9mgQYPso48+SjA2qnon5UT7lWeeecb9uXv3bvvxxx8T7WP69OmuOq/QLeXKlbOBAwe6z1AXE7JkyXKSnwwAAAAAZNDQrdDVsGFDK1iwoGsVrlatmqvAqhqqIBWutTlWffvtt3b99de7Nu8rrrjCXn/9dRcily1bZueff36K9lVv5ByLy5432dtvGtUm0XN///23+7Nw4cJhf0cVcFWnzznnHDvrrLPcc6qQHz9+3F0cqVKliv3zzz/WoEEDe/LJJwPbnEi4/SbH4cOHXVt5MLWr//777/bbb7+5MA8AAAAAacn37eV33nmnq1AuXrzYrrnmGqtUqZJVrVrV+vfv79qgZfPmzW4OcL58+Sx//vzWsWNH27lzZ8R9Nm7c2FXJgyncdu/ePVG1tVu3bm6/mh88c+ZMV2X1jqXq7dKlSxNUhnVxQBcEFDi1TatWrWz79u3Jeq9PP/202/6+++5zv//oo4/ahRdemC7t0QrO+ox0wSM08KttW+9ND7V0K2jnzJnTvbZhwwb3u4899piNGzfO3n33XduzZ49ddtllduTIkSSPmdR+k0Mt7O+//77NmTPHncPPP//swr4kdwwAAAAAINNUuhXW1PKs1vK8eRNXbRVwFa68EKw5yXFxca4Crnm/c+fOPaXjaz6wwqPavfVz165dXdVW84pVdR8wYIAL5Zq37LUuHzx40MaMGeNanbNmzWpdunSxe++911577bUTHu+7775zFxNCg+SHH36YZHVXD8++ffvcn7myxlu2bPHJfq/qHgh21113uXnRX331VaLXdFFDFy7U9q/52x06dHCfvRZN07Z66PmmTZu67adNm+Yq1grRmqcdSVL7DaZ53przHXpeumiioK0uAb2mCzB6H7p4oe9J6PbpxTsPv5wPEmOM/I8x8j/GyP8Yo9jAOPkfYxR7Y3Q0jf873Nehe/369S5cVa5cOeI2qmquXLnSNm7cGGhFVshTNXzJkiVuNe6TpbnUWlVbBg8ebJMmTXL7UxgUhe769eu7qnqJEiUCAzh58uTAPGSFvmHDhiXreAqbxYsXT/Cc/q7nI1Er+tChQxM9P6jmccuTJ+EiZEn55JNPAj9PmTLFFi1a5C44aO50uPnTwUFXFxa0WJ3mfasTwKssB+9TK6Lr77ookhyh+w32yy+/uIsLwfv3XHLJJe7CyN69e13o9s79119/tT/++MP8RBch4G+Mkf8xRv7HGPkfYxQbGCf/Y4xiZ4wOHjyYpsf1dehW4D4RrXatsB089/e8885zVXC9diqhO3jxLy8Ma0556HO7du0KhG7NKfYCt5QsWdK9Hi1aKCy4Oq4wqs9i+PKsFpcjW7L3s2pIS/d5q6X8hx9+sPnz57uF3E5EVXZV9PWZ6yJFhQoVbPz48XbmmWcGKt3qWNDc7jZt2rg28+QI3W8wtfRrbJOzwJy6BC666CI3V94vdGFG/+D1WeTIkSO9TwdhMEb+xxj5H2Pkf4xRbGCc/I8xir0x2ve/7uC04uvQrdCntu3UXixNYS400IdrMQgORF77eLjn1Loc7ne8bZJz8UAU3EPnogdX0cPRPav1CHX4eBaLO5b81bp13po/r8XbZsyY4RZP+/PPP91rBQoUcAuSab72W2+95VrEdS9tLVA2atQo91rbtm3dPtRhoHb/e+65x1XMVW3WhQF1K3hfci2yppXN1ZFQt27dZO3X63zYv3+/q6YfOnTItfWLgrnmfquSrTnkalHX61qM7b333nMt6n4MtzonP54X/h9j5H+Mkf8xRv7HGMUGxsn/GKPYGaMcafzf4L5eSE3BT3OaJ06cmOBe0R61EGvBsS1btriH56effnKvKYyFo2AXvLCW5ghr/nJ6U6u62uWD6YqMnk8Lap/XiuUKrarQew8FYtHc6gULFgQq2po3r7ZxrbquW4t5FKbr1avnKtuNGjVyX2rNzfe+3LrAsW7dukBbR3L3e8stt1jNmjXtueeec3O39bMe27ZtC2zzyiuvWO3atd0CcArlmtevYA8AAAAA6cHXlW5R4FaAUnDS3Gi1fGtesMKoQqICtlq+O3fu7FbL1muq2CrsKXyFo7ZntWTrvt9qBdeiXQrp6e3uu+92560VtxVY33zzTddKrYpxSi0a2MyKFCmSot85UUW+VKlSYedRh1J1+8UXX3SPcLQyfPCxkrvfEy2Md8YZZ7jF6AAAAADAL3xd6ZZy5cq5+1Q3adLEtSzr9lVqU1ZFWKFb7dtqhy5UqJBbcKt58+bud7zqbDhaffzGG290K48r5Gp77T+9aQEwtXcrZF9wwQWuVVpzklN6j24AAAAAgD/4vtItanHWvaoj3a/67LPPdsE7Eq2ArYdHbc66J7QekWzatOmEleDQiq1W3A6+17d3/+/kzukWrYzurY4OAAAAAIhtvq90AwAAAAAQqwjdaShfvnwRH1pIDAAAAACQscREe3lGoftfR1K6dOk0PRcAAAAAQPQRutOQbocFAAAAAMg8aC8HAAAAACBKCN0AAAAAAEQJoRsAAAAAgCghdAMAAAAAECWEbgAAAAAAooTQDQAAAABAlBC6AQAAAACIEkI3AAAAAABRQugGAAAAACBKCN0AAAAAAEQJoRsAAAAAgCghdAMAAAAAECWEbgAAAAAAooTQDQAAAABAlBC6AQAAAACIEkI3AAAAAABRQugGAAAAACBKCN2Z3Pz5861t27ZWqlQpy5Ili3344YcJXtdz4R6jR48ObHPllVfa2Wefbblz57aSJUta165dbdu2bUked8qUKda4cWPLnz+/29/evXsTbVO2bNlExx01alSCbeLj423MmDFWqVIly5Url5UuXdpGjBhxyp8LAAAAAKSGTBG6hwwZYjVq1Ejv0/ClAwcO2AUXXGATJ04M+/r27dsTPF566SUXfq+55prANk2aNLG3337b1q1bZ++99579+uuvdu211yZ53IMHD1qrVq3swQcfTHK7YcOGJTh+7969E7x+99132wsvvOCC99q1a23mzJlWt27dFH0GAAAAABAt2S0G7Nixw1UvZ82aZVu3brVixYq5EN23b19r1qyZZRSrV6+2wYMH2/fff2+//fabjR071r3HaLr88svdI5ISJUok+PuMGTNcyC5XrlzguX79+gV+LlOmjD3wwAPWvn17O3r0qOXIkSPsfr33NXfu3CTP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AABAsiLozkIamx1rmzdvXlY+FQAAAABAFkiK8vLsQpOixVKmTJksfS4AAAAAgPgj6M5C8ZqBHAAAAADgT5SXAwAAAAAQJwTdAAAAAADECUE3AAAAAABxQtANAAAAAECcEHQDAAAAABAnBN0AAAAAAMQJQTcAAAAAAHFC0A0AAAAAQJwQdAMAAAAAECcE3QAAAAAAxAlBNwAAAAAAcULQDQAAAABAnBB0AwAAAAAQJwTdAAAAAADECUE3AAAAAABxQtANAAAAAECcEHQDAAAAABAnSR90DxkyxOrVq5fop5F0PvvsM7vgggusdOnSliNHDnv33XdjHnvttde6Y8aMGRPct2HDBrvqqqusUqVKli9fPqtSpYrdd999tm/fvgw9fiAQsPPPPz/NYy9fvty6detm5cqVc+c99dRT7fHHH495ni+++MJy5crF7wAAAAAAX0p40L1161a78cYbrXLlypYnTx4XbCkYnDlzpmUnq1atsksuucQqVqyYJoD1eLdFbjfccEOmP5+//vrLTj/9dHvyySfTPe6dd96xr776ygXnob799ls7dOiQPf300+7aRo8ebU899ZTdddddGXp8Xb+uLdLXX39tJUqUsFdeecWd9+6777ZBgwbZuHHj0hy7a9cuu+KKK6x169YZekwAAAAAyGq5LIGULW3WrJkVKVLEHn30UTvttNNs//799vHHH7tAU4FddpGamuo6Fi677DK79dZbox6zaNEiO3jwYPDnlStXWps2bdx9jlTj4TPtQK4CUW/bMKKjyzJrS8/mzZtdh4jao2PHjmG3tW/f3m0eXdvatWttwoQJ9thjj6V73mXLltnIkSNt8eLFdsopp4Td1qdPn7Cfdd758+fblClTrF+/fmky8P/+978tJSUl3Uw9AAAAAByXme7rr7/eZTsXLlzossDVq1e32rVr22233eayq7Jx40br1KmTFSxY0AoXLmxdunSxbdu2xTznOeecY7fcckvYvs6dO1vv3r3DMspDhw51WVKdt0KFCvbee+/Zr7/+GnysunXruqDQM2nSJNc5oABUJc86RkHnli1bMnStjRo1ch0Ll19+ucvoR1O8eHErVapUcPvggw9c2XbLli0tqymL3bNnTxswYIBrk4z4448/rGjRooftfFCgrAy7rvFoz/vCCy/Yjz/+6EraAQAAAMCvEhZ079y50z766COX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UTReW2PHFTRq9nRlfUXjmrUpSI4MlNULoyxvZo5VVuCcXnY+o5l7XUcsur7I8yig1xaLAu/QGeZjufzyy90GAAAAAH6X8CXDKleu7EqZlXlVGXWdOnVcibFKlxV0q3x76tSpdtJJJ7nMqDLBuo8m8IpFY4yVtdUEWwrOdbwfsty6nn379tmll17qyri9TeXmAAAAAIDsJ+GZblHgOW7cOLdFozG/CrxjicygKjs8fvx4t8USbXx0ZGY2MlsbLROr9b8zmhmO9pjxuA8AAAAAwB8SnukGAAAAACC7IujORN7Y7GibZiYHAAAAABxffFFenl0sW7Ys5m1lypTJ0ucCAAAAAEg8gu5MVLVq1cw8HQAAAAAgyVFeDgAAAABAnBB0AwAAAAAQJwTdAAAAAADECUE3AAAAAABxQtANAAAAAECcEHQDAAAAABAnBN0AAAAAAMQJQTcAAAAAAHFC0A0AAAAAQJwQdAMAAAAAECcE3QAAAAAAxAlBNwAAAAAAcULQDQAAAABAnBB0AwAAAAAQJwTdAAAAAADECUE3AAAAAABxQtANAAAAAECcJH3QPWTIEKtXr16in0bS+PPPP+2WW26xChUqWL58+axp06a2aNGi4O05cuSIuj366KNHfU7Zs2eP9evXz8qWLeuOqVWrlj311FNhx/zzzz92ww03WLFixaxgwYJ2ySWX2LZt2+LwKgAAAADAcRJ0b9261W688UarXLmy5cmTx8qVK2cXXHCBzZw507KTVatWuSCyYsWKLogdM2bMUQWvx+rqq6+2GTNm2Msvv2wrVqywtm3b2nnnnWebN292t2/ZsiVse/75593z1XM/2nPKbbfdZh999JG98sortmbNGnedCsLfe++94DG33nqrvf/++/bWW2/Z3Llz7ZdffrGLL744U68fAAAAAI6boHvDhg3WoEEDmzVrlsukKmBTYHbuuee6jGd2kpqa6joWRowYYaVKlTrq4DWjGg+faRXvnBbc5O+//7a3337bHnnkEWvRooVVrVrVVQro64QJE9wxem6h29SpU1176LlHk5Fzypdffmm9evWyc845x3U89O3b104//XRbuHChu/2PP/6wiRMn2qhRo6xVq1bu9+KFF15w9/vqq6+O+PoBAAAAwI73oPv66693WVQFXsqkVq9e3WrXru2yol6gtXHjRuvUqZMrNy5cuLB16dIl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t2KeM9Z9Hn300eAxO3futO7du1vhwoWtSJEidtVVV9mePXvCzhMIBOyxxx6z6tWrW548eaxMmTI2bNiwuL4eAAAAAJAVclmSGzJkiL377ru2bNmyRD8VX1u0aJEdPHgw+PPKlSutTZs2dtlll1m5cuVsy5YtYcc/88wzLng+//zzY54z8j4ffvihC6ovueSS4D4F3DpuxowZtn//frvyyiutb9++9tprrwWPufnmm+2TTz5xgfdpp53mAnVtAAAAAJDsEp7p3rp1q914441WuXJll+VUAHjBBRfYzJkzLTtZtWqVC0a9jPOYMWPSPX7EiBHuuFtuuSVTHr948eJWqlSp4PbBBx9YlSpVrGXLlpaSkhJ2m7Z33nnHunTpYgULFox5zsj7TJ061c4991zXlrJmzRr76KOP7LnnnrPGjRtb8+bNbezYsTZ58mT75ZdfgsdMmDDB3ffCCy+0SpUqWYMGDVyHAAAAAAAku4QG3SprVoA1a9Ysl1VdsWKFC9IUuKnsOTtJTU11waiCaQWoh8tKP/3001a3bt2jfrzGw2daxTunuS3Svn377JVXXrE+ffq4wD7S119/7SoHlLXOqG3bttm0adPC7jN//nxXUt6wYcPgvvPOO89y5sxpCxYscD+///777nVRJ4ACbnVKXH311WS6AQAAAGQLCQ26r7/+ehf0LVy40GWBNaa3du3adtttt9lXX33ljtm4caN16tTJZVw1LljZVwV4sZxzzjlpssOdO3e23r17B39WYDd06FC74oor3HkrVKhg7733nv3666/Bx1LAu3jx4uB9Jk2a5ALIjz/+2E499VR3TPv27dOUWMfSqFEj17Fw+eWXu4x+LBrvrJLsZ5991k466SSLB5Xj79q1K+w1CTVx4kR3jU2bNs3wOV988UUrVKiQXXzxxWFVDCVKlAg7LleuXFa0aFF3m/z444/2008/ubHjL730knudFfRfeumlR319AAAAAGDH+5hujdlVVlsTZhUoUCDN7QpwDx06FAyC586dawcOHHAZ8K5du9qcOXOO6fFHjx5tDz30kN1zzz3u+549e7ogU9lfBccDBw50QbnKwr1ssLLVGnf88ssvu2xtjx497Pbbb7dXX33VMouur2PHji4jrI6Bw9m7d6/bPLt373Zf8+QMWEpKwH2vsdShVO7drl07V3Ieedvff//txlvfdddd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DBhgBw4cCDtmzpw5dsYZZ7iJH6pWrWqTJk3KkmvMTkaMGGE5cuSwW265JbiP9vGHzZs3W48ePdz7JF++fHbaaafZ4sWLg7dr2pF7773XTjnlFHf7eeedZ99//33YOXbu3Gndu3d3624WKVLErrrqKtuzZ0/YMd98842dffbZ7v/GcuXK2SOPPJJl15jMDh48aPfcc49VqlTJvf5VqlSxBx980LWLhzbKWp999pldcMEFVrp0aff/2rvvvht2e1a2x1tvvWU1a9Z0x+i9O3369DhddfZpo/3799vAgQPd61WgQAF3zBVXXGG//PJL2Dloo8S1UaRrr73WHTNmzBjayGdttGbNGrvwwgvdett6P+mzuT5b+/KzniZSQ/YwefLkwAknnBB4/vnnA6tWrQr85z//CRQpUiSwbdu2RD+1bKddu3aBF154IbBy5crAsmXLAh06dAiUL18+sGfPnuAx1157baBcuXKBmTNnBhYvXhw466yzAk2bNg3efuDAgUCdOnUC5513XmDp0qWB6dOnB04++eTAoEGDgsf8+OOPgfz58wduu+22wOrVqwNjx44NpKSkBD766KMsv+ZktXDhwkDFihUDdevWDdx8883B/bRP4u3cuTNQoUKFQO/evQMLFixwv+8ff/xxYN26dcFjRowYETjxxBMD7777bmD58uWBCy+8MFCpUqXA33//HTymffv2gdNPPz3w1VdfBebNmxeoWrVqoFu3bsHb//jjj0DJkiUD3bt3d+/Z119/PZAvX77A008/neXXnGyGDRsWKFasWOCDDz4IrF+/PvDWW28FChYsGHj88ceDx9BGWUt/K+6+++7AlClT1PMReOedd8Juz6r2+OKLL9zfo0ceecT9fRo8eHAgd+7cgRUrVgSOd+m10a5du9zf/TfeeCPw7bffBubPnx8488wzAw0aNAg7B22UuDYKpdv1XildunRg9OjRtJGP2mjdunWBokWLBgYMGBBYsmSJ+3nq1KlhcY+fPusRdGcj+k/7hhtuCP588OBB95/E8OHDE/q8jgfbt293/yHMnTs3+EdVHz70AdWzZs0ad4z+wIre2Dlz5gxs3bo1eMyECRMChQsXDuzdu9f9fMcddwRq164d9lhdu3Z1QT8O788//wxUq1YtMGPGjEDLli2DQTft4w8DBw4MNG/ePObthw4dCpQqVSrw6KOPBvep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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[特征重要性排名 - Gain]\n", "ebitda_rank 14616.823972\n", "return_10 2170.157647\n", "return_20 1597.996920\n", "ma_ratio 1346.640091\n", "vol_ratio 1307.361400\n", "high_low_ratio 918.782296\n", "vol_ma20 828.398926\n", "ma20 635.353193\n", "volatility_5 631.979581\n", "return_diff 617.399685\n", "vol_ma5 491.980673\n", "market_cap_rank 415.972949\n", "volatility_20 276.516502\n", "profit_to_market_cap 256.683738\n", "ma5 236.319446\n", "ma10 173.155782\n", "ebit_rank 142.423690\n", "operate_profit_to_market_cap 127.127625\n", "total_liab_rank 97.979562\n", "n_income_rank 77.705741\n", "operate_profit_rank 75.762452\n", "cashflow_to_market_cap 68.135267\n", "money_cap_rank 58.562898\n", "n_cashflow_act_rank 47.001317\n", "total_profit_rank 36.941945\n", "dtype: float64\n", "\n", "所有特征都有一定重要性\n" ] } ], "execution_count": 26 } ], "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 }