{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. 导入依赖" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:27:44.613389Z", "start_time": "2026-03-11T13:27:44.026988Z" } }, "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-11T13:27:44.632791Z", "start_time": "2026-03-11T13:27:44.624747Z" } }, "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-11T13:27:44.644952Z", "start_time": "2026-03-11T13:27:44.640383Z" } }, "cell_type": "code", "source": [ "# 特征因子定义字典:新增因子只需在此处添加一行\n", "LABEL_NAME = 'future_return_5'\n", "\n", "FACTOR_DEFINITIONS = FACTOR_DICT = {\n", " # ================= 1. 价格、趋势与路径依赖 (Trend, Momentum & Path Dependency) =================\n", " \"ma_5\": \"ts_mean(close, 5)\",\n", " \"ma_20\": \"ts_mean(close, 20)\",\n", " \"ma_ratio_5_20\": \"ts_mean(close, 5) / (ts_mean(close, 20) + 1e-8) - 1\", # 均线发散度\n", " \"bias_10\": \"close / (ts_mean(close, 10) + 1e-8) - 1\", # 10日乖离率\n", " \"high_low_ratio\": \"(close - ts_min(low, 20)) / (ts_max(high, 20) - ts_min(low, 20) + 1e-8)\", # 威廉指标变形\n", " \"bbi_ratio\": \"(ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / (4 * close + 1e-8)\", # 多空指标比率\n", " \"return_5\": \"(close / (ts_delay(close, 5) + 1e-8)) - 1\", # 5日动量\n", " \"return_20\": \"(close / (ts_delay(close, 20) + 1e-8)) - 1\", # 20日动量\n", "\n", " # [高阶] Kaufman 趋势效率 (极高价值) - 衡量趋势流畅度,剔除无序震荡\n", " \"kaufman_ER_20\": \"abs(close - ts_delay(close, 20)) / (ts_sum(abs(close - ts_delay(close, 1)), 20) + 1e-8)\",\n", " # [高阶] 动量加速度 - 寻找二阶导数大于0,正在加速爆发的股票\n", " \"mom_acceleration_10_20\": \"(close / (ts_delay(close, 10) + 1e-8) - 1) - (ts_delay(close, 10) / (ts_delay(close, 20) + 1e-8) - 1)\",\n", " #[高阶] 高点距离衰减 - 衡量套牢盘压力\n", " \"drawdown_from_high_60\": \"close / (ts_max(high, 60) + 1e-8) - 1\",\n", " # [高阶] 趋势一致性 - 过去20天内收红的天数比例\n", " \"up_days_ratio_20\": \"ts_sum(close > ts_delay(close, 1), 20) / 20\",\n", "\n", " # ================= 2. 波动率、风险调整与高阶矩 (Volatility & Risk-Adjusted Returns) =================\n", " \"volatility_5\": \"ts_std(close, 5)\",\n", " \"volatility_20\": \"ts_std(close, 20)\",\n", " \"volatility_ratio\": \"ts_std(close, 5) / (ts_std(close, 20) + 1e-8)\", # 波动率期限结构\n", " \"std_return_20\": \"ts_std((close / (ts_delay(close, 1) + 1e-8)) - 1, 20)\", # 真实收益率波动率\n", "\n", " # [高阶] 夏普趋势比率 - 惩罚暴涨暴跌,奖励稳健爬坡\n", " \"sharpe_ratio_20\": \"ts_mean(close / (ts_delay(close, 1) + 1e-8) - 1, 20) / (ts_std(close / (ts_delay(close, 1) + 1e-8) - 1, 20) + 1e-8)\",\n", " #[高阶] 尾部崩盘风险 - 过去一个月最大单日跌幅\n", " \"min_ret_20\": \"ts_min(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\",\n", " # [高阶] 波动率挤压比 - 寻找盘整到极致面临变盘的股票 (布林带收口)\n", " \"volatility_squeeze_5_60\": \"ts_std(close, 5) / (ts_std(close, 60) + 1e-8)\",\n", "\n", " # ================= 3. 日内微观结构与异象 (Intraday Microstructure & Anomalies) =================\n", " # [高阶] 隔夜与日内背离 - 差值越小说明主力越喜欢在盘中吸筹\n", " \"overnight_intraday_diff\": \"(open / (ts_delay(close, 1) + 1e-8) - 1) - (close / (open + 1e-8) - 1)\",\n", " #[高阶] 上影线抛压极值 - 冲高回落被套牢的概率\n", " \"upper_shadow_ratio\": \"(high - ((open + close + abs(open - close)) / 2)) / (high - low + 1e-8)\",\n", " # [高阶] 资金沉淀率 - 衡量主力日内高抛低吸洗盘的剧烈程度\n", " \"capital_retention_20\": \"ts_sum(abs(close - open), 20) / (ts_sum(high - low, 20) + 1e-8)\",\n", " # [高阶] MAX 彩票效应 - 反转因子,剔除近期有过妖股连板特征的标的\n", " \"max_ret_20\": \"ts_max(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\",\n", "\n", " # ================= 4. 量能、流动性与量价背离 (Volume, Liquidity & Divergence) =================\n", " \"volume_ratio_5_20\": \"ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\", # 相对放量比\n", " \"turnover_rate_mean_5\": \"ts_mean(turnover_rate, 5)\", # 活跃度\n", " \"turnover_deviation\": \"(turnover_rate - ts_mean(turnover_rate, 10)) / (ts_std(turnover_rate, 10) + 1e-8)\", # 换手率偏离度\n", "\n", " # [高阶] Amihud 非流动性异象 (绝对核心) - 衡量砸盘/拉升的摩擦成本\n", " \"amihud_illiq_20\": \"ts_mean(abs(close / (ts_delay(close, 1) + 1e-8) - 1) / (amount + 1e-8), 20)\",\n", " # [高阶] 换手率惩罚因子 - 换手率忽高忽低说明游资接力,行情极不稳定\n", " \"turnover_cv_20\": \"ts_std(turnover_rate, 20) / (ts_mean(turnover_rate, 20) + 1e-8)\",\n", " # [高阶] 纯粹量价相关性 - 检验是否是\"放量上涨,缩量下跌\"的良性多头\n", " \"pv_corr_20\": \"ts_corr(close / (ts_delay(close, 1) + 1e-8) - 1, vol, 20)\",\n", " # [高阶] 收盘价与均价背离 - 专门抓尾盘突袭拉升骗线的股票\n", " \"close_vwap_deviation\": \"close / (amount / (vol * 100 + 1e-8) + 1e-8) - 1\",\n", "\n", " # ================= 5. 基本面财务特征 (Fundamental Quality & Structure) =================\n", " \"roe\": \"n_income / (total_hldr_eqy_exc_min_int + 1e-8)\", # 净资产收益率\n", " \"roa\": \"n_income / (total_assets + 1e-8)\", # 总资产收益率\n", " \"profit_margin\": \"n_income / (revenue + 1e-8)\", # 销售净利率\n", " \"debt_to_equity\": \"total_liab / (total_hldr_eqy_exc_min_int + 1e-8)\", # 杠杆率\n", " \"current_ratio\": \"total_cur_assets / (total_cur_liab + 1e-8)\", # 短期偿债安全垫\n", "\n", " #[高阶] 利润同比增速 (日频延后252天等于去年同期)\n", " \"net_profit_yoy\": \"(n_income / (ts_delay(n_income, 252) + 1e-8)) - 1\",\n", " # [高阶] 营收同比增速\n", " \"revenue_yoy\": \"(revenue / (ts_delay(revenue, 252) + 1e-8)) - 1\",\n", " # [高阶] 资产负债表扩张斜率 - 剔除单纯靠举债扩张的公司\n", " \"healthy_expansion_velocity\": \"(total_assets / (ts_delay(total_assets, 252) + 1e-8) - 1) - (total_liab / (ts_delay(total_liab, 252) + 1e-8) - 1)\",\n", "\n", " # ================= 6. 基本面估值与截面动量共振 (Valuation & Cross-Sectional Ranking) =================\n", " # 估值水平绝对值 (Tushare 市值单位需要 * 10000 转换为元)\n", " \"EP\": \"n_income / (total_mv * 10000 + 1e-8)\", # 盈利收益率 (1/PE)\n", " \"BP\": \"total_hldr_eqy_exc_min_int / (total_mv * 10000 + 1e-8)\", # 账面市值比 (1/PB)\n", " \"CP\": \"n_cashflow_act / (total_mv * 10000 + 1e-8)\", # 经营现金流收益率 (1/PCF)\n", "\n", " # 全市场截面排名因子\n", " \"market_cap_rank\": \"cs_rank(total_mv)\", # 规模因子 (Size)\n", " \"turnover_rank\": \"cs_rank(turnover_rate)\",\n", " \"return_5_rank\": \"cs_rank((close / (ts_delay(close, 5) + 1e-8)) - 1)\",\n", " \"EP_rank\": \"cs_rank(n_income / (total_mv + 1e-8))\", # 谁最便宜\n", "\n", " # [高阶] 戴维斯双击动量 - 估值相对上一年是否在扩张\n", " \"pe_expansion_trend\": \"(total_mv / (n_income + 1e-8)) / (ts_delay(total_mv, 60) / (ts_delay(n_income, 60) + 1e-8) + 1e-8) - 1\",\n", " # [高阶] 业绩与价格背离度 - 截面做差:利润排名全市场第一,但近20日价格排名倒数第一,捕捉被错杀的潜伏股\n", " \"value_price_divergence\": \"cs_rank((n_income - ts_delay(n_income, 252)) / (abs(ts_delay(n_income, 252)) + 1e-8)) - cs_rank(close / (ts_delay(close, 20) + 1e-8))\",\n", " # [高阶] 流动性溢价调整后市值 - 识别僵尸大盘股和极度活跃的小微盘\n", " \"active_market_cap\": \"total_mv * ts_mean(turnover_rate, 20)\",\n", " \"ebit_rank\": \"cs_rank(ebit)\",\n", "}\n", "\n", "# Label 因子定义(不参与训练,用于计算目标)\n", "LABEL_FACTOR = {\n", " LABEL_NAME: \"(ts_delay(close, -5) / ts_delay(open, -1)) - 1\", # 未来5日收益率\n", "}" ], "outputs": [], "execution_count": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 训练参数配置" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:27:44.654539Z", "start_time": "2026-03-11T13:27:44.651010Z" } }, "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\": 16, # 显式限制深度,防止过度拟合噪声\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", "# 数据处理器配置(新 API:需要传入 feature_cols)\n", "# 注意:processor 现在需要显式指定要处理的特征列\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(\"30\") & # 排除创业板\n", " ~df[\"ts_code\"].str.starts_with(\"68\") & # 排除科创板\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-11T13:28:08.730709Z", "start_time": "2026-03-11T13:27:44.661048Z" } }, "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. 创建数据处理器(新 API:需要传入 feature_cols)\n", "processors = [\n", " NullFiller(feature_cols=feature_cols, strategy=\"mean\"),\n", " Winsorizer(feature_cols=feature_cols, lower=0.01, upper=0.99),\n", " StandardScaler(feature_cols=feature_cols),\n", "]\n", "\n", "# 7. 创建数据划分器(正确的 train/val/test 三分法)\n", "# Train: 训练模型参数 | Val: 验证/早停 | Test: 最终评估\n", "splitter = DateSplitter(\n", " train_start=TRAIN_START,\n", " train_end=TRAIN_END,\n", " val_start=VAL_START,\n", " val_end=VAL_END,\n", " test_start=TEST_START,\n", " test_end=TEST_END,\n", ")\n", "\n", "# 8. 创建股票池管理器\n", "# 使用新的 API:传入自定义筛选函数和所需列\n", "pool_manager = StockPoolManager(\n", " filter_func=stock_pool_filter,\n", " required_columns=STOCK_FILTER_REQUIRED_COLUMNS, # 筛选所需的额外列\n", " # required_factors=STOCK_FILTER_REQUIRED_FACTORS, # 可选:筛选所需的因子\n", " data_router=engine.router,\n", ")\n", "print(\"[股票池筛选] 使用自定义函数进行股票池筛选\")\n", "print(f\"[股票池筛选] 所需基础列: {STOCK_FILTER_REQUIRED_COLUMNS}\")\n", "print(\"[股票池筛选] 筛选逻辑: 排除创业板/科创板/北交所后,每日选市值最小的500只\")\n", "# print(f\"[股票池筛选] 所需因子: {list(STOCK_FILTER_REQUIRED_FACTORS.keys())}\")\n", "\n", "# 9. 创建 ST 股票过滤器\n", "st_filter = STFilter(\n", " data_router=engine.router,\n", ")\n", "\n", "# 10. 创建训练器\n", "trainer = Trainer(\n", " model=model,\n", " pool_manager=pool_manager,\n", " processors=processors,\n", " filters=[st_filter], # 使用STFilter过滤ST股票\n", " splitter=splitter,\n", " target_col=target_col,\n", " feature_cols=feature_cols,\n", " persist_model=PERSIST_MODEL,\n", ")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "================================================================================\n", "LightGBM 回归模型训练\n", "================================================================================\n", "\n", "[1] 创建 FactorEngine\n", "\n", "[2] 定义因子(字符串表达式)\n", "================================================================================\n", "使用字符串表达式定义因子\n", "================================================================================\n", "\n", "注册特征因子:\n", " - ma_5: ts_mean(close, 5)\n", " - ma_20: ts_mean(close, 20)\n", " - ma_ratio_5_20: ts_mean(close, 5) / (ts_mean(close, 20) + 1e-8) - 1\n", " - bias_10: close / (ts_mean(close, 10) + 1e-8) - 1\n", " - high_low_ratio: (close - ts_min(low, 20)) / (ts_max(high, 20) - ts_min(low, 20) + 1e-8)\n", " - bbi_ratio: (ts_mean(close, 3) + ts_mean(close, 6) + ts_mean(close, 12) + ts_mean(close, 24)) / (4 * close + 1e-8)\n", " - return_5: (close / (ts_delay(close, 5) + 1e-8)) - 1\n", " - return_20: (close / (ts_delay(close, 20) + 1e-8)) - 1\n", " - kaufman_ER_20: abs(close - ts_delay(close, 20)) / (ts_sum(abs(close - ts_delay(close, 1)), 20) + 1e-8)\n", " - mom_acceleration_10_20: (close / (ts_delay(close, 10) + 1e-8) - 1) - (ts_delay(close, 10) / (ts_delay(close, 20) + 1e-8) - 1)\n", " - drawdown_from_high_60: close / (ts_max(high, 60) + 1e-8) - 1\n", " - up_days_ratio_20: ts_sum(close > ts_delay(close, 1), 20) / 20\n", " - volatility_5: ts_std(close, 5)\n", " - volatility_20: ts_std(close, 20)\n", " - volatility_ratio: ts_std(close, 5) / (ts_std(close, 20) + 1e-8)\n", " - std_return_20: ts_std((close / (ts_delay(close, 1) + 1e-8)) - 1, 20)\n", " - sharpe_ratio_20: ts_mean(close / (ts_delay(close, 1) + 1e-8) - 1, 20) / (ts_std(close / (ts_delay(close, 1) + 1e-8) - 1, 20) + 1e-8)\n", " - min_ret_20: ts_min(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\n", " - volatility_squeeze_5_60: ts_std(close, 5) / (ts_std(close, 60) + 1e-8)\n", " - overnight_intraday_diff: (open / (ts_delay(close, 1) + 1e-8) - 1) - (close / (open + 1e-8) - 1)\n", " - upper_shadow_ratio: (high - ((open + close + abs(open - close)) / 2)) / (high - low + 1e-8)\n", " - capital_retention_20: ts_sum(abs(close - open), 20) / (ts_sum(high - low, 20) + 1e-8)\n", " - max_ret_20: ts_max(close / (ts_delay(close, 1) + 1e-8) - 1, 20)\n", " - volume_ratio_5_20: ts_mean(vol, 5) / (ts_mean(vol, 20) + 1e-8)\n", " - turnover_rate_mean_5: ts_mean(turnover_rate, 5)\n", " - turnover_deviation: (turnover_rate - ts_mean(turnover_rate, 10)) / (ts_std(turnover_rate, 10) + 1e-8)\n", " - amihud_illiq_20: ts_mean(abs(close / (ts_delay(close, 1) + 1e-8) - 1) / (amount + 1e-8), 20)\n", " - turnover_cv_20: ts_std(turnover_rate, 20) / (ts_mean(turnover_rate, 20) + 1e-8)\n", " - pv_corr_20: ts_corr(close / (ts_delay(close, 1) + 1e-8) - 1, vol, 20)\n", " - close_vwap_deviation: close / (amount / (vol * 100 + 1e-8) + 1e-8) - 1\n", " - roe: n_income / (total_hldr_eqy_exc_min_int + 1e-8)\n", " - roa: n_income / (total_assets + 1e-8)\n", " - profit_margin: n_income / (revenue + 1e-8)\n", " - debt_to_equity: total_liab / (total_hldr_eqy_exc_min_int + 1e-8)\n", " - current_ratio: total_cur_assets / (total_cur_liab + 1e-8)\n", " - net_profit_yoy: (n_income / (ts_delay(n_income, 252) + 1e-8)) - 1\n", " - revenue_yoy: (revenue / (ts_delay(revenue, 252) + 1e-8)) - 1\n", " - healthy_expansion_velocity: (total_assets / (ts_delay(total_assets, 252) + 1e-8) - 1) - (total_liab / (ts_delay(total_liab, 252) + 1e-8) - 1)\n", " - EP: n_income / (total_mv * 10000 + 1e-8)\n", " - BP: total_hldr_eqy_exc_min_int / (total_mv * 10000 + 1e-8)\n", " - CP: n_cashflow_act / (total_mv * 10000 + 1e-8)\n", " - market_cap_rank: cs_rank(total_mv)\n", " - turnover_rank: cs_rank(turnover_rate)\n", " - return_5_rank: cs_rank((close / (ts_delay(close, 5) + 1e-8)) - 1)\n", " - EP_rank: cs_rank(n_income / (total_mv + 1e-8))\n", " - pe_expansion_trend: (total_mv / (n_income + 1e-8)) / (ts_delay(total_mv, 60) / (ts_delay(n_income, 60) + 1e-8) + 1e-8) - 1\n", " - value_price_divergence: cs_rank((n_income - ts_delay(n_income, 252)) / (abs(ts_delay(n_income, 252)) + 1e-8)) - cs_rank(close / (ts_delay(close, 20) + 1e-8))\n", " - active_market_cap: total_mv * ts_mean(turnover_rate, 20)\n", " - ebit_rank: cs_rank(ebit)\n", "\n", "注册 Label 因子:\n", " - future_return_5: (ts_delay(close, -5) / ts_delay(open, -1)) - 1\n", "\n", "特征因子数: 49\n", "Label: future_return_5\n", "已注册因子总数: 50\n", "\n", "[3] 准备数据\n", "\n", "================================================================================\n", "准备数据\n", "================================================================================\n", "\n", "计算因子: 20200101 - 20261231\n", "[FinancialLoader] 加载 financial_fina_indicator 失败: Binder Error: Referenced column \"f_ann_date\" not found in FROM clause!\n", "Candidate bindings: \"ann_date\", \"end_date\", \"ocf_to_debt\", \"arturn_days\", \"nca_to_assets\"\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "D:\\PyProject\\ProStock\\src\\data\\financial_loader.py:148: UserWarning: Sortedness of columns cannot be checked when 'by' groups provided\n", " merged = df_price.join_asof(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "数据形状: (7255513, 70)\n", "数据列: ['ts_code', 'trade_date', 'low', 'open', 'turnover_rate', 'close', 'amount', 'vol', 'high', 'total_assets', 'total_mv', 'f_ann_date', 'n_income', 'revenue', 'total_cur_assets', 'total_liab', 'total_cur_liab', 'total_hldr_eqy_exc_min_int', 'n_cashflow_act', 'ebit', 'ma_5', 'ma_20', 'ma_ratio_5_20', 'bias_10', 'high_low_ratio', 'bbi_ratio', 'return_5', 'return_20', 'kaufman_ER_20', 'mom_acceleration_10_20', 'drawdown_from_high_60', 'up_days_ratio_20', 'volatility_5', 'volatility_20', 'volatility_ratio', 'std_return_20', 'sharpe_ratio_20', 'min_ret_20', 'volatility_squeeze_5_60', 'overnight_intraday_diff', 'upper_shadow_ratio', 'capital_retention_20', 'max_ret_20', 'volume_ratio_5_20', 'turnover_rate_mean_5', 'turnover_deviation', 'amihud_illiq_20', 'turnover_cv_20', 'pv_corr_20', 'close_vwap_deviation', 'roe', 'roa', 'profit_margin', 'debt_to_equity', 'current_ratio', 'net_profit_yoy', 'revenue_yoy', 'healthy_expansion_velocity', 'EP', 'BP', 'CP', 'market_cap_rank', 'turnover_rank', 'return_5_rank', 'EP_rank', 'pe_expansion_trend', 'value_price_divergence', 'active_market_cap', 'ebit_rank', 'future_return_5']\n", "\n", "前5行预览:\n", "shape: (5, 70)\n", "┌───────────┬────────────┬─────────┬─────────┬───┬────────────┬────────────┬───────────┬───────────┐\n", "│ ts_code ┆ trade_date ┆ low ┆ open ┆ … ┆ value_pric ┆ active_mar ┆ ebit_rank ┆ future_re │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ e_divergen ┆ ket_cap ┆ --- ┆ turn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ ce ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ --- ┆ f64 ┆ ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ ┆ │\n", "╞═══════════╪════════════╪═════════╪═════════╪═══╪════════════╪════════════╪═══════════╪═══════════╡\n", "│ 000001.SZ ┆ 20200102 ┆ 1806.75 ┆ 1817.67 ┆ … ┆ null ┆ null ┆ null ┆ -0.008857 │\n", "│ 000001.SZ ┆ 20200103 ┆ 1847.15 ┆ 1849.33 ┆ … ┆ null ┆ null ┆ null ┆ -0.01881 │\n", "│ 000001.SZ ┆ 20200106 ┆ 1846.05 ┆ 1856.97 ┆ … ┆ null ┆ null ┆ null ┆ -0.008171 │\n", "│ 000001.SZ ┆ 20200107 ┆ 1850.42 ┆ 1870.07 ┆ … ┆ null ┆ null ┆ null ┆ -0.014117 │\n", "│ 000001.SZ ┆ 20200108 ┆ 1815.49 ┆ 1855.88 ┆ … ┆ null ┆ null ┆ null ┆ -0.017252 │\n", "└───────────┴────────────┴─────────┴─────────┴───┴────────────┴────────────┴───────────┴───────────┘\n", "\n", "[配置] 训练期: 20200101 - 20231231\n", "[配置] 验证期: 20240101 - 20241231\n", "[配置] 测试期: 20250101 - 20261231\n", "[配置] 特征数: 49\n", "[配置] 目标变量: future_return_5\n", "[股票池筛选] 使用自定义函数进行股票池筛选\n", "[股票池筛选] 所需基础列: ['total_mv']\n", "[股票池筛选] 筛选逻辑: 排除创业板/科创板/北交所后,每日选市值最小的500只\n" ] } ], "execution_count": 5 }, { "metadata": {}, "cell_type": "markdown", "source": "### 4.2 执行训练" }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:12.487988Z", "start_time": "2026-03-11T13:28:08.737960Z" } }, "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_18404\\3491564681.py:71: DeprecationWarning: `is_in` with a collection of the same datatype is ambiguous and deprecated.\n", "Please use `implode` to return to previous behavior.\n", "\n", "See https://github.com/pola-rs/polars/issues/22149 for more information.\n", " return df[\"ts_code\"].is_in(small_cap_codes)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 筛选前数据规模: (7255513, 70)\n", " 筛选后数据规模: (1494000, 70)\n", " 筛选前股票数: 5694\n", " 筛选后股票数: 2196\n", " 删除记录数: 5761513\n" ] } ], "execution_count": 6 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:12.560547Z", "start_time": "2026-03-11T13:28:12.492037Z" } }, "cell_type": "code", "source": [ "# 步骤 2: 划分训练/验证/测试集(正确的三分法)\n", "print(\"\\n[步骤 2/6] 划分训练集、验证集和测试集\")\n", "print(\"-\" * 60)\n", "if splitter:\n", " # 正确的三分法:train用于训练,val用于验证/早停,test仅用于最终评估\n", " train_data, val_data, test_data = splitter.split(filtered_data)\n", " print(f\" 训练集数据规模: {train_data.shape}\")\n", " print(f\" 验证集数据规模: {val_data.shape}\")\n", " print(f\" 测试集数据规模: {test_data.shape}\")\n", " print(f\" 训练集股票数: {train_data['ts_code'].n_unique()}\")\n", " print(f\" 验证集股票数: {val_data['ts_code'].n_unique()}\")\n", " print(f\" 测试集股票数: {test_data['ts_code'].n_unique()}\")\n", " print(\n", " f\" 训练集日期范围: {train_data['trade_date'].min()} - {train_data['trade_date'].max()}\"\n", " )\n", " print(\n", " f\" 验证集日期范围: {val_data['trade_date'].min()} - {val_data['trade_date'].max()}\"\n", " )\n", " print(\n", " f\" 测试集日期范围: {test_data['trade_date'].min()} - {test_data['trade_date'].max()}\"\n", " )\n", "\n", " print(\"\\n 训练集前5行预览:\")\n", " print(train_data.head())\n", " print(\"\\n 验证集前5行预览:\")\n", " print(val_data.head())\n", " print(\"\\n 测试集前5行预览:\")\n", " print(test_data.head())\n", "else:\n", " train_data = filtered_data\n", " test_data = filtered_data\n", " print(\" 未配置划分器,全部作为训练集\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[步骤 2/6] 划分训练集、验证集和测试集\n", "------------------------------------------------------------\n", " 训练集数据规模: (970000, 70)\n", " 验证集数据规模: (242000, 70)\n", " 测试集数据规模: (282000, 70)\n", " 训练集股票数: 1705\n", " 验证集股票数: 1308\n", " 测试集股票数: 1774\n", " 训练集日期范围: 20200102 - 20231229\n", " 验证集日期范围: 20240102 - 20241231\n", " 测试集日期范围: 20250102 - 20260306\n", "\n", " 训练集前5行预览:\n", "shape: (5, 70)\n", "┌───────────┬────────────┬───────┬───────┬───┬─────────────┬─────────────┬───────────┬─────────────┐\n", "│ ts_code ┆ trade_date ┆ low ┆ open ┆ … ┆ value_price ┆ active_mark ┆ ebit_rank ┆ future_retu │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _divergence ┆ et_cap ┆ --- ┆ rn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ ┆ f64 │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪═════════════╪═════════════╪═══════════╪═════════════╡\n", "│ 000004.SZ ┆ 20200102 ┆ 90.1 ┆ 92.05 ┆ … ┆ null ┆ null ┆ null ┆ 0.000441 │\n", "│ 000004.SZ ┆ 20200103 ┆ 89.53 ┆ 90.67 ┆ … ┆ null ┆ null ┆ null ┆ 0.005875 │\n", "│ 000004.SZ ┆ 20200106 ┆ 87.58 ┆ 90.22 ┆ … ┆ null ┆ null ┆ null ┆ 0.05644 │\n", "│ 000004.SZ ┆ 20200107 ┆ 88.06 ┆ 88.59 ┆ … ┆ null ┆ null ┆ null ┆ 0.049753 │\n", "│ 000004.SZ ┆ 20200108 ┆ 88.51 ┆ 89.04 ┆ … ┆ null ┆ null ┆ null ┆ 0.019922 │\n", "└───────────┴────────────┴───────┴───────┴───┴─────────────┴─────────────┴───────────┴─────────────┘\n", "\n", " 验证集前5行预览:\n", "shape: (5, 70)\n", "┌───────────┬────────────┬───────┬───────┬───┬─────────────┬─────────────┬───────────┬─────────────┐\n", "│ ts_code ┆ trade_date ┆ low ┆ open ┆ … ┆ value_price ┆ active_mark ┆ ebit_rank ┆ future_retu │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _divergence ┆ et_cap ┆ --- ┆ rn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ ┆ f64 │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪═════════════╪═════════════╪═══════════╪═════════════╡\n", "│ 000004.SZ ┆ 20240102 ┆ 65.23 ┆ 65.43 ┆ … ┆ null ┆ 770442.9948 ┆ null ┆ -0.014188 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 33 ┆ ┆ │\n", "│ 000004.SZ ┆ 20240103 ┆ 64.62 ┆ 65.55 ┆ … ┆ null ┆ 751492.2017 ┆ null ┆ 0.002432 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 8 ┆ ┆ │\n", "│ 000004.SZ ┆ 20240104 ┆ 64.7 ┆ 65.8 ┆ … ┆ null ┆ 866443.5445 ┆ null ┆ 0.016919 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 25 ┆ ┆ │\n", "│ 000004.SZ ┆ 20240105 ┆ 65.19 ┆ 67.38 ┆ … ┆ null ┆ 907980.5905 ┆ null ┆ -0.013477 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 95 ┆ ┆ │\n", "│ 000004.SZ ┆ 20240108 ┆ 65.02 ┆ 66.04 ┆ … ┆ null ┆ 931205.3950 ┆ null ┆ -0.024684 │\n", "│ ┆ ┆ ┆ ┆ ┆ ┆ 63 ┆ ┆ │\n", "└───────────┴────────────┴───────┴───────┴───┴─────────────┴─────────────┴───────────┴─────────────┘\n", "\n", " 测试集前5行预览:\n", "shape: (5, 70)\n", "┌───────────┬────────────┬───────┬───────┬───┬─────────────┬─────────────┬───────────┬─────────────┐\n", "│ ts_code ┆ trade_date ┆ low ┆ open ┆ … ┆ value_price ┆ active_mark ┆ ebit_rank ┆ future_retu │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _divergence ┆ et_cap ┆ --- ┆ rn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ ┆ f64 │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪═════════════╪═════════════╪═══════════╪═════════════╡\n", "│ 000004.SZ ┆ 20250102 ┆ 54.17 ┆ 55.8 ┆ … ┆ null ┆ 2.3754e6 ┆ null ┆ -0.066193 │\n", "│ 000004.SZ ┆ 20250103 ┆ 51.86 ┆ 57.71 ┆ … ┆ null ┆ 2.1884e6 ┆ null ┆ 0.00893 │\n", "│ 000004.SZ ┆ 20250106 ┆ 49.17 ┆ 50.39 ┆ … ┆ null ┆ 2.1549e6 ┆ null ┆ -0.0142 │\n", "│ 000004.SZ ┆ 20250107 ┆ 51.41 ┆ 51.41 ┆ … ┆ null ┆ 2.2770e6 ┆ null ┆ 0.013031 │\n", "│ 000004.SZ ┆ 20250108 ┆ 52.38 ┆ 52.95 ┆ … ┆ null ┆ 2.3533e6 ┆ null ┆ 0.00442 │\n", "└───────────┴────────────┴───────┴───────┴───┴─────────────┴─────────────┴───────────┴─────────────┘\n" ] } ], "execution_count": 7 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:13.045107Z", "start_time": "2026-03-11T13:28:12.565811Z" } }, "cell_type": "code", "source": [ "# 步骤 3: 训练集数据处理\n", "print(\"\\n[步骤 3/6] 训练集数据处理\")\n", "print(\"-\" * 60)\n", "fitted_processors = []\n", "if processors:\n", " for i, processor in enumerate(processors, 1):\n", " print(\n", " f\" [{i}/{len(processors)}] 应用处理器: {processor.__class__.__name__}\"\n", " )\n", " train_data_before = len(train_data)\n", " train_data = processor.fit_transform(train_data)\n", " train_data_after = len(train_data)\n", " fitted_processors.append(processor)\n", " print(f\" 处理前记录数: {train_data_before}\")\n", " print(f\" 处理后记录数: {train_data_after}\")\n", " if train_data_before != train_data_after:\n", " print(f\" 删除记录数: {train_data_before - train_data_after}\")\n", "\n", "print(\"\\n 训练集处理后前5行预览:\")\n", "print(train_data.head())\n", "print(f\"\\n 训练集特征统计:\")\n", "print(f\" 特征数: {len(feature_cols)}\")\n", "print(f\" 样本数: {len(train_data)}\")\n", "print(f\" 缺失值统计:\")\n", "for col in feature_cols[:5]: # 只显示前5个特征的缺失值\n", " null_count = train_data[col].null_count()\n", " if null_count > 0:\n", " print(\n", " f\" {col}: {null_count} ({null_count / len(train_data) * 100:.2f}%)\"\n", " )" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[步骤 3/6] 训练集数据处理\n", "------------------------------------------------------------\n", " [1/3] 应用处理器: NullFiller\n", " 处理前记录数: 970000\n", " 处理后记录数: 970000\n", " [2/3] 应用处理器: Winsorizer\n", " 处理前记录数: 970000\n", " 处理后记录数: 970000\n", " [3/3] 应用处理器: StandardScaler\n", " 处理前记录数: 970000\n", " 处理后记录数: 970000\n", "\n", " 训练集处理后前5行预览:\n", "shape: (5, 70)\n", "┌───────────┬────────────┬───────┬───────┬───┬─────────────┬─────────────┬───────────┬─────────────┐\n", "│ ts_code ┆ trade_date ┆ low ┆ open ┆ … ┆ value_price ┆ active_mark ┆ ebit_rank ┆ future_retu │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ _divergence ┆ et_cap ┆ --- ┆ rn_5 │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ --- ┆ f64 ┆ --- │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ f64 ┆ ┆ f64 │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪═════════════╪═════════════╪═══════════╪═════════════╡\n", "│ 000004.SZ ┆ 20200102 ┆ 90.1 ┆ 92.05 ┆ … ┆ null ┆ null ┆ null ┆ 0.000441 │\n", "│ 000004.SZ ┆ 20200103 ┆ 89.53 ┆ 90.67 ┆ … ┆ null ┆ null ┆ null ┆ 0.005875 │\n", "│ 000004.SZ ┆ 20200106 ┆ 87.58 ┆ 90.22 ┆ … ┆ null ┆ null ┆ null ┆ 0.05644 │\n", "│ 000004.SZ ┆ 20200107 ┆ 88.06 ┆ 88.59 ┆ … ┆ null ┆ null ┆ null ┆ 0.049753 │\n", "│ 000004.SZ ┆ 20200108 ┆ 88.51 ┆ 89.04 ┆ … ┆ null ┆ null ┆ null ┆ 0.019922 │\n", "└───────────┴────────────┴───────┴───────┴───┴─────────────┴─────────────┴───────────┴─────────────┘\n", "\n", " 训练集特征统计:\n", " 特征数: 49\n", " 样本数: 970000\n", " 缺失值统计:\n", " ma_5: 4000 (0.41%)\n", " ma_20: 19000 (1.96%)\n", " ma_ratio_5_20: 19000 (1.96%)\n", " bias_10: 9000 (0.93%)\n", " high_low_ratio: 19000 (1.96%)\n" ] } ], "execution_count": 8 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:26.439057Z", "start_time": "2026-03-11T13:28:13.048971Z" } }, "cell_type": "code", "source": [ "# 步骤 4: 训练模型\n", "print(\"\\n[步骤 4/6] 训练模型\")\n", "print(\"-\" * 60)\n", "print(f\" 模型类型: LightGBM\")\n", "print(f\" 训练样本数: {len(train_data)}\")\n", "print(f\" 特征数: {len(feature_cols)}\")\n", "print(f\" 目标变量: {target_col}\")\n", "\n", "X_train = train_data.select(feature_cols)\n", "y_train = train_data.select(target_col).to_series()\n", "\n", "print(f\"\\n 目标变量统计:\")\n", "print(f\" 均值: {y_train.mean():.6f}\")\n", "print(f\" 标准差: {y_train.std():.6f}\")\n", "print(f\" 最小值: {y_train.min():.6f}\")\n", "print(f\" 最大值: {y_train.max():.6f}\")\n", "print(f\" 缺失值: {y_train.null_count()}\")\n", "\n", "print(\"\\n 开始训练...\")\n", "model.fit(X_train, y_train)\n", "print(\" 训练完成!\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "[步骤 4/6] 训练模型\n", "------------------------------------------------------------\n", " 模型类型: LightGBM\n", " 训练样本数: 970000\n", " 特征数: 49\n", " 目标变量: future_return_5\n", "\n", " 目标变量统计:\n", " 均值: 0.004737\n", " 标准差: 0.066054\n", " 最小值: -0.910839\n", " 最大值: 5.130794\n", " 缺失值: 465\n", "\n", " 开始训练...\n", " 训练完成!\n" ] } ], "execution_count": 9 }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:26.494851Z", "start_time": "2026-03-11T13:28:26.443216Z" } }, "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-11T13:28:26.994246Z", "start_time": "2026-03-11T13:28:26.501158Z" } }, "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.002399\n", " 标准差: 0.009874\n", " 最小值: -0.299069\n", " 最大值: 0.122588\n" ] } ], "execution_count": 11 }, { "metadata": {}, "cell_type": "markdown", "source": "### 4.3 训练指标曲线" }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:34.229526Z", "start_time": "2026-03-11T13:28:27.000586Z" } }, "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", "[301]\ttrain's l1: 0.0421507\tval's l1: 0.0620576\n", "训练完成,指标已收集\n", "\n", "评估指标: l1\n", "\n", "[早停信息]\n", " 配置的最大轮数: 1000\n", " 实际训练轮数: 401\n", " 早停状态: 已触发(连续100轮验证指标未改善)\n", "\n", "最终指标:\n", " 训练 l1: 0.041986\n", " 验证 l1: 0.062072\n" ] } ], "execution_count": 12 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:34.643007Z", "start_time": "2026-03-11T13:28:34.233779Z" } }, "source": [ "# 绘制训练指标曲线\n", "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots(figsize=(12, 6))\n", "\n", "# 绘制训练集和验证集的指标曲线(注意:val用于验证,test不参与训练)\n", "iterations = range(1, len(train_metric) + 1)\n", "ax.plot(iterations, train_metric, label=f\"Train {metric_name}\", linewidth=2, color=\"blue\")\n", "ax.plot(iterations, val_metric, label=f\"Validation {metric_name}\", linewidth=2, color=\"red\")\n", "\n", "ax.set_xlabel(\"Iteration\", fontsize=12)\n", "ax.set_ylabel(metric_name.upper(), fontsize=12)\n", "ax.set_title(f\"Training and Validation {metric_name.upper()} Curve\", fontsize=14, fontweight=\"bold\")\n", "ax.legend(fontsize=10)\n", "ax.grid(True, alpha=0.3)\n", "\n", "# 标记最佳验证指标点(用于早停决策)\n", "best_iter = val_metric.index(min(val_metric))\n", "best_metric = min(val_metric)\n", "ax.axvline(x=best_iter + 1, color=\"green\", linestyle=\"--\", alpha=0.7, label=f\"Best Iteration ({best_iter + 1})\")\n", "ax.scatter([best_iter + 1], [best_metric], color=\"green\", s=100, zorder=5)\n", "ax.annotate(\n", " f\"Best: {best_metric:.6f}\\nIter: {best_iter + 1}\",\n", " xy=(best_iter + 1, best_metric),\n", " xytext=(best_iter + 1 + len(iterations) * 0.1, best_metric),\n", " fontsize=9,\n", " arrowprops=dict(arrowstyle=\"->\", color=\"green\", alpha=0.7),\n", ")\n", "\n", "plt.tight_layout()\n", "plt.show()\n", "\n", "print(f\"\\n[指标分析]\")\n", "print(f\" 最佳验证 {metric_name}: {best_metric:.6f}\")\n", "print(f\" 最佳迭代轮数: {best_iter + 1}\")\n", "print(f\" 早停建议: 如果验证指标连续10轮不下降,建议在第 {best_iter + 1} 轮停止训练\")\n", "print(f\"\\n[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\")" ], "outputs": [ { "data": { "text/plain": [ "
" ], "image/png": "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atWqlbz++uu5vpXh3ff++9//ysUXXyyJiYnSvHlzE4SFe/jhh+Wcc84xz6GBz2OPPSbp6elm3SuvvCJTpkyR7777Trxer8THxwf2Obz73vfffy+XXXaZlCpVSqpUqWIqtvT1WG699Vbp16+fPPvss1KrVi2zzciRIwPPlR8dOnSQZ555Rq6//nrbArECX31v/fr1+d529+7dBX14AAAAAEAu9GS1QmIFcxILILvY2Fi55ZZbTMDz6KOPmmNGaSCVmZlpwigNdNq1a2dCo/Lly8v7778vN998s5x99tnSsWPHPN9Wn88n/fv3lxo1asg333wjR44cCRl/ylKuXDmzH7Vr1zbB0vDhw82yhx56SK677jrZtGmTLF261ARaGRkZJkwKd+LECenVq5d07tzZdCFMTk6W22+/XUaNGhUSvH366acmkNKfW7duNY+vXQP1OUuqAodSWuZmNWh+BjnP77YAAAAAAMAB2rcX2bvX3ufU7mRr1+Z789tuu81U/Xz++edmwHKr656OmVShQgUzPfjgg4Ht77nnHvnwww/ljTfeyFco9fHHH8vmzZvNfTRwUk888US2caAmTJgQUmmlz7lgwQITSpUqVUrKli1rQjTtLqehlM6Hmz9/vqSkpMg//vEPKVOmjFk2a9YsM3bWU089ZYIxValSJbM8JiZGmjVrJn379pXly5dHVyiljQgAAAAAODPSM9PlhbUviNfjldvb3i5xMXE0BeylgdSuXSX6XddQpkuXLvLyyy+bUEorh3SQ88cff9ys14opDZE0hNq1a5ekpaVJampqvseM+vHHH6Vu3bqBQEppJVO4hQsXyp///Gf56aefTHWWBk9amVUQP/74o7Ru3ToQSKmuXbuaaq0tW7YEQqkWLVqYQMqiVVNanVWSFTiUGjJkSPHsCQAAAAAgT5n+TPlg6wemV8rQ84dKnBBKwWY2DYJ9us+pY0dpBdTs2bNNgY12zevWrZtZp1VUM2fONGNE6XhSGvho9zsNp4rKypUr5cYbbzTjRmn3O63O0iqp6dOnS3GIiwv9LtDvCA2uoiqUAgAAAAAALlaAbnRn0rXXXiujR4823d+069uIESMCQwx9/fXXcvXVV8tNN91kbmt485///McMWJ4f5557rvzyyy+yZ88eU5GkVq1aFbLNihUrpH79+mZcK8vPP/8csk18fLyp2srruXTsKB1byqqW0v3XceWaNm0qTsbIeAAAAAAAIOroeE062Pe4ceNMeKRXqLM0adLEDC6uwZF2j7vzzjtl3759+X7sHj16mKvqaW8yvXqedg0MDp+s59ixY4epjtLue9qNb9GiRSHbNGjQQLZt2yYbNmyQAwcOmC6E4bTaSq/wp8+lA6PrQOZaAaYDs1td94qCVonpfuik89qtUee162NxIZQCAAAAAABRSbvwHTp0yHSfCx7/SQcgb9u2rVmuY07pQOP9+vXL9+NqlZIGTKdOnTIDo+vV8P70pz+FbHPVVVfJfffdZ66Sp1fB0wDsscceC9lmwIAB0rt3b7nsssvM/r3++uvZnkvHudIB1X/99Vfp0KGDDBw4ULp3724GNS9Ku3fvlvPPP99MGuI9++yzZl5fW3Hx+PUSebDF0aNHTR9SvVRkQQc2O9O0lFEvO1m9enUuPRvlaGt3ob3dhfZ2D9raXWhv97X3jt07ZNQXo0w3pKRBSZIYm3imdwtRemzrFd+0iqdhw4amUgfFx+/3B66+Z3UxLOly+3zkN/+gUgoAAAAAAAC2I5QCAAAAAACA7bj6HgAAAAA4SEJMgrx05UumS5fOA4BTEUoBAAAAgIPoeDPVyzDWKwDno/seAAAAAADIEddHQ3F9LgilAAAAAMBBMnwZ8vKGl+Xlb18280BxiYuLMz9PnjzJm4xsrM+F9TkpDLrvAQAAAICDaBC1ePNi043vhlY3SKyX0zoUj5iYGKlYsaIkJyeb26VLlzafOxRP1VFGRobExsaW+PdY91UDKf1c6OdDPyeFxbcXAAAAAACIqGbNmuanFUyh+IIen89nLmBQ0kMpiwZS1uejsAilAAAAAABARBqQ1KpVS6pXry7p6em8S8XE5/PJwYMHpUqVKiaYKum0y97pVEhZCKUAAAAAAECuNIAoihACOYdScXFxkpiY6IhQqqi455UCAAAAAACgxCCUAgAAAAAAgO0IpQAAAAAAAGA7xpQCAAAAAAdJiEmQWX1mmXFndB4AnIpQCgAAAAAcdjW0ehXquWowZADRiW8xAAAAAAAA2I5KKQAAAABwkAxfhsz/fr6plLq2xbUS6+W0DoAz8e0FAAAAAA4LpRb8sMB04+t/bn9CKQCORfc9AAAAAAAA2I5QCgAAAAAAALYjlAIAAAAAAIDtCKUAAAAAAABgO0IpAAAAAAAA2I5QCgAAAAAAALaLtf8pAQAAAACFFR8TL9P/MF28Xq+ZBwCnIpQCAAAAAAfxerzSpEoTE0oBgJPxLQYAAAAAAADblchQavbs2dKgQQNJTEyUTp06yerVq3PdPikpSZo1a2a2b9WqlSxZsiRk/a233ioejydk6t27d8g2v/76q9x4441Svnx5qVixogwbNkyOHz8ess3GjRvloosuMs9Tt25defrpp4vwVQMAAABA3jJ8GfLWj2+ZSecBwKlKXCi1cOFCuf/++2XSpEmyfv16ad26tfTq1UuSk5Mjbr9ixQoZPHiwCZG+/fZb6devn5k2bdoUsp2GUHv27AlMr7/+esh6DaR++OEHWbZsmbz33nvyxRdfyB133BFYf/ToUenZs6fUr19f1q1bJ88884xMnjxZ5s6dW0zvBAAAAABkp0HUK9+9IvM2zCOUAuBoJS6Ueu6552T48OEydOhQad68ucyZM0dKly4tL7/8csTtZ86caQKnsWPHyrnnnitTp06Vtm3byqxZs0K2S0hIkJo1awamSpUqBdb9+OOPsnTpUnnppZdMZdaFF14of/nLX2TBggWye/dus81rr70maWlpZj9atGgh119/vdx7771mfwEAAAAAAODgUEpDH61C6tGjR2CZDt6nt1euXBnxPro8eHullVXh23/22WdSvXp1adq0qYwYMUIOHjwY8hjaZa99+/aBZfqY+tzffPNNYJuLL75Y4uPjQ55ny5YtcujQoSJ49QAAAAAAAO5Roq6+d+DAAcnMzJQaNWqELNfbmzdvjnifvXv3Rtxel1u0kqp///7SsGFD+emnn2T8+PHSp08fEzTFxMSYbTWwChYbGyuVK1cOPI7+1PuHP4+1LrjyypKammqm4C6AyufzmclJdH/9fr/j9hsFR1u7C+3tLrS3e9DW7kJ7u7O9xfyX9fs5v6NHJ45td/FF2Tl3fl9HiQqliot2tbPoQOjnnXeenH322aZ6qnv37sX2vNOmTZMpU6ZkW75//35JSUkRp32gjhw5Yg4SLj0b3Whrd6G93YX2dg/a2l1ob3e2d2paqnjEY8beTYxNPNO7hWLAse0uvig75z527JjzQqmqVauayqV9+/aFLNfbOg5UJLq8INurRo0amefaunWrCaV02/CB1DMyMswV+azHyel5rHWRjBs3zgzaHlwppVftq1atmrnKn9MOEL1qoe57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" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[指标分析]\n", " 最佳验证 l1: 0.062058\n", " 最佳迭代轮数: 301\n", " 早停建议: 如果验证指标连续10轮不下降,建议在第 301 轮停止训练\n", "\n", "[重要提醒] 验证集仅用于早停/调参,测试集完全独立于训练过程!\n" ] } ], "execution_count": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 查看结果" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:34.669584Z", "start_time": "2026-03-11T13:28:34.650632Z" } }, "source": [ "print(\"\\n\" + \"=\" * 80)\n", "print(\"训练结果\")\n", "print(\"=\" * 80)\n", "\n", "results = trainer.results\n", "\n", "print(f\"\\n结果数据形状: {results.shape}\")\n", "print(f\"结果列: {results.columns}\")\n", "print(f\"\\n结果前10行预览:\")\n", "print(results.head(10))\n", "print(f\"\\n结果后5行预览:\")\n", "print(results.tail())\n", "\n", "print(f\"\\n每日预测样本数统计:\")\n", "daily_counts = results.group_by(\"trade_date\").agg(pl.len()).sort(\"trade_date\")\n", "print(f\" 最小: {daily_counts['len'].min()}\")\n", "print(f\" 最大: {daily_counts['len'].max()}\")\n", "print(f\" 平均: {daily_counts['len'].mean():.2f}\")\n", "\n", "# 展示某一天的前10个预测结果\n", "sample_date = results[\"trade_date\"][0]\n", "sample_data = results.filter(results[\"trade_date\"] == sample_date).head(10)\n", "print(f\"\\n示例日期 {sample_date} 的前10条预测:\")\n", "print(sample_data.select([\"ts_code\", \"trade_date\", target_col, \"prediction\"]))" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "================================================================================\n", "训练结果\n", "================================================================================\n", "\n", "结果数据形状: (282000, 71)\n", "结果列: ['ts_code', 'trade_date', 'low', 'open', 'turnover_rate', 'close', 'amount', 'vol', 'high', 'total_assets', 'total_mv', 'f_ann_date', 'n_income', 'revenue', 'total_cur_assets', 'total_liab', 'total_cur_liab', 'total_hldr_eqy_exc_min_int', 'n_cashflow_act', 'ebit', 'ma_5', 'ma_20', 'ma_ratio_5_20', 'bias_10', 'high_low_ratio', 'bbi_ratio', 'return_5', 'return_20', 'kaufman_ER_20', 'mom_acceleration_10_20', 'drawdown_from_high_60', 'up_days_ratio_20', 'volatility_5', 'volatility_20', 'volatility_ratio', 'std_return_20', 'sharpe_ratio_20', 'min_ret_20', 'volatility_squeeze_5_60', 'overnight_intraday_diff', 'upper_shadow_ratio', 'capital_retention_20', 'max_ret_20', 'volume_ratio_5_20', 'turnover_rate_mean_5', 'turnover_deviation', 'amihud_illiq_20', 'turnover_cv_20', 'pv_corr_20', 'close_vwap_deviation', 'roe', 'roa', 'profit_margin', 'debt_to_equity', 'current_ratio', 'net_profit_yoy', 'revenue_yoy', 'healthy_expansion_velocity', 'EP', 'BP', 'CP', 'market_cap_rank', 'turnover_rank', 'return_5_rank', 'EP_rank', 'pe_expansion_trend', 'value_price_divergence', 'active_market_cap', 'ebit_rank', 'future_return_5', 'prediction']\n", "\n", "结果前10行预览:\n", "shape: (10, 71)\n", "┌───────────┬────────────┬───────┬───────┬───┬──────────────┬───────────┬─────────────┬────────────┐\n", "│ ts_code ┆ trade_date ┆ low ┆ open ┆ … ┆ active_marke ┆ ebit_rank ┆ future_retu ┆ prediction │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ t_cap ┆ --- ┆ rn_5 ┆ --- │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ f64 ┆ --- ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ f64 ┆ │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪══════════════╪═══════════╪═════════════╪════════════╡\n", "│ 000004.SZ ┆ 20250102 ┆ 54.17 ┆ 55.8 ┆ … ┆ 2.027703 ┆ null ┆ -0.066193 ┆ 0.015616 │\n", "│ 000004.SZ ┆ 20250103 ┆ 51.86 ┆ 57.71 ┆ … ┆ 1.80063 ┆ null ┆ 0.00893 ┆ 0.03083 │\n", "│ 000004.SZ ┆ 20250106 ┆ 49.17 ┆ 50.39 ┆ … ┆ 1.759968 ┆ null ┆ -0.0142 ┆ 0.044376 │\n", "│ 000004.SZ ┆ 20250107 ┆ 51.41 ┆ 51.41 ┆ … ┆ 1.908269 ┆ null ┆ 0.013031 ┆ 0.014036 │\n", "│ 000004.SZ ┆ 20250108 ┆ 52.38 ┆ 52.95 ┆ … ┆ 2.000828 ┆ null ┆ 0.00442 ┆ 0.006524 │\n", "│ 000004.SZ ┆ 20250109 ┆ 53.69 ┆ 54.3 ┆ … ┆ 2.005907 ┆ null ┆ 0.024865 ┆ -0.002277 │\n", "│ 000004.SZ ┆ 20250110 ┆ 50.8 ┆ 53.89 ┆ … ┆ 1.795423 ┆ null ┆ 0.073486 ┆ 0.007954 │\n", "│ 000004.SZ ┆ 20250113 ┆ 48.24 ┆ 50.35 ┆ … ┆ 1.563935 ┆ null ┆ -0.04458 ┆ 0.005756 │\n", "│ 000004.SZ ┆ 20250114 ┆ 50.92 ┆ 50.92 ┆ … ┆ 1.572468 ┆ null ┆ -0.156301 ┆ 0.000774 │\n", "│ 000004.SZ ┆ 20250115 ┆ 53.97 ┆ 55.15 ┆ … ┆ 1.570886 ┆ null ┆ -0.203593 ┆ 0.000368 │\n", "└───────────┴────────────┴───────┴───────┴───┴──────────────┴───────────┴─────────────┴────────────┘\n", "\n", "结果后5行预览:\n", "shape: (5, 71)\n", "┌───────────┬────────────┬───────┬───────┬───┬──────────────┬───────────┬─────────────┬────────────┐\n", "│ ts_code ┆ trade_date ┆ low ┆ open ┆ … ┆ active_marke ┆ ebit_rank ┆ future_retu ┆ prediction │\n", "│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ t_cap ┆ --- ┆ rn_5 ┆ --- │\n", "│ str ┆ str ┆ f64 ┆ f64 ┆ ┆ --- ┆ f64 ┆ --- ┆ f64 │\n", "│ ┆ ┆ ┆ ┆ ┆ f64 ┆ ┆ f64 ┆ │\n", "╞═══════════╪════════════╪═══════╪═══════╪═══╪══════════════╪═══════════╪═════════════╪════════════╡\n", "│ 605588.SH ┆ 20260305 ┆ 54.89 ┆ 55.01 ┆ … ┆ 0.108525 ┆ null ┆ null ┆ 0.006038 │\n", "│ 605588.SH ┆ 20260306 ┆ 54.63 ┆ 55.23 ┆ … ┆ 0.082701 ┆ null ┆ null ┆ 0.005326 │\n", "│ 605589.SH ┆ 20260303 ┆ 36.77 ┆ 39.02 ┆ … ┆ 4.992206 ┆ null ┆ null ┆ -0.000194 │\n", "│ 605598.SH ┆ 20260303 ┆ 72.72 ┆ 77.17 ┆ … ┆ 3.20713 ┆ null ┆ null ┆ 0.010633 │\n", "│ 605599.SH ┆ 20260303 ┆ 28.23 ┆ 30.23 ┆ … ┆ 4.008987 ┆ null ┆ null ┆ 0.005141 │\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.015616 │\n", "│ 000007.SZ ┆ 20250102 ┆ 0.019858 ┆ -0.000471 │\n", "│ 000010.SZ ┆ 20250102 ┆ 0.076274 ┆ 0.001351 │\n", "│ 000014.SZ ┆ 20250102 ┆ -0.064651 ┆ 0.007245 │\n", "│ 000020.SZ ┆ 20250102 ┆ -0.035224 ┆ 0.02038 │\n", "│ 000040.SZ ┆ 20250102 ┆ -0.093583 ┆ -0.140064 │\n", "│ 000042.SZ ┆ 20250102 ┆ -0.035958 ┆ 0.015733 │\n", "│ 000056.SZ ┆ 20250102 ┆ -0.033205 ┆ 0.017907 │\n", "│ 000068.SZ ┆ 20250102 ┆ -0.021277 ┆ 0.006877 │\n", "│ 000153.SZ ┆ 20250102 ┆ -0.018193 ┆ 0.002956 │\n", "└───────────┴────────────┴─────────────────┴────────────┘\n" ] } ], "execution_count": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 保存结果" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:35.113238Z", "start_time": "2026-03-11T13:28:34.675124Z" } }, "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.061083 ┆ 600421.SH │\n", "│ 2025-01-02 ┆ 0.05972 ┆ 000668.SZ │\n", "│ 2025-01-02 ┆ 0.046336 ┆ 002848.SZ │\n", "│ 2025-01-02 ┆ 0.040149 ┆ 000586.SZ │\n", "│ 2025-01-02 ┆ 0.038014 ┆ 603963.SH │\n", "│ … ┆ … ┆ … │\n", "│ 2025-01-06 ┆ 0.072982 ┆ 600421.SH │\n", "│ 2025-01-06 ┆ 0.067706 ┆ 000668.SZ │\n", "│ 2025-01-06 ┆ 0.067522 ┆ 603316.SH │\n", "│ 2025-01-06 ┆ 0.062621 ┆ 002072.SZ │\n", "│ 2025-01-06 ┆ 0.061637 ┆ 600847.SH │\n", "└────────────┴──────────┴───────────┘\n" ] } ], "execution_count": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.5 特征重要性" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:35.122694Z", "start_time": "2026-03-11T13:28:35.117401Z" } }, "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 1379.975546\n", "turnover_rank 1233.056754\n", "return_5_rank 1211.083106\n", "pe_expansion_trend 1194.518072\n", "return_5 1067.753329\n", "overnight_intraday_diff 864.510148\n", "high_low_ratio 737.870126\n", "amihud_illiq_20 699.716207\n", "revenue_yoy 591.354167\n", "min_ret_20 586.062664\n", "drawdown_from_high_60 544.946004\n", "roa 492.201997\n", "close_vwap_deviation 456.329131\n", "volatility_ratio 425.847030\n", "active_market_cap 391.611939\n", "healthy_expansion_velocity 381.013310\n", "bbi_ratio 350.895088\n", "ma_ratio_5_20 333.176295\n", "turnover_deviation 320.594954\n", "net_profit_yoy 312.797814\n", "turnover_rate_mean_5 294.216230\n", "return_20 292.148741\n", "EP_rank 270.906632\n", "turnover_cv_20 255.994465\n", "ma_20 249.024118\n", "mom_acceleration_10_20 245.051260\n", "volume_ratio_5_20 236.906485\n", "max_ret_20 233.119360\n", "profit_margin 231.406188\n", "EP 223.520549\n", "ma_5 222.848019\n", "std_return_20 211.703293\n", "sharpe_ratio_20 200.874590\n", "BP 182.380531\n", "capital_retention_20 167.152835\n", "roe 162.483161\n", "volatility_squeeze_5_60 158.716820\n", "volatility_20 152.922347\n", "current_ratio 149.282750\n", "debt_to_equity 142.640424\n", "CP 133.383919\n", "market_cap_rank 112.134213\n", "volatility_5 104.388842\n", "pv_corr_20 102.753917\n", "kaufman_ER_20 79.014202\n", "upper_shadow_ratio 58.782669\n", "up_days_ratio_20 42.695102\n", "value_price_divergence 0.000000\n", "ebit_rank 0.000000\n", "dtype: float64\n", "\n", "================================================================================\n", "训练完成!\n", "================================================================================\n" ] } ], "execution_count": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. 可视化分析\n", "\n", "使用训练好的模型直接绘图。\n", "- **特征重要性图**:辅助特征选择\n", "- **决策树图**:理解决策逻辑" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:35.137085Z", "start_time": "2026-03-11T13:28:35.126226Z" } }, "source": [ "# 导入可视化库\n", "import matplotlib.pyplot as plt\n", "import lightgbm as lgb\n", "import pandas as pd\n", "\n", "# 从封装的model中取出底层Booster\n", "booster = model.model\n", "print(f\"模型类型: {type(booster)}\")\n", "print(f\"特征数量: {len(feature_cols)}\")" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "模型类型: \n", "特征数量: 49\n" ] } ], "execution_count": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 绘制特征重要性(辅助特征选择)\n", "\n", "**解读**:\n", "- 重要性高的特征对模型贡献大\n", "- 重要性为0的特征可以考虑删除\n", "- 可以帮助理解哪些因子最有效" ] }, { "metadata": { "ExecuteTime": { "end_time": "2026-03-11T13:28:35.308547Z", "start_time": "2026-03-11T13:28:35.141844Z" } }, "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+naQAA8U9JREFUeJzs3Qm8jOX///GPc8i+Z09kyx5ZSkSWonwtLaisaVFZopQUkiWiopVvy5fSXipaJUXaRJbsUXyprAmhbGf+j/f1+9/znTNn5pjDGefMnNfz8RjOmbnnnvvMdc7c1+f6fK7rzubz+XwGAAAAAADSXUL67xIAAAAAABB0AwAAAAAQRWS6AQAAAACIEoJuAAAAAACihKAbAAAAAIAoIegGAAAAACBKCLoBAAAAAIgSgm4AAAAAAKKEoBsAAAAAgCgh6AYAAMggW7dutVy5ctnXX399Wl6vV69eVr58+ZN67r333msXXHBBuh8TAMQ7gm4AQFyaPn26ZcuWLeRNwUM0fPPNNzZy5Ejbu3evZdb3Y8mSJRarnnnmGfdzxJNRo0a5QLZx48YpHlu4cKF17tzZypQpY2eccYYVLFjQbavn7Nix47Qf68CBA23FihU2e/bs0/7aABDLsmf0AQAAEE0KUM4555xk99WsWTNqQfeDDz7osomFChWKymtkZQq6zzzzTPf+xoNdu3bZiy++6G7BRowYYaNHj7YKFSq4n1f///PPP/bDDz/Yo48+6p7z888/p/k1n3vuOUtKSjqp4y1ZsqR16NDBHnnkEWvfvv1J7QMAsiKCbgBAXLv88sutfv36FssOHjxoefPmtazq0KFDlidPHos3L7/8smXPnt3atWuX7P433njDBdzKcs+YMcNluQNNmjTJ3U5Gjhw5TumYdUydOnWyX375xQ0EAABOjPJyAECW9vHHH9vFF1/sgtr8+fNb27ZtbfXq1cm2+fHHH/3ZRs2/Vcavd+/e9scff/i3UVn53Xff7b5WZt0rZd+8ebO76etQpdG6X88N3I/uW7NmjV1//fVWuHBha9KkSbJArV69epY7d24rUqSIXXvttW5e8MnQz5QvXz7bsmWL/etf/3Jfq5T56aefdo+vXLnSWrRo4d6bcuXK2auvvhqyZP3LL7+0Pn36WNGiRa1AgQLWo0cP+/PPP0NmqmvUqGE5c+a00qVLW9++fVOU4l9yySWuEkEZ3aZNm7pg+7777nPzkNUuCxYs8L+32lb27NljgwcPtlq1armfQcegwRaVQgeaP3++e96bb75pY8eOtbPOOsu1Z8uWLW3jxo0pjnfRokV2xRVXuDbQe1C7dm17/PHHk22zbt06u+aaa1xbaF8a4Im0/Pq9995z5eI65uAstzL6L7zwQoqAW1RmHvg7I7NmzXK/u3pf9f5WrFjRBe7Hjx9PdU6397up7PWzzz7rnqfnN2jQwBYvXpzitVu1auV/PQBAZMh0AwDi2r59+2z37t3J7lNAI8oi9uzZ01q3bm0PP/ywy6hOmTLFBbnLli3zBydz5851mb0bbrjBBdwK/hSg6P/vvvvOBS1XXXWV/fTTT/baa6+5LKT3GsWKFXNlxGmlbGLlypXtoYceMp/P5+5ToDh8+HCXbbzpppvcfp988kkXnOp4T6akXUGZAlTtY8KECfbKK69Yv379XJB5//33W9euXd3PNnXqVBdMN2rUKEW5vrbXaysQXL9+vXsP//vf//qDXNFjKr1X0Hbbbbf5t1Ngp0XEAjOwGszQMWlAoVu3blaiRAkXYPfv398FqDou0f2itlEAq/dMx6b5zv/+97+tWbNmbvBCgWig8ePHW0JCggvU9fuhn1s/p4Jsj9pcAxGlSpWyO+64w7X72rVr7YMPPnDfi9pfc7E1UKF1AvSeKaDv2LGjzZw506688sqw7/vRo0fdz673IpB+h3RT+wYH46nRAIi2v/POO93/n3/+uQve9+/fbxMnTjzh8zWg8tdff7nBE7WZ3hO1u97bwLZRwK/AXG02aNCgiI8PALI0HwAAcWjatGmKVEPe5K+//vIVKlTId/PNNyd73vbt230FCxZMdv+hQ4dS7P+1115z+/ryyy/9902cONHdt2nTpmTb6nvdr2MKpvsfeOAB//f6Wvddd911ybbbvHmzLzEx0Td27Nhk969cudKXPXv2FPeHez8WL17sv69nz57uvoceesh/359//unLnTu3L1u2bL7XX3/df/+6detSHKu3z3r16vmOHDniv3/ChAnu/lmzZrnvd+7c6TvjjDN8l112me/48eP+7Z566im33X/+8x//fc2aNXP3TZ06NcXPUKNGDfd4sH/++SfZfr33PGfOnL5Ro0b57/viiy/cvqtVq+Y7fPiw//7HH3/c3a/3Uo4dO+Y755xzfOXKlXPvR6CkpCT/1y1btvTVqlXLvX7g4xdddJGvcuXKvtRs3LjRveaTTz6Z7H69Z7p/8uTJKV53165dyW5Hjx5N9Xe0T58+vjx58iQ7PrW5fq7A90mvV7RoUd+ePXtSHMf777+fYr9qR72HAIDIUF4OAIhrKpVW1jLwJvpfpc3XXXedy4R7t8TERFfy+8UXX/j3oVJujxaz0nYXXnih+37p0qVROe5bb7012ffvvPOOWwBLWe7A41UGVhnxwONNK2VVPcpYn3vuuS5rq9fy6D49psxnsFtuuSVZNlTZW81V/uijj9z3n332mR05csStfq0Ms+fmm292peAffvhhsv2pvFlVBZHS9t5+lblXplzZXh1zqPbRvgPLtjW9QLyfTVUDmzZtcscbXD3gZe5V0q5sst4jZYi99tBrq3Jiw4YN9ttvv4U9Zm9qgkrXAykzLcFZbmXkVTUReFu+fHnI31HvePRzqXpDJfAn0qVLl2THEvyeBNJ2wdUjAIDwKC8HAMS1hg0bhlxITUGRaM5yKAoGPQqwVBr9+uuv286dO1MEQ9EQXMKt41ViXAF2ei6QpXnICuACqYRY8529ADPw/lBztYOPSQGjyrI1X1hUai4KggMp8NU8ee9xj3eJrEhpMEJzrTVnXMFy4DxmzTMPdvbZZyf73gs2vZ/NWxU8tVXuNQdc7aFyf91C0e+KfpbUeFMHPFpXQA4cOJDiPfUGjD799NMUJeMqdR82bJgbCPAC97T8jp7oPQk+5uDfDQBAeATdAIAsybtskuZ1K1scTJlaj7KZuhyYFkqrU6eOC4D0/DZt2kR0+aVwAUrwIleBAjOX3vFqP1r4Tdn4YGmZ/xso1L5Suz84SIyG4J/9RDTvXYGvFrfT4mFa1EyZb2WqQ7VPevxs3n41L1yZ7VAqVaoU9vneYEBwUFu1alX3/6pVq1L8PnqLmP3666/JHlPFhuava6BIl8jTnGsNpijLP2TIkIh+R9PynuiYvTULAAAnRtANAMiSFJhI8eLF/cFMKAow5s2b5zLdWpgqOFMeSXDtZQ2DV+oOzvCe6HgVACkDXqVKFctM9F40b97c/72ytNu2bXMrf4tWPhctnhZ4mSmVnCszndr7H8n7+/bbb7vX12rfgfR+n0xw6P1uKPANd2zez6EKg0iPPzizrMEF/fyBVA2gygEtDDd58uSILhWnBetUrq4pCFoQzxO87/Si/Z533nlR2TcAxCPmdAMAsiRlJ5UZVJZUK0kH81Yc9zKAwRk/BUTBvAApOLjW6yj406W1AqkcOlJaSVrHouA/+Fj0feDly043reQe+B5qVfJjx465FchFQanKxZ944olkx64gWaXPutRVJPT+Br+3ovcl+D156623Up1TnZrzzz/fDW6ojYNfz3sdDdZoRXWtkq4BhmAnWrFewbqmPSxZsiTFY1rpXXOmNec91O9m8M8a6ndUAxpp+f2KlNpL5fcXXXRRuu8bAOIVmW4AQJakQFjBYffu3V2QpctTaW6zrlmthb10KainnnrKbeddTksBkOboak5tqCyirp8tuqSV9qfAql27di5Y1GJlulSV/lewpQBcl4ZKS/Z1zJgxNnToUDdXWpel0vxfHce7777rFjNTqXNGUICna12rDF/ZbAV7uuxa+/bt3eN6X3XcGjBQSb7u97bT9aB1WbBI6P1Vm+l9UOm2Al/NydelvVRWrQXSFAzq+uK69FlgVj0tVJqu11HbaTqB9qs56lqQTHOn58yZ41+kTz+nrg+uAFmvp8uVffvtt64EPPg64cE6dOjgflc0BztwDQFdn11Z9nHjxtn333/vfpc0CHDw4EF3vy5Lp7b3Kij0M+trXf5uwIABriJA0yaiMRVAi+Jpvzp2AECEIlzlHACAmBLqElmh6DJSrVu3dpcJy5Url69ixYq+Xr16+ZYsWeLf5tdff/VdeeWV7hJj2q5Tp06+33//PcUltGT06NG+MmXK+BISEpJdPkyXdLrxxhvd8/Pnz+/r3Lmzu5RWuEuG6ZJQocycOdPXpEkTX968ed2tatWqvr59+/rWr1+f5vdDl4/SPoLpsly6PFcwXWqqbdu2Kfa5YMEC3y233OIrXLiwL1++fL6uXbv6/vjjjxTP1yXCdLw5cuTwlShRwnfbbbeluCRXuNf2Luem19f7p9f1Lh+mS2LdddddvlKlSrnLnTVu3Nj37bffuscDLzHmXTLsrbfeiuiSbl999ZXv0ksvda+n96l27dopLvH1888/+3r06OErWbKk+7nU9v/61798b7/9tu9EduzY4S73NmPGjJCPz58/33fNNde4n0v7LlCggK9+/frud2Tbtm3Jtv366699F154ofv5S5cu7bvnnnt8c+bMcT+Xfu4TXTJMl7sLFur3u0uXLu73DwAQuWz6J9IAHQAAwDN9+nSXBV68eHHIFeJxYjfeeKOreFi4cGGmf7u2b9/uMu5axZ9MNwBEjjndAAAAGeSBBx5wgxZff/11pm8DzXFXKT0BNwCkDXO6AQAAMohWMf/nn39i4v3XmgQAgLQj0w0AAAAAQJQwpxsAAAAAgCgh0w0AAAAAQJQQdAMAAAAAECUspBZnkpKS7Pfff7f8+fNbtmzZMvpwAAAAACAu6erbf/31l5UuXdoSEsLnswm644wC7rJly2b0YQAAAABAlrB161Y766yzwj5O0B1nlOGWTZs2WZEiRTL6cHCSjh49ap9++qlddtllliNHDt7HGEU7xj7aMD7QjvGBdox9tGF8oB3/Z//+/S7h6cVg4RB0xxmvpFwNX6BAgYw+HJzCh1mePHlcGxJ0xy7aMfbRhvGBdowPtGPsow3jA+2Y0omm9bKQGgAAAAAAUULQDQAAAABAlBB0AwAAAAAQJQTdAAAAAABECUE3AAAAAABRQtANAAAAAECUEHQDAAAAABAlBN0AAAAAAEQJQTcAAAAAAFFC0A0AAAAAQJQQdAMAAAAAECUE3QAAAAAARAlBNwAAAAAAUULQDQAAAABAlBB0AwAAAAAQJQTdAAAAAABECUE3AAAAAABRQtANAAAAAECUEHQDAAAAABAlBN0AAAAAAEQJQTcAAAAAAFFC0A0AAAAAQJQQdAMAAAAAECUE3QAAAAAARAlBNwAAAAAAUULQDQAAAABwvvzyS2vXrp2VLl3asmXLZu+9916yd2bUqFHWt29fK1SokBUuXNhatWplixYt8j8+f/5897xQt8WLF/u3e/PNN61OnTqWJ08eK1eunE2cOPGELbB06VK79NJL3WsXLVrUbrnlFjtw4ID/8enTp4d97Z07d/q3O3z4sN1///3udXPmzGnly5e3//znP1H7DcgSQffIkSNdgwIAAAAAwjt48KCdd9559vTTT4d8vHLlyi7YVQD81VdfuYD1sssus127drnHL7roItu2bVuy20033WTnnHOO1a9f323z8ccfW9euXe3WW2+1VatW2TPPPGOTJk2yp556Kuxx/f777y7Ar1SpkgvyP/nkE1u9erX16tXLv02XLl1SvHbr1q2tWbNmVrx4cf92nTt3tnnz5tkLL7xg69evt9dee83OPffcqP1aZLcYsH37dhs7dqx9+OGH9ttvv7k3TEH0wIEDrWXLlhYv3nnnHXvooYds48aNdvToUfcLfdddd1n37t0z+tAAAAAAZAGXX365u4Vz3XXX2UcffWQVKlSwHDly2GOPPeaC1x9//NHFZmeccYaVLFnSv/3Ro0dt1qxZ1r9/f5dxlhkzZljHjh1d0C3a19ChQ+3hhx92WXRvu0AffPCBez0NBiQk/F/ueOrUqVa7dm0XPykYz507t7t5NBDw+eefu+PzKFhfsGCB/fLLL1akSBF3nwYOoinTB92bN2+2xo0buxIClRzUqlXLNdycOXNcg6xbt87ihRpdZQ5Vq1Z1v6z6xbrhhhvcIINGaNLignHz7Fj2vFE7VkRXzkSfTWhoVnPkHDt8POWHDmID7Rj7aMP4QDvGB9ox9tGGmdvm8W3T/JwjR47Ys88+awULFnTZ8VBmz55tf/zxh4trAsu7VVYeSMHyr7/+av/9739DBsF6jmIkL+D2niPKuCvoDvbSSy+517nmmmuSHY8y7hMmTHDBf968ea19+/Y2evToZAF7liovv/32291Ix/fff29XX321ValSxWrUqGF33nmnfffdd26bLVu2WIcOHSxfvnxWoEABVy6wY8eOsPu85JJLXJY8kEZaAksT1NBjxoyxHj16uP2q3l8NpNES77U0qrJkyZJkcwg0OKABgWrVqrlt2rRp48oaIqHjuvLKK91zK1asaHfccYd7Df0SAQAAAEBmoLnZms+dK1cuVxY+d+5cO/PMM0Nu+8ILL7gE4llnneW/T9+rylcl3klJSfbTTz/Zo48+6h4LFzu1aNHCVUArEatg/88//7R777031efota+//vpkwbQy3IqvVNb+7rvv2uTJk+3tt992cWeWzHTv2bPHpf9VWq4RiGAKcNVIXhCsMoFjx465DLjq+TWJ/1ToF0jl3sOHD3dfq8xbcxR69+7tGnvIkCEuKNdcAq8E4tChQ/bII4+4URONwnTr1s0GDx5sr7zySppe2+fzuVIIzTFQmUU4GvHRzbN//373f84EnyUm+k76Z0fGUvsF/o/YRDvGPtowPtCO8YF2jH20YeamauJQFF8FPqavVX387bff2r59+1xgq6SnAtnAedOizPWcOXPs1VdfTbYPJTsVaP/rX/9y9ytx2q9fP5dtVnwX6liUfNVr3XPPPa4UPTEx0T2nRIkSLnYKfo4StGvXrrVp06Yle+z48eMudlPCVBl6Udb72muvtccffzxN2e5w71lMBd2qzdcbqHLrcDQ6snLlStu0aZOVLVvWX0agbLhGYBo0aHDSr3/FFVdYnz593NcjRoywKVOmuP116tTJ3aegu1GjRi6r7s1b0BuvuQXKVIt+EbTCX6T0i1umTBkXSOsXSYsKaIW+cMaNG2cPPvhgivuH1U2yPHmOp/lnRuYyun5SRh8C0gHtGPtow/hAO8YH2jH20YaZk+Zph/LDDz+4udSBlOFWxtirGFZgraxzYBm3vPHGG5Y/f37Lnj17iv1ffPHFLqG5d+9eF3RrTrj8/PPPtnv37pDHoiD53//+t3uOVh1X8KxMtb4P3v+TTz7pFm9TdjzwMQXdSt5+/fXX/vu0srniTiVKtWp7pJRwjfmgWz/4iWj0QsG2F3BL9erV3Rupx04l6FZpt0cjKKJRneD71Ehe0K05A17ALaVKlUq2PP2J6Jdy+fLlbul7DSiojF4LC6j0PBSN8mibwEy33osxyxLsWI7ENP28yFwjwTohDV+SYIeTmNMdq2jH2EcbxgfaMT7QjrGPNszcVo0MvYZUvXr1XDLSoySjysmVGPSCcWWHNT03cDvFcoMGDXJVwpozfSK6NNmFF17oFmqLlLLVGgC4++67XfznUSylimNNFw48Jm8VdC1W3bRpU1ctLZpGrCplraielky3V2Uc00G3Vu/W6EV6L5amNzQ4oA9VGhA4ouOVj4e6TyUQoZ7jbRPJ4EHgsXmLAGiFdg0cKJsdLujWCI9uwRSoHWMBrpindmQhtdhHO8Y+2jA+0I7xgXaMfbRh5uTFMQpYVXHs2bp1q5tOq0WfdW1sVfHqf1UWq0pXq4nrClMqzw6MhZRAVDXyLbfckiJGUiZb86gV4/zzzz+uBHzmzJluurC3rdb00lRe7UeVwKJLiik7rmBZgb+C7fHjx1uxYsWS7V/zxVUW37NnzxSvrSnDmkKs41LFsI5FiUwNDijjfjLvWUwH3WpYTbJXQw4YMCDFvG6VEWjRMf0i6OZlu9esWeMeU8Y7FDVK4GR7lRhoIn3z5s0ts1FAHzhnO1KLhrZ0fwyITRoEUhmMRhwj/WNG5kM7xj7aMD7QjvGBdox9tGFs0ELRgXGRV1WrAFbTaLXm1MKFC926V4o3VFms7xWEB9L8awXIVcNMFX7xxRfd2ldKUGrKrtbjatiwYbLSbb1WYHJUgfgDDzzgBga0X5Wah7q8sl77qquuSpb99ngBuy5hplXM9TNoTrqy4tGSqYNuUcCtS4apATSqopJvjVrojdIcawXYKvlWKYDq+fWYVp7TBdC9i6+HWvlOvzy67rdKwXVtOQXpGU0ZbR2zjkmBtoIuLcimnxMAAAAAok3Z59Qqdd966y0Xp6hsO7XkkBZPC+fMM890C7Gl9Ti0dlckvvnmm1QfV8CuePJ0yfRBt+YzL1261K1grtp7ZaiVqdbcAgWjKt/2LrauunyVZ+syXZo4H45KB1asWOHKFTSpX3MNMkOW++DBg27AQKv8aS6BfhlefvlltxI7AAAAACD2ZPOlZcIxMj1N5teqfpqbQHl57JdfnWgEEZkb7Rj7aMP4QDvGB9ox9tGG8YF2TBl7aW57avPBE8I+AgAAAAAATglB92mkSfvhblp8AAAAAAAQXzL9nO54outvh+Mtgw8AAAAAiB8E3aeRd/1tAAAAAEDWQHk5AAAAAABRQtANAAAAAECUEHQDAAAAABAlBN0AAAAAAEQJQTcAAAAAAFFC0A0AAAAAQJQQdAMAAAAAECUE3QAAAAAARAlBNwAAAAAAUULQDQAAAABAlBB0AwAAAAAQJQTdAAAAAABECUE3AAAAAABRQtANAAAAAECUEHQDAAAAABAlBN0AAAAAAEQJQTcAAACAmPXll19au3btrHTp0pYtWzZ77733/I8dPXrUhgwZYrVq1bK8efO6bXr06GG///57sn20b9/ezj77bMuVK5eVKlXKunfvnmyb9evXW/Pmza1EiRJumwoVKtiwYcPc/lOzZcsWa9u2reXJk8eKFy9ud999tx07dsz/+Pz5890xB9+2b9/u36Z8+fIht+nbt286vYOItrgIukeOHGl16tTJ6MMAAAAAcJodPHjQzjvvPHv66adTPHbo0CFbunSpDR8+3P3/zjvvuABaQXYgBdRvvvmme2zmzJn2888/2zXXXON/PEeOHC5Y//TTT902kydPtueee84eeOCBsMd1/PhxF3AfOXLEvvnmG3vxxRdt+vTpNmLEiBTbap/btm3z3xSgexYvXpzssblz57r7O3XqdNLvGU6v7JYJaCRn7Nix9uGHH9pvv/3mfskURA8cONBatmxp8ej111+36667zjp06OAfjdNImUbMPvroI/vll1+sYMGC1qpVKxs/frwblQMAAACQ3OWXX+5uoag/7QWpnqeeesoaNmzostDKbsugQYP8j5crV87uvfde69ixo+ufK+BWZlu3wG2UpV64cGHY5lCAvmbNGvvss89chlzxzejRo13mXUnDM844w7+t4p9ChQqF3E+xYsWSfa/YoGLFitasWTN+FWJEhgfdmzdvtsaNG7tfsokTJ7rSD/1yz5kzx5VMrFu3zuKNfubBgwfbxRdfHHYkTqN1f/75p91xxx1uJG7JkiVpeo0Lxs2zY9nzpvOR43TJmeizCQ3Nao6cY4ePZ+ONj1G0Y+yjDeMD7RgfaMfYl95tuHl825N63r59+1x5drggd8+ePfbKK6/YRRdd5ALuUDZu3GiffPKJXXXVVWFf59tvv3WxjQJuT+vWre22226z1atXW926df33KyA/fPiw1axZ0wXkio9CUdb85ZdftjvvvNP9DIgNGV5efvvtt7tfmO+//96uvvpqq1KlitWoUcP9In333XduG41CKSOcL18+K1CggHXu3Nl27NgRdp+XXHKJy5IH0khVr169ks2NGDNmjCsT0X41WjV79mzbtWuX/7Vq166dLNhVOYj+ODUgUK1aNbdNmzZtXJlHpFRm0rVrV3vwwQeTjZYFjsTp5zv33HPtwgsvdCNxP/zwg3sPAAAAAJy8f/75x2WaVXGquCKQ7te876JFi7q+96xZs1I8X4G45nRXrlzZJdBGjRqVajVvYMAt3vfenG3NH586daoradetbNmyLpZRIi4UVcju3bs3WVyDzC9DM90aRdIIkUrL9QseTAFuUlKSPwhesGCBW3hAGfAuXbq4ko5TMWnSJHvooYdcZllfa8EE/SH17t3bZd31h6egXCNR3kiSstGPPPKIzZgxwxISEqxbt24ua63RsEjoD1PlIzfeeGOq5SiRjsRpREw3z/79+93/ORN8lpjoi/CdQGaj9gv8H7GJdox9tGF8oB3jA+0Y+9K7DcMtYqZ4IdRjuk/JLcUXTzzxRIptlLRT318Bt5Jzig0U5AZmlJVl/uuvv+zHH3+0oUOH2sMPP+xigVD0Oj6fL9nreF97xxhctt6gQQOXRX/00Uddwi/Y888/77LlKjk/0SJu0eK9bka9fmYS6XuQoUG3fqH0i1i1atWw28ybN89WrlxpmzZtciM/8tJLL7lsuBYV0C/mybriiiusT58+7mstaDBlyhS3P29RAgXdjRo1cln1kiVL+t9YjUZpHoX069cv1RGuQF999ZW98MILtnz58lMeifOMGzfOZc2DDaubZHnyHI/odZB5ja6flNGHgHRAO8Y+2jA+0I7xgXaMfenVhloHKRRViQaXhSvIVVJN/Xr13dUvT42ScDfddJNLzIWKVdQ3V8ygUnBVqCYmJqbYRsH5hg0bkh2nV62rOCjc8SvTrp8h+PGdO3e62EjxQbjnnk7Bc+WzokOHDmX+oFsB94msXbvWBdtewC3Vq1d3mV89dipBt8rHg0s9NO8i+D79gntBt5b79wJuryREj5+I/ug0WqZVDs8888wTbu+NxOk90mBAOBphUyl+YKZb79WYZQl2LEfKP37EBo0A64Q0fEmCHU5ivk6soh1jH20YH2jH+EA7xr70bsNVI1uHvL9evXouuRbYr1YSS/3xr7/+OsXCZKF4Uzu1r3ALlv3xxx8um63ppqHmfqsq9u2337b69ev7VyNXploB+80332w5c+YMud8nn3zSBfqBP0NgxayqdLNnz7gwTu+nAu5LL7007Jz3rGL//68yztRBt+ZCqFwjvRdL0y94cEAfKvUf+EvilY2Euk9/TKGe420TyeCBLjugBdR0DUGPt1/90egyAV4w7wXc//3vf+3zzz8Pm+UW/bGG+oPVB9kxFuCKeWpHFlKLfbRj7KMN4wPtGB9ox9iXXm3o9csPHDjgMseerVu3uumhRYoUcQkyBdyaI/3BBx+4OEHBsuhxrSC+aNEiV0HbpEkTK1y4sOu3K7BV31zztvU6mkqq/5WgU99b6z5pG015VVJO3n33XZcQ82IbBc1KFiprPmHCBDePW5cY01RZTZ0VXXrsnHPOcVW8qnJVUP7FF1+4lc8D4w7FDar27dmzp+XOndsyAx1fVg+6c0T482do0K1fdM1J0DX1BgwYkGJetxYJ0IJl+sPRzct2a+l9PaZf4lA0ehW4uJkWL1u1apW7/l5G0WiVyuQD6fJgGnF7/PHH/T+bF3CrFEV/cCovAQAAABCaAuDAfr5XBaoAVeXfWizZWyE8kPraWrRMQbOu362AWNf8VqCu7LX66l5yS0kyzd/+6aefXMJNizBrmmngpca0FpMSaR6VnCvQ12rlmrKqWEfHFDg1VauR33XXXe6yyToOVeLqEmPBcYvuU/ZdATxiT4ZfMkwBt5bE17Xy9AuoXzTNuVDJgsqqFWBrREkrfmskSI9pxXOVeahUI5QWLVq4PzZd91sjVI899pgL0jOSVjnUJQACeYujefcr4L7mmmv8I3EaLPBWNvRG4iK1aGhLAvYYpt8FzdVR2VRWH0GMZbRj7KMN4wPtGB9ox9gXrTZU4Jxa5emJqlIVa6i6NDXKaOuWGq0oHryquILz1OZf33PPPe52IpdddllE1bXInDL8kmFarU9BpkZzNMqjAFTzA7RIgIJulW9ruX6VejRt2tRatWrlnvPGG2+E3adGgDSKpNUHFZxr+4zMckdKI1waifv111/dSJxG2bzbN998k9GHBwAAAABIo2w+hkzibjK/rve9e/duMt1xMBKsuUBkumMX7Rj7aMP4QDvGB9ox9tGG8YF2TBl7aWpBautwZXimGwAAAACAeEXQnY60CmG428KFC9PzpQAAAAAAMSDDF1KLJ8uXLw/7WJkyZU7rsQAAAAAAMh5BdzqqVKlSeu4OAAAAABDjKC8HAAAAACBKCLoBAAAAAIgSgm4AAAAAAKKEoBsAAAAAgCgh6AYAAAAAIEoIugEAAAAAiBKCbgAAAAAAooSgGwAAAACAKCHoBgAAAAAgSgi6AQAAAACIEoJuAAAAAACihKAbAAAAAIAoIegGAAAAACBKCLoBAAAAAIgSgm4AAAAAAKKEoBsAAAAAgCgh6AYAAAAAIEoIugEAAABkGl9++aW1a9fOSpcubdmyZbP33nvP/9jRo0dtyJAhVqtWLcubN6/bpkePHvb7778n28fYsWPtoosusjx58lihQoVCvs6AAQOsXr16ljNnTqtTp05Ex/bPP/9Y3759rWjRopYvXz67+uqrbceOHcm2Wbx4sbVs2dK9buHCha1169a2YsUK/+Pr16+35s2bW4kSJSxXrlxWoUIFGzZsmPvZEJ/iIugeOXJkxH8oAAAAADKvgwcP2nnnnWdPP/10iscOHTpkS5cuteHDh7v/33nnHRfEtm/fPtl2R44csU6dOtltt92W6mv17t3bunTpEvGxDRo0yN5//3176623bMGCBS7Yv+qqq/yPHzhwwNq0aWNnn322LVq0yL766ivLnz+/C7y9oDpHjhxuoODTTz91xz558mR77rnn7IEHHoj4OBBbslsmsH37djca9eGHH9pvv/1mxYsXd0H0wIED3ShRPHr99dftuuuusw4dOiQbvdMAgh7bunWrnXHGGW70Te/NBRdckKHHCwAAAJwOl19+ubuFUrBgQZs7d26y+5566ilr2LChbdmyxQW78uCDD7r/p0+fHvZ1nnjiCff/rl277Mcffzzhce3bt89eeOEFe/XVV61FixbuvmnTplm1atXsu+++swsvvNDWrVtne/bssVGjRlnZsmXdNgqma9eubf/973+tUqVKLrOtm6dcuXI2f/58W7hwYQTvDmJRhgfdmzdvtsaNG7vyi4kTJ7pSEY0CzZkzx5Vu6Bc33uhnHjx4sF188cUpHqtSpYr74NAf4t9//22TJk2yyy67zDZu3GjFihWL+DUuGDfPjmXPm85HjtMlZ6LPJjQ0qzlyjh0+no03PkbRjrGPNowPtGN8oB3jvw03j297UvtVMKwy9HBl5Onlhx9+cHFKq1at/PdVrVrVBfrffvutC7rPPfdcV3qu4Py+++6z48ePu68VmJcvXz7kftXP/+STT5JlzBFfMry8/Pbbb3d/JN9//72bE6Ggs0aNGnbnnXe6ESPRqJUywpo3UaBAAevcuXOKuROBLrnkEpclD9SxY0fr1auX/3v90o8ZM8aVdmi/GmGaPXu2G+nyXksjUkuWLPE/RyNl+mPWgID+cLSNyke2bdsW8c+rP7yuXbu60bfAES7P9ddf7/6Q9Zjeh8cee8z2798f0egbAAAAkJVojrXmeKuCVHFCtKtzVYkaHNxrbrYeE5WSK2v98ssvW+7cuV28oID6448/tuzZk+c7Nedcc7orV67sknHKjiM+ZWimW6UX+iVU+bQWQgimX+ikpCR/EKx5E8eOHXMZcM290C/0qVAW+aGHHnJzQvR19+7d3S+/5nYo664/YAXlq1evdgMD3jySRx55xGbMmGEJCQnWrVs3l7V+5ZVXInpN/TGpfP7GG288YQmJ5qI8++yzroxG81pCOXz4sLt5FKBLzgSfJSb60vBuIDNR+wX+j9hEO8Y+2jA+0I7xgXaM/zYMt5CY+v+hHtN9SsYpXlCpeKhtlPBKbd/eNj6f74QLmek4Qu1Lz9U+dL8qVRVLNGrUyMULul9JtCuuuMJlwxWIexSY//XXXy65NnToUHv44YddXJHZeT8/C79ZxO9BhgbdKqXQL6nKMsKZN2+erVy50jZt2uSfF/HSSy+5LLBWBmzQoMFJv75++fv06eO+HjFihE2ZMsXtT4suiIJu/cEoq16yZEn/Gzt16lSrWLGi+75fv34Rj0ppIQWVlyxfvjzV7T744AO79tprXYBfqlQpN2/lzDPPDLntuHHj/HNWAg2rm2R58vzfhwxi1+j6SRl9CEgHtGPsow3jA+0YH2jH+G3Djz76KGxZtxYfCw6AlSRTP119cfWzQ9Gq4eq/h9u3bNiwwSWuUttGNCdbSbE333zTJQQD7//zzz/d89Vv/+mnn1wQvXPnTn8lqxJ1Os5Q00uVoVf8obWdVJ6emJhosSB4bn1WdOjQocwfdCvgPpG1a9e6YNsLuKV69eouC67HTiXoVvl4YFmIaE558H36g/GCbl12wAu4RUGx9weVGo1iKZOulQnDBdAeXUJAgfnu3bvd9hrB0+qHypAH0x+0SvE9+sDQezVmWYIdyxEbf7BISSPAOiENX5Jgh5OY0x2raMfYRxvGB9oxPtCO8d+Gq0a2Dvk8LSysZJlHQbTKydW//vrrr1Nd90j9aQXsgc8PpumkiitS20a0DtXo0aNdmbi3rVYf1/TUG264wS18rEShstlt27b1V8pqgEDPUewR7jX++OMPl7HX1NXgAYbMRu+/Au5LL7000x9rtHlVxpk66Nb8Bf0ypvdiaSr7Dg7oQ6X+A39JvD+KUPfpDyDUc7xtIhk8+Pnnn90CarrmoMfbr/4I9QfrBfMqtdfKhrppQQa9T8qQK8AOpusK6hZMH2THWIAr5qkdWUgt9tGOsY82jA+0Y3ygHeO3Db1+ti67pYpYj67qo+meRYoUcQkvBdy6XJiqQ9XvV8Aqelxzrr01oTSVVVdGUom3ni/qX3tZar2GXktBs+aGe9sowaf96Lm6kpKqbLU6uhJnmiJ6zz33uGSYMtT9+/d3lbFNmjRxz1XQfO+997r1pfSY+vvjx493/X0vSNW0VP2vZJ/68Qr6Nd1V02eV4IsV+hmyetCdI8KfP0ODbv1h6Jp1ugafLk4fPK977969bsEy/aHp5mW716xZ4x7TH0QoGu0KXNxMf2irVq1yGeSMohJ6lckHGjZsmBuhe/zxx5Nl8oPpjzVw3nYkFg1t6VZORGzyyqA04pvVP8xiGe0Y+2jD+EA7xgfaMeu0oYLQwH67V9XZs2dPV4KtxY9FlxgO9MUXX7gFlb2poy+++KL/sbp166bY5qabbnJrRgVvo2y1Fl3W8SoxFlhCrHWgFOhrAWj1zxXLPPPMM8n6/LqOt6Z/KhjXttqv1rHSgIEoANf8bZWhK3mnBZ01ZVXXAEd8yvBLhingVqmGRo80z0FlFyrBUMmC5lgrwNYokFb81oXj9ZhWPG/WrJnVr18/5D513Tz9ceq638oea/ECBekZSSsT1qxZM9l93sqH3v0HDx50i8q1b9/e/VGqHEbvj0bZvHnmAAAAQDxTUJxaJWkkVaa66lBq1+iWEy3KrMA7+LXUp1f/XLdwlNHWLRxltHVD1pHhlwzTpbFUHqLRrLvuussFoPol1QJqCrpVvj1r1iwrXLiwNW3a1H85rTfeeCPsPrVioEbCtPK4gnNtn5FZ7khp0QSV2nuXTlMpuspltMq5Fo4DAAAAAMSWbL5IhooQU5P5dYkxZckpL4/98isttkF5eeyiHWMfbRgfaMf4QDvGPtowPtCOKWOvffv2pXqd+AzPdAMAAAAAEK8IutORVkIMd1OJOAAAAAAga8nwhdTiia6tHU6ZMmVO67EAAAAAADIeQXc60nX/AAAAAADwUF4OAAAAAECUEHQDAAAAABAlBN0AAAAAAEQJQTcAAAAAAFFC0A0AAAAAQJQQdAMAAAAAECUE3QAAAAAARAlBNwAAAAAAUULQDQAAAABAlBB0AwAAAAAQJQTdAAAAAABECUE3AAAAAABRQtANAAAAAECUEHQDAAAAABAlBN0AAAAAAEQJQTcAAAAAAFFC0A0AAAAAQJTERdA9cuRIq1OnTkYfBgAAAIAwFi5caGPGjLFy5cpZtmzZ7L333kv2+DvvvGOXXXaZFS1a1D2+fPnyFPv4+eef7corr7RixYpZgQIFrHPnzrZjx46Qr3f48GEXI4TbV6BLLrnEbRd4u/XWW5NtM2DAAKtXr57lzJkzbOwxZ84cu/DCCy1//vzuGK+++mrbvHkzvxNZXKYIurdv3279+/e3ChUquF/ismXLWrt27WzevHkWr15//XX3x9yxY8dk9/fq1SvFH3ybNm0y7DgBAACA9HDw4EE755xz7PHHHw/7eJMmTezhhx8O+7iCcvWPP//8c/v666/tyJEjLm5ISkpKsf0999xjpUuXjvj4br75Ztu2bZv/NmHChBTb9O7d27p06RLy+Zs2bbIOHTpYixYtXJCvAHz37t121VVXRXwMiE/ZM/oANPLTuHFjK1SokE2cONFq1aplR48edb+kffv2tXXr1lm80c88ePBgu/jii0M+riB72rRp/u81EJFWF4ybZ8ey5z2l40TGyZnoswkNzWqOnGOHj2ejKWIU7Rj7aMP4QDvGB9oxdm0e39bfx1VwfMUVV4Tcrnv37v+3fZjMsIJsPbZs2TKX5ZYXX3zRChcu7ILwVq1a+bf9+OOP7dNPP7WZM2e6ryORJ08eK1myZNjHn3jiCff/rl277Mcff0zx+A8//GDHjx932fyEhP/LbarPr0Bc8U2OHDkiOg7EnwzPdN9+++1utOr777935RdVqlSxGjVq2J133mnfffed22bLli3ulzVfvnwnLCPxykMGDhyY7D5llJVF9pQvX979QfTo0cPtV2Uus2fPdn9E3mvVrl3blixZ4n/O9OnT3eCABgSqVavmttGHh0bCIqU/xK5du9qDDz7oMvuhKMjWH7x30wcJAAAAkJWpXFxxQ2BCKleuXC7A/eqrr/z3KU5Q1nrGjBkukI7UK6+8YmeeeabVrFnThg4daocOHUrT8an0XMei5Jn6/Pv27XPHoMEAAu6sLUOD7j179tgnn3ziMtp586bMyirA1WiYgmBtu2DBAps7d6798ssvYcs60mLSpEkuy67RsrZt27rRNQXh3bp1s6VLl1rFihXd9z6fz/8c/fE98sgj7g/oyy+/dAMCGsGK1KhRo6x48eJ24403ht1m/vz5bptzzz3XbrvtNvvjjz9O+WcFAAAAYpnmSitmGDJkiOuTq9xc/XAFuF4STP12Jdo0H7t+/foR7/v666+3l19+2b744gsXcKuvr5ggLVQ6r+z6fffd5wYGFMv8+uuv9uabb6b5Z0V8ydDy8o0bN7o/jKpVq4bdRvO6V65c6eZIaK63vPTSSy4bvnjxYmvQoMFJv75KW/r06eO+HjFihE2ZMsXtr1OnTu4+/UE3atTIjZZ5pSYqDZk6daoLyKVfv34ukI6ERuBeeOGFVBdyUOZc8z70R6uFIvRHe/nll9u3335riYmJIUf8dPPs37/f/Z8zwWeJif8bLEBsUfsF/o/YRDvGPtowPtCO8YF2jF3qP4f6/9ixY/6vw20f+LiC2Ndee82tBaVSb2WVlYirW7euf/unnnrK9YcVjAc+P3hfwW644Qb/14pNtAha69at3VRXr9/vUZCvGCZ4f1qn6qabbnLBuo7rwIEDrrpV1bwqcVeWPh4Et2NWdjTC9yBDg+7ADHI4a9eudcG2F3BL9erV3R+dHjuVoFvl454SJUq4/zWnPPi+nTt3+oNulagE/uGVKlXKPX4if/31l8ukP/fcc65sJZxrr73W/7WORceo11P2u2XLlim2HzdunPtjDjasbpLlyXP8hMeFzG10/ZSLgiD20I6xjzaMD7RjfKAdY89HH32U7HtVrnpzoEOVXXvTSJWw+v3331M8/thjj7nAWkG3pnsqs60+s15HixVremhwFa2y5M2aNbM77rgjomP+559/3P/anxfUezZs2OBeP/jnUnm6NG3a1J95V9WsAvHJkye7KtZ44rVjVnYowikIGRp0V65c2Y34pPdiafoDDA7oQ41CBP6ReyNPoe4LXA0x+INB20QyeKCstRZ+0OqKHm+/2bNnt/Xr16cYRRPN+1aQrqqAUEG3yl80/92jDwANUIxZlmDHcqTMjCN2RvPVqRi+JMEOJ8XHqGhWRDvGPtowPtCO8YF2jF2rRrb298cVqF166aX+OdChFlXzFlLTSuYnuiywysE1d1qZbQW1mo/tVX6Kgl9NI3311VetYcOGdtZZZ0V0zN988437X333wESdKKhX8i/42JUk07EH3u8F3wr6VUEbDwLbMavPVd8f8LuWaYPuIkWKuLKNp59+2l33LnhEau/evW7Bsq1bt7qbl+1es2aNe0wZ71BUDhK4uJlKQFatWmXNmze3jKIyFZXJBxo2bJjLgOuyCYGZ/ECaB6I53cqoh6L5IqFWN1egdoxVr2Oe2pHVy2Mf7Rj7aMP4QDvGB9ox9niBmcqttTbT6tWr3ffq3+trxQRnn322W8NJ6yV52W1tq+d6iwuLFilTfKD+vqZfKnM9aNAgF2xLcBLLW5BYAbmmb8pvv/3mklmasqpAXMkxBeUKlnWNcK1Mrn0qY62BAY+SYPoZtPCyMuHez6GY5IwzznABuvr1qkS97rrrXD9fU0W1YLOqc+MtQNXPE28/U1pF/PP7MtjPP//sK1mypK969eq+t99+2/fTTz/51qxZ43v88cd9VatW9SUlJfnq1Knju/jii30//PCDb9GiRb569er5mjVr5t/HAw884DvvvPP830+dOtWXJ08e3wcffOBbu3at7+abb/YVKFDA17NnT/825cqV802aNCnZsejtePfdd/3fb9q0yd23bNky9/20adN8BQsWTPYcbX+yb6OOp0OHDv7v//rrL9/gwYN93377rXvtzz77zHf++ef7Kleu7Pvnn38i2ue+ffvc8ezevfukjgmZw5EjR3zvvfee+x+xi3aMfbRhfKAd4wPtGPvmzp3r+qnBN6+Prr52qMfV1/cMGTLEV6JECV+OHDlcH/nRRx918UI4wf35wPu++OIL9/2WLVt8TZs29RUpUsSXM2dOX6VKlXx3332361cHUvwR6vi0P89rr73mq1u3ri9v3ry+YsWK+dq3b+/ikXjC32LK2Cv4dyVYhl+nW+XTWil87Nixdtddd7kMtUauNKqkhc1Uvj1r1iy3YIJGm1Q6rsXGnnzyybD71EXrV6xY4eZQqHRbI1UZmeWOlBZK08iarjeoTH7p0qXtsssus9GjR5/UtboBAACAzEJzqt977z2XUQ6VIdTc7MBL/IYyfvx4d4uULhMcPBU0+D5VnOoqSSei8vET0fpMgWs0AZJNkTdvRXzNKyhYsKDt3r3blccgdufKaHGOcCclxAbaMfbRhvGBdowPtGPsow3jA+2YMvbSugIFChSwTHmdbgAAAAAA4hlBdzrSJQvC3RYuXJieLwUAAAAAiAEZPqc7nixfvjzsY2XKlDmtxwIAAAAAyHgE3emoUqVK6bk7AAAAAECMo7wcAAAAAIAoIegGAAAAACBKCLoBAAAAAIgSgm4AAAAAAKKEoBsAAAAAgCgh6AYAAAAAIEoIugEAAAAAiBKCbgAAAAAAooSgGwAAAACAKCHoBgAAAAAgSgi6AQAAAACIEoJuAAAAAACihKAbAAAAAIAoIegGAAAAACBKCLoBAAAAAIgSgm4AAAAAAKKEoBsAAAAAgCgh6AYAAADSwZdffmnt2rWz0qVLW7Zs2ey9995L9rjP57MRI0ZYqVKlLHfu3NaqVSvbsGFDiv18+OGHdsEFF7htChcubB07dvQ/Nn36dLfvULedO3eGPK758+eHfc7ixYvdNps3bw75+HfffeffzzvvvGP169e3QoUKWd68ea1OnTo2Y8YMfneAE8gSQffIkSPdhwIAAAAQLQcPHrTzzjvPnn766ZCPT5gwwZ544gmbOnWqLVq0yAWurVu3tn/++ce/zcyZM6179+52ww032IoVK+zrr7+266+/3v94ly5dbNu2bclu2kezZs2sePHiIV/3oosuSvGcm266yc455xwXRAf67LPPkm1Xr149/2NFihSx+++/37799lv78ccf3THqNmfOnHR494D4ld1iwPbt223s2LFu1O+3335zHygKogcOHGgtW7a0eLJ37173YaaRxD179li5cuVs8uTJdsUVV2T0oQEAACAVl19+ubuFoiy3+nTDhg2zDh06uPteeuklK1GihMuIX3vttXbs2DG74447bOLEiXbjjTf6n1u9enX/18p+6+bZtWuXff755/bCCy+EPa4zzjjDSpYs6f/+6NGjNmvWLOvfv7/LZgcqWrRosm0DXXLJJcm+17G++OKL9tVXX7nAH0CMBt0qdWncuLErY9EHUK1atdwHhUbU+vbta+vWrbN4ceTIEbv00kvdoMLbb79tZcqUsf/+97/uZ0+rC8bNs2PZ80blOBF9ORN9NqGhWc2Rc+zw8eQnQ8QO2jH20YbxgXaMD5m5HTePb3vCbTZt2uQSSSop9xQsWNCVkStzrKB76dKlLsGUkJBgdevWddsr0aQ+cM2aNUPuV4F7njx57Jprron4eGfPnm1//PGHy1IHa9++vcu8V6lSxe655x73fbhBBAX769evt4cffjji1wayokxfXn777be7Ebjvv//err76avcBUKNGDbvzzjv9c0y2bNniRgzz5ctnBQoUsM6dO9uOHTvC7lOjdMqSB9JcmV69evm/L1++vI0ZM8Z69Ojh9quMsz6gNJrovVbt2rVtyZIlyebYKEDWgEC1atXcNm3atHGlOZH4z3/+47LbGu3UQIOOQaVCKlMCAABA7FIALcpsB9L33mO//PKLf2qkMuIffPCBm9Otvqv6iKEow63y88Ds94noOcpMn3XWWf771G999NFH7a233nLVpU2aNHH9Y/V/A+3bt89tq+x527Zt7cknn3RJIwAxmunWh8snn3ziSss15yWYAtykpCR/ELxgwQJXlqMMuOa7aNGIUzFp0iR76KGHbPjw4e5rza/RnJjevXu7EcchQ4a4oHz16tX+0pxDhw7ZI4884haV0Chlt27dbPDgwfbKK6+c8PX0odaoUSN3/Cr5KVasmPsQ1eskJiaGfM7hw4fdzbN//373f84EnyUm+k7p50fGUfsF/o/YRDvGPtowPtCO8SEzt6OqMENRv9R7TF972wZur76s+pG6T1WPcu+99/ozzM8++6ybe/3666/bzTffnGz/SkCtXbvWpk2bFvYYgv36668uQfTqq68me46y7io39yjDrm01Dz2wZD5Xrlxu8bUDBw7YF198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AAAAiBKCbgAAAAAAooSgGwAAAACAKCHoBgAAAAAgSgi6AQAAAACIEoJuAAAAAACihKAbAAAAAIAoIegGAAAAACBKCLoBAAAAAIgSgm4AAAAAAKKEoBsAAAAAgCgh6AYAAAAAIEoIugEAAAAAiBKCbgAAAAAAooSgGwAAAACAKIn5oHvkyJFWp06djD4MAABi3m+//WbdunWzokWLWu7cua1WrVq2ZMkS/+M7duywXr16WenSpS1PnjzWpk0b27BhQ7J9/Pzzz3bllVdasWLFrECBAta5c2f3vNSUL1/esmXLluLWt29f/zbPPvusXXLJJW6femzv3r0h9/Xhhx/aBRdc4I6/cOHC1rFjx1N+XwAAiOmge/v27da/f3+rUKGC5cyZ08qWLWvt2rWzefPmWTx57rnn7OKLL3YdAN1atWpl33//fYrt1q5da+3bt7eCBQta3rx5rUGDBrZly5YMOWYAQNbx559/WuPGjS1Hjhz28ccf25o1a+zRRx915yzx+XwugP3ll19s1qxZtmzZMitXrpw7nx08eNBto/8vu+wyFxR//vnn9vXXX9uRI0fceT0pKSnsay9evNi2bdvmv82dO9fd36lTJ/82hw4dckH+fffdF3Y/M2fOtO7du9sNN9xgK1ascK9//fXXp+O7BABA2mW3DLR582Z3gi9UqJBNnDjRjagfPXrU5syZ40a3161bZ/Fi/vz5dt1119lFF11kuXLlsocffth1TFavXm1lypTxZweaNGliN954oz344INuNF+Pa/u0umDcPDuWPW8UfhKcDjkTfTahoVnNkXPs8PFsvOkxinaMfVmlDTePb+vOSxr4njZtmv/+c845x/+1MtrfffedrVq1ymrUqOHumzJlipUsWdJee+01u+mmm1yQq3O7AnKdw+TFF190gbuCcAXooSgrHmj8+PFWsWJFa9asmf++gQMH+s+noRw7dszuuOMO15/QedRTvXp117cAACBLZrpvv/12NxqujO/VV19tVapUcSfyO++8053YRVneDh06WL58+SIqU1PpmXdi9mhkXuVwgWVsY8aMsR49erj9aqR+9uzZtmvXLv9r1a5dO1lJ3fTp093ggAYEqlWr5rbRiLtG5CPxyiuvuJ9XpfBVq1a1559/3o36B2b077//frviiitswoQJVrduXdfhUNa7ePHiaXpfAQBIK50H69ev77LLOu/oPKQqLc/hw4fd/4EDwQkJCa5K7auvvvJvo/O67vNoe23nbXMiyoy//PLL1rt3b7evSC1dutSVx+u1dOylSpWyyy+/3A0SAACQJYPuPXv22CeffOIy2iqjDqYAV0GpgmBtu2DBAlduprK2Ll26nPLrT5o0yWXZNRrftm1bV46mIFxz2XTiVsCr71VOF1ja9sgjj9iMGTPsyy+/dAMCgwcPPqnX17408l6kSBH3vX5WzUPTwEPr1q1dh0dz0t57771T/lkBADgRnV+Vua5cubIbYL7ttttswIABLlMtGjA+++yzbejQoa4UXcGxsuO//vqrfwD6wgsvdOf0IUOGuPOcys11njx+/HjEg9Q672m+duBgeaTH7631MmzYMPvggw9chl2D8epHAACQ5crLN27c6AJancTDURZ45cqVtmnTJlfyJi+99JLLhmv+l+Y7nyxllPv06eO+HjFihOtoaH/e/DF1GBo1auSy6iqdEwXJU6dOdQG59OvXz0aNGnVSr6/9ayEar9Ru586dduDAAVdSpyy8OjIalLjqqqvsiy++SFZiF0hZBS/7IPv373f/50zwWWLi/wYMEFvUfoH/IzbRjrEvq7Shzm8a/K1Xr56b3iQ1a9a0H3/80Z0fvXnRb775pt1yyy1uwDgxMdFatmzpqr50Ptc+NGCuUnOt1fLEE0+4rLMGypV59l7nRFQJpsFnlZyH2l5l5N6+Ah/XIIDce++9rkrMW3xNJfI6bg0YUGYe27z2ox1jF20YH2jH/4n08yjDgu7ADHI4WlRMwbYXcHtzs3RS12OnEnSrfNxTokQJ97/mlAffp2DYC7q1UqsXcItK1/R4Wimwfv311928NK9Mz1tgRpn9QYMGua9Viv7NN9+4QD9c0D1u3Dh/BynQsLpJlifP8TQfGzKX0fXDLzyE2EE7xr54b8OPPvrInVs1dUpfBwa4mssdeJ8Gm5XB1mNa9PPuu++2SpUqJdvmsccec4PACrq1T2Wtdd4N3CYUnVM14K6B6XDbajBePv30U7dvj7foqLLkgc9VtlvVaapk8xZoQ2yjHWMfbRgfaEdzVV2ZOuhW+ZrmaqX3Ymk6wQcH9KFGILQ6q8ebMxbqvsDVVgMf97aJZPAgkMrTFXR/9tlnyQL/M88807Jnz+4GFQJp/nhq8+BU5qc58B51cjRIMWZZgh3LkZimY0PmoayaOvnDlyTY4aT4Xbwp3tGOsS+rtOGqka2tRYsWrlRclWAeLX6maU+B9wVSQK5FQCdPnmyXXnppyG1UrbVv3z5XZn7uueemehwK6DW9avjw4e6cGIo3JU2LkWqgwKOFSFUppsudecer879e2xu41jEGn8sRO9Se6uTTjrGLNowPtKOlqDLOtEG3StNUPvb000+7OWPB87o1Uq2Ac+vWre7mZbt1CRM9FhycelSOFjhvTPPItIhK8+bNLaNpgbSxY8e6uXJarCbQGWec4TL369evT3b/Tz/95BZ6C0eL1QQuWONR5/BYHK+0m1WoHeN5xeSsgnaMffHehgpE77rrLneFDa3+rUVLtcipSr1Vou0Fqm+99ZY7z6pUWxlnrRauxUoDg3Ktfq7zt7b79ttv3Taq4FK5ukdl6bqWt6ZpeTTIrSlkPXv2dNfYDnWJUd20Orpo0D5//vzuWNSnULB96623usBdC6bq3KmfRfTz6Fj0cxB0xz7aMfbRhvGBdrSIzykZeskwBdxazKxhw4buJKnMr8rVNIqpOWQKsFXy3bVrVzeKrse0ArhGrIODVo9G6pX51aJkKgVXiZuC9IymOdqaO/7qq6+6zoA6DqLSOK88TiV6mvvWtGlTN0igOd3vv/9+2MujpGbR0JauA4LYHUFUeaSyT3QQYxftGPuyUhtq4Pfdd991FVQ6J2sutM69Ogd7NKitc6zWO9EUKy04qqx0IA0eax9avEznO12Zw5s25VF2fPfu3cnuUwWYSsS1ankommoVOJ1K50ovyPcWXVOQrQy5Fkf9+++/3YKkytZ71xoHACAjZGjQXaFCBbdSuLK/GmHXyVwj41rIRUG3yrdnzZrlFmTRyVWl41qw5cknnwy7T52sV6xY4ToCOvHqRJ8Zstz6ebTIyzXXXJPs/gceeMCttCoa9VenQvO0lf1XGd7MmTNdyRwAANH2r3/9y93C0blJt9RoCpVuqfGy1YFULp7alC2dK73zZTgaGNE0Lt0CsfAWACAjZfOldVIyMv28Ai1sowwCme7Yz66pZDPes2vxjHaMfbRhfKAd4wPtGPtow/hAO6aMvbR+SIECBSzTXacbAAAAAIB4R9CdTry52aFuCxcuTK+XAQAAAADEkAyd0x1Pli9fHvaxMmXKnNZjAQAAAABkDgTd6aRSpUrptSsAAAAAQJygvBwAAAAAgCgh6AYAAAAAIEoIugEAAAAAiBKCbgAAAAAAooSgGwAAAACAKCHoBgAAAAAgSgi6AQAAAACIEoJuAAAAAACihKAbAAAAAIAoIegGAAAAACBKCLoBAAAAAIgSgm4AAAAAAKKEoBsAAAAAgCgh6AYAAAAAIEoIugEAAAAAiBKCbgAAAAAAooSgGwAAAACAKCHoBgAgyMiRIy1btmx2xhlnWMeOHd3/VatW9T/+888/25VXXmnFihWzAgUKWOfOnW3Hjh3J9jF27Fi76KKLLE+ePFaoUKGIX1evkzdvXitcuLC1atXKFi1alGyb8uXLu2MLvI0fPz7k/jZu3Gj58+eP+PUBAED6i/mgWx2UOnXqZPRhAADiTI0aNWzLli02bdo09/9XX33l7j948KBddtllLtj9/PPP7euvv7YjR45Yu3btLCkpyf983depUye77bbbIn7NKlWq2FNPPWUrV650r6cAW6+1a9euZNuNGjXKtm3b5r/1798/xb6OHj1q1113nV188cWn9D4AAIAYD7q3b9/uOgsVKlSwnDlzWtmyZV3HZd68eRZP3nnnHatfv77LNiiDoYGCGTNmpNhu7dq11r59eytYsKDbrkGDBq6zBwA4vbJnz24lS5Z0GWf9f+aZZ7r7FWRv3rzZpk+fbrVq1XK3F1980ZYsWeKCcM+DDz5ogwYNco9H6vrrr3fZbZ0TFfQ/9thjtn//fvvxxx+TbafstY7Ju+l8EWzYsGEua64sPAAAyDjZM/C1XaelcePGLhCdOHGi65hoZH7OnDnWt29fW7duncWLIkWK2P333+86QCpT/OCDD+yGG26w4sWLW+vWrf3lik2aNLEbb7zRddZUsrh69WrLlStXml/vgnHz7Fj2lJ0wxIaciT6b0NCs5sg5dvh4tow+HJwk2jH2bB7f1v/1hg0brFy5ci573bx5c3v44Yft7LPPtsOHD7sstwaKPfqcTkhIcNlpBc3pQZnyZ5991g3CnnfeeckeUzn56NGj3fEoUFdwr0ECj4L/t956y5YvX+4GfQEAQBbNdN9+++2u4/L999/b1Vdf7crqNLJ/55132nfffee2UZa3Q4cOli9fvrDz5gJdcsklNnDgwGT3aT5er169/N+rXG/MmDHWo0cPt191qmbPnu3K97zXql27tstaeJTR0OCABgSqVavmtmnTpo0r64uEjkvz//TcihUr2h133OFewytXFAXlV1xxhU2YMMHq1q3rtlPWW4E5AOD0ueCCC9zn/vvvv2+33nqrGyRWmfZff/1lF154ocssDxkyxA4dOuTKzQcPHmzHjx+P+JyQGg3K6hyjQH7SpEk2d+5cf5ZdBgwYYK+//rp98cUX1qdPH3vooYfsnnvu8T/+xx9/uHOejl/nTQAAkEUz3Xv27LFPPvnELTQTqixOAa6yC14QvGDBAjt27JjLgHfp0sXmz59/Sq+vjow6KsOHD3dfd+/e3S1407t3b5d1V2dKQbkyzRoYEHWuHnnkEVcWroxGt27dXEfrlVdeSdNr+3w+l4VYv369y5yIftYPP/zQdZyU+V62bJmdc845NnToUDdoEI4yLrp5VIYoORN8lpjoO8l3BxlN7Rf4P2IT7Rh7VG0lXrZa3//66692yy23uEHT1157zVUp6X9NjXriiSfc+UDnJQ2WBu7Do2A81P3hqOJp8eLFLnh+4YUX3GCzBmi9AdjA+ds6psTERDeIrXneyr6rWkrH06hRI/eaaX39eOT97Fn5PYgHtGPsow3jA+34P5GeVzIs6NaKqgo+A1eDDaZ53VpMZtOmTW6ut7z00ksuG64OieY7nyxllJUhkBEjRtiUKVPc/rTojSjoVodFWXXNl/Pe1KlTp7oMtPTr1891ciK1b98+K1OmjAuS1Ul65pln7NJLL3WP7dy50w4cOOBKBpWFVzCuQYmrrrrKZTOaNWsWcp/jxo1zpejBhtVNsjx5/q+jhdg1uv7/FmVC7KIdY8dHH30U8n6dcxT0fvrpp1aiRAl3nzffWkG3BoeVXVYFU/A+VqxY4c4f4fadGg26qsLq3nvvtWuuuSbkNv/8848blNb5UecYZcaVodfxeTSwq8y5gvP0Kn+PRXpvEPtox9hHG8YH2tFcUjZTB90KuE9Ei4op2PYCbqlevbrLguuxUwm61THyeB2owMVuvPsUDHtBty774gXcUqpUKfd4pLTwjebXKbjWgILK6LVYjkrPvRVvldnX3DzRYmvffPONC/TDBd3KhGs/HnUA9X6NWZZgx3IkRnxsyHwZUgVqw5ck2OEk5nTHKtox9qwa+X9rbHgULKtToUFYZZ61DokGbYNpcFQDq6p+Ovfcc5M9tnv3bsuRI0fI50Uid+7cblpUuOe/+uqrLvBXUK5F37799lt/dlsUgKtKSxVjCsq1TVbjtaMGutUWiE20Y+yjDeMD7WgpqowzbdBduXJlV7ad3oulqeMRHNCHSvsHnnS98vFQ9wVe/iX4RK1tIhk8CDy2SpUq+QNqDRwoU62gW/P1tAiOBhUCqXQwcN53MJUSBi7m41GgdowFuGKe2pGF1GIf7Rg7vM95Bc+6kkbp0qXdeerJJ590FUqaVqRtdBkxfT7rOt0KcrVOhwZMa9as6d+X1iTRVKrffvvNBcGariQ6DygzLqr20nlAa35obrimXGktDw3qKlh/+umn3fOvvfZa97p6LV23Wwu7aSBX3999993uuLzy88BBZS/TrvOPV/6elek9JOiOfbRj7KMN4wPtaBGfU7Jn5GremrusDoUWhQme1713717Xodm6dau7ednuNWvWuMeCg1OPOkCBC9moo7Nq1SrXQclsFNB787G1orky95rnHeinn35yC70BAE4fzePWNa6V3VZw26JFC7fAp84xos9qVRopqFYWWgthelVKHk1d0qXEPF7Qq6y4Blu9/ShDLgrqFeDrOQq4ixYt6s4LCxcudNOqRIOsWkRt5MiR7vyhtT/0uoEVTwAAIHPJ0EuGKeBWqV7Dhg3d3GiNzmtemkrANMdaAbZKvrt27WqTJ092j2k+mkqtdc3rUNQxUudDi5KpFFxz2hSkZzRlMnTMOiZ1lDS3Twuy6ef0KFuhxW+aNm3qBgk0p1tlgSezaNyioS1dhw2xyZv/qVJXsjKxi3aMXQpsA9tQpd2Bf4taf0O31Gj1cN1SE1gtpTnXJ7q81/nnn++/ukekNNc88AoeAAAgCwXdms+8dOlSV0531113uQy1sgj16tVzwajKt2fNmuVWalUgqvI4XaZLZX7haPVxldJp5XGVaysDkBmy3Cob1ICBsiean6eSwpdfftkF2R6VF2r+tgJ0Zf81L3DmzJluJVsAAAAAQOzJ5kvLpGTExGT+ggUL+ksTEZvCZdcQW2jH2EcbxgfaMT7QjrGPNowPtGPK2EtTxQoUKGDhJIR9BAAAAAAAnBKC7nSilWjD3bQIDgAAAAAg68nQOd3xRNffDkfXRQUAAAAAZD0E3enEu/42AAAAAAAeyssBAAAAAIgSgm4AAAAAAKKEoBsAAAAAgCgh6AYAAAAAIEoIugEAAAAAiBKCbgAAAAAAooSgGwAAAACAKCHoBgAAAAAgSgi6AQAAAACIEoJuAAAAAACihKAbAAAAAIAoIegGAAAAACCzB9179+5Nr10BAAAAAJB1g+6HH37Y3njjDf/3nTt3tqJFi1qZMmVsxYoV6Xl8AAAAAABkraB76tSpVrZsWff13Llz3e3jjz+2yy+/3O6+++70PkYAAAAAAGJS9pN50vbt2/1B9wcffOAy3ZdddpmVL1/eLrjggvQ+RgAAAAAAsk6mu3DhwrZ161b39SeffGKtWrVyX/t8Pjt+/Hj6HiEAAAAAAFkp6L7qqqvs+uuvt0svvdT++OMPV1Yuy5Yts0qVKtnpNHLkSKtTp85pfU0AQPzR+SRbtmzJbjVr1kxW5dW9e3crWbKk5c2b184//3ybOXNmiv18+OGHruord+7cbpC6Y8eOqb6uBqxHjBhhpUqVcs/RQPaGDRvStF+di9u0aWOlS5e2nDlzumq0fv362f79+0/5fQEAABkQdE+aNMmdzKtXr+7mc+fLl8/dv23bNrv99tvTtC91Yvr3728VKlTwdxTatWtn8+bNs3iyevVqu/rqq10JvjpykydPTrGN91jwrW/fvhlyzACQ1dSoUcOdy7zb/Pnz/Y/16NHD1q9fb7Nnz7aVK1e6AWhNr9KAs0dBuALzG264wS0s+vXXX7tB6tRMmDDBnnjiCbdeyqJFi1xA37p1a/vnn38i3m9CQoJ16NDBHdtPP/1k06dPt88++8xuvfXWdH+PAADAaZjTnSNHDhs8eHCK+wcNGpSm/WzevNkaN25shQoVsokTJ1qtWrXs6NGjNmfOHBdorlu3zuLFoUOH3MBCp06dwr5PixcvTlaev2rVKldNoOek1QXj5tmx7HlP6ZiRcXIm+mxCQ7OaI+fY4ePZaIoYRTvGhs3j2/q/zp49u8tke3RO8nzzzTc2ZcoUa9iwoft+2LBhbhD6hx9+sLp169qxY8fsjjvucOezG2+80f88DVCnluXWIKz2paBZXnrpJStRooS99957du2110a0X2W+b7vtNv/35cqVc4Pgeg4AAIjR63TPmDHDmjRp4krZ/vvf/7r71HGYNWtWxPtQh0CZ3O+//95lgatUqeKyDHfeead99913bpstW7a4joiy6QUKFHBZhR07doTd5yWXXGIDBw5Mdp9K8Hr16pUsozxmzBiXtdB+1TlRdmDXrl3+16pdu7YtWbLE/xxlDTQ4oAGBatWquW1UyqdMSCQaNGjgOj/qQCmjH0qxYsVcZ8+7aZG6ihUrWrNmzSJ6DQDAqVFZt85rGiTt2rWrOwd5LrroIne5zD179lhSUpK9/vrrLhut844sXbrUfvvtN5d1VhCucnFNv9IAajibNm1yFV/e2ihSsGBBV0b+7bffnvR+f//9d3vnnXc4fwAAEKtBt0b6FRjrpL93715/dlZBaaiy6VDUadEibMpoq5QumPalTo2CYG27YMECV8r+yy+/WJcuXexUKTuhLLvKAtu2bevK9hSEd+vWzXVwFOzqe2UhArPVjzzyiBtw+PLLL11nLFTGPz0cOXLEXn75Zevdu7cbmAAARJcCXQ2w6tyk85wC4hYtWtjff//tHn/zzTdd5rto0aJu8LRPnz727rvv+tcy0fnJmxuuzLUGTpWBVlCu81goCrhFme1A+t57LC37ve666yxPnjxWpkwZN1D9/PPPp/v7BAAATkN5+ZNPPmnPPfecyyCPHz/ef3/9+vUjDkI3btzoAtqqVauG3UbzujVvTh0f7xJlKrtTNlyl2Moen6wrrrjCdZhEC9iog6X9eaXcQ4YMsUaNGrmsuldqqM6W5twpIBfNax81apRFg8oKNaARmKEP5fDhw+7m8RbNyZngs8TE/w0YILao/QL/R2yiHWODV0IemG1WRZMWSlNA/dVXX1n79u3t/vvvtz///NMF5Qq8VSGl6qvPP//cTY/SYKnce++9bnt59tln7ZxzznFZ8ZtvvjnFa6t03DuGwFJ2DTprwFX3pWW/mh9+3333uYy9AnRVfumcndV5723ge4zYQzvGPtowPtCO/xPpeeWkgm4FwSpxC6aR/4MHD0a0j8AMcjhr1651wbYXcHtz2JQF12OnEnSrfNzjZRjUaQq+b+fOnf6gW9kDL+AWlfjp8Wh44YUXXCWByhxTM27cOHvwwQdT3D+sbpLlycPl22Ld6PpJGX0ISAe0Y+b20UcfhX2sePHiLuOsAd9nnnnGLXimknKVe9erV89NT1KQq/nUXim6BkwD96ms9BdffOGyz8G8bLYWSlNJu0drmiio1n5OZr+JiYmugkvHpgx+kSJFTvr9iSeqmEPsox1jH20YH2hHc5XQUQu61RFYvny562wE0ui/sgORqFy5shvFT+/F0jTnLTigDzUCocXgPF75dqj7lG0I9Rxvm0gGD9JKc+S16qzm453I0KFDXal/YKZbgxRjliXYsRyJ6X5sOH0ZUgVqw5ck2OEkphfEKtoxNqwa2Trk/QcOHHCX4lJwq6y3aI2NwPPc008/bWeddZarntI6J1ovRFlwfe+df/bt2+fK1L37AukcorJxbec9rs9xVYMps32y+5X8+fO7//V8rWWSlen9UudQi5MGn8sRO2jH2Ecbxgfa8X8ivTTnSQXdCvI0F1uj/eowaCG01157zWVdI50/plF3XRJFHZYBAwakmNetEX11bLZu3epuXrZ7zZo17rFwq8FqMbLAxc0031yLzTRv3txixbRp01x2RXPNT0TVBaEWZlOgdoxVr2Oe2pHVy2Mf7Zi5eUGYpkfpkpUaUNZCZA888IDLGF988cXuet0qNde0Iq3toQBY04A0QKo51tqH7tMlujTtSEGu9uOtHq5FNL3X0bQqnS+vvPJK971KwPW97teg9vDhw12V0zXXXBPxfpUB13QoVYBpoU9dpvLuu+92a5dokBv/a2uC7thHO8Y+2jA+0I4W8TnlpILum266yXLnzu3miymlrmuFqoPw+OOPuw5ApBRwq0Ogy6+oM6GSb81v02i05lgrwFbJt1aQ1QJtekwrnivToPnjoWjUX4MCH374oSsFf+yxx1yQntE0J08/j/e1ShNVLaDOkbcIj5dZV9Dds2dPd+mak7VoaEvXUUPsjiCqE60MHB3E2EU7xpZff/3VLUSm7LYGcJUhXrhwobs2txfYKvuswFxZcH12v/jii8kyzQqG9dmt0m4twKbSbs35Vrbco/0pS+2555573NSsW265xZ2v9LqqHMuVK1fE+9U5WWut6JKUWudDA9W6jriOFwAAZKw0R3UKfF999VWXpVYwrKBbnQ9lZtNK89e0UvjYsWPtrrvuchlqdXQ0T05Bt8q3dQmy/v37W9OmTV3puC7TldqiMFrte8WKFW7lcXVQ1AHJDFluZU0C58ErU6KbBhDmz5/vv19ZE83f088BADh9tChZqIETBcmijLHmXqdGwbn3+R5O8LQknes08Jzawpwn2q/Oc7qOOAAAyHyy+U5iUrIWFNNCZsFzupE55hXoGq+7d+8m0x0HGVJl0Mh0xy7aMfbRhvGBdowPtGPsow3jA+2YMvZSBZsu1Zmu1+lWObiubw0AAAAAAMI7qUnDmletcnDNf1MpePAiaIGX48oqNDc7nI8//tgtxAMAAAAAyFpOKuj2FkvTquPBl8/S/1oxPKvRomjhhLqGKgAAAAAg/p1U0L1p06b0P5IYF7gCOQAAAAAAJx10s4AaAAAAAABRCrpfeumlVB/X5boAAAAAAMjqTirovuOOO1IsG6/rdZ9xxhnucmIE3QAAAAAAnOQlw/78889ktwMHDtj69eutSZMm9tprr/G+AgAAAABwskF3KJUrV7bx48enyIIDAAAAAJBVpVvQLdmzZ7fff/89PXcJAAAAAEDWmtM9e/bsZN/r+tzbtm2zp556yho3bpxexwYAAAAAQNYLujt27Jjs+2zZslmxYsWsRYsW9uijj6bXsQEAAAAAkPWC7qSkpPQ/EgAAAAAA4sxJzekeNWqUu0RYsL///ts9BgAAAAAATjLofvDBB91lwoIpENdjAAAAAADgJINuLZymedzBVqxYYUWKFOF9BQAAAAAgrXO6Cxcu7IJt3apUqZIs8D5+/LjLft966628sQAAAAAApDXonjx5ssty9+7d25WRFyxY0P/YGWecYeXLl7dGjRrxxgIAAAAAkNagu2fPnu7/c845xy666CLLkSMHbyIAAAAAAOl5ybBmzZr5v/7nn3/syJEjyR4vUKDAyewWAAAAAIC4clILqWmV8n79+lnx4sUtb968bq534A0AAAAAAJxk0H333Xfb559/blOmTLGcOXPa888/7+Z4ly5d2l566SXeVwBAVIwcOdK/oKd3q1q1aorttP7I5Zdf7h5/7733Qu7rjz/+sLPOOstts3fv3lRfd9myZXbppZdaoUKFrGjRonbLLbeEvHTmifZ7+PBhu//++61cuXLu/Km1UP7zn/+k6T0AAABZIOh+//337ZlnnrGrr77asmfPbhdffLENGzbMHnroIXvllVfsdHfA6tSpc1pfEwCQcWrUqGHbtm3z37766quQC3+GurRloBtvvNFq1659wtfbs2ePtWnTxipVqmSLFi2yTz75xFavXm29evVK8347d+5s8+bNsxdeeMHWr19vr732mp177rknPAYAAJDFgm51QCpUqOCfv63vpUmTJvbll1+maV/bt2+3/v37u/1p1L9s2bLWrl071ymJJ+qgaZBCWQ11BNUhDOXpp5922+TKlcsuuOAC+/7770/7sQJAZqbB3pIlS/pvZ555ZrLHly9fbo8++miqGWRVaikLPXjw4BO+3uLFi93Cofp8VoDcoEEDmzp1qs2cOdM2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4BT7KViwYLLXXLJkif355592ww03pMv7AgAAEAuyZ+SLb9682Ro3buw6gxMnTrRatWrZ0aNHbc6cOda3b19bt26dxQt1VjWwoAzPoEGD0pzRSqsLxs2zY9nznvTzkbFyJvpsQkOzmiPn2OHj2WiOLNiOm8e39X+tz8O2bdtaq1atbMyYMak+T6XlKgfPnj35x7v2cdNNN7nPoVtvvdUFvhrYC6Vo0aKuZP2ll16y888/3w2I6jOpePHiVq9ePf92a9assVGjRtmiRYvsl19+OeHP9MILL7ifoVy5chG8AwAAAPEhQzPdt99+u+v0ff/99y4LXKVKFTfX784777TvvvvObbNlyxY3rzBfvnyuI9m5c2fbsWNH2H1ecsklKbLDKqPU3EKPss3quPbo0cPtVx3A2bNn265du/yvpYBXWRmPyjY1OKABgWrVqrlt2rRp40omI9GgQQM3sHDttde6DmxaM1oAsibNvV66dKmNGzfuhNsqQz169Gi75ZZbkt2vwPjNN9+0uXPnus9affY++eSTYfejz+XPPvvMli1bZvnz53dZ8ccee8yVrnufS4cPH7brrrvOfa5pLvmJqAz+448/doE/AABAVpJhmW4tAKQOnEoh8+ZNmZFVgJuUlOQPghcsWODKJZWt6dKli82fP/+UXn/SpEn20EMP2fDhw93X3bt3t4suush69+7tOpFDhgxxQbnKwr1skLLVmjs5Y8YMS0hIsG7durmSyldeecXSS1oyWl7HVzfP/v373f85E3yWmOhLt+PC6aX2C/wfWa8dVfWjOdB33HGHffTRR5aYmOju8/l87rNRXwfS3/4VV1zhBgXvv//+ZI+rTDywJF3b6nPutttuC/naeg09VqxYMbd4mhZp+89//uPK2L/55hsrVaqU+4xUNlyfx3otr5xdXwcfm+j5+lzX51uoxzMr71hj6ZiREu0YH2jH2Ecbxgfa8X8i7R9kWNC9ceNG17GrWrVq2G00r3vlypW2adMmN9dbVO6obLhKsJU9PlnqnPbp08d9PWLECDcvUfvzFvhRh7JRo0Yuq665iN6bOnXqVDd3Uvr16+cySOmd0dLPFillvx588MEU9w+rm2R58hxPt2NDxhhdP4m3Pou2owJtVfzs3LnTGjZs6L9fAffChQvt6aeftrfeessF43///bdbVFJVNFrUTBnt1GjQ8Ndff7VZ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AAAAABAhp0TQPXjwYDv77LOjvRsAYsT48eOtbt26VrBgQfdo3LixzZgxw7/8wgsvtGzZsgU97rjjjqBtbNy40dq1a2d58+a1EiVKWN++fS0lJSXDz/3uu++sQ4cOdtppp7nPPf/8823evHlB68yZM8fOO+88K1CggJUqVcr69esXtN0NGzak2Tc9Fi1alGXfDwAAAE6xoHvbtm3Ws2dPq1y5suXKlcvKlStn7du3dxeniWTChAlpLqRz584d7d0CEk7ZsmVt+PDh9tVXX9nSpUutefPmLhj+5ptv/OvceuuttnXrVv9jxIgR/mVHjx51Affhw4ftiy++sIkTJ7rj96GHHsrwcy+99FIXQM+dO9d99llnneVe0zlOVq5caZdccom1adPGli9fbm+++aa9//779sADD6TZ1ieffBK0f/Xr18/S7wgAAABZI7vFOGV1mjRpYoULF7aRI0danTp17MiRIzZr1izr0aOHffvtt5ZIlP1at26d/7kC7xNx7rA5lpI9XxbuGU6mXMk+G9HIrPbgWXbo6In9P4DwNgxv5zrtAj322GMu+61sca1atdxrymAr0xzOxx9/bGvWrHGBb8mSJV0lzZAhQ1xWWpU1OXPmTPOenTt32vfff28vvfSSy7KLAv9x48bZ6tWr3WcpyNYyL3g/44wzXLB/zTXX2MMPP+yy355ixYqlu38AAACIHTGf6e7evbsLPBcvXmxXXnmlnXnmme6iuHfv3v5ySpV5KkuVP39+F7TqAnX79u3pblOlo7169Qp6rWPHjnbTTTf5n1esWNGGDh1qN954o9tuhQoVXMbpl19+8X+WLo6VJfMo06XOAXUI1KhRw62jjJWyUJml31UX0t5DF/QAIkdZ6ylTptiBAwdcmbln0qRJrgy8du3a1r9/fzt48KB/2cKFC10HYODx2bp1a9u7d29QtjyQguRq1arZq6++6j5LGe/nn3/elaZ7WepDhw6lqW7JkyeP/fHHHy4zHuiyyy5z71WJus5NAAAAiE0xHXTv3r3bZs6c6TLa+fKlzdoqwE1NTXVBsNadP3++zZ4923788Ue79tpr//bnjx492mXZVeapUtIuXbq4IPyGG26wZcuWWZUqVdxzn8/nf48uzJ988kl77bXX7LPPPnMdAvfdd1+mP3P//v0uwFcJfWi5K4Css2rVKtcxpiErGq89bdo0q1mzplt2/fXX2+uvv+7GWyvg1vGs496jcvDQDjHvuVcqHq5DTZlxnU+UsVZwPWrUKHeOK1KkiD9wV7n6G2+84ToDtmzZYo8++qhb5nXeaZ+feuope/vtt+2jjz5yQbc6DQm8AQAAYlNMl5f/8MMPLqCtXr16uutoXLcuntevX+8CVVEmSdnwJUuWWMOGDU/48zW28vbbb3f/Vrmnyk+1vauvvtq9plJSZcaUVffKPFX6/txzz7mAXO666y7/RfOxKAv28ssvuwz6b7/95oJ3TaikwFtjUMNRZkwPjzJtkivJZ8nJf3UGIL6o/QJ/IuvoGBXNEaFzhI6Zd99917p27eqCYgXeN998s399nX+KFy/uAmINZ9Gxrc4+nZu8bQVuVxls79+BP7X+nXfe6balYF4ZbB3vKnVXoH366afbRRdd5ErO1QmgTj51CDz44IO2YMEC95naTqFChdwcFx6Vtm/evNmVobdt25b/VbJYaFsiPtGOiYF2jH+0YWKgHf+S2euDmA66AzPI6Vm7dq0Ltr2AW3TRrCy4lv2doNsbdxmYxVJJaehrO3bs8AfdGgfqBdyiC2ktzwwF8IHlrQq4VaauElSNFw1n2LBh9sgjj6R5fWC9VMub92imPhexa0iD1GjvQsKZPn16mtdU0aJhIffff78b0hJK5d2iMvR69erZvn373PjswG15Q1rUWRj6GarA0SRpel0Z9D179riHgmRlqAcOHOiGz4iG0Ghitl9//dVV+HjnD2W6w+27aD2NMU9vOf4+tSHiH+2YGGjH+EcbJgba0YKGH8Zt0F21alVXkpnVk6UlJSWlCejD9VLkyJEjzYRm4V5TBirce7x1MtN5EI62pQt8XcSnR6WvGt/uUdZOHRBDlydZSo7kE/pcRJ8y3Aq4By1NskOpTKSWlVYPbh329TFjxriONFW4hFImWpSVVmecziHvvPOONWjQwI2rlhdffNHNKaFZz5Wh9s4r+oPUsmVL/3lC8zyoRNyjf+tcF+5zRROz6ZhW1UxycvhjWoG7hqWktw2cuMA2DD2/I37QjomBdox/tGFioB0tTZVxXAfdRYsWdSWdzz77rN19991pxnUrU6RM8KZNm9zDy3Yr46Nl3vjMUCrvDJzcTGMnNXuwSjtjifZLpfMZXUjr4t67wA+kQC2FWa/jntqR2cuzlgIndVYpy1y+fHmXtZ48ebKbE0LZbs3DoOc67jT52ddff2333nuvNW3a1D/hmZbp/NKtWzdX1q1x3JpdXPNPeAG1Jn9UibiGoegzL7jgAjd2+5///KcbrqLy8hdeeMHdoUGTonkBne7SoMBcgf3UqVPd87feess/wZqy4JodXR1yonU0iaOCfoLCyNF3y/cb/2jHxEA7xj/aMDHQjpbpa4OYDrpFAbdKPxs1auTGRivLpDGTyjxojLUCbJV8d+7c2WWqtEzloc2aNXNZqHB0T15lhzUJkUrBNZmRgvRo0+/3j3/8w90mSPuji+2ffvrJXaQfry/7t3ABA+K3B1GlwsrKcqGf9VSyrUkQ1fmmMdI6ryjgVjZTHXga263ziWYZV2eeSr9VAu5RxvnDDz90Y7Q1JEQdghoTHjh/g8qNvvvuO3dOEs2ErknTBgwY4M5BamPNPfHee++5+3V7ZsyY4W5hprka9LqWh47V1nATnRuyZ8/uxpzrVmNXXXVVBL4pAAAA/F0xH3RrsiPNFK6L0D59+riLZGWqlXFS0K3ybV2UamIhZaKUHVKWaOzYseluU9kpja/URbcuWpXFioUst8ZwqjRVWTNlxPQ7qqw1vYw9gBOje2WnR0G2st7HonLujMZQ69aEhw8fDlpHHYEK7jMyd+7cDJcruNcDAAAA8SGb70QHHCNmxxUoc7dz504y3QmQ6VYZM5nu+EU7xj/aMDHQjomBdox/tGFioB3Txl6685Tm9onL+3QDAAAAABDPCLpPIk2wlN5D9+EFAAAAACSWmB/TnUhWrFiR7rIyZcqc1H0BAAAAAEQeQfdJpFnJAQAAAACnDsrLAQAAAACIEIJuAAAAAAAihKAbAAAAAIAIIegGAAAAACBCCLoBAAAAAIgQgm4AAAAAACKEoBsAAAAAgAgh6AYAAAAAIEIIugEAAAAAiBCCbgAAAAAAIoSgGwAAAACACCHoBgAAAAAgQgi6AQAAAACIEIJuAAAAAAAihKAbAAAAAIAIIegGAAAAACBCCLoBAAAAAIgQgm4ACWP8+PFWt25dK1iwoHs0btzYZsyY4V9+++23W5UqVSxPnjxWvHhx69Chg3377bf+5bt27bI2bdpY6dKlLVeuXFauXDm76667bO/evRl+7mOPPWbnnXee5c2b1woXLpxm+auvvmrZsmUL+9ixY4d/vUOHDtmAAQOsQoUK7vMrVqxoL7/8cpZ9PwAAADj5Tomge/DgwXb22WdHezcARFjZsmVt+PDh9tVXX9nSpUutefPmLrD+5ptv3PL69evbK6+8YmvXrrVZs2aZz+ezVq1a2dGjR93ypKQkt/77779v3333nU2YMME++eQTu+OOOzL83MOHD9vVV19td955Z9jlWrZ169agR+vWra1Zs2ZWokQJ/3rXXHONzZkzx1566SVbt26dvfHGG1atWrUs/Y4AAABwcmW3OLBt2zaXSfroo49sy5Yt7iJVQXSvXr2sRYsWliheeOEFlxFbvXq1P0B4/PHHrVGjRtHeNSAutG/fPui5zhvKfi9atMhq1aplt912m3+ZsshDhw61s846yzZs2OAy4EWKFAkKnJVx7t69u40cOTLDz33kkUfcTwXp4Sizrsy755dffrG5c+e64Nozc+ZMmz9/vv34449WtGhR/z4CAAAgvsV80K2L4SZNmriSTV341qlTx44cOeKyVD169AgqDY13n376qXXq1MmVqebOndueeOIJl4VTlq5MmTLHta1zh82xlOz5IraviKxcyT4b0cis9uBZduhoNr7uTNgwvF3Qc2Wv3377bTtw4IArMw+l15X1rlSpkisjD+fnn3+2qVOnuox0VlLnmkrRr7rqKv9ryq43aNDARowYYa+99prly5fPLrvsMhsyZIgL2gEAABCfYr68XFkmjXtcvHixXXnllXbmmWe6jFXv3r1d9ko2btzoSkLz58/vskkq0dy+fXu627zwwgtdljxQx44d7aabbkqTBbvxxhvddpXx0kWxMlTeZ2nsqEpYPcpyqXNAHQI1atRw62h8qEpJM2PSpEnu91UWv3r16vbiiy9aamqqKzcFkDmrVq1yx57GRKssfNq0aVazZk3/8nHjxrnlemi89+zZsy1nzpxB21Dnl4JidXbpnKJjMSspw3399dcHBdPKcH/++eeu0kX7PGbMGHvnnXfcOQEAAADxK6Yz3bt373YllyoRVdYnlAJcBaVeEKzSzJSUFJcBv/baa13m+O8YPXq0K+8eNGiQ+3eXLl1cFrpbt24u696vXz8XlCsTrY4BOXjwoD355JMuU6XxoTfccIPdd999LqA+XtqWsvpeqWk4mnhJD4834VOuJJ8lJ/tO6PdG9Kn9An/i2HSsSOXKlW3JkiXuWHj33Xeta9eubly2F3irU04dbxq2MmrUKDfeWucOVZd4lG1+8MEH7fvvv7eBAwe6TrqxY8cecx+8seHevoT+FHUWaky5suyBr+u9Oo+o865QoUL+/bjuuuvs6aefJtsdJeHaEPGHdkwMtGP8ow0TA+34l8xeH8R00P3DDz+4iY6U9U2PssDKbK1fv95fIqrSTWXDdeHdsGHDE/78Sy65xM12LA899JAbG6rt6SJdFHSrbFVZ9VKlSvm/+Oeee86NDxXNfPzoo4+e0Odr+5pF+eKLL053nWHDhvnHkwYaWC/V8ub9MwBA/BrSIDXauxA3pk+fnuY1DU1R5cn9998fNmOs6hZ1jGmyxaZNm6ZZnpyc7DrbFICfe+65GXaAycqVK905IHRflE33KHhXSbuC/sD1FHSrI/G///2v/zXNbK5zoDrtdC5A9AS2IeIX7ZgYaMf4RxsmBtrRXJI07oNuXWweizJGCrYDx2Qqo6WLVy37O0G3ysc9JUuWdD81pjz0NV0Ye0G3SlK9gFtOP/30oFsCZZZmYJ4yZYrL1gdm4EL179/fldp7lN3TdzF0eZKl5Eg+7s9FbFCGWwH3oKVJdiiVMd2ZsXpw67Cvq0xbx6o60UKpSkQVKTpnhFsuBQoUcD/PP//8Y05stnPnTsuRI4d/WwrA9QepZcuW7vX9+/e7IF9DV0I/T+PH+/Tp44J/Ve6IhrRo/zp37kymO0pC2xDxiXZMDLRj/KMNEwPt+Jdj3VY2LoLuqlWrunLLrJ4sTRexoQF9uNKAwAssr3w83GsqcQ/3Hm+dzHQeBFJ5uoJulcQGBv7haNyqHqEUqKUwAVfcUzsykVrm6NhTJ1Tbtm2tfPnytm/fPps8ebIrHVe2e9OmTfbmm2+6yQl1j+7Nmze740zjqjXrud6vzLMqV9RZp8BXQ0f69u3rMuY6H4nml9CwElXZeBMcal4JDYfR3RWUsfZuUaa5ILx900OTsmkIjEreQ88VyqhrOItmWFf1igJ4/T4azhI48zmiw2tDxDfaMTHQjvGPNkwMtKNl+togpoNulXLqXrbPPvus3X333WnGde/Zs8dNWKaLaT28bPeaNWvcssDJkwLpgjtwcjNdJGvyoosuusiiTWM4NYZdQYJmMj5RX/ZvYcWKFcvSfcPJ45UoK3vLhX7mqapEAbGOb42LVqeVjiVlKZVJXrBggct8//rrry77razyF1984b9XtgJw3brv3nvvdVlwnVOuuOIKe+CBB4LKiHQP7cCOOg0/mThxov95vXr1wpZdaQI1bU+VOKEU5Gv9nj17umNfx6/GnysrDgAAgPgV00G3KOBWlkn3qtbYaF1EK1Oki1ONsVaArZJvlV/qYlrLNHZTt/hJL2ht3ry5K8nWfb9VCq7JlBSkR5tuEaaLd2XnVMaqMZ/izbQMIGOB970OpTHR4cZ9B1LHm4LwjGgSttDqFU1+Fu4e3aHju4+1bc1fwfgoAACAxBLztwzTTMTLli1zF8Ma71i7dm2XtVJpp4JulW+/9957VqRIEZe10qRjeo/KSNOjck2VdyojpuBc68dCllu/z+HDh929ezUW3Huo3BwAAAAAEH9iPtMtCjyfeeYZ9whH4zcVeKdHMxPr4VG5ru7Vq0d6NmzYkOa10OyWstGBr2km5MB7fXv3/87smO5wnwkAAAAAiF8xn+kGAAAAACBeEXSfRN7Y7HAPTfAEAAAAAEgscVFenihWrFiR7jLv1kMAAAAAgMRB0H0SnXHGGSfz4wAAAAAAUUZ5OQAAAAAAEULQDQAAAABAhBB0AwAAAAAQIQTdAAAAAABECEE3AAAAAAARQtANAAAAAECEEHQDAAAAABAhBN0AAAAAAEQIQTcAAAAAABFC0A0AAAAAQIQQdAMAAAAAECEE3QAAAAAARAhBNwAAAAAAEULQDQAAAABAhBB0AwAAAAAQIQTdAAAAAABECEE3AAAAAAARkhBB9+DBg+3ss8+O9m4AOAnGjx9vdevWtYIFC7pH48aNbcaMGW7Z7t27rWfPnlatWjXLkyePlS9f3u6++2777bffgraxceNGa9euneXNm9dKlChhffv2tZSUlAw/t2LFipYtW7agx/Dhw4PWeeutt9y5SNutUKGCPfXUU0HLP/300zTb0GPbtm1Z9v0AAAAgtsRE0K0LTl0oV65c2XLlymXlypWz9u3b25w5cyyRvPDCC3bBBRdYkSJF3OPiiy+2xYsXB61z0003pbkgb9OmTdT2GYg1ZcuWdcHuV199ZUuXLrXmzZtbhw4d7JtvvrGff/7ZPZ588klbvXq1TZgwwWbOnGm33HKL//1Hjx51Affhw4ftiy++sIkTJ7r1HnrooWN+9qOPPmpbt271P3Te8ijw79y5s91xxx3us8eNG2f/+te/7KOPPkqznXXr1gVtR4E/AAAAElP2aO/Ahg0brEmTJla4cGEbOXKk1alTx44cOWKzZs2yHj162LfffmuJQlmuTp062XnnnWe5c+e2J554wlq1auWChTJlyvjXU5D9yiuv+J+rI+J4nTtsjqVkz5dl+46TK1eyz0Y0Mqs9eJYdOpqNr1/niuHt3PegDrlAjz32mMt+L1q0yAXX7777rn9ZlSpV3PIbbrjBZbKzZ89uH3/8sa1Zs8Y++eQTK1mypMtMDxkyxPr16+eqZnLmzJnu912gQAErVapU2GWvvfaadezY0QXdok7E+++/34YOHWrPPPNM0LoKsnXOAwAAQOKLeqa7e/fuLpurjO+VV15pZ555ptWqVct69+7tLqK9UlBlsvLnz+/KSa+55hrbvn17utu88MILrVevXkGv6WJYWeTAUlFdDN94441uuyoFff/99+2XX37xf5ZKWJVJ8ygbpgtldQjUqFHDraMAWZmqzJg0aZL7fXWRX716dXvxxRctNTU1TUZfQbYu7L2HsuIA0lLWesqUKXbgwAFXZh6OSst13lDALQsXLnSdewq4Pa1bt7a9e/e6DrCMKMNerFgxq1evnuskDCxJP3TokOtMC6QS9127dtlPP/0U9LrOAaeffrq1bNnS/vvf/9K0AAAACSyqQbfGX6r0UxntfPnSZmUV4CooVRCsdefPn2+zZ8+2H3/80a699tq//fmjR492Wfbly5e7ctMuXbq4IFxZsWXLlrksmZ77fD7/ew4ePOhKV5XV+uyzz1yHwH333XdCn69tKatftGjRNBlxZcI0LvXOO+90F+0A/rJq1SrX6aUOKmWWp02bZjVr1kzzFe3cudNlsW+77bag4SyBAbd4zzMaW62x4Qrw582bZ7fffrs9/vjjLpMdGLhPnTrVdaLpvPXdd9+5c0zgdhVoP/fccy4br4eG0qiTUOcbAAAAJKaolpf/8MMPLqBV1jc9uoDVBfb69evdBaq8+uqrLhu+ZMkSa9iw4Ql//iWXXOIunkXjOVWiqu1dffXV7jWVmyp7pqy6V1KqIFkXzQrI5a677nLjPE+Etl+6dGk3ttujzPkVV1xhlSpVsv/973/24IMPWtu2bV12Ljk5Oc02lF3Tw6NsneRK8lly8l+dBYgvar/An/jz2POodFvHv/5/V/DatWtXVy4eGHhrmY5xVaUMGDDA/34FxDrvBG7P+7cy14GvBwocv61t6nhU5YqOfwX/qqRRoH3ppZe6bSi7ruUqb9dn6jXttx4enW90HtSEa6qkQezx/n9I7/8LxAfaMTHQjvGPNkwMtONfMnt9ENWgOzCDnJ61a9e6YNsLuEUX1sqCa9nfCbpVPh6a6VLZaehrO3bs8AfdmpXYC7i9zJWWHy+VqSprpqx2YEnqdddd5/+39kX7qM/Tei1atEiznWHDhtkjjzyS5vWB9VItb96jx71fiC1DGqRGexdixvTp08O+rmoVDflQ1llBrvz+++9ufLaCYY3zVoWMZ9++ffb9998Hbc8brqIAOL3PCfXHH3+4IF2dgN6cDJooUXM27NmzxwXdX3/9tXtd5eV6LRyVq2tSuMx+LqIj8P8hxC/aMTHQjvGPNkwMtKO5yuWYD7qrVq3qxnNn9WRpSUlJaQL6cL0QOXLk8P9b+5Hea8pShXuPt05mOg8CqTxdQbcyc4GBfzjKip122mkuGAgXdPfv39+Nfw/M7qmDYujyJEvJkTYzjvigDLcC7kFLk+xQKhOpyerBrdP9vsaMGeM6yZTZ1jGg4SJ6rnka1FEWen545513rEGDBv5ZwzW/goLkW2+9NdMTF06ePNlt66qrrkp33gWVm2uYiNYJPXd4xo4d66p9tO+IPfrboYsKjb9Prw0R+2jHxEA7xj/aMDHQjpamyjimg26NZdY4yGeffdaNlwwd163MkMo4N23a5B5etlszD2tZuDGcUrx48aDJzTTZkm7hc9FFF1m0jRgxwpWbKjOni/5j2bx5sxvTrYx6OAoQwgUJCtRSmPU67qkdmb38T17Ao44mDbnQPbiVtVbwq/kedEwpw62AW72OmrhQz/XwzgsqCVdwq3NHt27d3PGo8dYPP/ywm1tC48RFEztqPgcNb1EWW8M7vvzyS3cO0Qzmeq57e2v+By9w1/hxBfMao60suO5AoLHmKj/XvuuhzgENHdHwGK2jYF9jxDWjOgFdbPPaEPGNdkwMtGP8ow0TA+1omb42iPotwxRwqzy0UaNG7uJUmV+VbCqzoDHWCrBVZq373+qCVctUQtqsWbN0g1bdt1fZX90fV6XZo0aNSre082TSLcI0dlxBgmZP9yZX0oW+Hvv373el4prFXeXsGtOtktkzzjjDdU4cjy/7t3Blq4jfHkSVGyu7y4V+MA3nUECsjrVChQq5c4YCbmUiNQxDwbHouAmkeSF03Cnw/vDDD90khZqzQZ19GhMeODeDgnbdS9urkFHHloaDqGRdcygocL733nuDqkxE9/zWxIqqftG2Vc2iYNyje4P36dPHtmzZ4jLw2netEwsdggAAAIiMqAfdKp/WzL3K/upiVBfSykjVr1/fBd0q337vvffcJEZNmzZ15ZyabEwlmelRBmvlypXuwly3CdLFcSxc1Or30UW3Sk0DKcumi3kFAxoDqgt3dRJokjXdx1uzL5/IvbqBRPTSSy+lu0xZ5swM99AtAjMaQx26nXPOOcd/C8P0aBiIMuDhOk886kQLnPEcAAAAiS+b73gHJCPmxxUo+6fsGpnu+OUFayqFJtMdv2jH+EcbJgbaMTHQjvGPNkwMtGPa2Ou3335z8wPF5H26AQAAAABIZATdWcgbmx3usWDBgqz8KAAAAABAHIj6mO5EsmLFinSXeffxBQAAAACcOgi6s1DobMkAAAAAgFMb5eUAAAAAAEQIQTcAAAAAABFC0A0AAAAAQIQQdAMAAAAAECEE3QAAAAAARAhBNwAAAAAAEULQDQAAAABAhBB0AwAAAAAQIQTdAAAAAABECEE3AAAAAAARQtANAAAAAECEEHQDAAAAABAhBN0AAAAAAEQIQTcAAAAAABFC0A0AAAAAQIQQdAMAAAAAECEE3QAAAAAARAhBN4CYNn78eKtbt64VLFjQPRo3bmwzZszwL//3v/9tF154oVuWLVs227NnT9D7N2zYYLfccotVqlTJ8uTJY1WqVLGHH37YDh8+nO5n6j3aVrjH22+/7V9vzpw5dt5551mBAgWsVKlS1q9fP0tJSQna1vLly+3888936xQvXtyuvPJKt30AAACcGhIi6B48eLCdffbZ0d4NABFQtmxZGz58uH311Ve2dOlSa968uXXo0MG++eYbt/zgwYPWpk0be/DBB8O+/9tvv7XU1FR7/vnn3XtGjx5tzz33XLrrS7ly5Wzr1q1Bj0ceecTy589vbdu2deusXLnSLrnkEvfZCqzffPNNe//99+2BBx7wb2f9+vX2+OOPu06BFStW2KxZs2znzp12xRVXZPn3BAAAgNgUE0H3tm3brGfPnla5cmXLlSuXu+Bt3769yyIlkqlTp1qDBg2scOHCli9fPtdR8NprrwWtc9NNN6XJrOmiHjhV6Vyg4LZq1ap25pln2mOPPeaC30WLFrnlvXr1coHuP/7xj7Dv1/HzyiuvWKtWrdw55rLLLrP77rvPHY/pSU5OdpnrwMe0adPsmmuucZ8tCrKVgX/ooYfsjDPOsGbNmtmIESPs2WeftX379rl1li1b5gL+Rx991GXYzznnHPfZCsCPHDkSke8LAAAAsSV7tHdAZZZNmjRxgejIkSOtTp067mJUGaEePXq4LFWiKFq0qA0YMMCqV69uOXPmtA8//NBuvvlmK1GihLVu3TpNkOBRR8TxOnfYHEvJni/L9h0nV65kn41oZFZ78Cw7dDTbKfn1bxjeLs1rR48edeXdBw4ccGXmJ+q3335zx2NmKcuuQFkBtefQoUOWO3fuoPVUvv7HH3+49ZXdVpCtjrOJEye6Evf9+/e7jraLL77YcuTIccL7DwAAgPgR9Ux39+7d3UXp4sWL3VhHZbJq1aplvXv39meyNm7c6MpJlWHSuE1lm7Zv357uNnWxq+xXoI4dO7ossqdixYo2dOhQu/HGG912K1So4EpDf/nlF/9nKYulclbPhAkTXOeAOgRq1Kjh1lGArNLTzNB+XX755e69ynrdc8897jM+//zzoPUUZAdm2IoUKZLp7xNIRKtWrXLHm46NO+64w2Wda9aseULb+uGHH2zs2LF2++23Z/o9L730kjtuNX7bo46yL774wt544w3XGbBlyxaX0RbvnKBx5Br+MmjQILfvOn9s3rzZ3nrrrRPadwAAAMSfqGa6d+/ebTNnznTloiq3DqULVJVmekHw/Pnz3SRFyoBfe+219umnn/6tz9fYTo231AWx/t2lSxd3Ud2tWzeXddekSArKNQ5UHQPe+NEnn3zSZauSkpLshhtucOWikyZNOq7P9vl8NnfuXFu3bp098cQTQcv0eyn7rWBb41fVOVCsWLGw21G2TQ/P3r173c9cST5LTvadwLeCWKD2C/x5Kgosv1ZZ+JIlS9z/3++++6517drVPvnkk6DA25vATO9Lr3RbgbE6ytTBp064zJR4//777zZ58mQ3Bjxw/YsuusiNNVcngM4dCqq1zoIFC9x5S+tu2rTJxo0bZ9dff7116tTJZbo1Nlyfr8ngvPMKYpfX5gwHiG+0Y2KgHeMfbZgYaMe/ZPb6IKpBtzJOCj5Vbp0ejetWlksTEmmst7z66qsuG66L8IYNG57w52ucqJft0rhMzZKs7V199dXuNQXdKmFVVl0ZZ++L1SRMylTLXXfd5c9uZbastUyZMi5Q1rhRXZC3bNnSv1wBgSZZUobsf//7n7uI18RNCxcudOuHGjZsmLuIDzWwXqrlzXv0BL4VxJIhDVLtVDV9+vSwr2s4iqpN7r//flcp49F5Qj7++GP/uOvQTr6BAwe6ahqNE09v+6HmzZvnytl1Dgh9j7al0vFff/3VdRzu2LHDn+nWuuqMy5s3r6ty8bLf6sj75z//aWPGjLFq1aodxzeCaJo9ezYNkABox8RAO8Y/2jAx0I7mErIxH3Qr4D6WtWvXumDbC7hF2S1lwbXs7wTdKu32lCxZ0v3UmPLQ13Qh7QXduoD2Am45/fTT/RfamaHbBmlsqDJe6lBQGb2yeLool+uuu86/rvZF+6jPU/a7RYsWabbXv39/tw2PMoH6roYuT7KUHGmDdMQHZbgVcA9ammSHUk/NbOjqwX/NcxBKAauOT3WcebxqGU2YpvNDaIZbnVu6dZeC5HAdWOkZNWqUC9KVqT4WlZLr+FNnnD5Dx7iy2fpsbwy3F3xr4re/My4dJ4c6WnVREdiGiD+0Y2KgHeMfbZgYaEdLU2Uc00G3ZiPWBWlWT5amsu/QgD5c6j/wAsor8wz3mkpFw73HWycznQeB+6aZjkWzl6vjQNlqL+gOpYD8tNNOc1UB4YJulbSGm2hNgVrKKToBVyJRO56qE6l5x5o6llTtUb58eTcruEq9NdRE2W6to7sf6OHd+1rnE3VuaX1NluYF3Jq3QQF04H28vc40raPjS1U0jRo18i/XcadycWWtwwVcGoai6hQd15oNXc81XtubYO3SSy+1Z555xg0h0VAU7b+qV7Qv6jAkiIsfaivaK/7RjomBdox/tGFioB0t09cGUZ1ITRfEmoxIMwKrfDOULo41eZHGRerhWbNmjVuW3kRKxYsXD5rcTJMcrV692mKRAvrAMdmhNOnSrl27XEYdOBWpkkQl2SrFVmCsYSUKuL1hGRruUa9ePbv11lvd86ZNm7rnmhhRlKVU8Kyss+75rWPJewR2yml+hdASoZdfftm9R9nzcDQu+4ILLnC3Avzoo4/svffec5M2Bo77ViWK9kX7pABdnWSay0IznQMAACDxRf2WYQq4NUZT2SWNjVY5tSZE0oWyxlgrwFaZdefOnV1JqZZpHKfuiasL3XA0+ZgudHURrNLs0OxWtCijrX3WPinQVvZME7Lp95TASZaUgdOYbo1bVWY88JZimfFl/xbpTr6G2KcgUP9/qMT6VM+uaebwY5V065EeTZgWeOeCcHQ3g3AVK5poUY/0aDLEY1FQrmP/VG9HAACAU1XUg26VTy9btszNYN6nTx+XoVamun79+i4YVfm2skc9e/Z0GSyVcSpbpFv+pEezj69cudJlx7Jnz2733nuvyzhFm7L56jBQ9lpZLk0g9/rrr7uZ2EVjQL/++ms35lSdBKVLl3YZtiFDhpzQvboBAAAAANGVzXc8A5IRF4P5CxUqZDt37iTTnQCZbk0URoY0ftGO8Y82TAy0Y2KgHeMfbZgYaMe0sZfuUFWwYEGLyTHdAAAAAAAkMoLuLKR7A6f30AzIAAAAAIBTS9THdCcS3X87PWXKlDmp+wIAAAAAiD6C7izk3X8bAAAAAAChvBwAAAAAgAgh6AYAAAAAIEIIugEAAAAAiBCCbgAAAAAAIoSgGwAAAACACCHoBgAAAAAgQgi6AQAAAACIEIJuAAAAAAAihKAbAAAAAIAIIegGAAAAACBCCLoBAAAAAIgQgm4AAAAAACKEoBsAAAAAgAgh6AYAAAAAIEIIugEAAAAAiBCCbgAAAAAAIoSgGwAAAACACCHoBgAAAAAgQgi6AQAAAACIEIJuAAAAAAAihKAbAAAAAIAIIegGAAAAACBCskdqw4gOn8/nfu7bt89y5MhBM8SpI0eO2MGDB23v3r20YxyjHeMfbZgYaMfEQDvGP9owMdCOf9G1emAMlh6C7gSza9cu97NSpUrR3hUAAAAASHhKeBYqVCjd5QTdCaZo0aLu58aNGzNseMR+r1m5cuVs06ZNVrBgwWjvDk4Q7Rj/aMPEQDsmBtox/tGGiYF2/Isy3Aq4S5cubRkh6E4wSUl/DtNXwE2wFv/UhrRj/KMd4x9tmBhox8RAO8Y/2jAx0I5/ykyik4nUAAAAAACIEIJuAAAAAAAihKA7weTKlcsefvhh9xPxi3ZMDLRj/KMNEwPtmBhox/hHGyYG2vH4ZfMda35zAAAAAABwQsh0AwAAAAAQIQTdAAAAAABECEE3AAAAAAARQtCdYJ599lmrWLGi5c6d284991xbvHhxtHcJ/2/YsGHWsGFDK1CggJUoUcI6duxo69atC/p+/vjjD+vRo4cVK1bM8ufPb1deeaVt3749aJ2NGzdau3btLG/evG47ffv2tZSUFL7nKBg+fLhly5bNevXq5X+NNowPW7ZssRtuuMEda3ny5LE6derY0qVL/cs13clDDz1kp59+ult+8cUX2/fffx+0jd27d1vnzp3dfUoLFy5st9xyi+3fvz8Kv82p6ejRozZo0CCrVKmSa6MqVarYkCFDXNt5aMfY89lnn1n79u2tdOnS7vz5n//8J2h5VrXZ119/bRdccIG7HipXrpyNGDHipPx+p3obHjlyxPr16+fOqfny5XPr3Hjjjfbzzz8HbYM2jP1jMdAdd9zh1hkzZkzQ67Rj5hF0J5A333zTevfu7WYvX7ZsmZ111lnWunVr27FjR7R3DWY2f/58F1AvWrTIZs+e7f4wtWrVyg4cOOD/fu6991774IMP7O2333br64/UFVdcEXSRqYD78OHD9sUXX9jEiRNtwoQJ7gIFJ9eSJUvs+eeft7p16wa9ThvGvl9//dWaNGliOXLksBkzZtiaNWvsqaeesiJFivjX0QX6v/71L3vuuefsyy+/dBePOp+qU8Wji/5vvvnGHc8ffvihu4C57bbbovRbnXqeeOIJGz9+vD3zzDO2du1a91ztNnbsWP86tGPs0d88XZ8oSRBOVrTZ3r173d/XChUq2FdffWUjR460wYMH27///e+T8jueym148OBBdw2qDjH9nDp1qkswXHbZZUHr0Yaxfyx6pk2b5q5dFZyHoh2Pg2YvR2Jo1KiRr0ePHv7nR48e9ZUuXdo3bNiwqO4XwtuxY4fSMb758+e753v27PHlyJHD9/bbb/vXWbt2rVtn4cKF7vn06dN9SUlJvm3btvnXGT9+vK9gwYK+Q4cO8VWfJPv27fNVrVrVN3v2bF+zZs1899xzD20YR/r16+c7//zz012emprqK1WqlG/kyJH+13R85sqVy/fGG2+452vWrHHH5pIlS/zrzJgxw5ctWzbfli1bIvwbQNq1a+fr1q1b0JdxxRVX+Dp37kw7xgkdQ9OmTcvyY2/cuHG+IkWKBP1d1HFfrVq1k/SbnbptGM7ixYvdej/99JN7ThvGTztu3rzZV6ZMGd/q1at9FSpU8I0ePdq/jHY8PmS6E4Qyn+rNVRmWJykpyT1fuHBhVPcN4f3222/uZ9GiRd1PtZ+y34FtWL16dStfvry/DfVTJVslS5b0r6MMgHr11euPk0MVC6o4CGwr2jB+vP/++9agQQO7+uqr3RCNevXq2QsvvOBfvn79etu2bVtQ+xYqVMgN2Qk8FlXWqu14tL7Ou8rOIfLOO+88mzNnjn333Xfu+cqVK+3zzz+3tm3b0o5xKquOPa3TtGlTy5kzZ9DfSmVcVemCk3+9o9JktRttGD9SU1OtS5cubhhjrVq10iznWDw+BN0JYufOna70ODAYEz3XHzDE3olM44BV4lq7dm33mtpJFwjeH6Vwbaif4drYW4bImzJliiuZ0xj9ULRhfPjxxx9dWXLVqlVt1qxZduedd9rdd9/thmsEHksZnU/1UwF7oOzZs7tONI7Fk+OBBx6w6667znVOaqiAOk90XlW5I+0Yn7Lq2ONvZezQsACN8e7UqZMbgy+0YXzQkB0dW/r7GA7teHyyH+f6ALIoU7p69WqXlUH82LRpk91zzz1uHKEm50H8dnopS/b444+75wrWdDxqDGnXrl2jvXvIpLfeessmTZpkkydPdlmYFStWuKBb4w5pRyD6VL13zTXXuMnx1NGJ+KHqy6efftolGVSlgL+PTHeCOO200yw5OTnNTNd6XqpUqajtF9K666673MQv8+bNs7Jly/pfVztpmMCePXvSbUP9DNfG3jJE/o+QJiY855xzXO+vHprwTpP+6N/KxtCGsU+zItesWTPotRo1arg7AwQeSxmdT/UzdJJK3UVAM7lyLJ4cKnn0st0adqMySE1k6FWh0I7xJ6vajL+VsRNw//TTT66j2styC20Y+xYsWOCOMw1x9K531JZ9+vRxd0kS2vH4EHQnCJUl169f341vC8zm6Hnjxo2jum/4k3p6FXBrFsi5c+e629wEUvupRDKwDTX+TIGA14b6uWrVqqALDu+PWWgQgazXokUL9/0ro+Y9lDFVOav3b9ow9mlYR+jt+jQuWDMdi45NXUwEHouaN0HjRQOPRXWQqSPGo+Na512NP0XkaZZkjeMNpM5ntQHtGJ+y6tjTOprRXIFf4N/KatWqBd2lAJENuHWrt08++cTdmjEQbRj71Imp2+4FXu+oikidnRqWJbTjcTrOidcQw6ZMmeJm+JwwYYKbUfC2227zFS5cOGima0TPnXfe6StUqJDv008/9W3dutX/OHjwoH+dO+64w1e+fHnf3LlzfUuXLvU1btzYPTwpKSm+2rVr+1q1auVbsWKFb+bMmb7ixYv7+vfvH6XfCoGzlwttGPs0k2727Nl9jz32mO/777/3TZo0yZc3b17f66+/7l9n+PDh7vz53nvv+b7++mtfhw4dfJUqVfL9/vvv/nXatGnjq1evnu/LL7/0ff75525G+06dOkXptzr1dO3a1c2q++GHH/rWr1/vmzp1qu+0007z3X///f51aMfYvPvD8uXL3UOXoaNGjXL/9ma2zoo204znJUuW9HXp0sXNuqzrIx3jzz//fFR+51OpDQ8fPuy77LLLfGXLlnXXKYHXO4GzydOGsX8shgqdvVxox8wj6E4wY8eOdUFbzpw53S3EFi1aFO1dwv/TCS3c45VXXvF/R7qo6N69u7vViS4QLr/8cveHKtCGDRt8bdu29eXJk8ddYPbp08d35MgRvucYCbppw/jwwQcfuA4sdVRWr17d9+9//ztouW5dNGjQIHfhrnVatGjhW7duXdA6u3btchf6+fPnd7ftu/nmm91FDE6OvXv3umNPf/Ny587tq1y5sm/AgAFBF/a0Y+yZN29e2L+F6kTJyjZbuXKluzWgtqHOGQXziHwbqgMsvesdvY82jJ9jMTNBN8di5mXTf443Ow4AAAAAAI6NMd0AAAAAAEQIQTcAAAAAABFC0A0AAAAAQIQQdAMAAAAAECEE3QAAAAAARAhBNwAAAAAAEULQDQAAAABAhBB0AwAAAAAQIQTdAAAgoe3atctKlChhGzZsiMj2K1asaGPGjMn0+mvWrLGyZcvagQMHIrI/AIDYQtANAEAMuemmm6xjx44WqxS4ZsuWzVasWGHx4rHHHrMOHTq44DjQu+++a82bN7ciRYpYnjx5rFq1atatWzdbvnz5cW1/yZIldtttt2V6/Zo1a9o//vEPGzVq1HF9DgAgPhF0AwCATDl8+HDcfVMHDx60l156yW655Zag1/v162fXXnutnX322fb+++/bunXrbPLkyVa5cmXr37//cX1G8eLFLW/evMf1nptvvtnGjx9vKSkpx/U+AED8IegGACCGXXjhhdazZ0/r1auXy8iWLFnSXnjhBVearMCtQIECdsYZZ9iMGTP87/n0009dNvqjjz6yunXrWu7cuV1mdfXq1WkyvbVq1bJcuXK5LPBTTz0VtFyvDRkyxG688UYrWLCgy+ZWqlTJLatXr577DO2fl+1t2bKlnXbaaVaoUCFr1qyZLVu2LGh7Wv/FF1+0yy+/3AWpVatWdQFvoG+++cYuvfRS93n63S644AL73//+51+u99eoUcP9TtWrV7dx48Zl+P1Nnz7d/X76/T2LFi2yESNGuEyzHvqM8uXLW/369W3gwIFB36U+W1lyfe/58+e3hg0b2ieffJJheXlmfk99V7t377b58+dnuP8AgPhH0A0AQIybOHGiC2YXL17sAvA777zTrr76ajvvvPNcYNuqVSvr0qWLy+oG6tu3rwukFRArG9u+fXs7cuSIW/bVV1/ZNddcY9ddd52tWrXKBg8ebIMGDbIJEyYEbePJJ5+0s846y5Vca7n2QRR4bt261aZOneqe79u3z7p27Wqff/65C2oVaF5yySXu9UCPPPKI+9yvv/7aLe/cubMLPmXLli3WtGlTFyTPnTvX7aPKvb1s8KRJk+yhhx5y5eJr1661xx9/3O2Tvp/0LFiwwAXTgd544w0XQHfv3j3sexQ0e/bv3+/2c86cOe47aNOmjfseN27cmGGbZfR7Ss6cOV2WXfsHAEhwPgAAEDO6du3q69Chg/95s2bNfOeff77/eUpKii9fvny+Ll26+F/bunWrT3/SFy5c6J7PmzfPPZ8yZYp/nV27dvny5Mnje/PNN93z66+/3teyZcugz+7bt6+vZs2a/ucVKlTwdezYMWid9evXu20vX748w9/j6NGjvgIFCvg++OAD/2t638CBA/3P9+/f716bMWOGe96/f39fpUqVfIcPHw67zSpVqvgmT54c9NqQIUN8jRs3Tnc/9F1269Yt6LU2bdr46tatG/TaU0895b5X77Fnz550t1mrVi3f2LFjg76n0aNHZ/r39Fx++eW+m266Kd3PAQAkBjLdAADEOJWIe5KTk61YsWJWp04d/2sqfZYdO3YEva9x48b+fxctWtRNFKYMsehnkyZNgtbX8++//96OHj3qf61BgwaZ2sft27fbrbfe6jLcKi9XebiyxKEZ4cDfJV++fG49b781OZtKvXPkyJFm+yqnV6m3xmYrS+09hg4dGlR+Hur33393pejHooy6Pv/55593n/Vn7Pxnpvu+++5zJe2FCxd2n6nv7liZ7ox+T48mbwutTgAAJJ7s0d4BAACQsdAgVOXPga955dCpqalZ/lUqYMwMlZbr1lxPP/20VahQwZWIK+gPnXwt3O/i7beC0PQo+BWNZz/33HODlqkjIj0qy//111+DXlPHgMrgVWrv7Y8Caj02b94ctK4C7tmzZ7sye42d1z5eddVVx5xULqPf06Ny8ypVqmS4HQBA/CPTDQBAgtLYao8Cz++++85lbEU///vf/watr+dnnnlmhkGsxiJLYDbce+/dd9/txi97k7Pt3LnzuPZX2WGNcfbGnQdSNr906dL2448/uuA38OFN7haOJnzTfbEDderUyQXxx5qEzfu9dBs3TYqm6oJSpUpl2f2+NbGd9g8AkNjIdAMAkKAeffRRV4qugHXAgAEu6+vdA7xPnz5uJm7NTq5bZy1cuNCeeeaZYwaiJUqUcNnemTNnWtmyZV3ptsrJlT1+7bXXXDn63r173SRuGWWuw7nrrrts7NixbnI33bZL21XHQaNGjVxpvCYnU2Cv1zWh2aFDh2zp0qWuQ6F3795ht9m6dWu3La2j2d9FGXj9/nr89NNPdsUVV1i5cuXcxHC6vZiy0klJf+Yl9HtpsjhNnqbXNXFbVlQUKHDXxHEXX3zx394WACC2kekGACBBDR8+3O655x43e/e2bdvsgw8+8GeqzznnHHvrrbdsypQpVrt2bTcruIJ0ZXUzkj17dvvXv/7lxj4r86zbaYmCVQW22q5mUldwrAD9eKiDQLOWKwutW45pv1VO7pVq//Of/3S34nrllVdc1lnraLb1jDLdWs/7XQOpXFz35daM5LpFmYJrzQivgFodEBqDLbqlmIJ1zRSvwFtBvLb3d2kGdc06r1J8AEBiy6bZ1KK9EwAAIOvoPt0XXXSRC4I1TvlUp/uVK/Oucm4vgx1NGg+uIF9Bf+hkdgCAxEN5OQAASGjt2rVzs7KrnFtl5NGmmc8ffPBBAm4AOEWQ6QYAIMGQ6QYAIHYQdAMAAAAAECHRH9gEAAAAAECCIugGAAAAACBCCLoBAAAAAIgQgm4AAAAAACKEoBsAAAAAgAgh6AYAAAAAIEIIugEAAAAAiBCCbgAAAAAAIoSgGwAAAAAAi4z/A5osy5Y7O3HhAAAAAElFTkSuQmCC" }, "metadata": {}, "output_type": "display_data", "jetTransient": { "display_id": null } }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[特征重要性排名 - Gain]\n", "bias_10 1379.975546\n", "turnover_rank 1233.056754\n", "return_5_rank 1211.083106\n", "pe_expansion_trend 1194.518072\n", "return_5 1067.753329\n", "overnight_intraday_diff 864.510148\n", "high_low_ratio 737.870126\n", "amihud_illiq_20 699.716207\n", "revenue_yoy 591.354167\n", "min_ret_20 586.062664\n", "drawdown_from_high_60 544.946004\n", "roa 492.201997\n", "close_vwap_deviation 456.329131\n", "volatility_ratio 425.847030\n", "active_market_cap 391.611939\n", "healthy_expansion_velocity 381.013310\n", "bbi_ratio 350.895088\n", "ma_ratio_5_20 333.176295\n", "turnover_deviation 320.594954\n", "net_profit_yoy 312.797814\n", "turnover_rate_mean_5 294.216230\n", "return_20 292.148741\n", "EP_rank 270.906632\n", "turnover_cv_20 255.994465\n", "ma_20 249.024118\n", "mom_acceleration_10_20 245.051260\n", "volume_ratio_5_20 236.906485\n", "max_ret_20 233.119360\n", "profit_margin 231.406188\n", "EP 223.520549\n", "ma_5 222.848019\n", "std_return_20 211.703293\n", "sharpe_ratio_20 200.874590\n", "BP 182.380531\n", "capital_retention_20 167.152835\n", "roe 162.483161\n", "volatility_squeeze_5_60 158.716820\n", "volatility_20 152.922347\n", "current_ratio 149.282750\n", "debt_to_equity 142.640424\n", "CP 133.383919\n", "market_cap_rank 112.134213\n", "volatility_5 104.388842\n", "pv_corr_20 102.753917\n", "kaufman_ER_20 79.014202\n", "upper_shadow_ratio 58.782669\n", "up_days_ratio_20 42.695102\n", "value_price_divergence 0.000000\n", "ebit_rank 0.000000\n", "dtype: float64\n", "\n", "[低重要性特征] 以下2个特征重要性为0,可考虑删除:\n", " - value_price_divergence\n", " - ebit_rank\n" ] } ], "execution_count": 18 } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.0" } }, "nbformat": 4, "nbformat_minor": 4 }