From 13a312261c1ab00f0e115b0a24888955e32cf090 Mon Sep 17 00:00:00 2001 From: liaozhaorun Date: Sat, 5 Apr 2025 00:02:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8B=89=E5=BC=BA=E8=B5=9A=E9=92=B1rank?= =?UTF-8?q?=EF=BC=8C=E5=9B=9E=E6=92=A4=E5=B7=A8=E5=A4=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/train/Rank.ipynb | 285 ++- code/train/RollingRank.ipynb | 3040 +++++++++++++++++++++++++++---- code/train/RollingRank.py | 1250 ------------- code/train/predictions_test.tsv | 781 +++++--- 4 files changed, 3280 insertions(+), 2076 deletions(-) delete mode 100644 code/train/RollingRank.py diff --git a/code/train/Rank.ipynb b/code/train/Rank.ipynb index 5c1fdda..0aefe55 100644 --- a/code/train/Rank.ipynb +++ b/code/train/Rank.ipynb @@ -8,8 +8,8 @@ "source_hidden": true }, "ExecuteTime": { - "end_time": "2025-04-02T14:12:37.373532Z", - "start_time": "2025-04-02T14:12:36.959182Z" + "end_time": "2025-04-03T12:46:06.987506Z", + "start_time": "2025-04-03T12:46:06.259551Z" } }, "source": [ @@ -32,8 +32,8 @@ "metadata": { "scrolled": true, "ExecuteTime": { - "end_time": "2025-04-02T14:13:37.437375Z", - "start_time": "2025-04-02T14:12:37.383638Z" + "end_time": "2025-04-03T12:47:00.212859Z", + "start_time": "2025-04-03T12:46:06.998047Z" } }, "source": [ @@ -129,8 +129,8 @@ "id": "cac01788dac10678", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T14:13:49.617975Z", - "start_time": "2025-04-02T14:13:37.783573Z" + "end_time": "2025-04-03T12:47:10.527104Z", + "start_time": "2025-04-03T12:47:00.488715Z" } }, "source": [ @@ -200,8 +200,8 @@ "source_hidden": true }, "ExecuteTime": { - "end_time": "2025-04-02T14:13:49.892104Z", - "start_time": "2025-04-02T14:13:49.635085Z" + "end_time": "2025-04-03T12:47:10.719252Z", + "start_time": "2025-04-03T12:47:10.541247Z" } }, "source": [ @@ -289,8 +289,8 @@ "id": "a735bc02ceb4d872", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T15:03:19.084540Z", - "start_time": "2025-04-02T15:03:19.044068Z" + "end_time": "2025-04-03T12:47:10.821169Z", + "start_time": "2025-04-03T12:47:10.751831Z" } }, "source": [ @@ -307,7 +307,7 @@ " grouped = df.groupby('ts_code', group_keys=False)\n", "\n", " # 提前计算布尔掩码\n", - " window = 20\n", + " window = 5\n", " return_threshold = 0.0\n", "\n", " df['_is_upside'] = df['pct_chg'] > return_threshold\n", @@ -674,7 +674,7 @@ " return df, new_columns\n" ], "outputs": [], - "execution_count": 20 + "execution_count": 5 }, { "cell_type": "code", @@ -685,8 +685,8 @@ }, "scrolled": true, "ExecuteTime": { - "end_time": "2025-04-02T15:03:25.185749Z", - "start_time": "2025-04-02T15:03:19.095058Z" + "end_time": "2025-04-03T12:47:15.944254Z", + "start_time": "2025-04-03T12:47:10.826179Z" } }, "source": [ @@ -737,15 +737,15 @@ "industry_df = read_industry_data('../../data/sw_daily.h5')\n" ], "outputs": [], - "execution_count": 21 + "execution_count": 6 }, { "cell_type": "code", "id": "dbe2fd8021b9417f", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T15:03:25.217714Z", - "start_time": "2025-04-02T15:03:25.211561Z" + "end_time": "2025-04-03T12:47:15.969344Z", + "start_time": "2025-04-03T12:47:15.963327Z" } }, "source": [ @@ -761,19 +761,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "['ts_code', 'open', 'close', 'high', 'low', 'circ_mv', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg']\n" + "['ts_code', 'open', 'close', 'high', 'low', 'circ_mv', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg', 'in_date']\n" ] } ], - "execution_count": 22 + "execution_count": 7 }, { "cell_type": "code", "id": "85c3e3d0235ffffa", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T15:03:25.263787Z", - "start_time": "2025-04-02T15:03:25.256627Z" + "end_time": "2025-04-03T12:47:16.089879Z", + "start_time": "2025-04-03T12:47:15.990101Z" } }, "source": [ @@ -784,21 +784,32 @@ "name": "stdout", "output_type": "stream", "text": [ - "Empty DataFrame\n", - "Columns: [ts_code, trade_date, is_st]\n", - "Index: []\n" + " ts_code trade_date is_st\n", + "29 000037.SZ 2017-01-03 True\n", + "72 000408.SZ 2017-01-03 True\n", + "95 000504.SZ 2017-01-03 True\n", + "96 000505.SZ 2017-01-03 True\n", + "101 000511.SZ 2017-01-03 True\n", + "... ... ... ...\n", + "8476334 603869.SH 2025-03-28 True\n", + "8476339 603879.SH 2025-03-28 True\n", + "8476386 603959.SH 2025-03-28 True\n", + "8476769 688282.SH 2025-03-28 True\n", + "8476773 688287.SH 2025-03-28 True\n", + "\n", + "[192712 rows x 3 columns]\n" ] } ], - "execution_count": 23 + "execution_count": 8 }, { "cell_type": "code", "id": "92d84ce15a562ec6", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T15:26:42.881004Z", - "start_time": "2025-04-02T15:03:25.275794Z" + "end_time": "2025-04-03T13:08:01.612695Z", + "start_time": "2025-04-03T12:47:16.121802Z" } }, "source": [ @@ -846,15 +857,15 @@ ] } ], - "execution_count": 24 + "execution_count": 9 }, { "cell_type": "code", "id": "b87b938028afa206", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T15:26:44.711178Z", - "start_time": "2025-04-02T15:26:43.785812Z" + "end_time": "2025-04-03T13:08:03.658725Z", + "start_time": "2025-04-03T13:08:02.469611Z" } }, "source": [ @@ -884,15 +895,15 @@ "\n" ], "outputs": [], - "execution_count": 25 + "execution_count": 10 }, { "cell_type": "code", "id": "f4f16d63ad18d1bc", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T15:26:44.722470Z", - "start_time": "2025-04-02T15:26:44.717192Z" + "end_time": "2025-04-03T13:08:03.670700Z", + "start_time": "2025-04-03T13:08:03.665739Z" } }, "source": [ @@ -933,18 +944,15 @@ " return df, ret_feature_columns\n" ], "outputs": [], - "execution_count": 26 + "execution_count": 11 }, { "cell_type": "code", "id": "40e6b68a91b30c79", "metadata": { - "jupyter": { - "source_hidden": true - }, "ExecuteTime": { - "end_time": "2025-04-02T15:26:45.656660Z", - "start_time": "2025-04-02T15:26:44.774542Z" + "end_time": "2025-04-03T13:08:04.694262Z", + "start_time": "2025-04-03T13:08:03.694904Z" } }, "source": [ @@ -1001,16 +1009,19 @@ " def compute_stock_score(stock_df):\n", " stock_df = stock_df.sort_values(by=['trade_date'])\n", " future_return = stock_df['future_return']\n", - " volatility = stock_df['close'].pct_change().rolling(days).std().shift(-days)\n", + " # 使用已有的 pct_chg 字段计算波动率\n", + " volatility = stock_df['pct_chg'].rolling(days).std().shift(-days)\n", " max_drawdown = stock_df['close'].rolling(days).apply(calculate_max_drawdown, raw=False).shift(-days)\n", " score = future_return - lambda_param * max_drawdown\n", - "\n", " return score\n", "\n", - " scores = df.groupby('ts_code').apply(lambda x: compute_stock_score(x))\n", - " scores = scores.reset_index(level=0, drop=True)\n", + " # # 确保 DataFrame 按照股票代码和交易日期排序\n", + " # df = df.sort_values(by=['ts_code', 'trade_date'])\n", "\n", - " return scores\n", + " # 对每个股票分别计算 score\n", + " df['score'] = df.groupby('ts_code').apply(compute_stock_score).reset_index(level=0, drop=True)\n", + "\n", + " return df['score']\n", "\n", "\n", "def remove_highly_correlated_features(df, feature_columns, threshold=0.9):\n", @@ -1129,15 +1140,15 @@ " return df\n" ], "outputs": [], - "execution_count": 27 + "execution_count": 12 }, { "cell_type": "code", "id": "47c12bb34062ae7a", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T15:52:19.994776Z", - "start_time": "2025-04-02T15:47:05.010739Z" + "end_time": "2025-04-03T14:57:50.841165Z", + "start_time": "2025-04-03T14:49:25.889057Z" } }, "source": [ @@ -1148,6 +1159,7 @@ "\n", "gc.collect()\n", "\n", + "df = df.sort_values(by=['ts_code', 'trade_date'])\n", "# df['future_return'] = df.groupby('ts_code', group_keys=False)['close'].apply(lambda x: x.shift(-days) / x - 1)\n", "df['future_return'] = (df.groupby('ts_code')['close'].shift(-days) - df.groupby('ts_code')['open'].shift(-1)) / \\\n", " df.groupby('ts_code')['open'].shift(-1)\n", @@ -1156,10 +1168,11 @@ " .transform(lambda x: x.rolling(days).std().shift(-days))\n", ")\n", "\n", - "df['future_score'] = (\n", - " 0.7 * df['future_return']\n", - " # + 0.3 * df['future_volatility']\n", - ")\n", + "# df['future_score'] = (\n", + "# 0.7 * df['future_return']\n", + "# * 0.3 * df['future_volatility']\n", + "# )\n", + "df['future_score'] = calculate_score(df, days=2, lambda_param=0.3)\n", "\n", "filter_index = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99))\n", "filter_index = df['future_volatility'].between(df['future_volatility'].quantile(0.01),\n", @@ -1170,7 +1183,7 @@ "# )\n", "\n", "df['label'] = df.groupby('trade_date', group_keys=False)['future_score'].transform(\n", - " lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n", + " lambda x: pd.qcut(x, q=20, labels=False, duplicates='drop')\n", ")\n", "\n", "\n", @@ -1182,8 +1195,8 @@ " return np.sign(values) * np.log1p(np.abs(values))\n", "\n", "\n", - "train_data = df[filter_index & (df['trade_date'] <= '2024-03-01') & (df['trade_date'] >= '2000-01-01')]\n", - "test_data = df[(df['trade_date'] >= '2024-03-01')]\n", + "train_data = df[filter_index & (df['trade_date'] <= '2023-08-01') & (df['trade_date'] >= '2000-01-01')]\n", + "test_data = df[(df['trade_date'] >= '2023-08-01')]\n", "\n", "\n", "def select_pre_zt_stocks_dynamic(stock_df):\n", @@ -1298,17 +1311,17 @@ "去极值\n", "去极值\n", "检测到 13 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'obv', 'log(circ_mv)', 'alpha_003', 'log_close', 'up', 'down', 'mv_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume']\n", - "feature_columns: ['pe_ttm', 'volume_ratio', 'winner_rate', 'upside_volatility_20', 'downside_volatility_20', 'volatility_ratio_20', 'upside_semi_variance_20', 'downside_semi_variance_20', 'positive_negative_days_ratio_20', 'avg_positive_return_magnitude_20', 'avg_negative_return_magnitude_20', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_007', 'alpha_013', 'cat_up_limit', 'cat_down_limit', 'up_limit_count_10d', 'down_limit_count_10d', 'consecutive_up_limit', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'arbr', 'momentum_factor', 'resonance_factor', 'cat_vol_spike', 'obv-maobv_6', 'std_return_5 / std_return_90', 'std_return_90 - std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_momentum', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile']\n", - "1107768\n", + "feature_columns: ['pe_ttm', 'volume_ratio', 'winner_rate', 'upside_volatility_5', 'downside_volatility_5', 'volatility_ratio_5', 'upside_semi_variance_5', 'downside_semi_variance_5', 'positive_negative_days_ratio_5', 'avg_positive_return_magnitude_5', 'avg_negative_return_magnitude_5', 'return_skew', 'return_kurtosis', 'volume_change_rate', 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike', 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike', 'vol_std_5', 'atr_14', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_007', 'alpha_013', 'cat_up_limit', 'cat_down_limit', 'up_limit_count_10d', 'down_limit_count_10d', 'consecutive_up_limit', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'arbr', 'momentum_factor', 'resonance_factor', 'cat_vol_spike', 'obv-maobv_6', 'std_return_5 / std_return_90', 'std_return_90 - std_return_90_2', 'cat_af2', 'cat_af3', 'cat_af4', 'act_factor5', 'act_factor6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'ctrl_strength', 'low_cost_dev', 'asymmetry', 'lock_factor', 'cat_vol_break', 'cost_atr_adj', 'cat_golden_resonance', 'mv_momentum', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry_act_factor1', 'industry_act_factor2', 'industry_act_factor3', 'industry_act_factor4', 'industry_act_factor5', 'industry_act_factor6', 'industry_rank_act_factor1', 'industry_rank_act_factor2', 'industry_rank_act_factor3', 'industry_return_5_percentile', 'industry_return_20_percentile']\n", + "590201\n", "最小日期: 2018-06-04\n", - "最大日期: 2024-03-01\n", - "191955\n", - "最小日期: 2024-03-01\n", + "最大日期: 2023-08-01\n", + "179005\n", + "最小日期: 2023-08-01\n", "最大日期: 2025-03-28\n" ] } ], - "execution_count": 42 + "execution_count": 55 }, { "cell_type": "code", @@ -1318,8 +1331,8 @@ "source_hidden": true }, "ExecuteTime": { - "end_time": "2025-04-02T15:52:20.199221Z", - "start_time": "2025-04-02T15:52:20.184447Z" + "end_time": "2025-04-03T14:57:51.050696Z", + "start_time": "2025-04-03T14:57:51.034030Z" } }, "source": [ @@ -1466,36 +1479,36 @@ " return model, scaler\n" ], "outputs": [], - "execution_count": 43 + "execution_count": 56 }, { "cell_type": "code", "id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T16:43:22.759100Z", - "start_time": "2025-04-02T16:41:20.073261Z" + "end_time": "2025-04-03T15:03:18.426481Z", + "start_time": "2025-04-03T15:02:19.926352Z" } }, "source": [ "print('train data size: ', len(train_data))\n", "\n", "label_gain = list(range(len(train_data['label'].unique())))\n", - "label_gain = [gain for gain in label_gain]\n", + "label_gain = [gain * gain for gain in label_gain]\n", "light_params = {\n", " 'label_gain': label_gain,\n", " 'objective': 'lambdarank',\n", " 'metric': 'ndcg',\n", - " 'learning_rate': 0.1,\n", - " 'num_leaves': 1024,\n", - " 'min_data_in_leaf': 128,\n", + " 'learning_rate': 0.03,\n", + " 'num_leaves': 32,\n", + " # 'min_data_in_leaf': 128,\n", " 'max_depth': 8,\n", - " 'max_bin': 1024,\n", + " 'max_bin': 32,\n", " 'feature_fraction': 0.7,\n", - " 'bagging_fraction': 1,\n", + " 'bagging_fraction': 0.7,\n", " 'bagging_freq': 5,\n", - " 'lambda_l1': 1,\n", - " 'lambda_l2': 1,\n", + " 'lambda_l1': 0.1,\n", + " 'lambda_l2': 0.1,\n", " 'boosting': 'goss',\n", " 'verbosity': -1,\n", " 'extra_trees': True,\n", @@ -1511,14 +1524,14 @@ "gc.collect()\n", "\n", "use_pca = False\n", - "feature_contri = [2 if feat.startswith('act_factor') else 1 for feat in feature_columns]\n", - "light_params['feature_contri'] = feature_contri\n", - "print(f'feature_contri: {feature_contri}')\n", + "# feature_contri = [2 if feat.startswith('act_factor') or 'buy' in feat or 'sell' in feat else 1 for feat in feature_columns]\n", + "# light_params['feature_contri'] = feature_contri\n", + "# print(f'feature_contri: {feature_contri}')\n", "model, scaler, pca = train_light_model(train_data.dropna(subset=['label']),\n", " light_params, feature_columns,\n", " [lgb.log_evaluation(period=100),\n", " lgb.callback.record_evaluation(evals),\n", - " lgb.early_stopping(50, first_metric_only=True)\n", + " lgb.early_stopping(100, first_metric_only=True)\n", " ], evals,\n", " num_boost_round=1000, validation_days=120,\n", " print_feature_importance=True, use_pca=use_pca)\n", @@ -1530,14 +1543,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "train data size: 1107768\n", - "feature_contri: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n", - "原始训练集大小: 1107768\n", - "划分后的训练集大小: 1017570, 验证集大小: 90198\n", + "train data size: 590201\n", + "原始训练集大小: 590201\n", + "划分后的训练集大小: 537198, 验证集大小: 53003\n", "feature_columns size: 94\n", - "Training until validation scores don't improve for 50 rounds\n", + "Training until validation scores don't improve for 100 rounds\n", + "[100]\ttrain's ndcg@1: 0.727839\tvalid's ndcg@1: 0.35097\n", "Early stopping, best iteration is:\n", - "[26]\ttrain's ndcg@1: 0.527242\tvalid's ndcg@1: 0.572077\n", + "[67]\ttrain's ndcg@1: 0.702439\tvalid's ndcg@1: 0.403463\n", "Evaluated only: ndcg@1\n" ] }, @@ -1546,7 +1559,7 @@ "text/plain": [ "
" ], - "image/png": "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nTqV3r174+npWW4gC3DjjTcyc+ZMJk2axIABAzhw4ADffPMNrVq1stNZVU9UVBS33nor8+fPJykpyToN3vJ9qU/FMkXjJQGQEA3IggULiIqK4qOPPuL555/HycmJiIgI7rnnHq666irrfi+//DIxMTG88cYbpKenM2TIkEoHQAAPPPAAgYGB/O9//2PWrFkYDAY6dOjAv/71r3Jf161bN/744w+mTp3Kyy+/TPPmzZkxYwZxcXElAqCXX36Zixcv8uOPP/L9999z/fXXs3LlyjKTve0tKiqKlStX8vTTT/PSSy8RFhbGzJkzOXLkCEePHq3w9Y899hh79+7l888/Z968eYSHh1cYAD3//PNkZmayePFilixZQs+ePVm+fDnPPfecvU6r2r788kuCg4P59ttv+eWXXxg+fDhLliyhffv29aLqthCKKlltQghRaWPGjOHQoUOl5jI1Vnv37iUyMpKvv/6a8ePHO7o5QpRLcoCEEKICVy6keuLECVasWGFdQqQxKm1x2fnz56PT6Rg8eLADWiRE5cgQmBBCVKBVq1ZMnDiRVq1aERMTw4cffoizszPPPvuso5vmMG+88Qa7du1i2LBhODk5sXLlSlauXMlDDz1EWFiYo5snRIVkCEwIISowadIk1q9fT3x8PC4uLvTv35/XXnuNnj17OrppDrNmzRpmzJjB4cOHycjIoEWLFtx777288MILssK8qBckABJCCCFEoyM5QEIIIYRodCQAEkIIIUSjIwO1pTCbzVy4cAEvLy8p6CWEEELUE6qqkp6eTmhoKDpd+X08EgCV4sKFCzKLQQghhKinzp49S/PmzcvdRwKgUnh5eQFw5swZmjRp4uDWOIbRaGT16tXW5RQaK7kOcg1ArgHINbCQ61C3r0FaWhphYWHW/+PlkQCoFJZhLy8vL7y9vR3cGscwGo24u7vj7e1d537Aa5NcB7kGINcA5BpYyHWoH9fAlvQVSYIWQgghRKMjAZAQQgghGh0JgIQQQgjR6EgOkBBCCFFLzGYzeXl5jm5GtRiNRpycnMjJycFkMtXqexsMBvR6vV2OJQGQEEIIUQvy8vI4c+YMZrPZ0U2pFlVVCQ4O5uzZsw6plefr60twcHC131sCICGEEKKGqapKXFwcer2esLCwCov01WVms5mMjAw8PT1r9TxUVSUrK4vExEQAQkJCqnU8CYCE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" + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAkbpJREFUeJzs3Xd4k9XbwPFvku6WbjqAQtl7L9mgIIqiOBEQARUXuPi5UJn6ihNxggPEheLAybIgUxCw7L03bSmle6XJ8/5xmqShg7aUpk3uz3X1SvKsnJO2yZ1z7nOOTtM0DSGEEEIIJ6F3dAGEEEIIISqSBDdCCCGEcCoS3AghhBDCqUhwI4QQQginIsGNEEIIIZyKBDdCCCGEcCoS3AghhBDCqUhwI4QQQginIsGNEEIIIZyKBDdCCObPn49Op+P48eNX7TmmTp2KTqerNtd1tOPHj6PT6Zg/f365ztfpdEydOrVCyyREdSHBjRCVyBJE6HQ61q9fX2i/pmlERUWh0+m4+eaby/UcH3/8cbk/EEXZLFiwgFmzZjm6GEKIS0hwI4QDeHl5sWDBgkLb16xZw+nTp/H09Cz3tcsT3IwcOZKsrCzq1atX7ud1lJdffpmsrCyHPPfVDG7q1atHVlYWI0eOLNf5WVlZvPzyyxVcKiGqBwluhHCAQYMG8eOPP5KXl2e3fcGCBXTs2JGIiIhKKUdGRgYABoMBLy+vatW9Yym7m5sbXl5eDi7N5WVnZ2M2m0t9vE6nw8vLC4PBUK7n8/Lyws3NrVznClHdSXAjhAMMGzaMCxcuEBMTY92Wm5vLTz/9xPDhw4s8x2w2M2vWLFq2bImXlxfh4eE8/PDDXLx40XpMdHQ0e/bsYc2aNdbur759+wK2LrE1a9bw2GOPERYWRp06dez2XZpzs3TpUvr06UONGjXw9/enc+fORbY4XWr9+vV07twZLy8vGjZsyCeffFLomJJySi7NF7Hk1ezdu5fhw4cTFBREz5497fZdev748eP59ddfadWqFZ6enrRs2ZJly5YVeq7Vq1fTqVMnu7KWJo+nb9++LF68mBMnTlhf6+joaOs1dTod33//PS+//DK1a9fGx8eH1NRUkpKSeOaZZ2jdujV+fn74+/tz4403smPHjsu+PqNHj8bPz48zZ84wZMgQ/Pz8qFmzJs888wwmk6lUr+Hhw4cZPXo0gYGBBAQEMGbMGDIzM+3OzcrK4oknniA0NJQaNWpwyy23cObMGcnjEdWGhPVCOEB0dDTdunXju+++48YbbwRUIJGSksI999zD+++/X+ichx9+mPnz5zNmzBieeOIJjh07xocffsi2bdv4559/cHd3Z9asWTz++OP4+fnx0ksvARAeHm53nccee4yaNWsyefJka+tHUebPn8/9999Py5YtmThxIoGBgWzbto1ly5YVG4AB7Nq1i+uvv56aNWsydepU8vLymDJlSqFylMddd91F48aNee2119A0rcRj169fz6JFi3jssceoUaMG77//PnfccQcnT54kJCQEgG3btnHDDTcQGRnJtGnTMJlMTJ8+nZo1a162LC+99BIpKSmcPn2ad999FwA/Pz+7Y1555RU8PDx45plnyMnJwcPDg7179/Lrr79y1113Ub9+feLj4/nkk0/o06cPe/fupVatWiU+r8lkYuDAgXTt2pW3336bFStW8M4779CwYUMeffTRy5b77rvvpn79+syYMYOtW7fy+eefExYWxhtvvGE9ZvTo0fzwww+MHDmSa665hjVr1nDTTTdd9tpCVBmaEKLSfPHFFxqgbdmyRfvwww+1GjVqaJmZmZqmadpdd92l9evXT9M0TatXr5520003Wc9bt26dBmjffvut3fWWLVtWaHvLli21Pn36FPvcPXv21PLy8orcd+zYMU3TNC05OVmrUaOG1rVrVy0rK8vuWLPZXGIdhwwZonl5eWknTpywbtu7d69mMBi0gm85x44d0wDtiy++KHQNQJsyZYr18ZQpUzRAGzZsWKFjLfsuPd/Dw0M7fPiwdduOHTs0QPvggw+s2wYPHqz5+PhoZ86csW47dOiQ5ubmVuiaRbnpppu0evXqFdq+atUqDdAaNGhg/f1aZGdnayaTyW7bsWPHNE9PT2369Ol22y59fUaNGqUBdsdpmqa1b99e69ixY6HXoKjX8P7777c77rbbbtNCQkKsj2NjYzVAe+qpp+yOGz16dKFrClFVSbeUEA5y9913k5WVxZ9//klaWhp//vlnsS0iP/74IwEBAQwYMIDExETrT8eOHfHz82PVqlWlft6xY8deNo8jJiaGtLQ0XnjhhUL5LCV115hMJpYvX86QIUOoW7eudXvz5s0ZOHBgqctYnEceeaTUx/bv35+GDRtaH7dp0wZ/f3+OHj1qLeuK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ob311lvWbcnJyZqnp6f23XffVUYRK8xNN92k3X///Xbbbr/9dm3EiBGapjlXXQHtl19+sT4uTd327t2rAdqWLVusxyxdulTT6XTamTNnKq3sZXVpXYuyefNmDdBOnDihaZrz1fX06dNa7dq1td27d2v16tXT3n33Xeu+6lpXTSu6vkOHDtXuvffeYs+prPdol2m5yc3NJTY2lv79+1u36fV6+vfvz8aNGx1YsoqXkpIC2BYJjY2NxWg02tW9WbNm1K1bt9rWfdy4cdx00012dQLnq+vvv/9Op06duOuuuwgLC6N9+/Z89tln1v3Hjh0jLi7Orr4BAQF07dq12tW3e/furFy5koMHDwKwY8cO1q9fz4033gg4V10vVZq6bdy4kcDAQDp16mQ9pn///uj1ejZt2lTpZa5IKSkp6HQ6AgMDAeeqq9lsZuTIkTz77LO0bNmy0H5nq+vixYtp0qQJAwcOJCwsjK5du9p1XVXWe7TLBDeJiYmYTCbCw8PttoeHhxMXF+egUlU8s9nMU089RY8ePWjVqhUAcXFxeHh4WN84LKpr3b///nu2bt3KjBkzCu1ztroePXqU2bNn07hxY5YvX86jjz7KE088wZdffglgrZMz/F2/8MIL3HPPPTRr1gx3d3fat2/PU089xYgRIwDnquulSlO3uLg4wsLC7Pa7ubkRHBxcreufnZ3N888/z7Bhw6wLLDpTXd944w3c3Nx44oknitzvTHVNSEggPT2d119/nRtuuIG//vqL2267jdtvv501a9YAlfce7XKrgju7cePGsXv3btavX+/oolwVp06d4sknnyQmJsauD9dZmc1mOnXqxGuvvQZA+/bt2b17N3PmzGHUqFEOLl3F+uGHH/j2229ZsGABLVu2ZPv27Tz11FPUqlXL6eoqFKPRyN13342macyePdvRxalwsbGxvPfee2zduhWdTufo4lx1ZrMZgFtvvZWnn34agHbt2rFhwwbmzJlDnz59Kq0sLtNyExoaisFgKJSRHR8fT0REhINKVbHGjx/Pn3/+yapVq6hTp451e0REBLm5uSQnJ9sdXx3rHhsbS0JCAh06dMDNzQ03NzfWrFnD+++/j5ubG+Hh4U5TV4DIyEhatGhht6158+bWkQeWOjnD3/Wzzz5rbb1p3bo1I0eO5Omnn7a20DlTXS9VmrpFREQUGvyQl5dHUlJStay/JbA5ceIEMTEx1lYbcJ66rlu3joSEBOrWrWt9vzpx4gT/+9//iI6OBpynrqA+Z93c3C77nlUZ79EuE9x4eHjQsWNHVq5cad1mNptZuXIl3bp1c2DJrpymaYwfP55ffvmFv//+m/r169vt79ixI+7u7nZ1P3DgACdPnqx2db/uuuvYtWsX27dvt/506tSJESNGWO87S10BevToUWhY/8GDB6lXrx4A9evXJyIiwq6+qampbNq0qdrVNzMzE73e/i3JYDBYvw06U10vVZq6devWjeTkZGJjY63H/P3335jNZrp27VrpZb4SlsDm0KFDrFixgpCQELv9zlLXkSNHsnPnTrv3q1q1avHss8+yfPlywHnqCupztnPnziW+Z1Xa51GFpSZXA99//73m6empzZ8/X9u7d6/20EMPaYGBgVpcXJyji3ZFHn30US0gIEBbvXq1du7cOetPZmam9ZhHHnlEq1u3rvb3339r//33n9atWzetW7duDix1xSk4WkrTnKuumzdv1tzc3LT/+7//0w4dOqR9++23mo+Pj/bNN99Yj3n99de1wMBA7bffftN27typ3XrrrVr9+vW1rKwsB5a87EaNGqXVrl1b+/PPP7Vjx45pixYt0kJDQ7XnnnvOekx1rmtaWpq2bds2bdu2bRqgzZw5U9u2bZt1hFBp6nbDDTdo7du31zZt2qStX79ea9y4sTZs2DBHValYJdU1NzdXu+WWW7Q6depo27dvt3vPysnJsV7DGepalEtHS2la9amrpl2+vosWLdLc3d21Tz/9VDt06JD2wQcfaAaDQVu3bp31GpXxHu1SwY2madoHH3yg1a1bV/Pw8NC6dOmi/fvvv44u0hUDivz54osvrMdkZWVpjz32mBYUFKT5+Phot912m3bu3DnHFboCXRrcOFtd//jjD61Vq1aap6en1qxZM+3TTz+12282m7VJkyZp4eHhmqenp3bddddpBw4ccFBpyy81NVV78skntbp162peXl5agwYNtJdeesnuA68613XVqlVF/p+OGjVK07TS1e3ChQvasGHDND8/P83f318bM2aMlpaW5oDalKykuh47dqzY96xVq1ZZr+EMdS1KUcFNdamrppWuvnPnztUaNWqkeXl5aW3bttV+/fVXu2tUxnu0TtMKTP8phBBCCFHNuUzOjRBCCCFcgwQ3QgghhHAqEtwIIYQQwqlIcCOEEEIIpyLBjRBCCCGcigQ3QgghhHAqEtwIIYQQwqlIcCOEcAnR0dHMmjXL0cUQQlQCCW6EEBVu9OjRDBkyBIC+ffvy1FNPVdpzz58/n8DAwELbt2zZwkMPPVRp5RBCOI6bowsghBClkZubi4eHR7nPr1mzZgWWRghRlUnLjRDiqhn9/+3dXUjTXQDH8e9faVDOzSjpjdEIW7n6Z/YCZWCRozAKQUiTWGQQSHXhhXTVhUHZCyiZFUEQmXQR9ApCha1c4IWpvVA2KNQxoWEtM1rdlHueC3lGy+fFeNzzwPh94Fzs7Jyd/zkX48c5Z2z3bvx+P42NjRiGgWEYBINBAF6+fElxcTFWq5VZs2bh9XqJRCLxvhs2bODAgQNUV1czc+ZMNm/eDEBDQwOmaZKRkYHD4WDfvn1Eo1EA2tvbqays5NOnT/HxamtrgfHHUqFQiJKSEqxWKzabjbKyMoaGhuLv19bWsnz5clpaWnA6ndjtdnbs2MHnz5/jba5du4ZpmkydOpUZM2bg8Xj48uVLklZTRCZK4UZEkqaxsZG1a9eyd+9ewuEw4XAYh8PByMgIGzduJD8/n+7ubu7evcvQ0BBlZWUJ/Zubm7FYLHR0dHD+/HkA0tLSOH36NL29vTQ3N/PgwQMOHjwIQEFBAadOncJms8XHq6mpGfdcsViMkpIShoeH8fv9tLW10d/fT3l5eUK7vr4+bt26RWtrK62trfj9fo4fPw5AOBymoqKCPXv2EAgEaG9vp7S0FP1dn8j/T8dSIpI0drsdi8XCtGnTmD17drz+zJkz5OfnU1dXF6+7ePEiDoeD169f43K5AFi4cCEnT55M+Mwf7+84nU6OHDlCVVUV586dw2KxYLfbMQwjYbyf+Xw+Xrx4wcDAAA6HA4DLly+zZMkSurq6WL16NTAWgi5dukRmZiYAXq8Xn8/H0aNHCYfDfP/+ndLSUubPnw+AaZr/YrVEZLJo50ZE/nPPnz/n4cOHWK3WeFm8eDEwtlvyh5UrV47re//+fYqKipg3bx6ZmZl4vV4+fPjA169fJzx+IBDA4XDEgw2A2+0mKyuLQCAQr3M6nfFgAzBnzhzevXsHQF5eHkVFRZimyfbt27lw4QIfP36c+CKISNIo3IjIfy4ajbJt2zaePXuWUN68eUNhYWG8XUZGRkK/YDDI1q1bWbZsGdevX6enp4ezZ88CYxeOJ9uUKVMSXhuGQSwWAyA9PZ22tjbu3LmD2+2mqamJRYsWMTAwMOnPISK/RuFGRJLKYrEwOjqaULdixQp6e3txOp3k5OQklJ8DzY96enqIxWLU19ezZs0aXC4Xb9++/cfxfpabm8vg4CCDg4PxulevXjEyMoLb7Z7w3AzDYN26dRw+fJinT59isVi4efPmhPuLSHIo3IhIUjmdTjo7OwkGg0QiEWKxGPv372d4eJiKigq6urro6+vj3r17VFZW/m0wycnJ4du3bzQ1NdHf309LS0v8ovGP40WjUXw+H5FI5E+PqzweD6ZpsnPnTp48ecLjx4/ZtWsX69evZ9WqVROaV2dnJ3V1dXR3dxMKhbhx4wbv378nNzf31xZIRCadwo2IJFVNTQ3p6em43W6ys7MJhULMnTuXjo4ORkdH2bRpE6ZpUl1dTVZWFmlpf/21lJeXR0NDAydOnGDp0qVcuXKFY8eOJbQpKCigqqqK8vJysrOzx11IhrEdl9u3bzN9+nQKCwvxeDwsWLCAq1evTnheNpuNR48esWXLFlwuF4cOHaK+vp7i4uKJL46IJIXxm363KCIiIilEOzciIiKSUhRuREREJKUo3IiIiEhKUbgRERGRlKJwIyIiIilF4UZERERSisKNiIiIpBSFGxEREUkpCjciIiKSUhRuREREJKUo3IiIiEhKUbgRERGRlPI7Uovbmf+ANF0AAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" @@ -1556,7 +1569,7 @@ "text/plain": [ "
" ], - "image/png": "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cqJixYr4+fmRkpKi3ufl5cXatWu5efMmSqWSqKgo7t+/T4sWLYovYEChUqlUxRqBEC/Bzz//TGhoKBcuXMDU1BRPT088PT0JDw/XKLd7925atGjBkSNH+PTTTzlz5gweHh5MnDiR999/n2PHjlG7du2nthUbG0vLli2Jjo5m0qRJnDp1iu3bt9OsWTNmz57N119/zbVr16hSpQqTJ0/mgw8+4OLFi1SoUEGjnj59+hAREYGrqyuBgYEEBgaq99WuXZvOnTsTEhICgEKh4Msvv2TLli3s3LmTMWPGALBx40ZGjRrF5MmTuXXrFu3bt2f58uVYWFg89Rju3buHhYUFmzZtokOHDurtdevWpX379kyfPh2VSoWTkxOjRo1i9OjRANy5cwd7e3siIiL46KOPntoGQFpaGlZWVlQatZYHBmbPLC8eMtZXMadBLmOP6JOVqyjucF4bkjftSc50I3nTTUnO28VZHZ5ZZsuWLaSnp1O1alWuXr1KaGgof//9N8eOHWPfvn00atSIjz/+mO3bt2NgYICpqSk//fQT3t7eLzzevM/vO3fuYGlp+dSyBi+8dSFeMVevXqVHjx7MmTOHLl26cPfuXfbt20fv3r1JSUkhLS2NFStWAGBtbU16ejodO3akbdu2rF69muTkZIYPH651u+PHjyc8PJyKFStSpkwZwsLCWL16NV999RVubm7s3buXjz/+GFtbW5o0acK6devo2rUriYmJWFpaYmJiolV7ISEhzJo1iwULFmBgYMB3331HUlISGzdu5LfffuPWrVt069aNWbNmMWPGjKfW9eDBA3JzcylVqpTGdhMTE/X80OTkZK5du0abNm3U+62srGjYsCGHDh0qsLORlZVFVlaW+nlaWhoAxnoq9PXlvEdhGeupNP4VhSN5057kTDeSN92U5LwVZkbCo5+37u7u1KlTh8qVK7N27VqcnJwIDg7m1q1bbN26FRsbG3755Re6devGrl27qFGjxkuPN490NsQb7+rVqzx48ID3338fFxcXAPV/OhMTE7KysnBwcFCXj4iIQKlU8u2331KqVCmqV6/OlStXGDx4sFbtTp06lbZt2wIPv2TPnDmTHTt24OXlBUDFihXZv38/y5Yto3nz5lhbWwNgZ2dH6dKltT7Onj170rdvX41tSqWSiIgI9UhGr1692Llz5zM7GxYWFnh5eTFt2jTc3d2xt7fnhx9+4NChQ1SuXBl4eNULAHt7e43X2tvbq/c9LiwsjNDQ0HzbJ3kqMTXNLdyBCrVp9ZTFHcJrSfKmPcmZbiRvuimJeYuOjtbpdXZ2duzcuZM2bdrw1VdfsWjRIu7fv8/ff/9N3bp1cXFxYcKECVp/h3mWzMzMQpeVzoZ449WqVYvWrVtTo0YNfHx88Pb25oMPPqBMmTIFlj9z5gw1a9bUOKuf10HQRr169dQ/X7hwgczMTHXnI092djaenp5a1/2s9vK4urpqTJlydHQkNTW1UPV9//33fPLJJ5QtWxZ9fX3q1KlDjx49nmuhWVBQECNHjlQ/T0tLw9nZmZYtW2JjY6NzvSVNTk4OMTExtG3bFkNDw+IO57UhedOe5Ew3kjfdSN60k56ezo0bN3jnnXfUswaaN2+Ou7u7uswXX3xBuXLl8PX1faFt581MKAzpbIg3nr6+PjExMRw8eJDt27ezePFiJk6cSFxcXJG2a2b2vzUI6enpAGzevJmyZctqlDM2Nn5qPXp6ejy+tKqg4ctH28vz+B9rhUKBUlm4M0aVKlViz549ZGRkkJaWhqOjI927d6dixYoA6tGgf//9F0dHR/Xr/v333yeuazE2Ni7weA0NDeWDRQeSN91I3rQnOdON5E03kreCjR49mk6dOuHi4sI///zDlClT0NfXp2fPnuqZBwEBAYSHh2NjY8PGjRvZsWMHv/322wvPpzb1ydWoRImgUCho3LgxoaGhHDt2DCMjIzZs2ICRkRG5uZrTd9zd3Tl58qTGFZUOHz78XO1Xq1YNY2NjUlJSqFy5ssbD2dkZACMjI4B88dja2nL16lX187S0NJKTk58rHm2YmZnh6OjIrVu32LZtG++99x4AFSpUwMHBgZ07d2rEFhcXp9NIkBBCCCGe7MqVK/To0YOqVavSrVs3bGxsOHz4MLa2thgYGLBp0yZsbW3p1KkTNWvWZNWqVaxcufKFj2poS0Y2xBsvLi6OnTt34u3tjZ2dHXFxcfz333+4u7tz//59tm3bRmJiIjY2NlhZWdGzZ08mTpzIgAEDCAoK4uLFi/muWqUtCwsLRo8ezYgRI1AqlTRp0oQ7d+5w4MABLC0t6dOnDy4uLigUCn777Td8fX0xMTHB3NycVq1aERERQadOnShdujTBwcHo6+u/oOw82bZt21CpVFStWpULFy4wZswY3n77bfW6EIVCQWBgINOnT8fNzY0KFSowefJknJycXpl7lwghhBBviqioqAK35812cHNzeyXuGP446WyIN56lpSV79+5lwYIFpKWl4eLiwty5c2nfvj316tUjNjaWevXqkZ6err707a+//sqgQYPw9PSkWrVqzJ49m65duz5XHNOmTcPW1pawsDD++usvSpcuTZ06dZgwYQIAZcuWJTQ0lPHjx9O3b1969+5NREQEQUFBJCcn07FjR6ysrJg2bdpLGdm4c+cOQUFBXLlyBWtra7p27cqMGTM0hk7Hjh1LRkYGAwcO5Pbt2zRp0oStW7fmu4qVEEIIIUomuc+GEKLY5F2n+/r167JAXAs5OTlER0fj6+sr85q1IHnTnuRMN5I33UjedFMcedPmPhuyZkMIIYQQQghRJKSzIYSWBg0ahLm5eYGPQYMGFXd4hZKSkvLEYzA3NyclJaW4QxRCCCHEG0DWbAihpalTpzJ69OgC9z1rKPFV4eTkxPHjx5+6XwghhBDieUlnQwgt2dnZYWdnV9xhPBcDAwP1ncCFEEIIIYqKTKMSQgghhBBCFAnpbAjxiouNjUWhUHD79u0ibysiIoLSpUurn4eEhDzxbuBCCCFKhlmzZqnvrZSnRYsWKBQKjcfrsm5RvFzS2RBCC2/6l+/u3btz7ty54g5DCCHEKyI+Pp5ly5ZRs2bNfPsGDBjA1atX1Y85c+YUQ4TiVSedDSGEmomJyWu/HkUIIcSLkZ6ejp+fH8uXL6dMmTL59puamuLg4KB+vC4XSREvl3Q2RImjVCqZM2cOlStXxtjYmPLlyzNjxgwAxo0bR5UqVTA1NaVixYpMnjyZnJwc4OEUo9DQUE6cOKEeMo6IiHhqWz179qR79+4a23JycnjrrbdYtWoVAFlZWQwbNgw7OztKlSpFkyZNiI+P1+nYLl26RKdOnShTpgxmZmZUr16d6Oho4H/TsTZv3kzNmjUpVaoU77zzDgkJCerXPz6N6nFJSUlUrFiRgIAAVCoVWVlZjB49mrJly2JmZkbDhg2JjY3VKXYhhBCvlqFDh9KhQwfatGlT4P41a9bw1ltv4eHhQVBQEJmZmS85QvE6kKtRiRInKCiI5cuXM3/+fJo0acLVq1c5e/YsABYWFkRERODk5MSpU6cYMGAAFhYWjB07lu7du5OQkMDWrVvZsWMHAFZWVk9ty8/Pjw8//JD09HTMzc0B2LZtG5mZmXTp0gWAsWPHsm7dOlauXImLiwtz5szBx8eHCxcuYG1trdWxDR06lOzsbPbu3YuZmRmnT59Wt5tnzJgxLFy4EAcHByZMmECnTp04d+7cM+86evLkSXx8fOjXrx/Tp08HICAggNOnTxMVFYWTkxMbNmygXbt2nDp1Cjc3t3x1ZGVlkZWVpX6elpYGQLPZO3hgaKbVsZZkxnoqptWDulO3kqVUFHc4rw3Jm/YkZ7p51fOWEOLzzDJr167l6NGjHDp0iJycHFQqFUqlUn0Crnv37pQvXx5HR0dOnTrFxIkTOXPmDD/99JPOceXVnfevKJziyJs2bSlUKpWqCGMR4pVy9+5dbG1tWbJkCf37939m+fDwcKKiovj999+Bh2s2Nm7c+NR7VDzqwYMHODo6Mm/ePHr16gU8HO1QKpVERUWRkZFBmTJliIiIoGfPnsDD/8Curq4EBgYyZswYYmNjadmyJbdu3XrqqANAzZo16dq1K1OmTMm3L6+eqKgo9WjLzZs3KVeuHBEREXTr1o2IiAgCAwPVi9HzjvfLL7+kY8eOTJw4kVGjRgEPbwxYsWJFUlJSNO7L0aZNGxo0aMDMmTPzxRASEkJoaGi+7ZGRkZiamj47oUIIIYrcf//9x+jRowkNDcXV1RWAiRMnUqFChSd+dp48eZLg4GCWLl2Ko6PjS4xWFIfMzEx69uzJnTt3njl9TkY2RIly5swZsrKyaN26dYH7165dy6JFi0hKSiI9PZ0HDx481xxUAwMDunXrxpo1a+jVqxcZGRls2rSJqKgo4OG0pJycHBo3bqx+jaGhIQ0aNODMmTNatzds2DAGDx7M9u3badOmDV27ds23qM/Ly0v9s7W1NVWrVn1qWykpKbRt25YZM2ZoXInk1KlT5ObmUqVKFY3yWVlZ2NjYFFhXUFAQI0eOVD9PS0vD2dmZ6cf0eGCor82hlmgPz5oqmfy73it51vRVJXnTnuRMN6963p41srFp0ybu3LmjPrkEkJuby+nTp9myZQvp6eno62v+zW7evDnBwcE4Ozvj7e2tU1w5OTnExMTQtm3bZ462i/8pjrzlzUwoDOlsiBLFxMTkifsOHTqEn58foaGh+Pj4YGVlRVRUFHPnzn2uNv38/GjevDmpqanExMRgYmJCu3btnqvOJ+nfvz8+Pj5s3ryZ7du3ExYWxty5c/nss890rtPW1hYnJyd++OEHPvnkE3XnK+/D5ujRo/k+dB6fupXH2NgYY2PjfNv3jmvzxA6KyC8nJ4fo6GiOBreTD2QtSN60JznTzeueNx8fH06dOqWxrW/fvrz99tuMGzeOUqVK5XvNn3/+CYCzs/NzH7OhoeFrmbfi9jLzpk07skBclChubm6YmJiwc+fOfPsOHjyIi4sLEydOpF69eri5uXHp0iWNMkZGRuTm5mrVZqNGjXB2dmbt2rWsWbOGDz/8UP2ftFKlShgZGXHgwAF1+ZycHOLj46lWrZoOR/jwD/2gQYNYv349o0aNYvny5Rr7Dx8+rP751q1bnDt3Dnd39yfWZ2Jiwm+//UapUqXw8fHh7t27AHh6epKbm0tqaiqVK1fWeDg4OOgUuxBCiOJnYWGBh4eHxsPMzAwbGxs8PDxISkpi2rRpHD16lIsXL/LLL7/Qu3dvmjVrVuAlckXJJiMbokQpVaoU48aNY+zYsRgZGdG4cWP+++8//vzzT9zc3EhJSSEqKor69euzefNmNmzYoPF6V1dXkpOTOX78OOXKlcPCwqLAM/WP69mzJ1999RXnzp1j9+7d6u1mZmYMHjyYMWPGYG1tTfny5ZkzZw6ZmZn069dP6+MLDAykffv2VKlShVu3brF79+58HYmpU6diY2ODvb09EydO5K233qJz585PrdfMzIzNmzfTvn172rdvz9atW6lSpQp+fn707t2buXPn4unpyX///cfOnTupWbMmHTp00Dp+IYQQrz4jIyN27NjBggULyMjIwNnZma5duzJp0qTiDk28gqSzIUqcyZMnY2BgQHBwMP/88w+Ojo4MGjSIfv36MWLECAICAsjKyqJDhw5MnjyZkJAQ9Wu7du3K+vXradmyJbdv32bFihX4+/s/s00/Pz9mzJiBi4uLxvoMeHhnVqVSSa9evbh79y716tVj27ZtBV7T/Flyc3MZOnQoV65cwdLSknbt2jF//vx87Q0fPpzz589Tu3Ztfv31V4yMjJ5Zt7m5OVu2bMHHx4cOHToQHR3NihUrmD59OqNGjeLvv//mrbfe4p133qFjx45axy6EEOLV9ehlzZ2dndmzZ0/xBSNeK3I1KiFKCG2uavWypKWlYWVlxfXr12XNhhby5oP7+vrKvGYtSN60JznTjeRNN5I33RRH3vI+vwtzNSpZsyGEEEIIIYQoEtLZEOI5rFmzBnNz8wIf1atXf+HttW/f/ontFXRfCyGEEEKI4iRrNoR4Du+++y4NGzYscF9RDGV+88033Lt3r8B9z7rbeIsWLZBZk0IIIYR4maSzIcRzsLCwwMLC4qW1V7Zs2ZfWlhBCCCHE85JpVEIIIYQQQogiIZ0NIYQQQog33KxZs1AoFAQGBqq3ffrpp1SqVAkTExNsbW157733OHv2bPEFKd5I0tkoJiEhIdSuXfupZS5evIhCoeD48eMvJSZR9GJjY1EoFNy+ffuF1y3vFyGEEAWJj49n2bJl+e7uXbduXVasWMGZM2fYtm0bKpUKb29vcnNziylS8SaSzkYxGT16NDt37lQ/9/f3z3cXZ2dnZ65evYqHh8dLjk47hek4iYcaNWrE1atXsbKyAiAiIuKVuefF48LCwqhfvz4WFhbY2dnRuXNnEhMTNcrcv3+foUOHYmNjg7m5OV27duXff/8tpoiFEEI8Lj09HT8/P5YvX57vZrEDBw6kWbNmuLq6UqdOHaZPn87ly5e5ePFi8QQr3kjS2Sgm5ubmz7yJmb6+Pg4ODhgYFM86/uzs7Jfankql4sGDBy+1zZfNyMgIBwcHFApFcYfyTHv27GHo0KEcPnyYmJgYcnJy8Pb2JiMjQ11mxIgR/Prrr/z000/s2bOHf/75h/fff78YoxZCCPGooUOH0qFDB9q0afPUchkZGaxYsYIKFSrg7Oz8kqITJcErezWqrVu3Mn36dBISEtDX18fLy4uFCxdSqVIlGjVqRNOmTZk9e7a6/H///YeTkxM7d+6kWbNmXL16lf79+7Nr1y4cHByYMWMGEyZMIDAwUGO+4pMoFAq+/PJLfvnlF2JjY3F0dGTOnDl88MEH6jKnTp1i+PDhHDp0CFNTU7p27cq8efMwNzcHHk6ZGTt2LH/++SeGhoZUr16dyMhIXFxcCAkJYePGjRw/fpyQkBBWrlypbhdg9+7duLq6UqFCBY4dO0bNmjUpX748EydOZPDgweoYjh07Rt26dUlOTsbFxYXbt28zevRoNm3aRFZWFvXq1WP+/PnUqlXrmcecF1NAQAAzZszg0qVLKJXKp9YZERFBaGioRuwrVqygRYsW6tjzRj1u375NmTJl2L17Ny1atFDf0To6OppJkyZx6tQptm/fTkhICDVr1qRUqVJ88803GBkZMWjQIEJCQp55DHlxfPXVV/z666/s2rULFxcXvvvuO2xtbenfvz/x8fHUqlWL77//nkqVKgGQlJTEyJEjOXz4MBkZGbi7uxMWFqbxx7kw7ymFQsHy5cvZvHkz27Zto2zZssydO5d3331X/Z7Iu4v38ePH6du3r0bupkyZQkhICAqFgg0bNmiMdpUuXZoFCxbg7+8PwJEjR/j00085c+YMHh4eTJw4MV8uEhISGDNmDPv27cPMzAxvb2/mz5/PW2+99cw8bt26VeN5REQEdnZ2HD16lGbNmnHnzh2+/fZbIiMjadWqFfDwd+/u7s7hw4d55513CvHbeqhh2E4eGJgVunxJZ6yvYk4D8AjZRlbuq99xfVVI3rQnOdNNUeft4qwOhSoXFRXFH3/8QXx8/BPLfPnll4wdO5aMjAyqVq1KTEwMRkZGLypUIV7dzkZGRgYjR46kZs2apKenExwcTJcuXTh+/Dh+fn7MmTNHvdgJYO3atTg5OdG0aVMAevfuzfXr14mNjcXQ0JCRI0eSmpqqVQyTJ09m1qxZLFy4kO+//56PPvqIU6dO4e7uTkZGBj4+Pnh5eREfH09qair9+/cnICCAiIgIHjx4QOfOnRkwYAA//PAD2dnZHDlypMAz2qNHj+bMmTOkpaWxYsUK4OE9E/755x91GT09PXr06EFkZKRGZ2PNmjU0btwYFxcXAD788ENMTEzYsmULVlZWLFu2jNatW3Pu3Lln3ocB4MKFC6xbt47169ejr6//zDq7d+9OQkICW7duZceOHQBYWVlpNZVm/PjxhIeHU7FiRfUQ78qVKxk5ciRxcXEcOnQIf39/GjduTNu2bQtV57Rp05g3bx7z5s1j3Lhx9OzZk4oVKxIUFET58uX55JNPCAgIYMuWLcDDYWZfX19mzJiBsbExq1atolOnTiQmJlK+fHmg8O+p0NBQ5syZw+eff87ixYvx8/Pj0qVL+fLfqFEjFixYQHBwsHp6Ul5H9VnS09Pp2LEjbdu2ZfXq1SQnJzN8+HCNMrdv36ZVq1b079+f+fPnc+/ePcaNG0e3bt3YtWtXodp51J07d4D/3c/j6NGj5OTkaHTI3n77bcqXL8+hQ4cK7GxkZWWRlZWlfp6WlgaAsZ4KfX25B0hhGeupNP4VhSN5057kTDdFnbecnJxnlrl8+TLDhw8nOjoafX19cnJyUKlUKJVKjdd369aNFi1acO3aNebNm8eHH37Inj17KFWqVJHE/jR5cRXm+MT/FEfetGnrle1sdO3aVeN53pnp06dP061bNwIDA9m/f7+6cxEZGUmPHj1QKBScPXuWHTt2EB8fT7169YCHN0Nzc3PTKoYPP/yQ/v37Aw+/vMbExLB48WK+/PJLIiMjuX//PqtWrcLM7OEZ2SVLltCpUydmz56NoaEhd+7coWPHjuqz5+7u7gW2Y25ujomJCVlZWTg4ODwxHj8/P+bOnUtKSgrly5dHqVQSFRXFpEmTANi/fz9HjhwhNTUVY2NjAMLDw9m4cSM///wzAwcOfOYxZ2dns2rVKmxtbQtdp7m5OQYGBk+N/WmmTp2arxNRs2ZNpkyZAoCbmxtLlixh586dhe5s9O3bl27dugEwbtw4vLy8mDx5Mj4+PgAMHz5cPaoAUKtWLY3Rn2nTprFhwwZ++eUXAgICtHpP+fv706NHDwBmzpzJokWLOHLkCO3atdMoZ2RkhJWVFQqFQuvcRUZGolQq+fbbbylVqhTVq1fnypUrGh3RJUuW4OnpqXFn8e+++w5nZ2fOnTtHlSpVCt2eUqkkMDCQxo0bq9cQXbt2DSMjo3xrTuzt7bl27VqB9YSFhalHwh41yVOJqaksSNTWtHrK4g7htSR5057kTDdFlbfo6Ohnljl8+DCpqak0aNBAvU2pVLJv3z6++OILfvrpJ/VJxTz+/v58/PHHhISE0KxZsxced2HFxMQUW9uvs5eZt8zMzEKXfWU7G+fPnyc4OJi4uDiuX7+OUvnwP2xKSgoeHh54e3uzZs0amjZtSnJyMocOHWLZsmUAJCYmYmBgQJ06ddT1Va5cOd/CqGfx8vLK9zzvSj9nzpyhVq1a6o4GQOPGjVEqlSQmJtKsWTP8/f3x8fGhbdu2tGnThm7duuHo6KhLOgCoXbs27u7uREZGMn78ePbs2UNqaioffvghACdOnCA9PT3fWpB79+6RlJRUqDZcXFzUHY0XVeez5H15f9TjV8xwdHTUamTq0dfb29sDUKNGDY1t9+/fJy0tDUtLS9LT0wkJCWHz5s1cvXqVBw8ecO/ePVJSUgDt3lOPtm1mZoalpaXWo2rPcubMGfVUszyPv19PnDjB7t27CxwtSUpK0qqzMXToUBISEti/f7/uQQNBQUGMHDlS/TwtLQ1nZ2emH9PjgaH+U14pHmWsp2JaPSWTf9cjSylTWwpL8qY9yZluijpvCSE+zyzTtGlT9Um3PAMGDKBq1aqMHj26wIvPZGVloaenR7Vq1fD19X1h8RZWTk4OMTExtG3bFkNDw5fe/uuqOPKWNzOhMF7ZzkanTp1wcXFh+fLlODk5oVQq8fDwUC9a9vPzY9iwYSxevJjIyEhq1Kih8WXyVbBixQqGDRvG1q1bWbt2LZMmTSImJkarueyP8/PzU3c2IiMjadeunbojkJ6ejqOjI7GxsfleV9grHj3aeXqeOvX0Hl57QKX63xDyk4bcHm8TyPefRaFQqDuchfHo6/OmrhW0La/O0aNHExMTQ3h4OJUrV8bExIQPPvhAp0Xyzxt73msezR1oPzyanp6uHml7nDad3oCAAH777Tf27t1LuXLl1NsdHBzIzs7m9u3bGu+Ff//994kjNcbGxuoRskftHdfmmRdMEP+Tk5NDdHQ0R4PbyQeyFiRv2pOc6eZVyJu1tXW+6bvm5ubY2tri6enJX3/9xdq1a/H29sbW1pYrV64wa9YsTExM6NSpU7H+vg0NDeX9poOXmTdt2nklr0Z148YNEhMTmTRpEq1bt8bd3Z1bt25plHnvvfe4f/8+W7duJTIyEj8/P/W+qlWr8uDBA44dO6beduHChXx1PMvhw4fzPc+bCuXu7s6JEyc0rsxz4MAB9PT0qFq1qnqbp6cnQUFBHDx4EA8PDyIjIwtsy8jIqFDXte7ZsycJCQkcPXqUn3/+WeO469Spw7Vr1zAwMKBy5coaj8IsCC5IYeosKPa80ZGrV6+qt73K9384cOAA/v7+dOnShRo1auDg4KBx6b8X9Z563JN+77a2thq5O3/+vMaQpbu7OydPnuT+/fvqbY+/X+vUqcOff/6Jq6trvt9dQR28x6lUKgICAtiwYQO7du2iQoUKGvvr1q2LoaGhxiWcExMTSUlJyTfKIoQQ4tVSqlQp9u3bh6+vL5UrV6Z79+5YWFhw8OBB7Ozsijs88QZ5JTsbZcqUwcbGhq+//poLFy6wa9cujakX8PBseOfOnZk8eTJnzpxRz5GHh4tU27Rpw8CBAzly5AjHjh1j4MCBmJiYaHXJ0Z9++onvvvuOc+fOMWXKFI4cOUJAQADwcIShVKlS9OnTh4SEBHbv3s1nn31Gr169sLe3Jzk5maCgIA4dOsSlS5fYvn0758+ff+K6DVdXV06ePEliYiLXr19/4llsV1dXGjVqRL9+/cjNzVVf5QigTZs2eHl50blzZ7Zv387Fixc5ePAgEydO5Pfffy/0cT+qMHW6urqSnJzM8ePHuX79OllZWZiYmPDOO+8wa9Yszpw5w549e9RrS15Fbm5urF+/nuPHj3PixAl69uypMRrxot5Tj3N1dSU9PZ2dO3dy/fp1dYeiVatWLFmyhGPHjvH7778zaNAgjbMIPXv2RKFQMGDAAE6fPk10dDTh4eEadQ8dOpSbN2/So0cP4uPjSUpKYtu2bfTt27dQHduhQ4eyevVqIiMjsbCw4Nq1a1y7do179+4BDy8E0K9fP0aOHMnu3bs5evQoffv2xcvL67lG74QQQhSN2NhYFixYAICTkxPR0dH8+++/ZGdnc/nyZdasWaNxwlSIF+GV7Gzo6ekRFRXF0aNH8fDwYMSIEXz++ef5yvn5+XHixAmaNm2qvmJQnlWrVmFvb0+zZs3o0qULAwYMwMLCQqurK4SGhhIVFUXNmjVZtWoVP/zwA9WqVQPA1NSUbdu2cfPmTerXr88HH3xA69atWbJkiXr/2bNn6dq1K1WqVGHgwIEMHTqUTz/9tMC28uZR1qtXD1tbWw4cOPDEuPKOu0uXLpiYmKi3KxQKoqOjadasGX379qVKlSp89NFHXLp0Sb1uQVuFqbNr1660a9eOli1bYmtryw8//AA8XIz84MED6tatS2BgINOnT9cphpdh3rx5lClThkaNGtGpUyd8fHw01mfAi3lPPa5Ro0YMGjSI7t27Y2try5w5cwCYO3cuzs7ONG3alJ49ezJ69GhMTU3VrzM3N+fXX3/l1KlTeHp6MnHixHzTpZycnDhw4AC5ubl4e3tTo0YNAgMDKV26tHqa29MsXbqUO3fu0KJFCxwdHdWPtWvXqsvMnz+fjh070rVrV5o1a4aDgwPr16/XOR9CCCGEeLMoVI9PDH9DXblyBWdnZ3bs2EHr1q2fWb6g+xwI8Sht31Miv7S0NKysrLh+/bqs2dBC3nxwX19fmdesBcmb9iRnupG86UbyppviyFve5/edO3ewtLR8atlXdoH489q1axfp6enUqFGDq1evMnbsWFxdXYv1Um7i9SbvKSGEEEII7byS06hehJycHCZMmED16tXp0qULtra26puxrVmzBnNz8wIf1atXL+7Qi0z16tWfeNxr1qwp7vAKpTh/d097T71uUlJSnphHc3Nz9SV/hRBCCCGexxs7suHj46O+gdvj3n33XRo2bFjgvrwvjm/i7LLo6OgnLjzXdU3Hy1aY311Redp76nXj5OT01KuDOTk5vbxghBBCCPHGemM7G09jYWGBhYVFcYfx0rm4uBR3CM+tpP7uXrS8SxkLIYQQQhSlN3YalRBCCCGEEKJ4SWdDCCGEEOIVMGvWLBQKBYGBgept9+/fZ+jQodjY2GBubk7Xrl35999/iy9IIbQknQ0hSojY2FgUCgW3b98u7lCEEEI8Jj4+nmXLllGzZk2N7SNGjODXX3/lp59+Ys+ePfzzzz+8//77xRSlENqTzoYQQgghRDFKT0/Hz8+P5cuXU6ZMGfX2O3fu8O233zJv3jxatWpF3bp1WbFiBQcPHuTw4cPFGLEQhSedDfHaaNGiBZ999hmBgYGUKVMGe3t7li9fTkZGBn379sXCwoLKlSuzZcsWlEol5cqVY+nSpRp1HDt2DD09PS5duvTM9hQKBcuWLaNjx46Ympri7u7OoUOHuHDhAi1atMDMzIxGjRqRlJSk8bqlS5dSqVIljIyMqFq1Kt9///0LqXfTpk3UqVOHUqVKUbFiRUJDQ3nw4IFGvd988w1dunTB1NQUNzc3fvnlFwAuXrxIy5YtAShTpgwKhQJ/f38AXF1dWbBggUZbtWvXJiQk5LljFkII8WxDhw6lQ4cOtGnTRmP70aNHycnJ0dj+9ttvU758eQ4dOvSywxRCJyXyalTi9bVy5UrGjh3LkSNHWLt2LYMHD2bDhg106dKFCRMmMH/+fHr16kVKSgo9evQgMjKSwYMHq1+/Zs0aGjduXOgrc02bNo158+Yxb948xo0bR8+ePalYsSJBQUGUL1+eTz75hICAALZs2QLAhg0bGD58OAsWLKBNmzb89ttv9O3bl3Llyqm/7OtS7759++jduzeLFi2iadOmJCUlMXDgQACmTJmirjc0NJQ5c+bw+eefs3jxYvz8/Lh06RLOzs6sW7eOrl27kpiYiKWlJSYmJlrlXtuYtdEwbCcPDMy0fl1JZayvYk4D8AjZRlauorjDeW1I3rQnOdNNXt4KIyoqij/++IP4+Ph8+65du4aRkRGlS5fW2G5vb8+1a9deQKRCFD3pbIjXSq1atZg0aRIAQUFBzJo1i7feeosBAwYAEBwczNKlSzl58iR+fn7MnTuXlJQUypcvj1KpJCoqSv36wujbty/dunUDYNy4cXh5eTF58mT1/TaGDx9O37591eXDw8Px9/dnyJAhAIwcOZLDhw8THh6u0dnQtt7Q0FDGjx9Pnz59AKhYsSLTpk1j7NixGp0Nf39/evToAcDMmTNZtGgRR44coV27dlhbWwNgZ2eX74OrKHJRkKysLLKystTP09LSADDWU6Gv/+bd26aoGOupNP4VhSN5057kTDd5+XrSva3yXL58meHDhxMdHY2+vj45OTmoVCqUSiU5OTnq0evH61GpVOTm5j6z/tdN3vG8acdV1Iojb9q0JZ0N8Vp5dOGcvr4+NjY21KhRQ70t7+aEqampvPvuu7i7uxMZGcn48ePZs2cPqampfPjhhzq1l1f34+3dv3+ftLQ0LC0tOXPmjHrEIU/jxo1ZuHDhc9V74sQJDhw4wIwZM9RlcnNzuX//PpmZmZiamuar18zMDEtLS1JTUwt9vE+jbcwFCQsLIzQ0NN/2SZ5KTE1zX0icJcm0esriDuG1JHnTnuRMNzExMU/df/jwYVJTU2nQ4H/DIEqlkn379vHFF18wZcoUsrOz+fHHHzE3N1eXuXTpErdu3SI6OrrIYi9Oz8qbKNjLzFtmZmahy0pnQ7xWHr9LuEKh0NimUDwc5lcqH34w+vn5qTsbkZGRtGvXDhsbG53ay6v7ae0VVb3p6emEhoYWeAWSUqVKFVhvXj3Pik1PTw+VSvOsZUFnLF5ELoKCghg5cqT6eVpaGs7OzrRs2VKr30tJl5OTQ0xMDG3bts33OxdPJnnTnuRMN4XNW9OmTdUjxnkGDBhA1apVGT16NM7OzkyfPh0DAwN8fX0BSExM5L///qNv3740bNiwSI/jZZP3m26KI295MxMKQzob4o3Ws2dPJk2axNGjR/n555/56quvirQ9d3d3Dhw4oJ7uBHDgwAGqVav2XPXWqVOHxMTE57rrt5GREfBwRORRtra2XL16Vf08LS2N5ORkndt5GmNjY4yNjfNtNzQ0lA8WHUjedCN5057kTDfPypu1tbV6imsec3NzbG1t8fT0BKBfv36MHTsWOzs7LC0t+eyzz/Dy8qJJkyZFGntxkvebbl5m3rRpRzob4o3m6upKo0aN6NevH7m5ubz77rtF2t6YMWPo1q0bnp6etGnThl9//ZX169ezY8eO56o3ODiYjh07Ur58eT744AP09PQ4ceIECQkJTJ8+vVB1uLi4oFAo+O233/D19cXExARzc3NatWpFREQEnTp1onTp0gQHB6Ovr/9c8QohhHgx5s+fj56eHl27diUrKwsfHx++/PLL4g5LiEKTS9+KN56fnx8nTpygS5cuWl+BSVudO3dm4cKFhIeHU716dZYtW8aKFSto0aLFc9Xr4+PDb7/9xvbt26lfvz7vvPMO8+fPL/RVtQDKli2rXmhub29PQEAA8HBqU/PmzenYsSMdOnSgc+fOVKpU6bniFUIIoZvY2FiNy5GXKlWKL774gps3b5KRkcH69etxcHAovgCF0JJC9fhkbSGEeEnS0tKwsrLi+vXrsmZDCzk5OURHR+Pr6ytTDbQgedOe5Ew3kjfdSN50Uxx5y/v8vnPnzhMvCpNHRjaEEEIIIYQQRUI6G6JEWrNmDebm5gU+qlevXtzhCSGEEEK8EWSBuCiR3n333SdeMlCGboUQQgghXgzpbIgSycLCAgsLi+IOQwghhBDijSbTqIQQQgghhBBFQjobQgghhBA6WLp0KTVr1sTS0hJLS0u8vLzYsmWLev+1a9fo1asXDg4OmJmZUadOHdatW1eMEQvx8klnQwgttWjRgsDAwFeirpCQEOzt7VEoFGzcuPGFxCSEEKJwypUrx6xZszh69Ci///47rVq14r333uPPP/8E4JNPPiExMZFffvmFU6dO8f7779OtWzeOHTtWzJEL8fJIZ0OI19SZM2cIDQ1l2bJlXL16lfbt2z93nREREZQuXfr5gxNCiBKgU6dO+Pr64ubmRpUqVZgxYwbm5uYcOXIEgEOHDvHZZ5/RoEEDKlasyKRJkyhdujRHjx4t5siFeHmksyHEayopKQmA9957DwcHB4yNjYs5ov/Jzc1FqVQWdxhCCPHS5ObmEhUVRUZGhvpqh15eXqxdu5abN2+iVCqJiori/v37tGjRoniDFeIlkqtRCfEcbt26xfDhw/n111/JysqiefPmLFq0CDc3N3WZAwcOMHHiRI4cOYKxsTENGjQgKiqKMmXK5Ktv8+bN9OzZky+//BI/P78nthsSEkJoaCgAenoPzxmoVCri4+OZMGECx44dIycnh9q1azN//nzq1Kmjfu3t27cZN24cGzdu5M6dO1SuXJlZs2Zhbm5O3759AVAoFABMmTKFkJCQZx5nREQEgYGBrFq1ivHjx3Pu3DkuXLiAq6trofLYMGwnDwzMClVWgLG+ijkNwCNkG1m5iuIO57UhedNeSc/ZxVkdnlnm1KlTeHl5cf/+fczNzdmwYQPVqlXj4sWLREZG8vHHH2NjY4OBgQGmpqZs2LCBypUrv4TohXg1SGdDiOfg7+/P+fPn+eWXX7C0tGTcuHH4+vpy+vRpDA0NOX78OK1bt+aTTz5h4cKFGBgYsHv3bnJzc/PVFRkZyaBBg4iMjKRjx45PbXf06NG4urrSt29frl69qt5+9+5d+vTpw+LFi1GpVMydOxdfX1/Onz+PhYUFSqWS9u3bc/fuXVavXk2lSpU4ffo0+vr6NGrUiAULFhAcHExiYiIA5ubmhTpOgMzMTGbPns0333yDjY0NdnZ2+eLOysoiKytL/TwtLQ0AYz0V+voqLbNfchnrqTT+FYUjedNeSc9ZTk7OM8tUrFiR+Ph40tLSWLduHX369GHr1q0ABAcHc+vWLbZu3YqNjQ2//PIL3bp1Y9euXdSoUaOow3/t5OW7MHkX/1McedOmLYVKpSqZf0GE0FGLFi2oXbs2Q4cOpUqVKhw4cIBGjRoBcOPGDZydnVm5ciUffvghPXv2JCUlhf379z+1Ljc3NyZOnMimTZto3rx5oeLYuHEjXbp04Wn/hZVKJaVLl1Z3YLZv30779u05c+YMVapUyVc+b4Ti9u3b6m3nz59/5nFGRETQt29fjh8/Tq1atZ4Yz6MjMo+KjIzE1NS0UMcthBCvsuDgYBwcHOjSpQuDBw9m0aJFlC9fXmO/o6MjgwcPLsYohXg+mZmZ9OzZkzt37mBpafnUsjKyIYSOzpw5g4GBgcadyG1sbKhatSpnzpwB4Pjx43z44YdPrefnn38mNTWVAwcOUL9+/eeK6d9//2XSpEnExsaSmppKbm4umZmZpKSkqOMpV65cgR2NJynMcQIYGRlRs2bNp9YVFBTEyJEj1c/T0tJwdnZm+jE9HhjqFzqmks5YT8W0ekom/65HlrLkTW3RleRNeyU9ZwkhPlq/ZsGCBdja2qpHcZs3b467u7t6/xdffEG5cuXw9fV9YXG+KXJycoiJiaFt27bqUXPxbMWRt7yZCYUhnQ0hipCJickzy3h6evLHH3/w3XffUa9ePfV6CV306dOHGzdusHDhQlxcXDA2NsbLy4vs7OxCx6MrExOTZ8ZubGxc4EL2vePaYGNjU1ShvXFycnKIjo7maHA7+UDWguRNe5KzpwsKCqJ9+/aUL1+eu3fvEhkZyZ49e9i8eTOZmZlUrlyZgIAAwsPDsbGxYePGjezYsYPffvtN8vkUhoaGkh8dvMy8adOOXI1KCB25u7vz4MED4uLi1Ntu3LhBYmIi1apVA6BmzZrs3LnzqfVUqlSJ3bt3s2nTJj777LPniunAgQMMGzYMX19fqlevjrGxMdevX1fvr1mzJleuXOHcuXMFvt7IyCjfepLCHKcQQpREqamp9O7dm6pVq9K6dWvi4+PZtm0bbdq0wcDAgE2bNmFra0unTp2oWbMmq1atYuXKlTKqIUoUGdkQQkdubm689957DBgwgGXLlmFhYcH48eMpW7Ys7733HvDwrFeNGjUYMmQIgwYNwsjIiN27d/Phhx/y1ltvqeuqUqUKu3fvpkWLFhgYGLBgwQKdY/r++++pV68eaWlpjBkzRmM0o3nz5jRr1oyuXbsyb948KleuzNmzZ1EoFLRr1w5XV1fS09PZuXMntWrVwtTUtFDHKYQQJdG3335b4Pa8xbNubm5yx3BR4snIhhDPYcWKFdStW5eOHTvi5eWFSqUiOjpaPbxYpUoVtm/fzokTJ2jQoAFeXl5s2rQJA4P8/fyqVauya9cufvjhB0aNGqVTPN9++y23bt2iTp069OrVi2HDhuW7KtS6deuoX78+PXr0oFq1aowdO1Y9mtGoUSMGDRpE9+7dsbW1Zc6cOYU6TiGEEEKIgsjVqIQQxSYtLQ0rKyuuX78uaza0kDeP3tfXVzp8WpC8aU9yphvJm24kb7opjrzlfX4X5mpUMrIhhBBCCCGEKBLS2RDiFWVubv7Ex759+4o7PCGEEEKIZ5IF4kK8oo4fP/7EfWXLln15gQghhBBC6Eg6G0K8oipXrlzcIQghhBBCPBeZRiWEEEIIIYQoEtLZEEIIIUSJtXTpUmrWrImlpSWWlpZ4eXmxZcsWjTKHDh2iVatWmJmZYWlpSbNmzbh3714xRSzE60U6G0K8ABcvXkShUDx1nYUQQohXT7ly5Zg1axZHjx7l999/p1WrVrz33nv8+eefwMOORrt27fD29ubIkSPEx8cTEBCAnp58hRKiMOR/ihBP4e/vT+fOnYs7DABiY2NRKBTcvn27uEMBICQkBIVCofF4++23izssIYTQSqdOnfD19cXNzY0qVaowY8YMzM3NOXz4MAAjRoxg2LBhjB8/nurVq1O1alW6deuGsbFxMUcuxOtBOhtCFDOVSsWDBw9eaps5OTkvpJ7q1atz9epV9WP//v0vpF4hhCgOubm5REVFkZGRgZeXF6mpqcTFxWFnZ0ejRo2wt7enefPm8rdOCC3I1aiEAH7++WdCQ0O5cOECpqameHp64unpycqVKwFQKBQA7N69mxYtWnDkyBE+/fRTzpw5g4eHBxMnTix0W7GxsbRs2ZLo6GgmTZrEqVOn2L59O82aNWP27Nl8/fXXXLt2jSpVqjB58mQ++OADLl68SMuWLQEoU6YMAH369CEiIgJXV1cCAwMJDAxUt1G7dm06d+5MSEiIOv4vv/ySLVu2sHPnTsaMGQPAxo0bGTVqFJMnT+bWrVu0b9+e5cuXY2FhUahjMTAwwMHBodDH/iQNw3bywMDsuespKYz1VcxpAB4h28jKVRR3OK8NyZv2XvecXZzVoVDlTp06hZeXF/fv38fc3JwNGzZQrVo19ehGSEgI4eHh1K5dm1WrVtG6dWsSEhJwc3MryvCFeCNIZ0OUeFevXqVHjx7MmTOHLl26cPfuXfbt20fv3r1JSUkhLS2NFStWAGBtbU16ejodO3akbdu2rF69muTkZIYPH651u+PHjyc8PJyKFStSpkwZwsLCWL16NV999RVubm7s3buXjz/+GFtbW5o0acK6devo2rUriYmJWFpaYmJiolV7ISEhzJo1iwULFmBgYMB3331HUlISGzdu5LfffuPWrVt069aNWbNmMWPGjELVef78eZycnChVqhReXl6EhYVRvnz5J5bPysoiKytL/TwtLQ0AYz0V+voqrY6nJDPWU2n8KwpH8qa91z1nhR3FrVixIvHx8aSlpbFu3Tr69OnDjh07yM7OBqB///58/PHHAMyZM4cdO3awfPnyJ/6tzGv3RY0ilxSSN90UR960aUs6G6LEu3r1Kg8ePOD999/HxcUFgBo1agBgYmJCVlaWxtn7iIgIlEol3377LaVKlaJ69epcuXKFwYMHa9Xu1KlTadu2LfDwS/jMmTPZsWMHXl5ewMMPv/3797Ns2TKaN2+OtbU1AHZ2dpQuXVrr4+zZsyd9+/bV2KZUKomIiFCPZPTq1YudO3cWqrPRsGFDIiIiqFq1KlevXiU0NJSmTZuSkJDwxJGRsLAwQkND822f5KnE1DRX62Mq6abVUxZ3CK8lyZv2XtecRUdHa/2axo0bs23bNsaOHUvXrl0ByM7O1qjLysqKuLi4Z9YfExOjdftC8qarl5m3zMzMQpeVzoYo8WrVqkXr1q2pUaMGPj4+eHt788EHH6inKz3uzJkz1KxZk1KlSqm35XUQtFGvXj31zxcuXCAzM1Pd+ciTnZ2Np6en1nU/q708rq6uGh0DR0dHUlNTC1Vf+/bt1T/XrFmThg0b4uLiwo8//ki/fv0KfE1QUBAjR45UP09LS8PZ2ZmWLVtiY2NT2EMp8XJycoiJiaFt27YYGhoWdzivDcmb9kpqzhYsWIC9vT3+/v6EhoZiYmKCr6+vev+UKVPw8fHR2Paokpq35yV5001x5C1vZkJhSGdDlHj6+vrExMRw8OBBtm/fzuLFi5k4cSJxcXFF2q6Z2f/WKKSnpwOwefNmypYtq1HuWVc80dPTQ6XSnOJQ0PDmo+3lefyPkkKhQKnU7Qxm6dKlqVKlChcuXHhiGWNj4wKPx9DQUD5YdCB5043kTXtvcs6CgoJo37495cuX5+7du0RGRrJnzx62bduGkZERY8aMYcqUKdSpU4fatWuzcuVKEhMTWbdu3TNz8ibnrShJ3nTzMvOmTTvS2RCCh1+yGzduTOPGjQkODsbFxYUNGzZgZGREbq7m9B53d3e+//577t+/rx7dyFtEqKtq1aphbGxMSkoKzZs3L7CMkZERQL54bG1tuXr1qvp5WloaycnJzxWPLtLT00lKSqJXr14vvW0hhNBVamoqvXv35urVq1hZWVGzZk22bdumHmkODAzk/v37jBgxgps3b1KrVi1iYmKoVKlSMUcuxOtBOhuixIuLi2Pnzp14e3tjZ2dHXFwc//33H+7u7ty/f59t27aRmJiIjY0NVlZW9OzZk4kTJzJgwACCgoK4ePEi4eHhzxWDhYUFo0ePZsSIESiVSpo0acKdO3c4cOAAlpaW9OnTBxcXFxQKBb/99hu+vr6YmJhgbm5Oq1atiIiIoFOnTpQuXZrg4GD09fVfUHaebPTo0XTq1AkXFxf++ecfpkyZgr6+Pj169CjytoUQ4kX59ttvn1lm/PjxjB8//iVEI8SbRzobosSztLRk7969LFiwgLS0NFxcXJg7dy7t27enXr16xMbGUq9ePdLT09WXvv31118ZNGgQnp6eVKtWjdmzZ6sXEupq2rRp2NraEhYWxl9//UXp0qWpU6cOEyZMAKBs2bKEhoYyfvx4+vbtS+/evYmIiCAoKIjk5GQ6duyIlZUV06ZNeykjG1euXKFHjx7cuHFDfcWsw4cPY2trW+RtCyGEEOL1oFA9PtlbCCFekrS0NKysrLh+/bosENdCTk4O0dHR+Pr6yrxmLUjetCc5043kTTeSN90UR97yPr/v3LmDpaXlU8vKHcSFEEIIIYQQRUI6G0K8YIMGDcLc3LzAx6BBg4o7vEJJSUl54jGYm5uTkpJS3CEKIYQQ4jUgazaEeMGmTp3K6NGjC9z3rKHGV4WTkxPHjx9/6n4hhBBCiGeRzoYQL5idnR12dnbFHcZzMTAwoHLlysUdhhBCCCFeczKNSgghhBBCCFEkpLPxCmvRogWBgYHFHYZ4gVxdXVmwYEGR1C3vFyFEUZk9ezb169fHwsICOzs7OnfuTGJiokaZpKQkunTpgq2tLZaWlnTr1o1///23mCIWQrwqpLPxCoiNjUWhUHD79m2N7evXr2fatGnFE1QhXbx4EYVC8dT5/eJ/4uPjGThwoPq5QqFg48aNxRfQE8TGxvLee+/h6OiImZkZtWvXZs2aNfnK/fTTT7z99tuUKlWKGjVqEB0dXQzRCiGK2r59+xg6dCiHDx8mJiaGnJwcvL29ycjIACAjIwNvb28UCgW7du3iwIEDZGdn06lTJ5RKZTFHL4QoTrJm4xVmbW1drO3n5OS81OtcZ2dnY2Rk9NLaKw6vyw3vDh48SM2aNRk3bhz29vb89ttv9O7dGysrKzp27Kgu06NHD8LCwujYsSORkZF07tyZP/74Aw8Pj2I+AiHEi/Tbb79pfB5ERERgZ2fH0aNHadasGQcOHODixYscO3ZMfSGMlStXUqZMGXbt2kWbNm2KK3QhRDEr1pGNrVu30qRJE0qXLo2NjQ0dO3YkKSkJgEaNGjFu3DiN8v/99x+Ghobs3bsXgKtXr9KhQwdMTEyoUKECkZGRWk1TUSgUfPPNN3Tp0gVTU1Pc3Nz45ZdfNMokJCTQvn17zM3Nsbe3p1evXly/fl29/+7du/j5+WFmZoajoyPz58/PN53l+++/p169elhYWODg4EDPnj1JTU0FHo4MtGzZEoAyZcqgUCjw9/cHNKfFTJgwgYYNG+Y7hlq1ajF16lT182+++QZ3d3dKlSrF22+/zZdfflmoXOSNUKxdu5bmzZtTqlQp9Znsp9VZoUIFADw9PVEoFLRo0SJf7Hk6d+6sPjZ4OKVo2rRp9O7dG0tLSwYOHEhERASlS5dm27ZtuLu7Y25uTrt27bh69WqhjsPf35/OnTszc+ZM7O3tKV26NFOnTuXBgweMGTMGa2trypUrx4oVKzReN27cOKpUqYKpqSkVK1Zk8uTJ5OTkaJSZPn06dnZ2WFhY0L9/f8aPH0/t2rXztR0eHo6joyM2NjYMHTpUo55H35+urq4AdOnSBYVCoX6eV8+jAgMD1bmFh2cRe/fujbm5OY6OjsydOzdfLrKyshg9ejRly5bFzMyMhg0bEhsbW6g8TpgwgWnTptGoUSMqVarE8OHDadeuHevXr1eXWbhwIe3atWPMmDG4u7szbdo06tSpw5IlSwrVhhDi9XXnzh3gfyfFsrKyUCgUGBsbq8uUKlUKPT099u/fXywxCiFeDcU6spGRkcHIkSOpWbMm6enpBAcH06VLF44fP46fnx9z5sxh1qxZKBQKANauXYuTkxNNmzYFoHfv3ly/fp3Y2FgMDQ0ZOXKk+kt8YYWGhjJnzhw+//xzFi9ejJ+fH5cuXcLa2prbt2/TqlUr+vfvz/z587l37x7jxo2jW7du7Nq1C4CRI0dy4MABfvnlF+zt7QkODuaPP/7Q+BKak5PDtGnTqFq1KqmpqYwcORJ/f3+io6NxdnZm3bp1dO3alcTERCwtLTExMckXp5+fH2FhYSQlJVGpUiUA/vzzT06ePMm6desAWLNmDcHBwSxZsgRPT0+OHTvGgAEDMDMzo0+fPoXKx/jx45k7dy6enp7qDsfT6jxy5AgNGjRgx44dVK9eXeuRifDwcIKDg5kyZQrwcKg+MzOT8PBwvv/+e/T09Pj4448ZPXp0gdN4CrJr1y7KlSvH3r17OXDgAP369ePgwYM0a9aMuLg41q5dy6effkrbtm0pV64cABYWFkRERODk5MSpU6cYMGAAFhYWjB07Vp3bGTNm8OWXX9K4cWOioqKYO3euurOVZ/fu3Tg6OrJ7924uXLhA9+7dqV27NgMGDMgXZ3x8PHZ2dqxYsYJ27dqhr69f6LyNGTOGPXv2sGnTJuzs7JgwYUK+911AQACnT58mKioKJycnNmzYQLt27Th16hRubm6FbivPnTt3cHd3Vz8/dOgQI0eO1Cjj4+Pz1GlhWVlZZGVlqZ+npaUB0Gz2Dh4YmmkdU0llrKdiWj2oO3UrWUpFcYfz2pC8PVlCiE+B2/NOljx60kSpVDJ8+HAaNWpE1apVycnJoW7dupiZmTFmzBimTZuGSqVi4sSJ5Obm8vfff+c7efOmKyhv4tkkb7opjrxp01axdja6du2q8fy7777D1taW06dP061bNwIDA9m/f7+6cxEZGUmPHj1QKBScPXuWHTt2EB8fT7169YCHZ+C1/RLl7+9Pjx49AJg5cyaLFi3iyJEjtGvXTv0Fe+bMmRoxOjs7c+7cORwdHVm5ciWRkZG0bt0agBUrVuS7B8Enn3yi/rlixYosWrSI+vXrk56ejrm5ufrMkJ2dHaVLly4wzurVq1OrVi0iIyOZPHky8PALcMOGDdWXKJ0yZQpz587l/fffBx6OOpw+fZply5YVurMRGBiofn1h6sybFmRjY4ODg0Oh2nhUq1atGDVqlPr5vn37yMnJ4auvvlJ3qgICAjRGb57F2tqaRYsWoaenR9WqVZkzZw6ZmZlMmDABgKCgIGbNmsX+/fv56KOPAJg0aZL69a6urowePZqoqCh1Z2Px4sX069ePvn37AhAcHMz27dtJT0/XaLtMmTIsWbIEfX193n77bTp06MDOnTsL7Gzk5a506dJa5S49PZ1vv/2W1atXq993K1euVHec4OFN+VasWEFKSor6/Th69Gi2bt3KihUrNN7ThfHjjz8SHx/PsmXL1NuuXbuGvb29Rjl7e3uuXbv2xHrCwsIIDQ3Nt32SpxJT01ytYhIwrZ7MhdeF5C2/Z623iomJUf/81VdfcfToUcLCwjReN2LECL766iuWLFmCQqGgadOmVKxYkStXrpTY9VyP5k0UnuRNNy8zb5mZmYUuW6ydjfPnzxMcHExcXBzXr19XLyJLSUnBw8MDb29v1qxZQ9OmTUlOTubQoUPqLzuJiYkYGBhQp04ddX2VK1emTJkyWsVQs2ZN9c9mZmZYWlqqR0dOnDjB7t27MTc3z/e6pKQk7t27R05ODg0aNFBvt7KyomrVqhpljx49SkhICCdOnODWrVsax1mtWrVCx+rn58d3333H5MmTUalU/PDDD+ozyxkZGSQlJdGvXz+NL7YPHjzAysqq0G3kddxeZJ2FbS+PqampuqMB4OjoqNWIVfXq1dHT+98MQXt7e401BPr6+tjY2GjUuXbtWhYtWkRSUhLp6ek8ePBA4wZ8iYmJDBkyRKOdBg0aqEe4Hm370REKR0dHTp06VejYCyMpKYns7GyNaXXW1tYa77tTp06Rm5tLlSpVNF6blZWFjY2NVu3t3r2bvn37snz5cqpXr/5csQcFBWmMhqSlpeHs7Mz0Y3o8MCz8yE5J9/AMvZLJv+vJGXotSN6e7GkjGzExMbRt2xZDQ0OGDx9OQkIC+/fvzzey6+vry8SJE7l+/ToGBgaULl0aZ2dnmjdvjq+v78s4jFfG43kThSN5001x5C1vZkJhFGtno1OnTri4uLB8+XKcnJxQKpV4eHiQnZ0NPPxyPWzYMBYvXkxkZCQ1atSgRo0aLzSGx38pCoVC3RlIT0+nU6dOzJ49O9/rHB0duXDhwjPrz8jIwMfHBx8fH9asWYOtrS0pKSn4+Pioj7OwevTowbhx4/jjjz+4d+8ely9fpnv37upYAZYvX55vbYc203PMzP43leV56tTT00OlUmlsK2jI7dH28hT0O3m8rqcp6PVP+z0fOnQIPz8/QkND8fHxwcrKSj1NSltPa6ewCpu7p0lPT0dfX5+jR4/m+10V1Hl+kj179tCpUyfmz59P7969NfY5ODjku6zlv//++9RRGmNjY4053Xn2jmujdSeoJMvJySE6Opqjwe3kA1kLkjfdGRgYMGLECDZt2kRsbOxTZxE4OjoCD6e0pqam0qVLlxKbb0NDwxJ77M9D8qabl5k3bdopts7GjRs3SExMZPny5eppUo8vInvvvfcYOHAgW7duJTIyUuPLTtWqVXnw4AHHjh2jbt26AFy4cIFbt269sBjr1KnDunXrcHV1xcAgf6oqVqyIoaEh8fHxlC9fHng4r/3cuXM0a9YMgLNnz3Ljxg1mzZqFs7MzAL///rtGPXnrHHJznz6NpFy5cjRv3pw1a9Zw79492rZtq75Ttb29PU5OTvz111/4+fk934H/v8LU+aTYbW1tNRZ15+bmkpCQoF4M/yo5ePAgLi4uTJw4Ub3t0qVLGmWqVq1KfHy8xnswPj7+uds2NDQsMHcJCQka244fP67+j12pUiUMDQ2Ji4tTv+9u3brFuXPnaN68OfBwwX5ubi6pqanq/1/aio2NpWPHjsyePVvjcr15vLy82Llzp8aFAGJiYvDy8tKpPSHEq2vYsGFERUWxadMmLCws1NMlrays1OsMV6xYgbu7O7a2thw6dIjhw4czYsSIfKP9QoiSpdg6G2XKlMHGxoavv/4aR0dHUlJSGD9+vEYZMzMzOnfuzOTJkzlz5ox6bQXA22+/TZs2bRg4cCBLly7F0NCQUaNGYWJiol5Q/ryGDh3K8uXL6dGjB2PHjsXa2poLFy4QFRXFN998g4WFBX369FFf5cjOzo4pU6agp6enjqF8+fIYGRmxePFiBg0aREJCQr57Z7i4uKBQKPjtt9/w9fXFxMTkiWef/fz8mDJlCtnZ2cyfP19jX2hoKMOGDcPKyop27dqRlZXF77//zq1bt/It5C2sZ9VpZ2eHiYkJW7dupVy5cpQqVQorKytatWrFyJEj2bx5M5UqVWLevHn57iPyqnBzcyMlJYWoqCjq16/P5s2b2bBhg0aZzz77jAEDBlCvXj0aNWrE2rVrOXnyJBUrVnyutl1dXdm5cyeNGzfG2NiYMmXK0KpVKz7//HNWrVqFl5cXq1evJiEhAU9PT+DhyES/fv0YM2YMNjY22NnZMXHiRI2pY1WqVMHPz4/evXurF/z/999/7Ny5k5o1a9KhQ4enxrV79246duzI8OHD6dq1q/qLhZGRkXqN0fDhw2nevDlz586lQ4cOREVF8fvvv/P1118/V06EEK+evCnMj14VDx52MPKuMpiYmEhQUBA3b97E1dWViRMnMmLEiJccqRDiVVNsl77V09MjKiqKo0eP4uHhwYgRI/j888/zlfPz8+PEiRM0bdpUfRY3z6pVq7C3t6dZs2Z06dJFfQWhUqVKvZAYnZycOHDgALm5uXh7e1OjRg0CAwMpXbq0+ovdvHnz8PLyomPHjrRp04bGjRurLxMLD89SR0RE8NNPP1GtWjVmzZpFeHi4Rjtly5YlNDSU8ePHY29vT0BAwBNj+uCDD7hx4waZmZn5Lo/av39/vvnmG1asWEGNGjVo3rw5ERER+ebVauNZdRoYGLBo0SKWLVuGk5MT7733HvBwUXyfPn3o3bs3zZs3p2LFiq/kqAbAu+++y4gRIwgICKB27docPHhQvQg/j5+fH0FBQYwePZo6deqQnJyMv7//c7/X5s6dS0xMDM7OzurOhI+PD5MnT2bs2LHUr1+fu3fv5pvC9Pnnn9O0aVM6depEmzZtaNKkiXqEL8+KFSvo3bs3o0aNomrVqnTu3FljFO5pVq5cSWZmJmFhYTg6Oqofj148oFGjRkRGRvL1119Tq1Ytfv75ZzZu3Cj32BDiDZSdnY1Kpcr3ePRy5rNmzeLatWtkZ2dz7tw5Ro4c+cJO/gkhXl8KlTaT4V9xV65cwdnZmR07dqiv0vOyZWRkULZsWebOnUu/fv2KJQbxcrRt2xYHBwe+//774g7ltZWWloaVlRXXr1+XNRtayFt74OvrK/OatSB5057kTDeSN91I3nRTHHnL+/y+c+eOxgV1CvJa30F8165dpKenU6NGDa5evcrYsWNxdXVVr5d4GY4dO8bZs2dp0KABd+7cUV+iNe8Mv3gzZGZm8tVXX+Hj44O+vj4//PADO3bskMvzCSGEEEI8RbHeQfx55eTkMGHCBKpXr06XLl2wtbVV3+BvzZo1mJubF/h43st3Pi48PJxatWrRpk0bMjIy2LdvH2+99dYLbeN5zZw584n5aN++fXGHV2hPOgZzc3P27dtXZO0qFAqio6Np1qwZdevW5ddff2XdunW0adOmyNosSu3bt39iHrW9B4cQQgghxJO81iMbeZeULci7776b73KteV7kEJOnpydHjx59YfUVlUGDBtGtW7cC9xV0x/JX1fHjx5+4r2zZskXWromJCTt27Ciy+l+2b775hnv37hW4L28BuBBCCCHE83qtOxtPY2FhgYWFRXGH8cqwtrZ+I75E5t0tXTyfouyYCSGEEELkea2nUQkhhBBCCCFeXdLZEEIIId4AYWFh1K9fHwsLC+zs7OjcuTOJiYn5yh06dIhWrVphZmaGpaUlzZo1e+K0SiGEeF7S2RCvDX9//3z3FnlcixYtNO5oLYQQJcWePXsYOnQohw8fJiYmhpycHLy9vcnIyFCXOXToEO3atcPb25sjR44QHx9PQECAxk1BhRDiRXpj12yIohMSEsLGjRufulhbCCHEy7V161aN5xEREdjZ2XH06FH1JeFHjBjBsGHDGD9+vLpc1apVX2qcQoiSRU5lCPECZWdnF3cIQggBwJ07d4D/XWEuNTWVuLg47OzsaNSoEfb29jRv3pz9+/cXZ5hCiDecjGyUUEqlkvDwcL7++msuX76Mvb09n376KRMnTmTcuHFs2LCBK1eu4ODggJ+fH8HBwRgaGhIREUFoaCjw8N4TACtWrMDf3/+p7Z09e5b+/fvz+++/U7FiRRYtWkTbtm3ZsGGDemrUqVOnGD58OIcOHcLU1JSuXbsyb948zM3NC6wzIyODwYMHs379eiwsLBg9enS+MllZWUycOJEffviB27dv4+HhwezZs2nRogXw8MxfYGAga9euJTAwkMuXL9OkSRNWrFiBo6PjM/Po7+/P7du3qV+/Pl988QXGxsYkJydz+fJlRo0axfbt29HT06Np06YsXLgQV1dXAGJjYxk7dix//vknhoaGVK9encjISFxcXABYunQp4eHhXL58mQoVKjBp0iR69eqlblehULB8+XI2b97Mtm3b1Hetf/fddwHIzc1l4MCB7Nq1i2vXrlG+fHmGDBnC8OHD88XepEkT5s6dS3Z2Nh999BELFixQXx46KyuL4OBgIiMjSU1NxdnZmaCgIPr16wdAQkICY8aMYd++fZiZmeHt7c38+fO1vs9Mw7CdPDAw0+o1JZmxvoo5DcAjZBtZuYriDue18Trn7eKsDlqVVyqVBAYG0rhxYzw8PAD466+/gIej0+Hh4dSuXZtVq1bRunVrEhIScHNze+FxCyGEdDZKqKCgIJYvX878+fNp0qQJV69e5ezZs8DDywZHRETg5OTEqVOnGDBgABYWFowdO5bu3buTkJDA1q1b1fedsLKyempbubm5dO7cmfLlyxMXF8fdu3cZNWqURpmMjAx8fHzw8vIiPj6e1NRU+vfvT0BAABEREQXWO2bMGPbs2cOmTZuws7NjwoQJ/PHHH9SuXVtdJiAggNOnTxMVFYWTkxMbNmygXbt2nDp1Sv3BmpmZSXh4ON9//z16enp8/PHHjB49mjVr1hQqlzt37sTS0lJ9N/GcnBz1sezbtw8DAwOmT59Ou3btOHnyJHp6enTu3JkBAwbwww8/kJ2dzZEjR9Sdtw0bNjB8+HAWLFhAmzZt+O233+jbty/lypWjZcuW6nZDQ0OZM2cOn3/+OYsXL8bPz49Lly5hbW2NUqmkXLly/PTTT9jY2HDw4EEGDhyIo6Ojxv1Wdu/ejaOjI7t37+bChQt0796d2rVrM2DAAAB69+7NoUOHWLRoEbVq1SI5OZnr168DcPv2bVq1akX//v2ZP38+9+7dY9y4cXTr1o1du3YVmKusrCyysrLUz9PS0gAw1lOhr68qVL7Fw3w9+q8onNc5bzk5OVqVDwgIICEhgd27d6tfmzfy2r9/fz7++GMA5syZw44dO1i+fDkzZsx4Yrvatl/SSd50I3nTTXHkTZu2FCqV6vX7qyuey927d7G1tWXJkiX079//meXDw8OJiori999/B7Rfs7F161Y6derE5cuXcXBwAGDHjh0aIxvLly9n3LhxXL58GTOzh2e4o6Oj6dSpE//88w/29vbqM/EbN24kPT0dGxsbVq9ezYcffgjAzZs3KVeuHAMHDmTBggWkpKRQsWJFUlJScHJyUsfTpk0bGjRowMyZM4mIiKBv375cuHCBSpUqAfDll18ydepUrl279sxj8/f3Z+vWraSkpGBkZATA6tWrmT59OmfOnFF3ILKzsyldujQbN26kXr162NjYEBsbS/PmzfPV2bhxY6pXr87XX3+t3tatWzcyMjLYvHkz8HBkY9KkSUybNg142FkzNzdny5YttGvXrsBYAwICuHbtGj///LM69tjYWJKSktDX11e3o6enR1RUFOfOnaNq1arExMQUeKf06dOns2/fPrZt26beduXKFZydnUlMTKRKlSr5XhMSEqIeGXtUZGQkpqamBcYthNDO119/TVxcHDNnzsTe3l69/d9//+XTTz8lMDBQPboL8Pnnn6Ovr8/IkSOLIVohxOsoMzOTnj17cufOHSwtLZ9aVkY2SqAzZ86QlZVF69atC9y/du1aFi1aRFJSEunp6Tx48OCZb6SnSUxMxNnZWd3RAGjQoEG+mGrVqqXuaMDDL91KpZLExESND0yApKQksrOzNe4Sb21trbHQ8dSpU+Tm5ub70puVlYWNjY36uampqbqjAeDo6Ehqamqhj69GjRrqjgbAiRMnuHDhQr6bSt6/f5+kpCS8vb3x9/fHx8eHtm3b0qZNG7p166aetnXmzBkGDhyo8drGjRuzcOFCjW01a9ZU/5x3CctH4/7iiy/47rvvSElJ4d69e2RnZ2uM+gBUr15d3dHIO/ZTp04BD+/Wrq+vX2CHKO84d+/eXeA0t6SkpAI7G0FBQRpfaNLS0nB2dmb6MT0eGOrnKy8KZqynYlo9JZN/1yNL+XpNBypOr3PeEkJ8nllGpVIRGBjI8ePH2bt3b75pUSqVitDQUExMTPD19VVvnzJlCj4+Phrb8uTk5BATE0Pbtm3V0yvFs0nedCN5001x5C1vZkJhSGejBDIxMXnivkOHDuHn50doaCg+Pj5YWVkRFRXF3LlzX2KEL0Z6ejr6+vocPXpU4ws1oPEF+fH/mAqFAm0G/B7tIOW1W7du3QKnYdna2gIP17kMGzaMrVu3snbtWiZNmkRMTAzvvPNOodstKG6lUglAVFQUo0ePZu7cuXh5eWFhYcHnn39OXFxcoet42vsk7zg7derE7Nmz8+170noXY2NjjI2N823fO66NRgdQPF1OTg7R0dEcDW4nH8haeNPzNmTIECIjI9m0aRPW1tbcuHEDeDjVNe//85gxY5gyZQp16tShdu3arFy5ksTERNatW/fUnBgaGr6ROStqkjfdSN508zLzpk070tkogdzc3DAxMWHnzp35plEdPHgQFxcXJk6cqN526dIljTJGRkbk5uYWur2qVaty+fJl/v33X/UIRXx8vEYZd3d3IiIiyMjIUH95P3DgAHp6egVelrFSpUoYGhoSFxdH+fLlAbh16xbnzp1Tn4n39PQkNzeX1NRUmjZtWuh4n1edOnVYu3YtdnZ2Tx0R8vT0xNPTk6CgILy8vIiMjOSdd97B3d2dAwcO0KdPH3XZAwcOUK1atULHcODAARo1asSQIUPU25KSkrQ6jho1aqBUKtmzZ0+B06jq1KnDunXrcHV1xcBA/pQIUdyWLl0KoDFFCjQv4hEYGMj9+/cZMWIEN2/epFatWsTExGiM7gohxIskl74tgUqVKsW4ceMYO3Ysq1atIikpicOHD/Ptt9/i5uZGSkoKUVFRJCUlsWjRIjZs2KDxeldXV5KTkzl+/DjXr1/XWPBbkLZt21KpUiX69OnDyZMnOXDgAJMmTQL+d0UrPz8/SpUqRZ8+fdSLGj/77DN69eqVbwoVPByZ6NevH2PGjGHXrl0kJCTg7++vcWOqKlWq4OfnR+/evVm/fj3JyckcOXKEsLAw9dqHouDn58dbb73Fe++9x759+0hOTiY2NpZhw4Zx5coVkpOTCQoK4tChQ1y6dInt27dz/vx53N3dgYdnHiMiIli6dCnnz59n3rx5rF+/vsCrbT2Jm5sbv//+O9u2bePcuXNMnjw5XwfvWVxdXenTpw+ffPIJGzduVB/Hjz/+CMDQoUO5efMmPXr0ID4+nqSkJLZt20bfvn216owKIV4MlUpV4OPxqwWOHz+ey5cvk5GRwcGDB2nSpEnxBCyEKBGks1FCTZ48mVGjRhEcHIy7uzvdu3cnNTWVd999lxEjRhAQEEDt2rU5ePAgkydP1nht165dadeuHS1btsTW1pYffvjhqW3p6+urF3XXr1+f/v37q0dOSpUqBTxcN7Ft2zZu3rxJ/fr1+eCDD2jdujVLlix5Yr2ff/45TZs2pVOnTrRp04YmTZpQt25djTIrVqygd+/ejBo1iqpVq9K5c2fi4+PVoyFFwdTUlL1791K+fHnef/993N3d6devH/fv38fS0hJTU1POnj1L165dqVKlCgMHDmTo0KF8+umnAHTu3JmFCxcSHh5O9erVWbZsGStWrMh3tvJpPv30U95//326d+9Ow4YNuXHjhsYoR2EtXbqUDz74gCFDhvD2228zYMAA9d2InZycOHDgALm5uXh7e1OjRg0CAwMpXbq03I1YCCGEEIBcjUoUkwMHDtCkSRONq0CJkictLQ0rKyuuX78uaza0kLf2wNfXV+Y1a0Hypj3JmW4kb7qRvOmmOPKW9/ktV6MSr4wNGzZgbm6Om5sbFy5cYPjw4TRu3Fg6GkIIIYQQbzCZ6yCe25o1azA3Ny/wUb16deDhvT2GDh3K22+/jb+/P/Xr12fTpk3FHPmzPem4zM3N2bdvX3GHJ4QQQgjxSpORDfHc3n33XY37XTwqbzivd+/e9O7d+2WG9UI87caFZcuWfXmBCCGEEEK8hqSzIZ6bhYVFvhvYvSkqV65c3CEIIYQQQry2ZBqVEEIIIYQQokhIZ0OIV9S1a9do27YtZmZmlC5durjDEUK84sLCwqhfvz4WFhbY2dnRuXNnEhMT85U7dOgQrVq1wszMDEtLS5o1a8a9e/eKIWIhREkgnQ0hXoKQkBBq166t1Wvmz5/P1atXOX78OOfOnXshcbRo0YLAwMAXUtejVCoV7du3R6FQsHHjxhdevxDi2fbs2cPQoUM5fPgwMTEx5OTk4O3trb43DjzsaLRr1w5vb2+OHDlCfHw8AQEBcm8cIUSRkTUbQryikpKSqFu3Lm5ubsUdSj7Z2dkYGRmpny9YsEB9N3ghRPHYunWrxvOIiAjs7Ow4evQozZo1A2DEiBEMGzaM8ePHq8tVrVr1pcYphChZ5FSGEIW0detWmjRpQunSpbGxsaFjx44kJSWp91+5coUePXpgbW2NmZkZ9erVIy4ujoiICEJDQzlx4gQKhQKFQkFERMRT23J1dWXdunWsWrUKhUKBv78/APPmzaNGjRqYmZnh7OzMkCFDSE9P13jtgQMHaNGiBaamppQpUwYfHx9u3bqFv78/e/bsYeHCheo4Ll68CDw8I9qgQQOMjY1xdHRk/PjxPHjwQF1nixYtCAgIIDAwkLfeegsfHx/1vuPHjzN37ly+++6750uwEOKFunPnDgDW1tYApKamEhcXh52dHY0aNcLe3p7mzZuzf//+4gxTCPGGk5ENIQopIyODkSNHUrNmTdLT0wkODqZLly4cP36czMxMmjdvTtmyZfnll19wcHDgjz/+QKlU0r17dxISEti6dSs7duwAwMrK6qltxcfH07t3bywtLVm4cCEmJiYA6OnpsWjRIipUqMBff/3FkCFDGDt2LF9++SXw8It/69at+eSTT1i4cCEGBgbs3r2b3NxcFi5cyLlz5/Dw8GDq1KkA2Nra8vfff+Pr64u/vz+rVq3i7NmzDBgwgFKlShESEqKOaeXKlQwePJgDBw6ot2VmZtKzZ0+++OILHBwcdM5tw7CdPDAw0/n1JY2xvoo5DcAjZBtZuTKiVFivc94uzuqgVXmlUklgYCCNGzfGw8MDgL/++gt4OK0zPDyc2rVrs2rVKlq3bk1CQsIrOYoqhHj9vbDOxu3bt2URq3ijde3aVeP5d999h62tLadPn+bgwYP8999/xMfHq88iPnrZXHNzcwwMDAr9hdzW1hZjY2NMTEw0XvPoegtXV1emT5/OoEGD1J2NOXPmUK9ePfVzQH1jRQAjIyNMTU016vzyyy9xdnZmyZIlKBQK3n77bf755x/GjRtHcHCwei63m5sbc+bM0YhzxIgRNGrUiPfee69Qx5WVlUVWVpb6eVpaGgDGeir09VWFqkM8zNej/4rCeZ3zlpOTo1X5gIAAEhIS2L17t/q12dnZAPTv35+PP/4YePg3Y8eOHSxfvpwZM2Y8sV1t2y/pJG+6kbzppjjypk1bOnU2Zs+ejaurK927dwegW7durFu3DgcHB6Kjo6lVq5Yu1QrxSjt//jzBwcHExcVx/fp1lEolACkpKRw/fhxPT091R6Oo7Nixg7CwMM6ePUtaWhoPHjzg/v37ZGZmYmpqyvHjx/nwww+1qvPMmTN4eXlprLlo3Lgx6enpXLlyhfLlywNQt25djdf98ssv7Nq1i2PHjhW6rbCwMEJDQ/Ntn+SpxNQ0V6u4BUyrpyzuEF5Lr2PeoqOjC13266+/Ji4ujpkzZ3Ly5ElOnjwJwL///gs87HQ8Wp+VlRVxcXFPbSMmJkbHyEs2yZtuJG+6eZl5y8zMLHRZnTobX331FWvWrAEeHlhMTAxbtmzhxx9/ZMyYMWzfvl2XaoV4pXXq1AkXFxeWL1+Ok5MTSqUSDw8PsrOz1dOcitLFixfp2LEjgwcPZsaMGVhbW7N//3769etHdnY2pqamRRqHmZnmNKddu3aRlJSUb0Sza9euNG3alNjY2Hx1BAUFMXLkSPXztLQ0nJ2dadmyJTY2NkUR9hspJyeHmJgY2rZti6GhYXGH89p40/OmUqkIDAzk+PHj7N27N9+0KJVKRWhoKCYmJvj6+qq3T5kyBR8fH41ted70nBUVyZtuJG+6KY685c1MKAydOhvXrl3D2dkZgN9++41u3brh7e2Nq6srDRs21KVKIV5pN27cIDExkeXLl9O0aVMAjUWVNWvW5JtvvuHmzZsFjm4YGRmRm/t8Z+6PHj2KUqlk7ty56qlNP/74o0aZmjVrsnPnzgJHD54Uh7u7O+vWrUOlUqlHNw4cOICFhQXlypV7Yjzjx4+nf//+Gttq1KjB/Pnz6dSpU4GvMTY2xtjYON92Q0ND+WDRgeRNN29q3oYMGUJkZCSbNm3C2tqaGzduAA9HLvJORIwZM4YpU6ZQp04dateuzcqVK0lMTGTdunVPzcmbmrOiJnnTjeRNNy8zb9q0o9PVqMqUKcPly5eBh1foadOmDfDwrMnzfqES4lVUpkwZbGxs+Prrr7lw4QK7du3SOEPfo0cPHBwc6Ny5MwcOHOCvv/5i3bp1HDp0CHi4viI5OZnjx49z/fp1jXULhVW5cmVycnJYvHgxf/31F99//z1fffWVRpmgoCDi4+MZMmQIJ0+e5OzZsyxdupTr16+r44iLi+PixYvqqWBDhgzh8uXLfPbZZ5w9e5ZNmzYxZcoURo4c+dRr7zs4OODh4aHxAChfvjwVKlTQ+viEEM9n6dKl3LlzhxYtWuDo6Kh+rF27Vl0mMDCQoKAgRowYQa1atdi5cycxMTFUqlSpGCMXQrzJdOpsvP/++/Ts2ZO2bdty48YN2rdvD8CxY8c0FsUK8abQ09MjKiqKo0eP4uHhwYgRI/j888/V+42MjNi+fTt2dnb4+vpSo0YNZs2ahb6+PvBwalG7du1o2bIltra2/PDDD1rHUKtWLebNm8fs2bPx8PBgzZo1hIWFaZSpUqUK27dv58SJEzRo0AAvLy82bdqEgcHDQczRo0ejr69PtWrVsLW1JSUlhbJlyxIdHc2RI0eoVasWgwYNol+/fkyaNOk5MiaEeNlUKlWBj7xLZ+cZP348ly9fJiMjg4MHD9KkSZPiCVgIUSLoNI1q/vz5uLq6cvnyZebMmYO5uTkAV69eZciQIS80QCFeFW3atOH06dMa21Sq/13VxsXFhZ9//rnA1xobGz9x35MUdCfuESNGMGLECI1tvXr10njevHlzjcvTPqpKlSrq0ZbHX3PkyJEnxlLQ+ouCPJoPIYQQQgidOhuGhoaMHj063/bHvwQJIYQQQgghSi6d7yD+/fff06RJE5ycnLh06RIACxYsYNOmTS8sOCHeVGvWrMHc3LzAx6P3xRBCCCGEeJ3pNLKxdOlSgoODCQwMZMaMGepF4aVLl2bBggWFvsGXECXVu++++8Qrt8kVOIQQQgjxptCps7F48WKWL19O586dmTVrlnp7vXr1CpxeJYTQZGFhgYWFRXGHIYQQQghRpHSaRpWcnIynp2e+7cbGxmRkZDx3UEIIIYQQQojXn06djQoVKnD8+PF827du3Yq7u/vzxiSEEEKIx4SFhVG/fn0sLCyws7Ojc+fOJCYmapRp0aIFCoVC4zFo0KBiilgIIXScRjVy5EiGDh3K/fv3UalUHDlyhB9++IGwsDC++eabFx2jEEIIUeLt2bOHoUOHUr9+fR48eMCECRPw9vbm9OnTmJmZqcsNGDCAqVOnqp+bmpoWR7hCCAHoOLLRv39/Zs+ezaRJk8jMzKRnz54sXbqUhQsX8tFHH73oGIUoEVq0aEFgYGBxhwHAiRMn6NGjB87OzpiYmODu7s7ChQvzlYuNjaVOnToYGxtTuXJlIiIiXn6wQpQQW7duxd/fn+rVq1OrVi0iIiJISUnh6NGjGuVMTU1xcHBQPywtLYspYiGE0KGz8eDBA1atWkWbNm04f/486enpXLt2jStXrtCvX7+iiFGI1152dvZr1dbRo0exs7Nj9erV/Pnnn0ycOJGgoCCWLFmiLpOcnEyHDh1o2bIlx48fJzAwkP79+7Nt27bnbl8I8Wx37twBwNraWmP7mjVreOutt/Dw8CAoKIjMzMziCE8IIQAdplEZGBgwaNAgzpw5Azw8gyJDtEJoatGiBR4eHhgYGLB69Wpq1KjB4sWLGTNmDPv27cPMzAxvb2/mz5/PW2+9hb+/P3v27GHPnj3qEYTk5GRiY2MJDAzk9u3b6ro3btxIly5d1HfrDgkJYePGjQQEBDBjxgwuXbqEUqlEoVCwfPlyNm/ezLZt2yhbtixz587l3XfffWb8n3zyicbzihUrcujQIdavX09AQAAAX331FRUqVGDu3LkAuLu7s3//fubPn4+Pj49W+WoYtpMHBmbPLigAMNZXMacBeIRsIytXUdzhvDZe9bxdnNWh0GWVSiWBgYE0btwYDw8P9faePXvi4uKCk5MTJ0+eZNy4cSQmJrJ+/fqiCFkIIZ5JpzUbDRo04NixY7i4uLzoeIR4Y6xcuZLBgwdz4MABbt++TatWrejfvz/z58/n3r17jBs3jm7durFr1y4WLlzIuXPn8PDwUM+1trW1LXRbFy5cYN26daxfvx59fX319tDQUObMmcPnn3/O4sWL8fPz49KlS/nOhBbGnTt3NF536NAh2rRpo1HGx8fnqVPBsrKyyMrKUj9PS0sDwFhPhb6+SuuYSipjPZXGv6JwXvW85eTkFLpsQEAACQkJ7N69W+N1ffv2Vf/89ttvY2tri4+PD2fPnqVSpUo6x6RNbELypivJm26KI2/atKVTZ2PIkCGMGjWKK1euULduXY2FaQA1a9bUpVoh3ihubm7MmTMHgOnTp+Pp6cnMmTPV+7/77jucnZ05d+4cVapUwcjISD3XWlvZ2dmsWrUqXwfF39+fHj16ADBz5kwWLVrEkSNHaNeunVb1Hzx4kLVr17J582b1tmvXrmFvb69Rzt7enrS0NO7du4eJiUm+esLCwggNDc23fZKnElPTXK1iEjCtnrK4Q3gtvap5i46OLlS5r7/+mri4OGbOnMnJkyc5efLkE8vev38fgKioqAIvWV9YMTExOr+2JJO86UbyppuXmTdtpmfq1NnIWwQ+bNgw9TaFQoFKpUKhUKjvKC5ESVa3bl31zydOnGD37t2Ym5vnK5eUlESVKlWeqy0XF5cCR0Ie7fibmZlhaWlJamqqVnUnJCTw3nvvMWXKFLy9vZ8rzqCgIEaOHKl+npaWhrOzM9OP6fHAUP8prxSPMtZTMa2eksm/65GlfPWmA72qXvW8JYQ8ffqhSqUiMDCQ48ePs3fvXtzc3J5Z58GDBwHo1KmTTicCc3JyiImJoW3bthgaGmr9+pJK8qYbyZtuiiNveTMTCkOnzkZycrIuLxOiRHl0xC89PZ1OnToxe/bsfOUcHR2fWIeenp56bUaegoYuHx9dzPP4Hx2FQoFSWfizuqdPn6Z169YMHDiQSZMmaexzcHDg33//1dj277//YmlpWeCoBjy88aexsXG+7XvHtcHGxqbQcZV0OTk5REdHczS4nXwga+F1z9uQIUOIjIxk06ZNWFtbc+PGDQCsrKwwMTEhKSmJyMhIfH19sbGx4eTJk4wYMYJmzZppnPzQhaGh4WuZs+ImedON5E03LzNv2rSjU2dD1moIoZ06deqwbt06XF1dMTAo+L+dkZFRvlFBW1tb7t69S0ZGhrpDUdANNYvCn3/+SatWrejTpw8zZszIt9/LyyvftI+YmBi8vLxeSnxClDRLly4FHl6A4lErVqzA398fIyMjduzYwYIFC8jIyMDZ2ZmuXbvmO1EghBAvk06djVWrVj11f+/evXUKRog31dChQ1m+fDk9evRg7NixWFtbc+HCBaKiovjmm2/Q19fH1dWVuLg4Ll68iLm5OdbW1jRs2BBTU1MmTJjAsGHDiIuLeyn3skhISKBVq1b4+PgwcuRIrl27BoC+vr56utagQYNYsmQJY8eO5ZNPPmHXrl38+OOPGus6hBAvzuOjnI9zdnZmz549LykaIYQoHJ06G8OHD9d4npOTQ2ZmpnqBq3Q2hNDk5OTEgQMHGDduHN7e3mRlZeHi4kK7du3Q03t4u5vRo0fTp08fqlWrxr1790hOTsbV1ZXVq1czZswYli9fTuvWrQkJCWHgwIFFGu/PP//Mf//9x+rVq1m9erV6u4uLCxcvXgSgQoUKbN68mREjRrBw4ULKlSvHN998o/Vlb4UQQgjx5lKonnWqpJDOnz/P4MGDGTNmjHzZEEIUSlpaGlZWVly/fl3WbGghb+2Br6+vzGvWguRNe5Iz3UjedCN5001x5C3v8/vOnTtYWlo+tazWdxB/Ejc3N2bNmpVv1EMIIYQQQghRMr2wzgY8vLv4P//88yKrFEIUgUGDBmFubl7gY9CgQcUdnhBCCCHeEDqt2fjll180nqtUKq5evcqSJUto3LjxCwlMCFF0pk6dyujRowvc96zhUCGEEEKIwtKps9G5c2eN5wqFAltbW1q1asXcuXNfRFxCiCJkZ2eHnZ1dcYchhBBCiDecTp0NbW4KJoQQQgghhCiZdFqzMXXqVDIzM/Ntv3fvHlOnTn3uoIQQQojXUVhYGPXr18fCwgI7Ozs6d+5MYmKiev/Nmzf57LPPqFq1KiYmJpQvX55hw4Zx586dYoxaCCGKjk6djdDQUNLT0/Ntz8zMJDQ09LmDEkK8ejZu3EjlypXR19cnMDCwuMMR4pW0Z88ehg4dyuHDh4mJiSEnJwdvb28yMjIA+Oeff/jnn38IDw8nISGBiIgItm7dSr9+/Yo5ciGEKBo6TaNSqVQoFIp820+cOIG1tfVzByWE0F1ISAgbN27k+PHjL7TeTz/9lL59+zJs2DAsLCw09l24cAFPT0/09fW5ffv2C21XiNfJ1q1bNZ5HRERgZ2fH0aNHadasGR4eHqxbt069v1KlSsyYMYOPP/6YBw8eYGCg08eyEEK8srT6q1amTBkUCgUKhYIqVapodDhyc3NJT0+Xy2YK8QZKT08nNTUVHx8fnJycNPbl5OTQo0cPmjZtysGDB4spQiFeTXnTo552Ii7vpljS0RBCvIm0+su2YMECVCoVn3zyCaGhoVhZWan3GRkZ4erqipeX1wsPUoiSRqlUEh4eztdff83ly5ext7fn008/ZeLEiYwbN44NGzZw5coVHBwc8PPzIzg4GENDQyIiItRTGfNOBqxYsQJ/f/+ntjdv3jxWrFjBX3/9hbW1NZ06dWLOnDmYm5sTGxtLy5YtAWjVqhUAu3fvpkWLFgBMmjSJt99+m9atW+vc2WgYtpMHBmY6vbYkMtZXMacBeIRsIys3/yizKNjz5u3irA5alVcqlQQGBtK4cWM8PDwKLHP9+nWmTZvGwIEDtY5HCCFeB1p1Nvr06QNAhQoVaNSokdxKXogiEhQUxPLly5k/fz5NmjTh6tWrnD17FgALCwsiIiJwcnLi1KlTDBgwAAsLC8aOHUv37t1JSEhg69at7NixA0DjpMCT6OnpsWjRIipUqMBff/3FkCFDGDt2LF9++SWNGjUiMTGRqlWrsm7dOho1aqQ+S7tr1y5++uknjh8/zvr165/ZTlZWFllZWernaWlpABjrqdDXV2mdp5LKWE+l8a8onOfNW05OjlblAwICSEhIYPfu3QW+Ni0tDV9fX9zd3Zk4caLW9b8MeTG9irG9yiRvupG86aY48qZNWwqVSvVcn1b3798nOztbY5vcFEwI3d29exdbW1uWLFlC//79n1k+PDycqKgofv/9d+DFrNn4+eefGTRoENevXwfg9u3blClTRmNE48aNG3h6erJ69WqaNWtGREQEgYGBT12zERISUuBFJCIjIzE1NdU5XiFeNV9//TVxcXHMnDkTe3v7fPvv3btHSEgIxsbGTJo0CSMjo2KIUgghdJOZmUnPnj3V00CfRqcJopmZmYwdO5Yff/yRGzdu5Nufm5urS7VCCODMmTNkZWXRunXrAvevXbuWRYsWkZSURHp6Og8ePHjuDv6OHTsICwvj7NmzpKWl8eDBA+7fv09mZuYTOwEDBgygZ8+eNGvWrNDtBAUFMXLkSPXztLQ0nJ2dadmyJTY2Ns91DCVJTk4OMTExtG3bVkaYtfAy8qZSqQgMDOT48ePs3bsXNze3fGXS0tLo0KED9vb2/PLLL690R1vea7qRvOlG8qab4shb3syEwtCpszFmzBh2797N0qVL6dWrF1988QV///03y5YtY9asWbpUKYT4fyYmJk/cd+jQIfz8/AgNDcXHxwcrKyuioqKYO3euzu1dvHiRjh07MnjwYGbMmIG1tTX79++nX79+ZGdnP/GL0K5du/jll18IDw8HHn7JUiqVGBgY8PXXX/PJJ5/ke42xsTHGxsb5thsaGsoHiw4kb7opyrwNGTKEyMhINm3ahLW1tfqEnJWVFSYmJuqORmZmJmvWrOHevXvcu3cPAFtbW/T19Yskrucl7zXdSN50I3nTzcvMmzbt6NTZ+PXXX1m1ahUtWrSgb9++NG3alMqVK+Pi4sKaNWvw8/PTpVohBODm5oaJiQk7d+7MN43q4MGDuLi4MHHiRPW2S5cuaZQxMjLSanTx6NGjKJVK5s6di57ew1vv/Pjjj8983aFDhzTa2bRpE7Nnz+bgwYOULVu20O0L8SZZunQpgHq6YZ68CzX88ccfxMXFAVC5cmWNMsnJybi6ur6MMIUQ4qXRqbNx8+ZNKlasCDxcn3Hz5k0AmjRpwuDBg19cdEKUQKVKlWLcuHGMHTsWIyMjGjduzH///ceff/6Jm5sbKSkpREVFUb9+fTZv3syGDRs0Xu/6f+3deVxU1f/48dewDTsIgYAimCuKIK6RG+aGpLmVppZQprll7ksq4hZqLqC5pH6ETNMW19RINEFFwyRx31ARK9dSEUlkub8//DHfJhZhBEbl/Xw85qFz77nnvO8bdOY959w77u5cvnyZxMREKleujJWVVb6zCbmqV69OZmYmixcvpnPnzsTFxbF8+fInxunh4aH1/MiRIxgYGBR41x0hyoMnXQbp5+f3xDZCCPEi0ekbxF9++WUuX74MQO3atTWfgv7www/Y2tqWWHBClFdTpkxh9OjRBAcH4+HhQa9evbh58yZvvPEGI0eOZNiwYdSvX5+DBw8yZcoUrWN79OiBv78/rVu3xsHBgfXr1xc6lre3NwsWLGDOnDl4enqybt06QkNDS/P0hBBCCFFO6HQ3qoULF2JoaMjw4cPZvXs3nTt3RlEUMjMzWbBgAR9//HFpxCqEeMGkpqZiY2PD7du35QLxYsjMzGTnzp0EBATIuuZikLwVn+RMN5I33UjedKOPvOW+fpfa3ahGjhyp+Xvbtm05e/YsCQkJVK9eHS8vL126FEIIIYQQQrxgdCo2/u3hw4e4ubnh5uZWEvEIIUrYunXr+PDDD/Pd5+bmxqlTp8o4IiGEEEKUFzoVG9nZ2Xz66acsX76cGzducP78eV5++WWmTJmCu7s7/fv3L+k4hRA6euONN2jatGm++2SaWgghhBClSadiY9asWXz55ZfMnTuXAQMGaLZ7enoSFhYmxYYQzxArKyusrKz0HYYQQgghyiGd7ka1Zs0aVqxYQd++fbW+gMjb25uzZ8+WWHBCCCGEEEKI55dOxcYff/yR58uIAHJycsjMzHzqoIQQcP36ddq1a4eFhYXcUlqIZ0RoaCiNGzfGysoKR0dHunbtyrlz57TarFixAj8/P6ytrVGpVNy9e1c/wQohxDNAp2KjTp067N+/P8/277//Hh8fn6cOSogXTUhICPXr1y/WMQsXLuTatWskJiZy/vz5EonDz8+PESNGlEhfAB9++CHVqlXDzMwMBwcHunTpIrOb4oUWGxvL0KFD+eWXX4iOjiYzM5P27dvz4MEDTZv09HT8/f355JNP9BipEEI8G3S6ZiM4OJjAwED++OMPcnJy2LRpE+fOnWPNmjVs3769pGMUoly6ePEiDRs2pEaNGvoOJY9Hjx5hYmJCw4YN6du3L1WqVOHvv/8mJCSE9u3bc/nyZa0llkK8KKKiorSeR0ZG4ujoSEJCAi1btgTQFPQxMTFlHJ0QQjx7ijWzcenSJRRFoUuXLvzwww/s3r0bCwsLgoODOXPmDD/88APt2rUrrViF0KuoqCiaN2+Ora0t9vb2dOrUiYsXL2r2//777/Tu3Rs7OzssLCxo1KgR8fHxREZGMm3aNI4dO4ZKpUKlUhEZGVnoWO7u7mzcuJE1a9agUqkICgoCYMGCBdSrVw8LCwtcXV0ZMmQIaWlpWsfGxcXh5+eHubk5FSpUoEOHDty5c4egoCBiY2MJDw/XxJGcnAw8/rS2SZMmqNVqnJ2dmTBhAllZWZo+/fz8GDZsGCNGjOCll16iQ4cOAAwcOJCWLVvi7u5OgwYNmDlzJlevXtX0K8SL7t69ewDY2dnpORIhhHg2FWtmo0aNGly7dg1HR0datGiBnZ0dJ06coGLFiqUVnxDPjAcPHjBq1Ci8vLxIS0sjODiYbt26kZiYSHp6Oq1ataJSpUps27YNJycnfvvtN3JycujVqxcnT54kKiqK3bt3A2BjY1PoWL/++iv9+vXD2tqa8PBwzMzMADAwMGDRokVUrVqVS5cuMWTIEMaNG8fSpUsBSExMpE2bNrz//vuEh4djZGTE3r17yc7OJjw8nPPnz+Pp6cn06dMBcHBw4I8//iAgIICgoCDWrFnD2bNnGTBgAKampoSEhGhi+vLLLxk8eDBxcXEF5iciIoKqVavi6uqab5uMjAwyMjI0z1NTUwFoOWc3WcYWRfgpCAC1gcKMRtBwehQZOSp9h/PceFLeToZ0KFZ/OTk5fPzxx7z66qvUqlUrzzWLuQV7Zmbmc3s9Y27cz2v8+iJ5043kTTf6yFtxxlIpiqIUtbGBgQHXr1/H0dERAGtraxITE3n55ZeLH6UQz7nbt2/j4ODAiRMnOHjwIGPGjCE5OTnfTzhDQkLYsmULiYmJRe6/a9eu2NraFjoL8v333zNo0CBu374NQJ8+fUhJSeHAgQP5tvfz86N+/fqEhYVptk2aNImNGzdy5swZVKrHb8CWLl3K+PHjuXfvHgYGBvj5+ZGamspvv/2Wp8+lS5cybtw4Hjx4QK1atdixYwfVqlXLd/yQkBCmTZuWZ/vXX3+Nubl5gecpxLNo+fLlJCQkEBoayksvvZRn/4kTJ5gyZQpr167F0tJSDxEKIUTpSE9Pp0+fPty7dw9ra+tC2z7VN4gXo04R4rl34cIFgoODiY+P5/bt2+Tk5ACQkpJCYmIiPj4+pb6UYvfu3YSGhnL27FlSU1PJysri4cOHpKenY25uTmJiIm+99Vax+jxz5gy+vr6aQgOgWbNmpKWl8fvvv1OlShUAGjZsmO/xffv2pV27dly7do158+bRs2dP4uLiMDU1zdN24sSJjBo1SvM8NTUVV1dXZh41IMtYrvEoqsef0Ocw5YiBzGwUw5PyVpyZjY8//piTJ09y4MABqlatmm8bC4vHs3Xt27d/bu8ol5mZSXR0NO3atZMvAS0GyZtuJG+60UfeclcmFEWxio3cdd7/3SZEedC5c2fc3NxYuXIlLi4u5OTk4OnpyaNHjzTLnEpTcnIynTp1YvDgwcyaNQs7OzsOHDhA//79efToEebm5qUaR+4bp/+ysbHBxsaGGjVq8Morr1ChQgU2b95M796987RVq9Wo1eo82/eNb4u9vX2Jx/yiyszMZOfOnSQE+8sLcjGURN4UReGjjz5i69atxMTEFHoDByOjxy+xxsbGz/3P6UU4B32QvOlG8qabssxbccYpVrGhKApBQUGaNwsPHz5k0KBBed6EbNq0qTjdCvHM++uvvzh37hwrV66kRYsWAFpLlby8vFi1ahV///13vrMbJiYmZGdnP1UMCQkJ5OTkMH/+fAwMHt/b4dtvv9Vq4+XlxZ49e/JdqlRQHB4eHmzcuBFFUTQfHsTFxWFlZUXlypWLFaOiKCiKonVdhhAvkqFDh/L111+zdetWrKysuH79OvC46M4t9q9fv87169dJSkoCHi+nsrKyokqVKnIhuRCi3CnW3agCAwNxdHTUfJL5zjvv4OLionme+xDiRVOhQgXs7e1ZsWIFSUlJ/Pzzz1rLgXr37o2TkxNdu3YlLi6OS5cusXHjRg4dOgQ8vrvU5cuXSUxM5Pbt2zq9Ga9evTqZmZksXryYS5cu8dVXX7F8+XKtNhMnTuTXX39lyJAhHD9+nLNnz7Js2TLNNR3u7u7Ex8eTnJysWQo2ZMgQrl69ykcffcTZs2fZunUrU6dOZdSoUZqiJj+XLl0iNDSUhIQEUlJSOHjwIG+99RZmZmYEBAQU+/yEeB4sW7aMe/fu4efnh7Ozs+bxzTffaNosX74cHx8fBgwYAEDLli3x8fFh27Zt+gpbCCH0plgzGxEREaUVhxDPNAMDAzZs2MDw4cPx9PSkVq1aLFq0CD8/P+DxjMGuXbsYPXo0AQEBZGVlUadOHZYsWQJAjx492LRpE61bt+bu3btERERobmdbVN7e3ixYsIA5c+YwceJEWrZsSWhoKP369dO0qVmzJrt27eKTTz6hSZMmmJmZ0bRpU82SpjFjxhAYGEidOnX4559/uHz5Mu7u7uzcuZOxY8fi7e2NnZ0d/fv3Z/LkyYXGY2pqyv79+wkLC+POnTtUrFiRli1bcvDgQc1NJIR40RTlWsWQkBCtO7kJIUR5Vqy7UQkhRElKTU3FxsaG27dvyzUbxZB77UFAQICsay4GyVvxSc50I3nTjeRNN/rIW+7rd1HuRlWsZVRCCCGEEEIIUVRSbAihB+vWrcPS0jLfR926dfUdnhBCCCFEiXiq79kQQujmjTfeoGnTpvnuk6ljIYQQQrwopNgQQg+srKywsrLSdxhCCCGEEKVKllEJIYQQQgghSoUUG0IIIcT/FxoaSuPGjbGyssLR0ZGuXbty7tw5rTYPHz5k6NCh2NvbY2lpSY8ePbhx44aeIhZCiGebFBtCPKOuX79Ou3btsLCwwNbWVt/hCFEuxMbGMnToUH755Reio6PJzMykffv2PHjwQNNm5MiR/PDDD3z33XfExsby559/0r17dz1GLYQQzy4pNoQoAyEhIdSvX79YxyxcuJBr166RmJjI+fPnSyQOPz8/RowYUSJ95fanUqm0HoMGDSqx/oUoa1FRUQQFBVG3bl28vb2JjIwkJSWFhIQEAO7du8f//vc/FixYwGuvvUbDhg2JiIjg4MGD/PLLL3qOXgghnj1ygbgQz6iLFy/SsGFDatSooe9Q8nj06BEmJiYADBgwgOnTp2v2mZub6yssIUrcvXv3ALCzswMgISGBzMxM2rZtq2lTu3ZtqlSpwqFDh3jllVf0EqcQQjyrpNgQooiioqKYOXMmJ0+exNDQEF9fX8LDw6lWrRoAv//+O2PHjuWnn34iIyMDDw8PlixZwpkzZ5g2bRoAKpUKgIiICIKCggocy93dnStXrgCwZs0aAgMDiYyMZMGCBURERHDp0iXs7Ozo3Lkzc+fOxdLSUnNsXFwckyZN4vDhw6jVapo0acKGDRsYOXIksbGxxMbGEh4eDsDly5dxd3cnNjaWsWPHcuzYMezs7AgMDGTmzJkYGT3+L8LPzw9PT0+MjIxYu3Yt9erVY+/evcDj4sLJyempcts0dA9ZRhZP1Ud5ojZUmNsEPEN+IiNbpe9wnhu5eSuqnJwcRowYQbNmzfD09AQeL280MTHJs7SxYsWKXL9+vQSjFUKIF4MUG0IU0YMHDxg1ahReXl6kpaURHBxMt27dSExMJD09nVatWlGpUiW2bduGk5MTv/32Gzk5OfTq1YuTJ08SFRXF7t27AbCxsSl0rF9//ZV+/fphbW1NeHg4ZmZmABgYGLBo0SKqVq3KpUuXGDJkCOPGjWPp0qUAJCYm0qZNG95//33Cw8MxMjJi7969ZGdnEx4ezvnz5/H09NTMRDg4OPDHH38QEBBAUFAQa9as4ezZswwYMABTU1NCQkI0MX355ZcMHjyYuLg4rVjXrVvH2rVrcXJyonPnzkyZMqXA2Y2MjAwyMjI0z1NTUwFQGygYGirF+GmUb2oDRetPUTS5+crMzCxS+2HDhnHy5En27t2rOSYrKyvfPhRFITs7u8h9Py9yz+dFO6/SJnnTjeRNN/rIW3HGUimKIq9WQujg9u3bODg4cOLECQ4ePMiYMWNITk7WLLf4t5CQELZs2UJiYmKR++/atSu2trZERkYW2Ob7779n0KBB3L59G4A+ffqQkpLCgQMH8m3v5+dH/fr1CQsL02ybNGkSGzdu5MyZM5qZl6VLlzJ+/Hju3buHgYEBfn5+pKam8ttvv2n1t2LFCtzc3HBxceH48eOMHz+eJk2asGnTpnzHDwkJ0czy/NvXX38ty6/EM2XFihXEx8fz6aefUrFiRc3248ePExwczNq1a7VmFAcMGEDnzp1544039BGuEEKUqfT0dPr06cO9e/ewtrYutK3MbAhRRBcuXCA4OJj4+Hhu375NTk4OACkpKSQmJuLj45NvoVGSdu/eTWhoKGfPniU1NZWsrCwePnxIeno65ubmJCYm8tZbbxWrzzNnzuDr66spNACaNWtGWloav//+O1WqVAGgYcOGeY4dOHCg5u/16tXD2dmZNm3acPHiRc3ysn+bOHEio0aN0jxPTU3F1dWVmUcNyDI2LFbc5ZnaQGFGoxymHDEgI0eWURVVbt7atWuHsbFxvm0URWHEiBEkJiayb9++PNdMNWvWjBkzZmBkZERAQAAA586d49atW7z33ns0bdq01M+jLGVmZhIdHV1ozkRekjfdSN50o4+85a5MKAopNoQoos6dO+Pm5sbKlStxcXEhJycHT09PHj16pFnmVJqSk5Pp1KkTgwcPZtasWdjZ2XHgwAH69+/Po0ePMDc3L9U4LCyefE1F7hutpKSkfIsNtVqNWq3Os33f+LbY29s/fZDlRGZmJjt37iQh2F9ekIshN2/GxsYF5m3IkCF8/fXXbN26FTs7O/766y/g8dJHMzMzXnrpJfr378+4ceNwdHTE2tqajz76CF9fX5o3b16Wp1OmCsuZKJjkTTeSN92UZd6KM47c+laIIvjrr784d+4ckydPpk2bNnh4eHDnzh3Nfi8vLxITE/n777/zPd7ExITs7OyniiEhIYGcnBzmz5/PK6+8Qs2aNfnzzz+12nh5ebFnz54C+8gvDg8PDw4dOsS/V1TGxcVhZWVF5cqVixVj7jIxZ2fnYh0nxLNi2bJl3Lt3Dz8/P5ydnTWPb775RtNm4cKFdOrUiR49etCyZUucnJwKXDoohBDlnRQbQhRBhQoVsLe3Z8WKFSQlJfHzzz9rLQfq3bs3Tk5OdO3albi4OC5dusTGjRs5dOgQ8PjuUpcvXyYxMZHbt29rXSRdVNWrVyczM5PFixdz6dIlvvrqK5YvX67VZuLEifz6668MGTKE48ePc/bsWZYtW6a5psPd3Z34+HiSk5M1S8GGDBnC1atX+eijjzh79ixbt25l6tSpjBo1CgODgv+LuHjxIjNmzCAhIYHk5GS2bdtGv379aNmyJV5eXsU+PyGeBYqi5Pv4993jTE1NWbJkCX///TcPHjxg06ZNT31HNiGEeFFJsSFEERgYGLBhwwYSEhLw9PRk5MiRfPbZZ5r9JiYm7Nq1C0dHRwICAqhXrx6zZ8/G0PDxdQg9evTA39+f1q1b4+DgwPr164sdg7e3NwsWLGDOnDl4enqybt06QkNDtdrUrFmTXbt2cezYMZo0aYKvry9bt27V3MJ2zJgxGBoaUqdOHRwcHEhJSaFSpUrs3LmTw4cP4+3tzaBBg+jfvz+TJ08uNB4TExN2795N+/btqV27NqNHj6ZHjx788MMPxT43IYQQQryY5G5UQgi9SU1NxcbGhtu3b8s1G8WQe+1BQECArGsuBslb8UnOdCN5043kTTf6yFvu63dR7kYlMxtCCCGEEEKIUiHFhhB6sG7dOiwtLfN91K1bV9/hCSGEEEKUCLn1rRB68MYbbxR4P36ZOhZCCCHEi0KKDSH0wMrKCisrK32HIYQQQghRqmQZlRBCCCGEEKJUSLEhyh0/Pz9GjBih7zCeOTExMahUKu7evavvUIQoVfv376dz5864uLigUqnYsmWL1v4bN24QFBSEi4sL5ubm+Pv7c+HCBf0EK4QQzzkpNoR4AUgBJUTRPXjwAG9vb5YsWZJnn6IodO3alUuXLrF161aOHj2Km5sbbdu25cGDB3qIVgghnm9yzYYQQohyxd/fn86dO+e778KFC/zyyy+cPHlSc2e4ZcuW4eTkxPr16/nggw/KMlQhhHjuycyGKNfu3LlDv379qFChAubm5nTs2FGzXEJRFBwcHPj+++817evXr4+zs7Pm+YEDB1Cr1aSnpz9xrLt37/Lhhx9SsWJFTE1N8fT0ZPv27Zr9GzdupG7duqjVatzd3Zk/f77W8UuXLqVGjRqYmppSsWJF3nzzTQCCgoKIjY0lPDwclUqFSqUiOTn5ifHs3LmTmjVrYmZmRuvWrfM95sCBA7Ro0QIzMzNcXV0ZPny45tPdTz75JN87anl7ezN9+vQnji/EsygjIwMAU1NTzTYDAwPUajUHDhzQV1hCCPHckpkNUa4FBQVx4cIFtm3bhrW1NePHjycgIIDTp09jbGxMy5YtiYmJ4c033+TOnTucOXMGMzMzzp49S+3atYmNjaVx48aYm5sXOk5OTg4dO3bk/v37rF27lmrVqnH69GkMDQ0BSEhIoGfPnoSEhNCrVy8OHjzIkCFDsLe3JygoiCNHjjB8+HC++uorXn31Vf7++2/2798PQHh4OOfPn8fT01PzJt/BwaHQeK5evUr37t0ZOnQoAwcO5MiRI4wePVqrzcWLF/H392fmzJmsXr2aW7duMWzYMIYNG0ZERAR9+/YlNDSUixcvUq1aNQBOnTrF8ePH2bhxY7F+Dk1D95BlZFGsY8oztaHC3CbgGfITGdkqfYfzTEme/fpTHV+7dm2qVKnCxIkT+eKLL7CwsGDhwoX8/vvvXLt2rYSiFEKI8kOKDVFu5RYZcXFxvPrqq8DjL9tzdXVly5YtvPXWW/j5+fHFF18AsG/fPnx8fHByciImJobatWsTExNDq1atnjjW7t27OXz4MGfOnKFmzZoAvPzyy5r9CxYsoE2bNkyZMgWAmjVrcvr0aT777DOCgoJISUnBwsKCTp06YWVlhZubGz4+PgDY2NhgYmKCubk5Tk5ORTr3ZcuWUa1aNc3sSa1atThx4gRz5szRtAkNDaVv376aa0Fq1KjBokWLaNWqFcuWLaNu3bp4e3vz9ddfa+Jet24dTZs2pXr16vmOm5GRofnkGCA1NRUAtYGCoaFSpNjF43z9+0/xfzIzM5+4779tsrKytLZ9++23DBw4EDs7OwwNDWnTpg3+/v4oilJo/y+ignImCid5043kTTf6yFtxxpJiQ5RbZ86cwcjISGspkL29PbVq1eLMmTMAtGrVio8//phbt24RGxuLn5+fptjo378/Bw8eZNy4cU8cKzExkcqVK2sKjfxi6dKli9a2Zs2aERYWRnZ2Nu3atcPNzY2XX34Zf39//P396dat2xNnVAo79/8ugfL19dV6fuzYMY4fP866des02xRFIScnh8uXL+Ph4UHfvn1ZvXo1U6ZMQVEU1q9fz6hRowocNzQ0lGnTpuXZPtknB3PzbJ3OpTyb0ShH3yE8c3bu3PnENtHR0VrPExIS8nyZ5vTp03nw4AFZWVnY2NgwduxYqlevXqT+X0T/zZkoGsmbbiRvuinLvBVl+XguKTaEKES9evWws7MjNjaW2NhYZs2ahZOTE3PmzOHXX38lMzNTMytSGDMzs6eKw8rKit9++42YmBh27dpFcHAwISEh/Prrr9ja2j5V3wVJS0vjww8/ZPjw4Xn2ValSBYDevXszfvx4fvvtN/755x+uXr1Kr169Cuxz4sSJWsVIamoqrq6utG7dGnt7+5I/iRdUZmYm0dHRtGvXTr5xvhgKylvDhg0JCAgo8LgLFy5w8eJFwsLCaNeuXVmE+syQ3zXdSN50I3nTjT7ylrsyoSik2BDlloeHB1lZWcTHx2sKhr/++otz585Rp04dAFQqFS1atGDr1q2cOnWK5s2bY25uTkZGBl988QWNGjXCwuLJ1xp4eXnx+++/c/78+XxnNzw8PIiLi9PaFhcXR82aNTXXdRgZGdG2bVvatm3L1KlTsbW15eeff6Z79+6YmJiQnV30mQEPDw+2bdumte2XX37Ret6gQQNOnz5d4JIogMqVK9OqVSvWrVvHP//8Q7t27XB0dCywvVqtRq1W59lubGwsLyw6kLzpJiMjg/Pnz2ueX716lVOnTmFnZ0eVKlX47rvvcHBwoEqVKpw4cYKPP/6Yrl27FlqQvOjkd003kjfdSN50U5Z5K844cjcqUW7VqFGDLl26MGDAAA4cOMCxY8d45513qFSpktaSJj8/P9avX0/9+vWxtLTEwMCAli1bsm7duiJdrwGPl2O1bNmSHj16EB0dzeXLl/nxxx+JiooCYPTo0ezZs4cZM2Zw/vx5vvzySz7//HPGjBkDwPbt21m0aBGJiYlcuXKFNWvWkJOTQ61atQBwd3cnPj6e5ORkbt++TU5O4ctrBg0axIULFxg7diznzp3j66+/JjIyUqvN+PHjOXjwIMOGDSMxMZELFy6wdetWhg0bptWub9++bNiwge+++46+ffsWKR9C6FNCQgI+Pj6a655GjRqFj48PwcHBAFy7do13332X2rVrM3z4cN59913Wr1+vz5CFEOK5JcWGKNciIiJo2LAhnTp1wtfXF0VR2Llzp1bF3qpVK7Kzs/Hz89Ns8/Pzy7PtSTZu3Ejjxo3p3bs3derUYdy4cZrZiAYNGvDtt9+yYcMGPD09CQ4OZvr06QQFBQFga2vLpk2beO211/Dw8GD58uWsX79e8z0AY8aMwdDQkDp16uDg4EBKSkqhsVSpUoWNGzeyZcsWvL29Wb58OZ9++qlWGy8vL2JjYzl//jwtWrTQvBlzcXHRavfmm2/y119/kZ6eTteuXYucDyH0pVWrViiKkueRW3APHz6cq1ev8ujRI65cucKMGTMwMTHRb9BCCPGcUimKIrczEULoRWpqKjY2Nty+fVuu2SiGzMxMdu7cSUBAgCw1KAbJW/FJznQjedON5E03+shb7uv3vXv3sLa2LrStzGwIIYQQQgghSoUUG0KUgHXr1mFpaZnvI3epU1kaNGhQgfEMGjSozOMRQgghRPkkd6MSogS88cYbeb63Ipc+poKnT5+uubj8v5403SmEEEIIUVKk2BCiBFhZWWFlZaXvMDQcHR0LvQWtEEIIIURZkGVUQgghhBBCiFIhxYYQQogXyr59++jcuTMuLi6oVCq2bNmitT8tLY1hw4ZRuXJlzMzMqFOnDsuXL9dPsEII8YKTYkM8lZCQEOrXr695HhQUJN+18Jz6789SiOfVgwcP8Pb2ZsmSJfnuHzt2LFFRUaxdu5YzZ84wYsQIhg0bxrZt28o4UiGEePFJsSHEc8Dd3Z2wsLAS6y+/T3vHjBnDnj17SmwMIfSlY8eOzJw5k27duuW7/9ChQwQGBuLn54e7uzsDBw7E29ubw4cPl3GkQgjx4pNiQ4gXRHZ2Njk5OTofb2lpKV+sJ8oFX19ftm3bxh9//IGiKOzdu5fz58/Tvn17fYcmhBAvHLkb1Qvm+++/Z9q0aSQlJWFubo6Pjw9bt25l6NCh3L17lyZNmhAeHk5GRgajRo3ik08+YeLEifzvf//D3NycGTNm8N5772n6Gz9+PJs3b+b333/HycmJvn37EhwcXOTbuebk5DBv3jxWrFjB1atXqVixIh9++CGTJk0qUv8hISFs2bKFwYMHM3PmTP766y86derEypUrsbGxKVIMq1evZv78+SQlJWFnZ0ePHj34/PPPAUhJSeGjjz5iz549GBgY4O/vz+LFi6lYsaLW+KNHj2bKlCncuXOHjh07snLlSs3dp550jlevXmX06NHs2rULAwMDWrRoQXh4OO7u7sDjpWd3796lefPmzJ8/n0ePHvH2228TFhaGsbExfn5+XLlyhZEjRzJy5EgAFEUhMjKSESNGsGbNGiZMmMD58+dJSkri1q1bfPLJJxw9epTMzEzq16/PwoULadCgAYBm3NxPfd3c3EhOTtaca2Jioua8Zs6cyYoVK7h16xYeHh7Mnj0bf39/AJKTk6latSobN25k8eLFxMfHU6NGDZYvX46vr2+Rfja5mobuIcvIoljHlGdqQ4W5TcAz5CcyslX6DqdMJc9+/an7CAsLY+jQoVSuXBkjIyMMDAxYuXIlLVu2LIEIhRBC/JsUGy+Qa9eu0bt3b+bOnUu3bt24f/8++/fvR1EUAH7++WcqV67Mvn37iIuLo3///hw8eJCWLVsSHx/PN998w4cffki7du2oXLky8PiWrpGRkbi4uHDixAkGDBiAlZUV48aNK1JMEydOZOXKlSxcuJDmzZtz7do1zp49q9lflP6TkpL49ttv+eGHH0hNTaV///4MGTKEdevWPXH8ZcuWMWrUKGbPnk3Hjh25d+8ecXFxwOM30126dMHS0pLY2FiysrIYOnQovXr1IiYmRtPHxYsX2bJlC9u3b+fOnTv07NmT2bNnM2vWrCeeY2ZmJh06dMDX15f9+/djZGTEzJkz8ff35/jx45iYmACwd+9enJ2d2bt3L0lJSfTq1Yv69eszYMAANm3ahLe3NwMHDmTAgAFa55eens6cOXNYtWoV9vb2ODo6cunSJQIDA1m8eDGKojB//nwCAgK4cOECVlZW/Prrrzg6OhIREYG/vz+Ghob55i48PJz58+fzxRdf4OPjw+rVq3njjTc4deoUNWrU0LSbNGkS8+bNo0aNGkyaNInevXuTlJSEkVHe/14yMjLIyMjQPE9NTQVAbaBgaKg88ecpHlMbKFp/lieZmZnFPiYrK4vMzEzNsYsWLeLQoUNs2rSJKlWqcODAAYYOHYqjoyNt2rQp6ZCfa7k50yXv5ZnkTTeSN93oI2/FGUul5L4TFc+93377jYYNG5KcnIybm5vWvqCgIGJiYrh06RIGBo9Xz9WuXRtHR0f27dsHPF6GY2Njw6pVq3j77bfzHWPevHls2LCBI0eOAOT5NDz3U/otW7Zw//59HBwc+Pzzz/nggw+KdA759T9z5kyuXLlCpUqVAIiKiuL111/njz/+wMnJqdD+KlWqxHvvvcfMmTPz7IuOjqZjx45cvnwZV1dXAE6fPk3dunU5fPgwjRs3JiQkhM8++4zr169rZjLGjRvHvn37+OWXX554jmvXrmXmzJmcOXMGlerxJ9CPHj3C1taWLVu20L59e83P5uLFi5o3/j179sTAwIANGzYAj2cjRowYwYgRIzR9R0ZG8t5775GYmIi3t3eBOcjJycHW1pavv/6aTp06AY+v2di8ebPWxfz//VlWqlSJoUOH8sknn2jaNGnShMaNG7NkyRLNzMaqVavo37+/Vv7OnDlD7dq188QSEhLCtGnT8mz/+uuvMTc3L/AchNBV165dmTBhAq+88grwuODt27cvEyZMoFGjRpp2n3/+OX/99RdTp07VV6hCCPHcSE9Pp0+fPty7d++JXxYsMxsvEG9vb9q0aUO9evXo0KED7du3580336RChQoA1K1bV1NoAFSsWBFPT0/Nc0NDQ+zt7bl586Zm2zfffMOiRYu4ePEiaWlpZGVlFfkbqM+cOUNGRkahnxQWpf8qVapoCg14vN46JyeHc+fOFVps3Lx5kz///LPA8c+cOYOrq6um0ACoU6cOtra2nDlzhsaNGwOP3+j/+wv7nJ2dNTl60jkeO3aMpKSkPF/49/DhQy5evKh5XrduXa0ZBmdnZ06cOFHgueUyMTHBy8tLa9uNGzeYPHkyMTEx3Lx5k+zsbNLT00lJSXlif7lSU1P5888/adasmdb2Zs2acezYMa1t/x7f2dkZeJz7/IqNiRMnMmrUKK1xXF1dmXnUgCzj/GdYRF5qA4UZjXKYcsSAjJzytYzqZEiHYh/TsGFDAgICyMzMZOvWrWRlZdGkSRPNkkCA7du3AxAQEFBisb4IMjMziY6Opl27dkVePiskb7qSvOlGH3nLXZlQFFJsvEAMDQ2Jjo7m4MGD7Nq1i8WLFzNp0iTi4+MB8vwCqlSqfLflXmR86NAh+vbty7Rp0+jQoQM2NjZs2LCB+fPnFykeMzOzQvc/bf9PO35RFZajJ42RlpZGw4YN813y5eDgUKQxCmNmZqaZMckVGBjIX3/9RXh4OG5ubqjVanx9fXn06NET+9PFv2PPjaWg2NVqNWq1Os/2fePbysXpxZCZmcnOnTtJCPaXF+R8pKWlkZSUpHl+9epVTp06hZWVFebm5rRs2ZKJEydiZWWFm5sbsbGxrF27lgULFkg+C2BsbCy50YHkTTeSN92UZd6KM47cjeoFo1KpaNasGdOmTePo0aOYmJiwefNmnfo6ePAgbm5uTJo0iUaNGlGjRg2uXLlS5ONr1KiBmZlZgbdTLWr/KSkp/Pnnn5rnv/zyCwYGBtSqVavQ8a2srHB3dy9wfA8PD65evcrVq1c1206fPs3du3epU6dOUU7xiefYoEEDLly4gKOjI9WrV9d6FPUCd3g8g5GdnV2ktnFxcQwfPpyAgADq1q2LWq3m9u3bWm2MjY0L7c/a2hoXFxfN9S3/7ruouRFCX44cOYKPjw8+Pj4AjBo1Ch8fH80SvrVr19K4cWP69u1LnTp1NNdgDRo0SJ9hCyHEC0lmNl4g8fHx7Nmzh/bt2+Po6Eh8fLzmLkLHjx8vdn81atQgJSWFDRs20LhxY3bs2FGswsXU1JTx48czbtw4TExMaNasGbdu3eLUqVP079+/yP2bmpoSGBjIvHnzSE1NZfjw4fTs2fOJ12vA42sEBg0ahKOjIx07duT+/fvExcXx0Ucf0bZtW+rVq0ffvn0JCwsjKyuLIUOG0KpVK6213E9zjn379uWzzz6jS5cuTJ8+ncqVK3PlyhU2bdrEuHHjNBfiP4m7uzv79u3j7bffRq1W89JLLxXYtkaNGnz11Vc0atSI1NRUxo4dm2cGJrcIa9asGWq1WrPU7t/Gjh3L1KlTqVatGvXr1yciIoLExMQiXZgvhD75+fmR3+WIuTNCTk5ORERE6CEyIYQof2Rm4wVibW3Nvn37CAgIoGbNmkyePJn58+fTsWNHnfp74403GDlyJMOGDaN+/focPHiQKVOmFKuPKVOmMHr0aIKDg/Hw8KBXr16a6x2K2n/16tXp3r07AQEBtG/fHi8vL5YuXVqk8QMDAwkLC2Pp0qXUrVuXTp06ceHCBeDxLNDWrVupUKECLVu2pG3btrz88st88803JXaO5ubm7Nu3jypVqtC9e3c8PDzo378/Dx8+LPK1LwDTp08nOTmZatWqaS2/ys///vc/7ty5Q4MGDXj33XcZPnw4jo6OWm3mz59PdHQ0rq6umk9//2v48OGMGjWK0aNHU69ePaKioti2bZvWnaiEEEIIIQojd6MSz7T/3iFJvFhSU1OxsbHh9u3bcs1GMeR+Qh8QECDrmotB8lZ8kjPdSN50I3nTjT7ylvv6XZS7UcnMhhBCCCGEEKJUSLEhnmuWlpYFPvbv36/v8IQQQgghyjW5QFw800JCQggJCSlwf2HLq/793RxCCCGEEKLsSbEhnmvVq1fXdwhCCCGEEKIAsoxKCCGEEEIIUSqk2BBCCPFC2bdvH507d8bFxQWVSsWWLVu09qelpTFs2DAqV66MmZkZderUYfny5foJVgghXnBSbAihg/zewLzoQkJCqF+/vr7DEOKJHjx4gLe3N0uWLMl3/9ixY4mKimLt2rWcOXOGESNGMGzYMLZt21bGkQohxItPig0hRB75FVNjxoxhz549+glIiGLo2LEjM2fOpFu3bvnuP3ToEIGBgfj5+eHu7s7AgQPx9vbm8OHDZRypEEK8+KTYEKKcyM7OJicnR+fjLS0t5Yv3xAvB19eXbdu28ccff6AoCnv37uX8+fO0b99e36EJIcQLR+5GJcqdFStWEBISwu+//46Bwf/V2126dMHe3p7Vq1ezbNky5s2bx9WrV6latSqTJ0/m3Xffzbe/mJgYWrduzZ07d7C1tQUe35LXx8eHy5cv4+7uTmRkJCNGjGDt2rWMHj2aq1evEhAQwJo1a/juu++YOnUq9+7d491332XhwoUYGhoCkJGRwaRJk1i/fj13797F09OTOXPm4Ofn98TzzB1zzZo1TJgwgfPnz5OUlMStW7f45JNPOHr0KJmZmdSvX5+FCxfSoEEDANzd3QE0nwq7ubmRnJyc59vcc3JymDlzJitWrODWrVt4eHgwe/Zs/P39i/0zaRq6hywji2IfV16pDRXmNgHPkJ/IyFbpO5wylTz79afuIywsjKFDh1K5cmWMjIwwMDBg5cqVtGzZsgQiFEII8W9SbIhy56233uKjjz5i7969tGnTBoC///6bqKgodu7cyebNm/n4448JCwujbdu2bN++nffee4/KlSvTunVrncdNT09n0aJFbNiwgfv379O9e3e6deuGra0tO3fu5NKlS/To0YNmzZrRq1cvAIYNG8bp06fZsGEDLi4ubN68GX9/f06cOEGNGjWKNOacOXNYtWoV9vb2ODo6cunSJQIDA1m8eDGKojB//nwCAgK4cOECVlZW/Prrrzg6OhIREYG/v7+m8Pmv8PBw5s+fzxdffIGPjw+rV6/mjTfe4NSpUwXGlpGRQUZGhuZ5amoqAGoDBUNDpbgpLbfUBorWn+VJZmZmsY/JysoiMzNTc+yiRYs4dOgQmzZtokqVKhw4cIChQ4fi6Oio+T9BPJabM13yXp5J3nQjedONPvJWnLGk2BDlToUKFejYsSNff/215o3F999/z0svvUTr1q1p0aIFQUFBDBkyBIBRo0bxyy+/MG/evKcqNjIzM1m2bBnVqlUD4M033+Srr77ixo0bWFpaUqdOHVq3bs3evXvp1asXKSkpREREkJKSgouLC/D4uomoqCgiIiL49NNPizTm0qVL8fb21mx77bXXtNqsWLECW1tbYmNj6dSpEw4ODgDY2tri5ORUYN/z5s1j/PjxvP322wDMmTOHvXv3EhYWVuCFuaGhoUybNi3P9sk+OZibZz/xfIS2GY10Xxb3vNq5c2exj0lISMDY2Bh4XPBOnTqVCRMmYGBgwO+//467uzuvvPIKn3zyCVOnTi3pkF8I0dHR+g7huSR5043kTTdlmbf09PQit5ViQ5RLffv2ZcCAASxduhS1Ws26det4++23MTAw4MyZMwwcOFCrfbNmzQgPD3+qMc3NzTWFBkDFihVxd3fH0tJSa9vNmzcBOHHiBNnZ2dSsWVOrn4yMjCJfO2FiYoKXl5fWths3bjB58mRiYmK4efMm2dnZpKenk5KSUuRzSU1N5c8//6RZs2Za25s1a8axY8cKPG7ixImMGjVKqx9XV1dat24t14MUQ2ZmJtHR0bRr107zJloUrGHDhgQEBJCZmcnWrVvJysqiSZMmWkv+tm/fDkBAQIC+wnwmye+abiRvupG86UYfectdmVAUUmyIcqlz584oisKOHTto3Lgx+/fvZ+HChTr1lXvdh6L835KW/KYX//sfgEqlyndb7kXcaWlpGBoakpCQkGcp078LlMKYmZmhUmmv6Q8MDOSvv/4iPDwcNzc31Go1vr6+PHr0qEh9Pg21Wo1arc6z3djYWF5YdCB5y19aWhpJSUma51evXuXUqVNYWVlhbm5Oy5YtmThxIlZWVri5uREbG8vatWtZsGCB5LMA8rumG8mbbiRvuinLvBVnHCk2RLlkampK9+7dWbduHUlJSdSqVUtzgbSHhwdxcXEEBgZq2sfFxVGnTp18+8pddnTt2jUqVKgAoLmI+mn4+PiQnZ3NzZs3adGixVP3lysuLo6lS5dqPsG9evUqt2/f1mpjbGxMdnbBy5qsra1xcXEhLi6OVq1aafXdpEmTEotVCF0cOXJEa8lj7mzau+++S48ePVi7di3BwcH07duXv//+Gzc3N2bNmsWgQYP0FbIQQrywpNgQ5Vbfvn3p1KkTp06d4p133tFsHzt2LD179sTHx4e2bdvyww8/sGnTJnbv3p1vP9WrV8fV1ZWQkBBmzZrF+fPnmT9//lPHV7NmTfr27Uu/fv2YP38+Pj4+3Lp1iz179uDl5cXrr+t2V54aNWrw1Vdf0ahRI1JTUxk7dixmZmZabdzd3dmzZw/NmjVDrVZriqh/Gzt2LFOnTqVatWrUr1+fiIgIEhMTWbdunU5xCVFS/Pz8tGYac2VmZrJz506cnJyIiIjQQ2RCCFH+yPdsiHLrtddew87OjnPnztGnTx/N9q5duxIeHs68efOoW7cuX3zxBREREQXebtbY2Jj169dz9uxZvLy8mDNnDjNnziyRGCMiIujXrx+jR4+mVq1adO3alV9//ZUqVaro3Of//vc/7ty5Q4MGDXj33XcZPnw4jo6OWm3mz59PdHQ0rq6u+Pj45NvP8OHDGTVqFKNHj6ZevXpERUWxbdu2It0lSwghhBDlg0rJ7+MfIYQoA6mpqdjY2HD79m25QLwYcj+hDwgIkHXNxSB5Kz7JmW4kb7qRvOlGH3nLff2+d+8e1tbWhbaVmQ0hhBBCCCFEqZBiQ4jnVMeOHbG0tMz3UZTv4BBCCCGEKG1ygbgQz6lVq1bxzz//5LvPzs6ujKMRQgghhMhLig0hnlOVKlXSdwhCCCGEEIWSZVRCCCGEEEKIUiHFhhCixAQFBdG1a1d9hyHKgX379tG5c2dcXFxQqVRs2bJFa79KpcrzMDExYfPmzfoJWAghyikpNkS55+fnx4gRI/QdxjMrOTkZlUpVIt+KLkRJefDgAd7e3ixZsiTf/deuXdN6rF69GpVKha+vbxlHKoQQ5ZtcsyFECXj06BEmJib6DqNAmZmZcs9y8ULp2LEjHTt2LHC/k5OT1vOtW7fi5+eXZ7sQQojSJTMbolwLCgoiNjaW8PBwzVKLyMhIbG1ttdpt2bIFlUqleR4SEkL9+vVZtWoVVatWxdTUFHi8dGPVqlV069YNc3NzatSowbZt27T6io2NpUmTJqjVapydnZkwYQJZWVkArFixAhcXF3JycrSO6dKlC++//77m+datW2nQoAGmpqa8/PLLTJs2TdNHbhzLli3jjTfewMLCglmzZhWahzt37tC3b18cHBwwMzOjRo0aREREAFC1alUAfHx8UKlUmm9Sz87OZtSoUdja2mJvb8+4ceOQ7wgVz6IbN26wY8cOgoKC9B2KEEKUOzKzIcq18PBwzp8/j6enJ9OnTwdgx44dRTo2KSmJjRs3smnTJgwNDTXbp02bxty5c/nss89YvHgxffv25cqVK9jZ2fHHH38QEBBAUFAQa9as4ezZswwYMABTU1NCQkJ46623+Oijj9i7dy9t2rQB4O+//yYqKoqdO3cCsH//fvr168eiRYto0aIFFy9eZODAgQBMnTpVE0dISAizZ88mLCwMI6PC/6lPmTKF06dP8+OPP/LSSy+RlJSkua3u4cOHadKkCbt376Zu3bqaGZz58+cTGRnJ6tWr8fDwYP78+WzevJnXXnutwHEyMjLIyMjQPE9NTQWg5ZzdZBlbFCnvAtQGCjMaQcPpUWTkqJ58wHPkZEgHnY7LysoiMzMz332rV6/GysqKTp06sX///gLbibxycyU5Kx7Jm24kb7rRR96KM5YUG6Jcs7GxwcTEBHNzc83yin8XDoV59OgRa9aswcHBQWt7UFAQvXv3BuDTTz9l0aJFHD58GH9/f5YuXYqrqyuff/45KpWK2rVr8+effzJ+/HiCg4OpUKECHTt25Ouvv9YUG99//z0vvfQSrVu3Bh4XMxMmTCAwMBCAl19+mRkzZjBu3DitYqNPnz689957RTqXlJQUfHx8aNSoEQDu7u6afbnnZ29vr7UEJSwsjIkTJ9K9e3cAli9fzk8//VToOKGhoUybNi3P9sk+OZibZxcpVvF/ZjTKeXKj50xuUV1cCQkJBS4VXLJkCb6+vuzfvx+A6OhoneMrryRnupG86UbyppuyzFt6enqR20qxIYSO3Nzc8hQaAF5eXpq/W1hYYG1tzc2bNwE4c+YMvr6+WkuymjVrRlpaGr///jtVqlShb9++DBgwgKVLl6JWq1m3bh1vv/02BgaPVz0eO3aMuLg4raVR2dnZPHz4kPT0dMzNzQE0hUNRDB48mB49evDbb7/Rvn17unbtyquvvlpg+3v37nHt2jWaNm2q2WZkZESjRo0KXUo1ceJERo0apXmempqKq6srM48akGVctCJP5M5s5DDliIHMbPx/DRs2JCAgIM/2AwcO8Mcff7Blyxbq1KlDdHQ07dq1k2uYiigzM1NypgPJm24kb7rRR95yVyYUhRQbQvyHgYFBnjfM+U0XWljkv+znv//QVSpVnmswCtO5c2cURWHHjh00btyY/fv3s3DhQs3+tLQ0pk2bpplR+Lfca0cKiy8/HTt25MqVK+zcuZPo6GjatGnD0KFDmTdvXpH7KAq1Wo1arc6zfd/4ttjb25foWC+yzMxMdu7cSUKwv7wg/39GRkb55uLLL7+kYcOGNGrUSPPv2NjYWPJWTJIz3UjedCN5001Z5q0448gF4qLcMzExITv7/5bwODg4cP/+fR48eKDZVlK3ffXw8ODQoUNaxUxcXBxWVlZUrlwZeFwwdO/enXXr1rF+/Xpq1apFgwYNNO0bNGjAuXPnqF69ep5H7uyHLhwcHAgMDGTt2rWEhYWxYsUKAM01Gv/OkY2NDc7OzsTHx2u2ZWVlkZCQoPP4QhRHWloaiYmJmn+bly9fJjExkZSUFE2b1NRUvvvuOz744AM9RSmEEEJmNkS55+7uTnx8PMnJyVhaWtK0aVPMzc355JNPGD58OPHx8URGRpbIWEOGDCEsLIyPPvqIYcOGce7cOaZOncqoUaO0CoW+ffvSqVMnTp06xTvvvKPVR3BwMJ06daJKlSq8+eabGBgYcOzYMU6ePMnMmTN1iis4OJiGDRtSt25dMjIy2L59Ox4eHgA4OjpiZmZGVFQUlStXxtTUFBsbGz7++GNmz55NjRo1qF27NgsWLODu3bs650aI4jhy5IjmOiZAszwvMDBQ8+91w4YNKIqiuYZKCCFE2ZOZDVHujRkzBkNDQ+rUqYODgwOpqamsXbuWnTt3Uq9ePdavX09ISEiJjFWpUiV27tzJ4cOH8fb2ZtCgQfTv35/JkydrtXvttdews7Pj3Llz9OnTR2tfhw4d2L59O7t27aJx48a88sorLFy4EDc3N53jMjExYeLEiXh5edGyZUsMDQ3ZsGED8Hh5yqJFi/jiiy9wcXGhS5cuAIwePZp3332XwMBAfH19sbKyolu3bjrHIERx+Pn5oShKnse/PxgYOHAg6enp2NjY6C9QIYQo51SK3BhfCKEnqamp2NjYcPv2bblmoxhyr9kICAiQdc3FIHkrPsmZbiRvupG86UYfect9/b537x7W1taFtpWZDSGEEEIIIUSpkGJDiHJg0KBBWFpa5vsYNGiQvsMTQgghxAtKLhAXohyYPn06Y8aMyXffk6Y/hRBCCCF0JcWGEOWAo6Mjjo6O+g5DCCGEEOWMLKMSQgghhBBClAopNoQQQjxz9u3bR+fOnXFxcUGlUrFly5Y8bc6cOcMbb7yBjY0NFhYWNG7cWOtL/YQQQuifFBtClBB3d3fCwsL0HUaZiYmJQaVSyRf5iVLx4MEDvL29WbJkSb77L168SPPmzalduzYxMTEcP36cKVOmYGpqWsaRCiGEKIxcsyFEAZKTk6latSpHjx6lfv36ZTauu7s7I0aMYMSIEWU25pP4+flRv379clVMCf3q2LEjHTt2LHD/pEmTCAgIYO7cuZpt1apVK4vQhBBCFIPMbAjxlB49elTmY2ZnZ5OTk1Pm4wrxLMjJyWHHjh3UrFmTDh064OjoSNOmTfNdaiWEEEK/ZGZDlHs5OTnMmzePFStWcPXqVSpWrMiHH37I5MmTAfDx8QGgVatWxMTEEBQUxN27d2ncuDFLlixBrVZz+fLlIo+nKArTpk1j9erV3LhxA3t7e958800WLVqEn58fV65cYeTIkYwcOVLTPjIykhEjRrBmzRomTJjA+fPnSUpKwtnZmUmTJrF+/Xru3r2Lp6cnc+bMwc/PD0Bz3DfffMOIESO4evUqzZs3JyIiAmdnZwCysrIYNWoUa9aswdDQkA8++IDr169z7949tmzZQlBQELGxscTGxhIeHg6gdb4JCQmMHz+e06dPU79+fSIiIqhVq1axfgZNQ/eQZWRRrGPKM7Whwtwm4BnyExnZKn2HU2zJs19/quNv3rxJWloas2fPZubMmcyZM4eoqCi6d+/O3r17adWqVQlFKoQQ4mlJsSHKvYkTJ7Jy5UoWLlxI8+bNuXbtGmfPnuXw4cM0adKE3bt3U7duXUxMTDTH7NmzB2tra6Kjo4s93saNG1m4cCEbNmygbt26XL9+nWPHjgGwadMmvL29GThwIAMGDNA6Lj09nTlz5rBq1Srs7e1xdHRk2LBhnD59mg0bNuDi4sLmzZvx9/fnxIkT1KhRQ3PcvHnz+OqrrzAwMOCdd95hzJgxrFu3DoA5c+awbt06IiIi8PDwIDw8nC1bttC6dWsAwsPDOX/+PJ6enkyfPh0ABwcHkpOTgcfLWebPn4+DgwODBg3i/fffJy4uLt9zz8jIICMjQ/M8NTUVALWBgqGhUuxclldqA0Xrz+dNZmZmsY/JysrSHJf7O9S5c2eGDRsGQN26dTlw4ABLly7l1VdfLXRcXcYvryRnupG86Ubypht95K04Y0mxIcq1+/fvEx4ezueff05gYCDweN138+bNNW+m7e3tcXJy0jrOwsKCVatWaRUgRZWSkoKTkxNt27bF2NiYKlWq0KRJEwDs7OwwNDTEysoqz5iZmZksXboUb29vTT8RERGkpKTg4uICwJgxY4iKiiIiIoJPP/1Uc9zy5cs169mHDRumKRoAFi9ezMSJE+nWrRsAn3/+OTt37tTst7GxwcTEBHNz8zwxAcyaNUvzSfKECRN4/fXXefjwYb4X6oaGhjJt2rQ82yf75GBunl3EDIpcMxo9n0vp/v37VVQJCQkYGxsDj3+nDQ0NMTQ01OrLxMSE48ePP7F/XT4kKO8kZ7qRvOlG8qabssxbenp6kdtKsSHKtTNnzpCRkUGbNm2KdVy9evV0KjQA3nrrLcLCwnj55Zfx9/cnICCAzp07Y2RU+D9HExMTvLy8NM9PnDhBdnY2NWvW1GqXkZGBvb295rm5ubnWhbPOzs7cvHkTgHv37nHjxg1NsQNgaGhIw4YNi3xNyL9jyl2adfPmTapUqZKn7cSJExk1apTmeWpqKq6ursw8akCWsWGRxhOPZzRmNMphyhEDMnKev2VUJ0M6FPuYhg0bEhAQoHneuHFjAK1tq1evxtvbW2vbv2VmZhIdHU27du00hYsonORMN5I33UjedKOPvOWuTCgKKTZEuWZmZqbTcRYWul9f4Orqyrlz59i9ezfR0dEMGTKEzz77jNjY2EL/kzAzM0Ol+r83lmlpaRgaGpKQkIChofYbdUtLS83f/9unSqVCUUpu+c2/+8+Nr6BCRa1Wo1ar82zfN76tVoEkCpeZmcnOnTtJCPZ/YV+Q09LSSEpK0jy/evUqp06dws7OjipVqjBu3Dh69eqFn58frVu3Jioqih07dhATE/PEnBgbG7+weSstkjPdSN50I3nTTVnmrTjjyN2oRLlWo0YNzMzM2LNnT559uTMX2dklv7zHzMyMzp07s2jRImJiYjh06BAnTpzQjFuUMX18fMjOzubmzZtUr15d65Hfcqf82NjYULFiRX799VfNtuzsbH777TetdkWNSYiScuTIEXx8fDQ3aBg1ahQ+Pj4EBwcD0K1bN5YvX87cuXOpV68eq1atYuPGjTRv3lyfYQshhPgPmdkQ5ZqpqSnjx49n3LhxmJiY0KxZM27dusWpU6cIDAzEzMyMqKgoKleujKmpKTY2Nk89ZmRkJNnZ2TRt2hRzc3PWrl2LmZkZbm5uwOPv2di3bx9vv/02arWal156Kd9+atasSd++fenXrx/z58/Hx8eHW7dusWfPHry8vHj99aLd8eejjz4iNDSU6tWrU7t2bRYvXsydO3e0ZlHc3d2Jj48nOTkZS0tL7OzsnjoPQhTGz8/viTNw77//Pu+//34ZRSSEEEIXMrMhyr0pU6YwevRogoOD8fDwoFevXty8eRMjIyMWLVrEF198gYuLC126dCmR8WxtbVm5ciXNmjXDy8uL3bt388MPP2iWEU2fPp3k5GSqVauGg4NDoX1FRETQr18/Ro8eTa1atejatSu//vprvtdLFGT8+PH07t2bfv364evri6WlJR06dNC6wHvMmDEYGhpSp04dHBwcSElJ0e3khRBCCFGuqJSSXLwthHju5eTk4OHhQc+ePZkxY0apjpWamoqNjQ23b9+WazaKIfeajYCAAFnXXAySt+KTnOlG8qYbyZtu9JG33Nfve/fuYW1tXWhbWUYlRDl35coVdu3aRatWrcjIyODzzz/n8uXL9OnTR9+hCSGEEOI5J8uohChh69atw9LSMt9H3bp19R1eHgYGBkRGRtK4cWOaNWvGiRMn2L17Nx4eHvoOTQghhBDPOZnZEKKEvfHGGzRt2jTffc/itLCrq2uB3/gthBBCCPE0pNgQooRZWVlhZWWl7zCEEEIIIfROllEJIYQQQgghSoUUG0IIIcrcvn376Ny5My4uLqhUKrZs2aK1PygoCJVKpfXw9/fXT7BCCCF0JsWGEC+Q5ORkVCoViYmJT93Xpk2baN++Pfb29k/sU1EUOnbsmO+bRiHy8+DBA7y9vVmyZEmBbfz9/bl27ZrmsX79+jKMUAghREmQazaEKIcePXqEiYlJoW0ePHhA8+bN6dmzJwMGDCi0bVhYmNY3jgvxJB07dqRjx46FtlGr1Tg5OZVRREIIIUqDzGwI8ZyJioqiefPm2NraYm9vT6dOnbh48SIAVatWBcDHxweVSoWfnx/weElK165dmTVrFi4uLtSqVeuJ47z77rsEBwfTtm3bQtslJiYyf/58Vq9e/XQnJsR/xMTE4OjoSK1atRg8eDB//fWXvkMSQghRTDKzIcRz5sGDB4waNQovLy/S0tIIDg6mW7duJCYmcvjwYZo0acLu3bupW7eu1uzFnj17sLa2Jjo6usRiSU9Pp0+fPixZsuSpPoFuGrqHLCOLEovrRac2VJjbBDxDfiIj+9mbUUqe/fpT9+Hv70/37t2pWrUqFy9e5JNPPqFjx44cOnQIQ0PDEohSCCFEWZBiQ4jnTI8ePbSer169GgcHB06fPo2DgwMA9vb2ed78W1hYsGrVqicunyqOkSNH8uqrr9KlS5citc/IyCAjI0PzPDU1FQC1gYKhoVJicb3o1AaK1p/PmszMzGIfk5WVpXXcv3/Pa9eujYeHB7Vr12b37t289tprTxWXLvGVV5Iz3UjedCN5040+8lacsaTYEOI5c+HCBYKDg4mPj+f27dvk5OQAkJKSQp06dQo8rl69eiVaaGzbto2ff/6Zo0ePFvmY0NBQpk2blmf7ZJ8czM2zSyy28mJGoxx9h5CvnTt3FvuYhISEJ37ppbW1NVu3buXhw4e6hgZQorN75YXkTDeSN91I3nRTlnlLT08vclspNoR4znTu3Bk3NzdWrlyJi4sLOTk5eHp68ujRo0KPs7Ao2WVKP//8MxcvXsTW1lZre48ePWjRogUxMTF5jpk4cSKjRo3SPE9NTcXV1ZXWrVtjb29fovG9yDIzM4mOjqZdu3bP5LfS66Jhw4YEBAQUuP/333/n/v37tG3bttB2hXkR81baJGe6kbzpRvKmG33kLXdlQlFIsSHEc+Svv/7i3LlzrFy5khYtWgBw4MABzf7cmYvs7NKfJZgwYQIffPCB1rZ69eqxcOFCOnfunO8xarUatVqdZ7uxsbG8sOjgec5bWloaSUlJmudXr17l1KlT2NnZYWdnx7Rp0+jRowdOTk5cvHiRcePGUb16dV5//fWnPufnOW/6IjnTjeRNN5I33ZRl3oozjhQbQjxHKlSogL29PStWrMDZ2ZmUlBQmTJig2e/o6IiZmRlRUVFUrlwZU1NTbGxsdBrr77//JiUlhT///BOAc+fOAeDk5KT1+K8qVapo7oolREGOHDlC69atNc9zZ7wCAwNZtmwZx48f58svv+Tu3bu4uLjQvn17ZsyYkW+xKoQQ4tklxYYQzxEDAwM2bNjA8OHD8fT0pFatWixatEhzi1sjIyMWLVrE9OnTCQ4OLnA5U1Fs27aN9957T/P87bffBmDq1KmEhIQ85ZmI8s7Pzw9FKfgC959++qkMoxFCCFFapNgQ4jnTtm1bTp8+rbXt32/aPvjggzzLmyIjI4s9TlBQEEFBQcU6prA3j0IIIYQof+RL/YQQQgghhBClQooNIcqh/fv3Y2lpWeBDCCGEEKIkyDIqIcqhRo0akZiYqO8whBBCCPGCk2JDiHLIzMyM6tWr6zsMIYQQQrzgZBmVEEIIIYQQolRIsSGEEKLE7du3j86dO+Pi4oJKpWLLli0Fth00aBAqlYqwsLAyi08IIUTZkGKjEMnJyahUKlnb/gIICgqia9eu+g5DiHLjwYMHeHt7s2TJkkLbbd68mV9++QUXF5cyikwIIURZKpfFxrP0xjMmJgaVSsXdu3f1HQoA9+/fZ8SIEbi5uWFmZsarr77Kr7/+qtVGURSCg4NxdnbGzMyMtm3bcuHChTKP9VkrBv38/BgxYoS+w9DYs2cPr776KlZWVjg5OTF+/HiysrK02hw/fpwWLVpgamqKq6src+fOLXL/K1eupEWLFlSoUIEKFSrQtm1bDh8+XNKnIZ5THTt2ZObMmXTr1q3ANn/88QcfffQR69atw9jYuAyjE0IIUVbKZbFRFhRFyfPGrrRlZmY+dR8ffPAB0dHRfPXVV5w4cYL27dvTtm1b/vjjD02buXPnsmjRIpYvX058fDwWFhZ06NCBhw8fPvX4z6JHjx49d+MdO3aMgIAA/P39OXr0KN988w3btm1jwoQJmjapqam0b98eNzc3EhIS+OyzzwgJCWHFihVFGiMmJobevXuzd+9eDh06hKurK+3bt9f6XRGiIDk5Obz77ruMHTuWunXr6jscIYQQpeSFvhvV999/z7Rp00hKSsLc3BwfHx98fHz48ssvAVCpVADs3bsXPz8/Dh8+zIcffsiZM2fw9PRk0qRJRR4rJiaG1q1bs3PnTiZPnsyJEyfYtWsXLVu2ZM6cOaxYsYLr169Ts2ZNpkyZwptvvklycjKtW7cGoEKFCgAEBgYSGRmJu7s7I0aM0PqkvH79+nTt2pWQkBBN/EuXLuXHH39kz549jB07FoAtW7YwevRopkyZwp07d+jYsSMrV67Eysqq0HP4559/2LhxI1u3bqVly5YAhISE8MMPP7Bs2TJmzpyJoiiEhYUxefJkunTpAsCaNWuoWLEiW7Zs4e233y5yzorizp07DBs2jF27dpGWlkblypX55JNPeO+996hatSoAPj4+ALRq1YqYmBiys7MZO3Ysq1evxtDQkP79+xfrm639/Pzw9PTEyMiItWvXUq9ePfbu3cvJkycZO3Ys+/fvx8LCgvbt27Nw4UJeeuklgoKCiI2NJTY2lvDwcAAuX75MTEwMI0aM0Jq52rJlC926ddPEFBISwpYtWxg2bBizZs3iypUr5OTkoFKpWLlyJTt27OCnn36iUqVKzJ8/nzfeeOOJ5/DNN9/g5eVFcHAwANWrV2fu3Ln07NmTqVOnYmVlxbp163j06BGrV6/GxMSEunXrkpiYyIIFCxg4cOATx1i3bp3W81WrVrFx40b27NlDv379ippuAJqG7iHLyKJYx5RnakOFuU3AM+QnMrJVZT5+8uzXn7qPOXPmYGRkxPDhw0sgIiGEEM+qF7bYuHbtGr1792bu3Ll069aN+/fvs3//fvr160dKSgqpqalEREQAYGdnR1paGp06daJdu3asXbuWy5cv8/HHHxd73AkTJjBv3jxefvllKlSoQGhoKGvXrmX58uXUqFGDffv28c477+Dg4EDz5s3ZuHEjPXr04Ny5c1hbW2NmZlas8UJCQpg9ezZhYWEYGRmxevVqLl68yJYtW9i+fTt37tyhZ8+ezJ49m1mzZhXaV1ZWFtnZ2ZiammptNzMz48CBA8DjN9DXr1+nbdu2mv02NjY0bdqUQ4cOlXixMWXKFE6fPs2PP/7ISy+9RFJSEv/88w8Ahw8fpkmTJuzevZu6detiYmICwPz584mMjGT16tV4eHgwf/58Nm/ezGuvvVbkcb/88ksGDx5MXFwcAHfv3uW1117jgw8+YOHChfzzzz+MHz+enj178vPPPxMeHs758+fx9PRk+vTpADg4OBR5vKSkJDZu3MimTZswNDTUbJ82bRpz587ls88+Y/HixfTt25crV65gZ2dXaH8ZGRn5/hwfPnxIQkICfn5+HDp0iJYtW2ryBtChQwfmzJnDnTt3NAVwUaWnp5OZmVlobBkZGWRkZGiep6amAqA2UDA0LHpBWN6pDRStP8uaLrOoWVlZmuN+++03wsPDiY+P15oBzs7OLpEZ2oLk9l2aY7xoJGe6kbzpRvKmG33krThjvdDFRlZWFt27d8fNzQ2AevXqAY/fdGVkZODk5KRpHxkZSU5ODv/73/8wNTWlbt26/P777wwePLhY406fPp127doBj99Yffrpp+zevRtfX18AXn75ZQ4cOMAXX3xBq1atNG/MHB0dsbW1LfZ59unTh/fee09rW05ODpGRkZqZjHfffZc9e/Y8sdiwsrLC19eXGTNm4OHhQcWKFVm/fj2HDh3SfCfD9evXAahYsaLWsRUrVtTsK0kpKSn4+PjQqFEjANzd3TX7ct/M29vba/0sw8LCmDhxIt27dwdg+fLl/PTTT8Uat0aNGlrXL8ycORMfHx8+/fRTzbbVq1fj6urK+fPnqVmzJiYmJpibm2vFUlSPHj1izZo1eQqUoKAgevfuDcCnn37KokWLOHz4MP7+/oX216FDB8LCwli/fj09e/bk+vXrmiLo2rVrwOOfZe7sUK7cn+v169eLXWyMHz8eFxcXrUL0v0JDQ5k2bVqe7ZN9cjA3zy7WeAJmNMrRy7g7d+4s9jEJCQma6zK2bdvGzZs3efnllzX7c3JyGDduHHPmzGHlypUlFmt+oqOjS7X/F5HkTDeSN91I3nRTlnlLT08vctsXttjw9vamTZs21KtXjw4dOtC+fXvefPPNAt9AnTlzBi8vL61Pg3MLhOLIfVMMjz+tTk9P1xQfuR49eqRZ+vO0/j1eLnd3d60lU87Ozty8ebNI/X311Ve8//77VKpUCUNDQxo0aEDv3r1JSEgokXg7duzI/v37AXBzc+PUqVOFth88eDA9evTgt99+o3379nTt2pVXX321wPb37t3j2rVrNG3aVLPNyMiIRo0aFWspVcOGDbWeHzt2jL1792JpaZmn7cWLF6lZs2aR+86Pm5tbvjMhXl5emr9bWFhgbW1dpJ9l+/bt+eyzzxg0aBDvvvsuarWaKVOmsH//fgwMSv5SrdmzZ7NhwwZiYmLyzKj828SJExk1apTmeWpqKq6ursw8akCWsWGBxwltagOFGY1ymHLEgIycsl9GdTKkQ7GPadiwIQEBAQA0bdqUYcOGae3v1KkTffr0ITAwkFq1apVInP+VmZlJdHQ07dq1kwvSi0hyphvJm24kb7rRR95yVyYUxQtbbBgaGhIdHc3BgwfZtWsXixcvZtKkScTHx5fquBYW/7fuPC0tDYAdO3ZQqVIlrXZqtbrQfgwMDPK8Oc5vyurf4+X67y+aSqUiJ6don4BWq1aN2NhYHjx4QGpqKs7OzvTq1UvzCWTup/Y3btzA2dlZc9yNGzeoX7/+E/tftWqVZhlUUf5BdOzYkStXrrBz506io6Np06YNQ4cOZd68eUU6H139N69paWl07tyZOXPm5Gn77zz819P8HOHpfpajRo1i5MiRXLt2jQoVKpCcnMzEiRO1fpY3btzQOib3eXFmZ+bNm8fs2bPZvXu3VnGUH7Vane/v/r7xbbG3ty/ymOVdZmYmO3fuJCHY/5l9QU5LSyMpKUnz/OrVq5w6dQo7OzuqVKmS53fM2NiYSpUq4enpWeqxGRsbP7N5e1ZJznQjedON5E03ZZm34ozzQt+NSqVS0axZM6ZNm8bRo0cxMTFh8+bNmJiYkJ2tvWTDw8OD48ePa91R6Zdffnmq8evUqYNarSYlJYXq1atrPVxdXQE06+X/G4+Dg4NmuQs8riAvX778VPEUh4WFBc7Ozty5c4effvpJczF41apVcXJyYs+ePVqxxcfHF2kmqFKlSpoc5C5vexIHBwcCAwNZu3YtYWFhmrsl5Zc7GxsbnJ2dtYrKrKysp56ZadCgAadOncLd3T3PzzK3UMjv98rBwYH79+/z4MEDzbayvFWvSqXCxcUFMzMz1q9fj6urKw0aNAAez9zt27dPq/iJjo6mVq1aRV5CNXfuXGbMmEFUVFS+s2yi/Dpy5IjmphzwuPj18fHR3LRACCFE+fDCzmzEx8ezZ88e2rdvj6OjI/Hx8dy6dQsPDw8ePnzITz/9xLlz57C3t8fGxoY+ffowadIkBgwYwMSJE0lOTn7qT8+trKwYM2YMI0eOJCcnh+bNm3Pv3j3i4uKwtrYmMDAQNzc3VCoV27dvJyAgADMzMywtLXnttdeIjIykc+fO2NraEhwcrHXhcGn56aefUBSFWrVqkZSUxNixY6ldu7bmuhCVSsWIESOYOXMmNWrUoGrVqkyZMgUXF5dS+e6S4OBgGjZsSN26dcnIyGD79u14eHgAj69zMTMzIyoqisqVK2NqaoqNjQ0ff/wxs2fPpkaNGtSuXZsFCxY89feYDB06lJUrV9K7d2/GjRuHnZ0dSUlJbNiwgVWrVmFoaIi7uzvx8fEkJydjaWmJnZ0dTZs2xdzcnE8++YThw4cTHx9PZGTk0yemCD777DP8/f0xMDBg06ZNzJ49m2+//Vbze9SnTx+mTZtG//79GT9+PCdPniQ8PJyFCxcWqf85c+YQHBzM119/jbu7u+aaHUtLy3yXm4nyxc/Pr1hLF5OTk0svGCGEEHrzws5sWFtbs2/fPgICAqhZsyaTJ09m/vz5dOzYkQEDBlCrVi0aNWqEg4MDcXFxWFpa8sMPP3DixAl8fHyYNGlSvktmimvGjBlMmTKF0NBQPDw88Pf3Z8eOHZoLcytVqsS0adOYMGECFStW1KxjnjhxIq1ataJTp068/vrrdO3alWrVqj11PE9y7949hg4dSu3atenXrx/Nmzfnp59+0pouGzduHB999BEDBw6kcePGpKWlERUVVehafV2ZmJgwceJEvLy8aNmyJYaGhmzYsAF4fC3GokWL+OKLL3BxcdHMvowePZp3332XwMBAfH19sbKyKvSLxYrCxcWFuLg4srOzad++PfXq1WPEiBHY2tpqroEYM2YMhoaG1KlTBwcHB1JSUrCzs2Pt2rXs3LmTevXqsX79es2ti0vbjz/+SIsWLWjUqBE7duxg69atWgWhjY0Nu3bt4vLlyzRs2JDRo0cTHBxcpNveAixbtoxHjx7x5ptv4uzsrHmU9hI3IYQQQjw/VEpxPnoSQogSlJqaio2NDbdv35ZrNooh95qNgIAAWddcDJK34pOc6UbyphvJm270kbfc1+979+5hbW1daNsXdmZDCCGEEEIIoV9SbBTRoEGDNGvR//sYNGiQvsMrkpSUlALPwdLSkpSUlKce49NPPy2w/44dO+ZpX9Z5LYsclIWyyFthecq9fbEQQgghRGFe2AvES9r06dMZM2ZMvvueNH30rHBxcSn0TkguLi5PPcagQYPo2bNnvvvy+3b0ss5rWeSgLJRF3grL039v5SyEEEIIkR8pNorI0dERR0dHfYfxVIyMjDTfBF5a7OzsNN+KXhRlndeyyEFZKIu8vQh5EkIIIYR+yTIqIYQQQgghRKmQYkMIIYQQQghRKqTYEEIIIYQQQpQKKTaEEEIIIYQQpUKKDSGEEEIIIUSpkGJDCCGEEEIIUSrk1rdCCL1RFAWA+/fvY2xsrOdonh+ZmZmkp6eTmpoqeSsGyVvxSc50I3nTjeRNN/rIW2pqKvB/r+OFkWJDCKE3f/31FwBVq1bVcyRCCCGEKK779+9jY2NTaBspNoQQepP7BZApKSlP/M9K/J/U1FRcXV25evVqiX1jfHkgeSs+yZluJG+6kbzpRh95UxSF+/fv4+Li8sS2UmwIIfTGwODxZWM2NjbywqIDa2tryZsOJG/FJznTjeRNN5I33ZR13or6IaFcIC6EEEIIIYQoFVJsCCGEEEIIIUqFFBtCCL1Rq9VMnToVtVqt71CeK5I33Ujeik9yphvJm24kb7p51vOmUopyzyohhBBCCCGEKCaZ2RBCCCGEEEKUCik2hBBCCCGEEKVCig0hhBBCCCFEqZBiQwghhBBCCFEqpNgQQujNkiVLcHd3x9TUlKZNm3L48GF9h/RM2bdvH507d8bFxQWVSsWWLVu09iuKQnBwMM7OzpiZmdG2bVsuXLign2CfEaGhoTRu3BgrKyscHR3p2rUr586d02rz8OFDhg4dir29PZaWlvTo0YMbN27oKeJnw7Jly/Dy8tJ8KZivry8//vijZr/k7Mlmz56NSqVixIgRmm2St7xCQkJQqVRaj9q1a2v2S84K9scff/DOO+9gb2+PmZkZ9erV48iRI5r9z+prghQbQgi9+Oabbxg1ahRTp07lt99+w9vbmw4dOnDz5k19h/bMePDgAd7e3ixZsiTf/XPnzmXRokUsX76c+Ph4LCws6NChAw8fPizjSJ8dsbGxDB06lF9++YXo6GgyMzNp3749Dx480LQZOXIkP/zwA9999x2xsbH8+eefdO/eXY9R61/lypWZPXs2CQkJHDlyhNdee40uXbpw6tQpQHL2JL/++itffPEFXl5eWtslb/mrW7cu165d0zwOHDig2Sc5y9+dO3do1qwZxsbG/Pjjj5w+fZr58+dToUIFTZtn9jVBEUIIPWjSpIkydOhQzfPs7GzFxcVFCQ0N1WNUzy5A2bx5s+Z5Tk6O4uTkpHz22WeabXfv3lXUarWyfv16PUT4bLp586YCKLGxsYqiPM6RsbGx8t1332nanDlzRgGUQ4cO6SvMZ1KFChWUVatWSc6e4P79+0qNGjWU6OhopVWrVsrHH3+sKIr8rhVk6tSpire3d777JGcFGz9+vNK8efMC9z/LrwkysyGEKHOPHj0iISGBtm3barYZGBjQtm1bDh06pMfInh+XL1/m+vXrWjm0sbGhadOmksN/uXfvHgB2dnYAJCQkkJmZqZW32rVrU6VKFcnb/5ednc2GDRt48OABvr6+krMnGDp0KK+//rpWfkB+1wpz4cIFXFxcePnll+nbty8pKSmA5Kww27Zto1GjRrz11ls4Ojri4+PDypUrNfuf5dcEKTaEEGXu9u3bZGdnU7FiRa3tFStW5Pr163qK6vmSmyfJYcFycnIYMWIEzZo1w9PTE3icNxMTE2xtbbXaSt7gxIkTWFpaolarGTRoEJs3b6ZOnTqSs0Js2LCB3377jdDQ0Dz7JG/5a9q0KZGRkURFRbFs2TIuX75MixYtuH//vuSsEJcuXWLZsmXUqFGDn376icGDBzN8+HC+/PJL4Nl+TTDS6+hCCCFEKRk6dCgnT57UWg8uClarVi0SExO5d+8e33//PYGBgcTGxuo7rGfW1atX+fjjj4mOjsbU1FTf4Tw3OnbsqPm7l5cXTZs2xc3NjW+//RYzMzM9RvZsy8nJoVGjRnz66acA+Pj4cPLkSZYvX05gYKCeoyuczGwIIcrcSy+9hKGhYZ47jNy4cQMnJyc9RfV8yc2T5DB/w4YNY/v27ezdu5fKlStrtjs5OfHo0SPu3r2r1V7yBiYmJlSvXp2GDRsSGhqKt7c34eHhkrMCJCQkcPPmTRo0aICRkRFGRkbExsayaNEijIyMqFixouStCGxtbalZsyZJSUnyu1YIZ2dn6tSpo7XNw8NDswTtWX5NkGJDCFHmTExMaNiwIXv27NFsy8nJYc+ePfj6+uoxsudH1apVcXJy0sphamoq8fHx5TqHiqIwbNgwNm/ezM8//0zVqlW19jds2BBjY2OtvJ07d46UlJRynbf85OTkkJGRITkrQJs2bThx4gSJiYmaR6NGjejbt6/m75K3J0tLS+PixYs4OzvL71ohmjVrluc23ufPn8fNzQ14xl8T9Hp5uhCi3NqwYYOiVquVyMhI5fTp08rAgQMVW1tb5fr16/oO7Zlx//595ejRo8rRo0cVQFmwYIFy9OhR5cqVK4qiKMrs2bMVW1tbZevWrcrx48eVLl26KFWrVlX++ecfPUeuP4MHD1ZsbGyUmJgY5dq1a5pHenq6ps2gQYOUKlWqKD///LNy5MgRxdfXV/H19dVj1Po3YcIEJTY2Vrl8+bJy/PhxZcKECYpKpVJ27dqlKIrkrKj+fTcqRZG85Wf06NFKTEyMcvnyZSUuLk5p27at8tJLLyk3b95UFEVyVpDDhw8rRkZGyqxZs5QLFy4o69atU8zNzZW1a9dq2jyrrwlSbAgh9Gbx4sVKlSpVFBMTE6VJkybKL7/8ou+Qnil79+5VgDyPwMBARVEe3+pwypQpSsWKFRW1Wq20adNGOXfunH6D1rP88gUoERERmjb//POPMmTIEKVChQqKubm50q1bN+XatWv6C/oZ8P777ytubm6KiYmJ4uDgoLRp00ZTaCiK5Kyo/ltsSN7y6tWrl+Ls7KyYmJgolSpVUnr16qUkJSVp9kvOCvbDDz8onp6eilqtVmrXrq2sWLFCa/+z+pqgUhRF0c+cihBCCCGEEOJFJtdsCCGEEEIIIUqFFBtCCCGEEEKIUiHFhhBCCCGEEKJUSLEhhBBCCCGEKBVSbAghhBBCCCFKhRQbQgghhBBCiFIhxYYQQgghhBCiVEixIYQQQohi8fPzY8SIEfoOQwjxHJBiQwghhChBQUFBqFSqPI+kpKQS6T8yMhJbW9sS6UtXmzZtYsaMGXqNoTAxMTGoVCru3r2r71CEKPeM9B2AEEII8aLx9/cnIiJCa5uDg4OeoilYZmYmxsbGxT7Ozs6uFKIpGZmZmfoOQQjxLzKzIYQQQpQwtVqNk5OT1sPQ0BCArVu30qBBA0xNTXn55ZeZNm0aWVlZmmMXLFhAvXr1sLCwwNXVlSFDhpCWlgY8/sT+vffe4969e5oZk5CQEABUKhVbtmzRisPW1pbIyEgAkpOTUalUfPPNN7Rq1QpTU1PWrVsHwKpVq/Dw8MDU1JTatWuzdOnSQs/vv8uo3N3dmTlzJv369cPS0hI3Nze2bdvGrVu36NKlC5aWlnh5eXHkyBHNMbkzNFu2bKFGjRqYmprSoUMHrl69qjXWsmXLqFatGiYmJtSqVYuvvvpKa79KpWLZsmW88cYbWFhYMGDAAFq3bg1AhQoVUKlUBAUFARAVFUXz5s2xtbXF3t6eTp06cfHiRU1fuTnatGkTrVu3xtzcHG9vbw4dOqQ1ZlxcHH5+fpibm1OhQgU6dOjAnTt3AMjJySE0NJSqVatiZmaGt7c333//faH5FOKFpgghhBCixAQGBipdunTJd9++ffsUa2trJTIyUrl48aKya9cuxd3dXQkJCdG0WbhwofLzzz8rly9fVvbs2aPUqlVLGTx4sKIoipKRkaGEhYUp1tbWyrVr15Rr164p9+/fVxRFUQBl8+bNWuPZ2NgoERERiqIoyuXLlxVAcXd3VzZu3KhcunRJ+fPPP5W1a9cqzs7Omm0bN25U7OzslMjIyALPsVWrVsrHH3+see7m5qbY2dkpy5cvV86fP68MHjxYsba2Vvz9/ZVvv/1WOXfunNK1a1fFw8NDycnJURRFUSIiIhRjY2OlUaNGysGDB5UjR44oTZo0UV599VVNv5s2bVKMjY2VJUuWKOfOnVPmz5+vGBoaKj///LOmDaA4Ojoqq1evVi5evKgkJycrGzduVADl3LlzyrVr15S7d+8qiqIo33//vbJx40blwoULytGjR5XOnTsr9erVU7Kzs7VyVLt2bWX79u3KuXPnlDfffFNxc3NTMjMzFUVRlKNHjypqtVoZPHiwkpiYqJw8eVJZvHixcuvWLUVRFGXmzJlK7dq1laioKOXixYtKRESEolarlZiYmALzKcSLTIoNIYQQogQFBgYqhoaGioWFhebx5ptvKoqiKG3atFE+/fRTrfZfffWV4uzsXGB/3333nWJvb695HhERodjY2ORpV9RiIywsTKtNtWrVlK+//lpr24wZMxRfX98CY8qv2HjnnXc0z69du6YAypQpUzTbDh06pADKtWvXNOcBKL/88oumzZkzZxRAiY+PVxRFUV599VVlwIABWmO/9dZbSkBAgNZ5jxgxQqvN3r17FUC5c+dOgeegKIpy69YtBVBOnDihKMr/5WjVqlWaNqdOnVIA5cyZM4qiKErv3r2VZs2a5dvfw4cPFXNzc+XgwYNa2/v376/07t270FiEeFHJNRtCCCFECWvdujXLli3TPLewsADg2LFjxMXFMWvWLM2+7OxsHj58SHp6Oubm5uzevZvQ0FDOnj1LamoqWVlZWvufVqNGjTR/f/DgARcvXqR///4MGDBAsz0rKwsbG5ti9evl5aX5e8WKFQGoV69enm03b97EyckJACMjIxo3bqxpU7t2bWxtbTlz5gxNmjThzJkzDBw4UGucZs2aER4eXuA5FebChQsEBwcTHx/P7du3ycnJASAlJQVPT898z8XZ2VkTd+3atUlMTOStt97Kt/+kpCTS09Np166d1vZHjx7h4+NTpBiFeNFIsSGEEEKUMAsLC6pXr55ne1paGtOmTaN79+559pmampKcnEynTp0YPHgws2bNws7OjgMHDtC/f38ePXpUaLGhUqlQFEVrW34XS+cWPrnxAKxcuZKmTZtqtcu9xqSo/n2huUqlKnBb7hv8kvTvcypM586dcXNzY+XKlbi4uJCTk4OnpyePHj3SaldY3GZmZgX2n5vPHTt2UKlSJa19arW6SDEK8aKRYkMIIYQoIw0aNODcuXP5FiIACQkJ5OTkMH/+fAwMHt/D5dtvv9VqY2JiQnZ2dp5jHRwcuHbtmub5hQsXSE9PLzSeihUr4uLiwqVLl+jbt29xT+epZWVlceTIEZo0aQLAuXPnuHv3Lh4eHgB4eHgQFxdHYGCg5pi4uDjq1KlTaL8mJiYAWnn666+/OHfuHCtXrqRFixYAHDhwoNgxe3l5sWfPHqZNm5ZnX506dVCr1aSkpNCqVati9y3Ei0iKDSGEEKKMBAcH06lTJ6pUqcKbb76JgYEBx44d4+TJk8ycOZPq1auTmZnJ4sWL6dy5M3FxcSxfvlyrD3d3d9LS0tizZw/e3t6Ym5tjbm7Oa6+9xueff46vry/Z2dmMHz++SLe1nTZtGsOHD8fGxgZ/f38yMjI4cuQId+7cYdSoUaWVCuDxDMJHH33EokWLMDIyYtiwYbzyyiua4mPs2LH07NkTHx8f2rZtyw8//MCmTZvYvXt3of26ubmhUqnYvn07AQEBmJmZUaFCBezt7VmxYgXOzs6kpKQwYcKEYsc8ceJE6tWrx5AhQxg0aBAmJibs3buXt956i5deeokxY8YwcuRIcnJyaN68Offu3SMuLg5ra2utokmI8kJufSuEEEKUkQ4dOrB9+3Z27dpF48aNeeWVV1i4cCFubm4AeHt7s2DBAubMmYOnpyfr1q0jNDRUq49XX32VQYMG0atXLxwcHJg7dy4A8+fPx9XVlRYtWtCnTx/GjBlTpGs8PvjgA1atWkVERAT16tWjVatWREZGUrVq1ZJPwH+Ym5szfvx4+vTpQ7NmzbC0tOSbb77R7O/atSvh4eHMmzePunXr8sUXXxAREYGfn1+h/VaqVIlp06YxYcIEKlasyLBhwzAwMGDDhg0kJCTg6enJyJEj+eyzz4odc82aNdm1axfHjh2jSZMm+Pr6snXrVoyMHn9+O2PGDKZMmUJoaCgeHh74+/uzY8eOMsmnEM8ilfLfBZ5CCCGEEKUsMjKSESNGyLd8C/GCk5kNIYQQQgghRKmQYkMIIYQQQghRKmQZlRBCCCGEEKJUyMyGEEIIIYQQolRIsSGEEEIIIYQoFVJsCCGEEEIIIUqFFBtCCCGEEEKIUiHFhhBCCCGEEKJUSLEhhBBCCCGEKBVSbAghhBBCCCFKhRQbQgghhBBCiFIhxYYQQgghhBCiVPw/tzFpbnn+DZIAAAAASUVORK5CYII=" + "image/png": "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" }, "metadata": {}, "output_type": "display_data" @@ -1565,72 +1578,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "train data size: 1107768\n" + "train data size: 590201\n" ] } ], - "execution_count": 70 - }, - { - "cell_type": "code", - "id": "1a248706-e58a-406f-9268-6dce3de2d863", - "metadata": { - "jupyter": { - "source_hidden": true - }, - "ExecuteTime": { - "end_time": "2025-04-02T16:43:22.895694Z", - "start_time": "2025-04-02T16:43:22.891020Z" - } - }, - "source": [ - "\n", - "\n", - "# catboost_params = {\n", - "# 'loss_function': 'QuerySoftMax',\n", - "# 'eval_metric': 'QuerySoftMax',\n", - "# # 'custom_metric': ['AverageGain:top=10'],\n", - "\n", - "# 'iterations': 5000,\n", - "# 'learning_rate': 0.01,\n", - "# 'depth': 10,\n", - "# 'grow_policy': 'Lossguide',\n", - "# # 'max_leaves': 64,\n", - "# # 'min_data_in_leaf': 50,\n", - "\n", - "# # 'l2_leaf_reg': 5,\n", - "# # 'random_strength': 2.0,\n", - "# # 'bagging_temperature': 1.2,\n", - "# # 'subsample': 0.8,\n", - "\n", - "# 'early_stopping_rounds': 100,\n", - "# 'task_type': 'GPU',\n", - "# 'verbose': 500,\n", - "\n", - "# 'one_hot_max_size': 64\n", - "# }\n", - "\n", - "# gc.collect()\n", - "\n", - "# feature_weights = {col: 2.0 if 'act_factor' in col\n", - "# # or 'af' in col\n", - "# or 'limit' in col\n", - "# else 1.0\n", - "# for col in feature_columns_new}\n", - "# catboost_params['feature_weights'] = feature_weights\n", - "\n", - "# # model, scaler = train_catboost(train_data, test_data.dropna(subset=['label']), feature_columns_new, catboost_params, plot=True)" - ], - "outputs": [], - "execution_count": 71 + "execution_count": 62 }, { "cell_type": "code", "id": "5d1522a7538db91b", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T16:43:27.845040Z", - "start_time": "2025-04-02T16:43:22.900703Z" + "end_time": "2025-04-03T15:04:39.656944Z", + "start_time": "2025-04-03T15:04:39.298483Z" } }, "source": [ @@ -1667,33 +1627,26 @@ ], "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "25.79150579150579\n", - " trade_date ts_code future_return future_score label\n", - "108174 2024-03-01 600515.SH -0.021294 -0.014906 21.0\n", - "137114 2024-03-04 601377.SH -0.005138 -0.003597 22.0\n", - "137115 2024-03-05 601377.SH -0.007065 -0.004945 16.0\n", - "20064 2024-03-06 000950.SZ 0.056106 0.039274 46.0\n", - "43829 2024-03-07 002252.SZ 0.015518 0.010862 18.0\n", - "9725 2024-03-08 000650.SZ 0.040857 0.028600 34.0\n", - "58797 2024-03-11 002539.SZ 0.003740 0.002618 21.0\n", - "30855 2024-03-12 002030.SZ -0.005742 -0.004020 26.0\n", - "164833 2024-03-13 603366.SH 0.005460 0.003822 22.0\n", - "62880 2024-03-14 002616.SZ 0.036372 0.025461 32.0\n" + "ename": "NameError", + "evalue": "name 'test_data' is not defined", + "output_type": "error", + "traceback": [ + "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[1;31mNameError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[1;32mIn[1], line 8\u001B[0m\n\u001B[0;32m 1\u001B[0m \u001B[38;5;66;03m# train_data = train_data.sort_values(by='trade_date')\u001B[39;00m\n\u001B[0;32m 2\u001B[0m \u001B[38;5;66;03m# all_dates = train_data['trade_date'].unique() # 获取所有唯一的 trade_date\u001B[39;00m\n\u001B[0;32m 3\u001B[0m \u001B[38;5;66;03m# split_date = all_dates[-120] # 划分点为倒数第 validation_days 天\u001B[39;00m\n\u001B[0;32m 4\u001B[0m \u001B[38;5;66;03m# print(split_date)\u001B[39;00m\n\u001B[0;32m 5\u001B[0m \u001B[38;5;66;03m# print(all_dates)\u001B[39;00m\n\u001B[0;32m 6\u001B[0m \u001B[38;5;66;03m# val_data_split = train_data[train_data['trade_date'] >= split_date] # 验证集\u001B[39;00m\n\u001B[1;32m----> 8\u001B[0m score_df \u001B[38;5;241m=\u001B[39m test_data\n\u001B[0;32m 9\u001B[0m numeric_columns \u001B[38;5;241m=\u001B[39m score_df\u001B[38;5;241m.\u001B[39mselect_dtypes(include\u001B[38;5;241m=\u001B[39m[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mfloat64\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mint64\u001B[39m\u001B[38;5;124m'\u001B[39m])\u001B[38;5;241m.\u001B[39mcolumns\n\u001B[0;32m 10\u001B[0m numeric_columns \u001B[38;5;241m=\u001B[39m [col \u001B[38;5;28;01mfor\u001B[39;00m col \u001B[38;5;129;01min\u001B[39;00m numeric_columns \u001B[38;5;28;01mif\u001B[39;00m col \u001B[38;5;129;01min\u001B[39;00m feature_columns]\n", + "\u001B[1;31mNameError\u001B[0m: name 'test_data' is not defined" ] } ], - "execution_count": 72 + "execution_count": 1 }, { "cell_type": "code", "id": "d86af99d15cb3bdd", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T16:43:28.288257Z", - "start_time": "2025-04-02T16:43:28.041487Z" + "end_time": "2025-04-03T15:03:25.791021Z", + "start_time": "2025-04-03T15:03:25.537833Z" } }, "source": [ @@ -1722,15 +1675,15 @@ ] } ], - "execution_count": 73 + "execution_count": 64 }, { "cell_type": "code", "id": "ef9d068e-67f7-412c-bbd8-cdee7492dbc9", "metadata": { "ExecuteTime": { - "end_time": "2025-04-02T16:43:28.315175Z", - "start_time": "2025-04-02T16:43:28.292264Z" + "end_time": "2025-04-03T15:03:25.893508Z", + "start_time": "2025-04-03T15:03:25.878525Z" } }, "source": [ @@ -1742,12 +1695,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.7619606950196554\n", - "0.7280155931953278\n" + "0.7684793250465913\n", + "0.6965949564132026\n" ] } ], - "execution_count": 74 + "execution_count": 65 } ], "metadata": { diff --git a/code/train/RollingRank.ipynb b/code/train/RollingRank.ipynb index daa3ce8..93c96ef 100644 --- a/code/train/RollingRank.ipynb +++ b/code/train/RollingRank.ipynb @@ -8,8 +8,8 @@ "source_hidden": true }, "ExecuteTime": { - "end_time": "2025-03-31T14:33:30.607252Z", - "start_time": "2025-03-31T14:33:30.170544Z" + "end_time": "2025-04-04T15:35:12.553694Z", + "start_time": "2025-04-04T15:35:12.549140Z" } }, "source": [ @@ -24,7 +24,7 @@ "pd.set_option('display.max_columns', None)\n" ], "outputs": [], - "execution_count": 1 + "execution_count": 30 }, { "cell_type": "code", @@ -32,8 +32,8 @@ "metadata": { "scrolled": true, "ExecuteTime": { - "end_time": "2025-03-31T14:34:19.160370Z", - "start_time": "2025-03-31T14:33:30.794750Z" + "end_time": "2025-04-04T15:36:03.894111Z", + "start_time": "2025-04-04T15:35:12.573328Z" } }, "source": [ @@ -73,9 +73,13 @@ "text": [ "daily data\n", "daily basic\n", + "inner merge on ['ts_code', 'trade_date']\n", "stk limit\n", + "left merge on ['ts_code', 'trade_date']\n", "money flow\n", + "left merge on ['ts_code', 'trade_date']\n", "cyq perf\n", + "left merge on ['ts_code', 'trade_date']\n", "\n", "RangeIndex: 8477357 entries, 0 to 8477356\n", "Data columns (total 31 columns):\n", @@ -118,7 +122,7 @@ ] } ], - "execution_count": 2 + "execution_count": 31 }, { "cell_type": "code", @@ -128,8 +132,8 @@ "source_hidden": true }, "ExecuteTime": { - "end_time": "2025-03-31T14:34:30.996034Z", - "start_time": "2025-03-31T14:34:19.168375Z" + "end_time": "2025-04-04T15:36:18.904551Z", + "start_time": "2025-04-04T15:36:04.059865Z" } }, "source": [ @@ -189,15 +193,15 @@ ] } ], - "execution_count": 3 + "execution_count": 32 }, { "cell_type": "code", "id": "c4e9e1d31da6dba6", "metadata": { "ExecuteTime": { - "end_time": "2025-03-31T14:34:31.276589Z", - "start_time": "2025-03-31T14:34:31.060910Z" + "end_time": "2025-04-04T15:36:19.231919Z", + "start_time": "2025-04-04T15:36:19.058570Z" } }, "source": [ @@ -278,7 +282,7 @@ "index_data = index_data.dropna()\n" ], "outputs": [], - "execution_count": 4 + "execution_count": 33 }, { "cell_type": "code", @@ -288,8 +292,8 @@ "source_hidden": true }, "ExecuteTime": { - "end_time": "2025-03-31T14:34:31.348068Z", - "start_time": "2025-03-31T14:34:31.304847Z" + "end_time": "2025-04-04T15:36:19.280300Z", + "start_time": "2025-04-04T15:36:19.231919Z" } }, "source": [ @@ -299,10 +303,94 @@ "\n", "def get_rolling_factor(df):\n", " old_columns = df.columns.tolist()[:]\n", - " # 按股票和日期排序\n", + "\n", + " # 按股票和日期排序(如果尚未排序)\n", " df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\n", " grouped = df.groupby('ts_code', group_keys=False)\n", "\n", + " # 提前计算布尔掩码\n", + " window = 5\n", + " return_threshold = 0.0\n", + "\n", + " df['_is_upside'] = df['pct_chg'] > return_threshold\n", + " df['_is_downside'] = df['pct_chg'] < -return_threshold\n", + "\n", + " # # 1. 上行波动率 (20日)\n", + " # def rolling_upside_volatility(series, _is_upside, window):\n", + " # # 提取正收益\n", + " # positive_returns = series.where(_is_upside, np.nan)\n", + " # # 计算滚动窗口标准差\n", + " # return positive_returns.rolling(window=window, min_periods=2).std()\n", + " #\n", + " # df[f'upside_volatility_{window}'] = grouped.apply(\n", + " # lambda x: rolling_upside_volatility(x['pct_chg'], x['_is_upside'], window)\n", + " # ).reset_index(level=0, drop=True)\n", + " #\n", + " # # 2. 下行波动率 (20日)\n", + " # def rolling_downside_volatility(series, _is_downside, window):\n", + " # # 提取负收益\n", + " # negative_returns = series.where(_is_downside, np.nan)\n", + " # # 计算滚动窗口标准差\n", + " # return negative_returns.rolling(window=window, min_periods=2).std()\n", + " #\n", + " # df[f'downside_volatility_{window}'] = grouped.apply(\n", + " # lambda x: rolling_downside_volatility(x['pct_chg'], x['_is_downside'], window)\n", + " # ).reset_index(level=0, drop=True)\n", + " #\n", + " # # 3. 上行/下行波动率比率 (20日)\n", + " # df[f'volatility_ratio_{window}'] = df[f'upside_volatility_{window}'] / (df[f'downside_volatility_{window}'] + 1e-8)\n", + " #\n", + " # # 4. 上行半方差 (20日)\n", + " # def rolling_upside_semi_variance(series, _is_upside, window, threshold):\n", + " # # 提取正收益\n", + " # positive_returns = series.where(_is_upside, np.nan)\n", + " # # 计算平方偏差\n", + " # squared_deviation = (positive_returns - threshold) ** 2\n", + " # # 计算滚动窗口均值\n", + " # return squared_deviation.rolling(window=window, min_periods=2).mean()\n", + " #\n", + " # df[f'upside_semi_variance_{window}'] = grouped.apply(\n", + " # lambda x: rolling_upside_semi_variance(x['pct_chg'], x['_is_upside'], window, return_threshold)\n", + " # ).reset_index(level=0, drop=True)\n", + " #\n", + " # # 5. 下行半方差 (20日)\n", + " # def rolling_downside_semi_variance(series, _is_downside, window, threshold):\n", + " # # 提取负收益\n", + " # negative_returns = series.where(_is_downside, np.nan)\n", + " # # 计算平方偏差\n", + " # squared_deviation = (negative_returns - (-threshold)) ** 2\n", + " # # 计算滚动窗口均值\n", + " # return squared_deviation.rolling(window=window, min_periods=2).mean()\n", + " #\n", + " # df[f'downside_semi_variance_{window}'] = grouped.apply(\n", + " # lambda x: rolling_downside_semi_variance(x['pct_chg'], x['_is_downside'], window, return_threshold)\n", + " # ).reset_index(level=0, drop=True)\n", + " #\n", + " # # 8. 正负收益天数比率 (20日)\n", + " # df[f'positive_negative_days_ratio_{window}'] = grouped['pct_chg'].rolling(window=window, min_periods=2).apply(\n", + " # lambda x: np.sum(x > 0) / (np.sum(x < 0) + 1e-8)).reset_index(level=0, drop=True)\n", + " #\n", + " # # 9. 正收益幅度均值 (20日)\n", + " # def average_positive_return_magnitude(series):\n", + " # positive_returns = series[series > return_threshold]\n", + " # if positive_returns.empty:\n", + " # return 0\n", + " # return positive_returns.mean()\n", + " #\n", + " # df[f'avg_positive_return_magnitude_{window}'] = grouped['pct_chg'].rolling(window=window, min_periods=2).apply(\n", + " # average_positive_return_magnitude).reset_index(level=0, drop=True)\n", + " #\n", + " # # 10. 负收益幅度均值 (20日)\n", + " # def average_negative_return_magnitude(series):\n", + " # negative_returns = series[series < -return_threshold]\n", + " # if negative_returns.empty:\n", + " # return 0\n", + " # return np.abs(negative_returns.mean())\n", + " #\n", + " # df[f'avg_negative_return_magnitude_{window}'] = grouped['pct_chg'].rolling(window=window, min_periods=2).apply(\n", + " # average_negative_return_magnitude).reset_index(level=0, drop=True)\n", + "\n", " # df[\"gap_next_open\"] = (df[\"open\"].shift(-1) - df[\"close\"]) / df[\"close\"]\n", "\n", " df['return_skew'] = grouped['pct_chg'].rolling(window=5).skew().reset_index(0, drop=True)\n", @@ -594,7 +682,7 @@ " return df, new_columns\n" ], "outputs": [], - "execution_count": 5 + "execution_count": 34 }, { "cell_type": "code", @@ -605,8 +693,8 @@ }, "scrolled": true, "ExecuteTime": { - "end_time": "2025-03-31T14:34:36.714777Z", - "start_time": "2025-03-31T14:34:31.369443Z" + "end_time": "2025-04-04T15:36:25.455672Z", + "start_time": "2025-04-04T15:36:19.322099Z" } }, "source": [ @@ -657,15 +745,15 @@ "industry_df = read_industry_data('../../data/sw_daily.h5')\n" ], "outputs": [], - "execution_count": 6 + "execution_count": 35 }, { "cell_type": "code", "id": "dbe2fd8021b9417f", "metadata": { "ExecuteTime": { - "end_time": "2025-03-31T14:34:36.727797Z", - "start_time": "2025-03-31T14:34:36.724265Z" + "end_time": "2025-04-04T15:36:25.503415Z", + "start_time": "2025-04-04T15:36:25.498021Z" } }, "source": [ @@ -685,15 +773,15 @@ ] } ], - "execution_count": 7 + "execution_count": 36 }, { "cell_type": "code", "id": "85c3e3d0235ffffa", "metadata": { "ExecuteTime": { - "end_time": "2025-03-31T14:37:04.071963Z", - "start_time": "2025-03-31T14:34:36.756415Z" + "end_time": "2025-04-04T15:38:25.829052Z", + "start_time": "2025-04-04T15:36:25.591562Z" } }, "source": [ @@ -740,59 +828,15 @@ ] } ], - "execution_count": 8 - }, - { - "cell_type": "code", - "id": "92d84ce15a562ec6", - "metadata": { - "ExecuteTime": { - "end_time": "2025-03-31T14:37:05.401297Z", - "start_time": "2025-03-31T14:37:04.287413Z" - } - }, - "source": [ - "from scipy.stats import ks_2samp, wasserstein_distance\n", - "from sklearn.metrics import roc_auc_score\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.preprocessing import StandardScaler\n", - "\n", - "\n", - "def remove_shifted_features(train_data, test_data, feature_columns, ks_threshold=0.05, wasserstein_threshold=0.1,\n", - " importance_threshold=0.05):\n", - " dropped_features = []\n", - "\n", - " # **统计数据漂移**\n", - " numeric_columns = train_data.select_dtypes(include=['float64', 'int64']).columns\n", - " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", - " for feature in numeric_columns:\n", - " ks_stat, p_value = ks_2samp(train_data[feature], test_data[feature])\n", - " wasserstein_dist = wasserstein_distance(train_data[feature], test_data[feature])\n", - "\n", - " if p_value < ks_threshold and wasserstein_dist > wasserstein_threshold:\n", - " dropped_features.append(feature)\n", - "\n", - " print(f\"检测到 {len(dropped_features)} 个可能漂移的特征: {dropped_features}\")\n", - "\n", - " # **应用阈值进行最终筛选**\n", - " filtered_features = [f for f in feature_columns if f not in dropped_features]\n", - "\n", - " return filtered_features, dropped_features\n", - "\n" - ], - "outputs": [], - "execution_count": 9 + "execution_count": 37 }, { "cell_type": "code", "id": "f4f16d63ad18d1bc", "metadata": { - "jupyter": { - "source_hidden": true - }, "ExecuteTime": { - "end_time": "2025-03-31T14:37:05.435586Z", - "start_time": "2025-03-31T14:37:05.429705Z" + "end_time": "2025-04-04T15:38:26.184750Z", + "start_time": "2025-04-04T15:38:26.172896Z" } }, "source": [ @@ -833,20 +877,51 @@ " return df, ret_feature_columns\n" ], "outputs": [], - "execution_count": 10 + "execution_count": 38 }, { "cell_type": "code", "id": "40e6b68a91b30c79", "metadata": { "ExecuteTime": { - "end_time": "2025-03-31T14:37:05.994210Z", - "start_time": "2025-03-31T14:37:05.479565Z" + "end_time": "2025-04-04T15:38:27.360168Z", + "start_time": "2025-04-04T15:38:26.400810Z" } }, "source": [ "import pandas as pd\n", "\n", + "from scipy.stats import ks_2samp, wasserstein_distance\n", + "from sklearn.metrics import roc_auc_score\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import StandardScaler\n", + "\n", + "\n", + "def remove_shifted_features(train_data, feature_columns, ks_threshold=0.05, wasserstein_threshold=0.1, size=0.8, log=True):\n", + " dropped_features = []\n", + "\n", + " all_dates = sorted(train_data['trade_date'].unique().tolist()) # 获取所有唯一的 trade_date\n", + " split_date = all_dates[int(len(all_dates) * size)] # 划分点为倒数第 validation_days 天\n", + " train_data_split = train_data[train_data['trade_date'] < split_date] # 训练集\n", + " val_data_split = train_data[train_data['trade_date'] >= split_date] # 验证集\n", + "\n", + " # **统计数据漂移**\n", + " numeric_columns = train_data_split.select_dtypes(include=['float64', 'int64']).columns\n", + " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", + " for feature in numeric_columns:\n", + " ks_stat, p_value = ks_2samp(train_data_split[feature], val_data_split[feature])\n", + " wasserstein_dist = wasserstein_distance(train_data_split[feature], val_data_split[feature])\n", + "\n", + " if p_value < ks_threshold or wasserstein_dist > wasserstein_threshold:\n", + " dropped_features.append(feature)\n", + " if log:\n", + " print(f\"检测到 {len(dropped_features)} 个可能漂移的特征: {dropped_features}\")\n", + "\n", + " # **应用阈值进行最终筛选**\n", + " filtered_features = [f for f in feature_columns if f not in dropped_features]\n", + "\n", + " return filtered_features, dropped_features\n", + "\n", "\n", "def remove_outliers_label_percentile(label: pd.Series, lower_percentile: float = 0.01, upper_percentile: float = 0.99,\n", " log=True):\n", @@ -898,16 +973,19 @@ " def compute_stock_score(stock_df):\n", " stock_df = stock_df.sort_values(by=['trade_date'])\n", " future_return = stock_df['future_return']\n", - " volatility = stock_df['close'].pct_change().rolling(days).std().shift(-days)\n", + " # 使用已有的 pct_chg 字段计算波动率\n", + " volatility = stock_df['pct_chg'].rolling(days).std().shift(-days)\n", " max_drawdown = stock_df['close'].rolling(days).apply(calculate_max_drawdown, raw=False).shift(-days)\n", " score = future_return - lambda_param * max_drawdown\n", - "\n", " return score\n", "\n", - " scores = df.groupby('ts_code').apply(lambda x: compute_stock_score(x))\n", - " scores = scores.reset_index(level=0, drop=True)\n", + " # # 确保 DataFrame 按照股票代码和交易日期排序\n", + " # df = df.sort_values(by=['ts_code', 'trade_date'])\n", "\n", - " return scores\n", + " # 对每个股票分别计算 score\n", + " df['score'] = df.groupby('ts_code').apply(compute_stock_score).reset_index(level=0, drop=True)\n", + "\n", + " return df['score']\n", "\n", "\n", "def remove_highly_correlated_features(df, feature_columns, threshold=0.9):\n", @@ -949,19 +1027,6 @@ "import pandas as pd\n", "import statsmodels.api as sm\n", "\n", - "\n", - "def mad_filter(df, features, n=3):\n", - " \"\"\" 使用中位数绝对偏差(MAD)去极值 \"\"\"\n", - " df = df.copy()\n", - " for col in features:\n", - " median = df[col].median()\n", - " mad = np.median(np.abs(df[col] - median))\n", - " upper = median + n * mad\n", - " lower = median - n * mad\n", - " df[col] = np.clip(df[col], lower, upper) # 截断极值\n", - " return df\n", - "\n", - "\n", "from concurrent.futures import ProcessPoolExecutor\n", "\n", "\n", @@ -988,42 +1053,83 @@ "\n", "import gc\n", "\n", - "gc.collect()" + "gc.collect()\n", + "\n", + "\n", + "def mad_filter(df, features, n=3):\n", + " for col in features:\n", + " median = df[col].median()\n", + " mad = np.median(np.abs(df[col] - median))\n", + " upper = median + n * mad\n", + " lower = median - n * mad\n", + " df[col] = np.clip(df[col], lower, upper) # 截断极值\n", + " return df\n", + "\n", + "\n", + "def percentile_filter(df, features, lower_percentile=0.01, upper_percentile=0.99):\n", + " for col in features:\n", + " # 按日期分组计算上下百分位数\n", + " lower_bound = df.groupby('trade_date')[col].transform(\n", + " lambda x: x.quantile(lower_percentile)\n", + " )\n", + " upper_bound = df.groupby('trade_date')[col].transform(\n", + " lambda x: x.quantile(upper_percentile)\n", + " )\n", + " # 截断超出范围的值\n", + " df[col] = np.clip(df[col], lower_bound, upper_bound)\n", + " return df\n", + "\n", + "\n", + "from scipy.stats import iqr\n", + "\n", + "\n", + "def iqr_filter(df, features):\n", + " for col in features:\n", + " df[col] = df.groupby('trade_date')[col].transform(\n", + " lambda x: (x - x.median()) / iqr(x) if iqr(x) != 0 else x\n", + " )\n", + " return df\n", + "\n", + "\n", + "def quantile_filter(df, features, lower_quantile=0.01, upper_quantile=0.99, window=60):\n", + " df = df.copy()\n", + " for col in features:\n", + " # 计算 rolling 统计量,需要按日期进行 groupby\n", + " rolling_lower = df.groupby('trade_date')[col].transform(\n", + " lambda x: x.rolling(window=min(len(x), window)).quantile(lower_quantile))\n", + " rolling_upper = df.groupby('trade_date')[col].transform(\n", + " lambda x: x.rolling(window=min(len(x), window)).quantile(upper_quantile))\n", + "\n", + " # 对数据进行裁剪\n", + " df[col] = np.clip(df[col], rolling_lower, rolling_upper)\n", + "\n", + " return df\n" ], - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "execution_count": 11 + "outputs": [], + "execution_count": 39 }, { "cell_type": "code", "id": "1c46817a-b5dd-4bec-8bb4-e6e80bfd9d66", "metadata": { "ExecuteTime": { - "end_time": "2025-03-31T14:37:06.026489Z", - "start_time": "2025-03-31T14:37:06.024035Z" + "end_time": "2025-04-04T15:38:27.370464Z", + "start_time": "2025-04-04T15:38:27.360168Z" } }, - "source": "# print(test_data.head()[['act_factor1', 'act_factor2', 'ts_code', 'trade_date']])", + "source": [ + "# print(test_data.head()[['act_factor1', 'act_factor2', 'ts_code', 'trade_date']])" + ], "outputs": [], - "execution_count": 12 + "execution_count": 40 }, { "cell_type": "code", "id": "da2bb202843d9275", "metadata": { "ExecuteTime": { - "end_time": "2025-03-31T14:37:06.597135Z", - "start_time": "2025-03-31T14:37:06.031495Z" + "end_time": "2025-04-04T15:38:27.480633Z", + "start_time": "2025-04-04T15:38:27.463576Z" } }, "source": [ @@ -1043,7 +1149,7 @@ " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", " # X_train.loc[:, numeric_columns] = scaler.fit_transform(X_train[numeric_columns])\n", " # X_val.loc[:, numeric_columns] = scaler.transform(X_val[numeric_columns])\n", - " train_data_df = cross_sectional_standardization(train_data_df, numeric_columns)\n", + " # train_data_df = cross_sectional_standardization(train_data_df, numeric_columns)\n", "\n", " # 去除标签为空的样本\n", " train_data_df = train_data_df.dropna(subset=['label'])\n", @@ -1052,8 +1158,14 @@ " # 按时间顺序划分训练集和验证集\n", " if split_date is None:\n", " all_dates = train_data_df['trade_date'].unique() # 获取所有唯一的 trade_date\n", - " split_date = all_dates[-validation_days] # 划分点为倒数第 validation_days 天\n", - " train_data_split = train_data_df[train_data_df['trade_date'] < split_date] # 训练集\n", + " if validation_days == 0:\n", + " split_date = all_dates[-1]\n", + " else:\n", + " split_date = all_dates[-validation_days] # 划分点为倒数第 validation_days 天\n", + " if validation_days == 0:\n", + " train_data_split = train_data_df\n", + " else:\n", + " train_data_split = train_data_df[train_data_df['trade_date'] < split_date] # 训练集\n", " val_data_split = train_data_df[train_data_df['trade_date'] >= split_date] # 验证集\n", "\n", " # 打印划分结果\n", @@ -1069,7 +1181,6 @@ " # 标准化数值特征\n", " scaler = StandardScaler()\n", "\n", - "\n", " # 计算每个 trade_date 内的样本数(LTR 需要 group 信息)\n", " train_groups = train_data_split.groupby('trade_date').size().tolist()\n", " val_groups = val_data_split.groupby('trade_date').size().tolist()\n", @@ -1126,114 +1237,213 @@ " return model, scaler, pca" ], "outputs": [], - "execution_count": 13 + "execution_count": 41 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-03-31T14:37:11.087120Z", - "start_time": "2025-03-31T14:37:06.619979Z" + "end_time": "2025-04-04T15:39:38.894592Z", + "start_time": "2025-04-04T15:38:27.482638Z" } }, "cell_type": "code", "source": [ "\n", "days = 2\n", + "df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "# df['future_return'] = df.groupby('ts_code', group_keys=False)['close'].apply(lambda x: x.shift(-days) / x - 1)\n", "df['future_return'] = (df.groupby('ts_code')['close'].shift(-days) - df.groupby('ts_code')['open'].shift(-1)) / \\\n", " df.groupby('ts_code')['open'].shift(-1)\n", "df['future_volatility'] = (\n", - " df.groupby('ts_code')['future_return']\n", - " .transform(lambda x: x.rolling(days).std())\n", + " df.groupby('ts_code')['pct_chg']\n", + " .transform(lambda x: x.rolling(days).std().shift(-days))\n", ")\n", - "\n", - "df['future_score'] = (\n", - " 0.7 * df['future_return'] +\n", - " 0.3 * df['future_volatility']\n", - ")\n", - "\n", - "filter_index = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99))\n", - "filter_index = df['future_volatility'].between(df['future_volatility'].quantile(0.01),\n", - " df['future_volatility'].quantile(0.99)) | filter_index\n", - "filter_index2 = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99))\n", - "filter_index2 = df['future_volatility'].between(df['future_volatility'].quantile(0.01),\n", - " df['future_volatility'].quantile(0.99)) | filter_index2\n", + "df['future_score'] = calculate_score(df, days=2, lambda_param=0.3)\n", "df['label'] = df.groupby('trade_date', group_keys=False)['future_score'].transform(\n", - " lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop')\n", - ")\n" + " lambda x: pd.qcut(x, q=20, labels=False, duplicates='drop')\n", + ")\n", + "# df['label'] = df.groupby('trade_date', group_keys=False)['future_score'].transform(\n", + "# lambda x: pd.qcut(x.rank(method='first'), q=20, labels=False, duplicates='raise')\n", + "# )\n", + "# df['future_score'] = (\n", + "# 0.7 * df['future_return']\n", + "# * 0.3 * df['future_volatility']\n", + "# )" ], - "id": "81d4570663ae21d7", + "id": "ff19e3f1e051a489", "outputs": [], - "execution_count": 14 + "execution_count": 42 }, { "metadata": { "ExecuteTime": { - "end_time": "2025-03-31T14:39:16.314466Z", - "start_time": "2025-03-31T14:39:15.609756Z" + "end_time": "2025-04-04T15:39:51.373402Z", + "start_time": "2025-04-04T15:39:38.993074Z" } }, "cell_type": "code", + "source": [ + "def select_pre_zt_stocks_dynamic(\n", + " stock_df,\n", + "):\n", + " stock_df = stock_df.groupby('trade_date', group_keys=False).apply(\n", + " lambda x: x.nlargest(1000, 'return_20')\n", + " )\n", + " return stock_df\n", + "\n", + "\n", + "pdf = select_pre_zt_stocks_dynamic(df)\n", + "filter_index = pdf['future_return'].between(pdf['future_return'].quantile(0.01), pdf['future_return'].quantile(0.99))\n", + "\n", + "# filter_index = pdf['future_volatility'].between(pdf['future_volatility'].quantile(0.01),\n", + "# pdf['future_volatility'].quantile(0.99)) | filter_index" + ], + "id": "27dba27b2e108316", + "outputs": [], + "execution_count": 43 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-04T15:39:58.079901Z", + "start_time": "2025-04-04T15:39:51.374912Z" + } + }, + "cell_type": "code", + "source": [ + "\n", + "pdf = pdf.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + "pdf = pdf.sort_values(['trade_date'])\n", + "pdf = pdf.replace([np.inf, -np.inf], np.nan)\n", + "\n", + "feature_columns = [col for col in pdf.columns if col in pdf.columns]\n", + "feature_columns = [col for col in feature_columns if col not in ['trade_date',\n", + " 'ts_code',\n", + " 'label']]\n", + "feature_columns = [col for col in feature_columns if 'future' not in col]\n", + "feature_columns = [col for col in feature_columns if 'label' not in col]\n", + "feature_columns = [col for col in feature_columns if 'score' not in col]\n", + "feature_columns = [col for col in feature_columns if 'gen' not in col]\n", + "feature_columns = [col for col in feature_columns if 'pe_ttm' not in col]\n", + "feature_columns = [col for col in feature_columns if 'volatility' not in col]\n", + "feature_columns = [col for col in feature_columns if 'cat_l2_code' not in col]\n", + "feature_columns = [col for col in feature_columns if col not in origin_columns]\n", + "feature_columns = [col for col in feature_columns if not col.startswith('_')]\n", + "\n", + "numeric_columns = pdf.select_dtypes(include=['float64', 'int64']).columns\n", + "numeric_columns = [col for col in numeric_columns if col in feature_columns]" + ], + "id": "ca96fb81e17c4a90", + "outputs": [], + "execution_count": 44 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-04T15:46:05.915307Z", + "start_time": "2025-04-04T15:39:58.224302Z" + } + }, + "cell_type": "code", + "source": [ + "pdf = quantile_filter(pdf, numeric_columns)\n", + "\n", + "pdf = cross_sectional_standardization(pdf, numeric_columns)\n", + "\n", + "# print('去极值')\n", + "# train_data = quantile_filter(train_data, numeric_columns) # 去极值\n", + "# # print('中性化')\n", + "# # train_data = neutralize_manual(train_data, numeric_columns, industry_col='cat_l2_code', mkt_cap_col='log(circ_mv)') # 中性化\n", + "# print('去极值')\n", + "# test_data = quantile_filter(test_data, numeric_columns) # 去极值\n", + "\n", + "feature_columns = remove_highly_correlated_features(pdf,\n", + " feature_columns)\n", + "print(len(pdf))" + ], + "id": "81d4570663ae21d7", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1755000\n" + ] + } + ], + "execution_count": 45 + }, + { + "cell_type": "code", + "id": "92428d543f4727ad", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-04T15:46:06.774220Z", + "start_time": "2025-04-04T15:46:06.034832Z" + } + }, "source": [ "# print('train data size: ', len(train_data))\n", "\n", - "# label_gain = list(range(len(train_data['label'].unique())))\n", - "# label_gain = [gain * gain for gain in label_gain]\n", + "label_gain = list(range(len(df['label'].unique())))\n", + "label_gain = [gain * gain for gain in label_gain]\n", "light_params = {\n", + " 'label_gain': label_gain,\n", " 'objective': 'lambdarank',\n", - " 'metric': 'lambdarank',\n", - " 'learning_rate': 0.1,\n", - " 'num_leaves': 1024,\n", - " 'min_data_in_leaf': 128,\n", - " 'max_depth': 16,\n", - " 'max_bin': 1024,\n", + " 'metric': 'ndcg',\n", + " 'learning_rate': 0.03,\n", + " 'num_leaves': 32,\n", + " # 'min_data_in_leaf': 128,\n", + " 'max_depth': 8,\n", + " 'max_bin': 32,\n", " 'feature_fraction': 0.7,\n", - " 'bagging_fraction': 1,\n", + " # 'bagging_fraction': 0.7,\n", " 'bagging_freq': 5,\n", - " 'lambda_l1': 1,\n", - " 'lambda_l2': 1,\n", - " # 'boosting': 'dart',\n", + " 'lambda_l1': 0.1,\n", + " 'lambda_l2': 0.1,\n", + " 'boosting': 'gbdt',\n", " 'verbosity': -1,\n", " 'extra_trees': True,\n", " 'max_position': 5,\n", " 'ndcg_at': 1,\n", + " 'quant_train_renew_leaf': True,\n", + " 'lambdarank_truncation_level': 3,\n", + " # 'lambdarank_position_bias_regularization': 1,\n", " 'seed': 7\n", "}\n", "evals = {}\n", "\n", "gc.collect()" ], - "id": "92428d543f4727ad", "outputs": [ { "data": { "text/plain": [ - "6302" + "0" ] }, - "execution_count": 21, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 21 + "execution_count": 46 }, { "cell_type": "code", "id": "8f134d435f71e9e2", "metadata": { - "jupyter": { - "source_hidden": true - }, "ExecuteTime": { - "end_time": "2025-03-31T14:39:16.430821Z", - "start_time": "2025-03-31T14:39:16.321471Z" + "end_time": "2025-04-04T15:46:06.992779Z", + "start_time": "2025-04-04T15:46:06.838417Z" } }, "source": [ "gc.collect()\n", "\n", "\n", - "def rolling_train_predict(df, train_days, test_days, industry_df, index_df, days=5, use_pca=False, validation_days=60, filter_index=None):\n", + "def rolling_train_predict(df, train_days, test_days, feature_columns_origin, days=5, use_pca=False, validation_days=60,\n", + " filter_index=None):\n", " # 1. 按照交易日期排序\n", " unique_dates = df[df['trade_date'] >= '2020-01-01']['trade_date'].unique().tolist()\n", " unique_dates = sorted(unique_dates)\n", @@ -1246,72 +1456,18 @@ " predictions_list = []\n", "\n", " for start in range(start_index, n - train_days - test_days + 1, test_days):\n", - " gc.collect()\n", "\n", " train_dates = unique_dates[start: start + train_days]\n", " test_dates = unique_dates[start + train_days: start + train_days + test_days]\n", "\n", " # 根据日期筛选数据\n", " train_data = df[filter_index & df['trade_date'].isin(train_dates)]\n", - " test_data = df[filter_index2 & df['trade_date'].isin(test_dates)]\n", + " test_data = df[df['trade_date'].isin(test_dates)]\n", "\n", " train_data = train_data.sort_values('trade_date')\n", " test_data = test_data.sort_values('trade_date')\n", "\n", - " def select_pre_zt_stocks_dynamic(\n", - " stock_df,\n", - " ):\n", - " stock_df = stock_df.groupby('trade_date', group_keys=False).apply(\n", - " lambda x: x.nlargest(1000, 'return_20')\n", - " )\n", - " return stock_df\n", - "\n", - " train_data = select_pre_zt_stocks_dynamic(train_data)\n", - " test_data = select_pre_zt_stocks_dynamic(test_data)\n", - "\n", - " industry_df = industry_df.sort_values(by=['trade_date'])\n", - " # index_df = index_df.sort_values(by=['trade_date'])\n", - "\n", - " train_data = train_data.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", - " # train_data = train_data.merge(index_df, on='trade_date', how='left')\n", - " test_data = test_data.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", - " # test_data = test_data.merge(index_df, on='trade_date', how='left')\n", - "\n", - " train_data, test_data = train_data.replace([np.inf, -np.inf], np.nan), test_data.replace([np.inf, -np.inf],\n", - " np.nan)\n", - "\n", - " feature_columns = [col for col in train_data.columns if col in train_data.columns]\n", - " feature_columns = [col for col in feature_columns if col not in ['trade_date',\n", - " 'ts_code',\n", - " 'label']]\n", - " feature_columns = [col for col in feature_columns if 'future' not in col]\n", - " feature_columns = [col for col in feature_columns if 'label' not in col]\n", - " feature_columns = [col for col in feature_columns if 'score' not in col]\n", - " feature_columns = [col for col in feature_columns if 'gen' not in col]\n", - " feature_columns = [col for col in feature_columns if 'cat_l2_code' not in col]\n", - " feature_columns = [col for col in feature_columns if col not in origin_columns]\n", - " feature_columns = [col for col in feature_columns if not col.startswith('_')]\n", - "\n", - " numeric_columns = train_data.select_dtypes(include=['float64', 'int64']).columns\n", - " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", - " print('去极值')\n", - " train_data = mad_filter(train_data, numeric_columns) # 去极值\n", - " # print('中性化')\n", - " # train_data = neutralize_manual(train_data, numeric_columns, industry_col='cat_l2_code', mkt_cap_col='log(circ_mv)') # 中性化\n", - " print('去极值')\n", - " test_data = mad_filter(test_data, numeric_columns) # 去极值\n", - "\n", - " all_dates = train_data['trade_date'].unique() # 获取所有唯一的 trade_date\n", - " split_date = all_dates[-validation_days] # 划分点为倒数第 validation_days 天\n", - " train_data_split = train_data[train_data['trade_date'] < split_date] # 训练集\n", - " val_data_split = train_data[train_data['trade_date'] >= split_date] # 验证集\n", - "\n", - " feature_columns, _ = remove_shifted_features(train_data_split[train_data_split['label'] == train_data_split['label'].max()],\n", - " val_data_split[val_data_split['label'] == val_data_split['label'].max()],\n", - " feature_columns)\n", - "\n", - " feature_columns = remove_highly_correlated_features(train_data[train_data['label'] == train_data['label'].max()],\n", - " feature_columns)\n", + " feature_columns, _ = remove_shifted_features(train_data, feature_columns_origin, size=0.8, log=False)\n", "\n", " train_data = train_data.dropna(subset=feature_columns)\n", " train_data = train_data.dropna(subset=['label'])\n", @@ -1323,10 +1479,10 @@ " test_data = test_data.reset_index(drop=True)\n", "\n", " # print(len(train_data))\n", - " print(f\"最小日期: {train_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", - " print(f\"最大日期: {train_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", - " # print(len(test_data))\n", - " print(f\"最小日期: {test_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + " # print(f\"最小日期: {train_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + " # print(f\"最大日期: {train_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + " # # print(len(test_data))\n", + " # print(f\"最小日期: {test_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", " print(f\"最大日期: {test_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", "\n", " cat_columns = [col for col in df.columns if col.startswith('cat')]\n", @@ -1335,7 +1491,7 @@ " test_data[col] = test_data[col].astype('category')\n", "\n", " label_gain = list(range(len(train_data['label'].unique())))\n", - " label_gain = [gain * gain for gain in label_gain]\n", + " label_gain = [(gain + 1) * (gain + 1) for gain in label_gain]\n", " light_params['label_gain'] = label_gain\n", "\n", " # ud = train_data[\"trade_date\"].unique()\n", @@ -1343,21 +1499,18 @@ " # light_params['weight'] = train_data[\"trade_date\"].map(date_weights).tolist()\n", "\n", " # print(f'feature_columns: {feature_columns}')\n", - " feature_contri = [2 if feat.startswith('act_factor') else 1 for feat in feature_columns]\n", - " light_params['feature_contri'] = feature_contri\n", + " # feature_contri = [2 if feat.startswith('act_factor') else 1 for feat in feature_columns]\n", + " # light_params['feature_contri'] = feature_contri\n", " model, _, _ = train_light_model(train_data.dropna(subset=['label']),\n", - " light_params, feature_columns,\n", - " [lgb.log_evaluation(period=100),\n", - " lgb.callback.record_evaluation(evals),\n", - " lgb.early_stopping(50, first_metric_only=True)\n", - " ], evals,\n", - " num_boost_round=3000, validation_days=validation_days,\n", - " print_feature_importance=False, use_pca=False)\n", + " light_params, feature_columns,\n", + " [lgb.log_evaluation(period=100),\n", + " lgb.callback.record_evaluation(evals),\n", + " # lgb.early_stopping(100, first_metric_only=True)\n", + " ], evals,\n", + " num_boost_round=100, validation_days=validation_days,\n", + " print_feature_importance=False, use_pca=False)\n", "\n", " score_df = test_data.copy()\n", - " numeric_columns = score_df.select_dtypes(include=['float64', 'int64']).columns\n", - " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", - " score_df = cross_sectional_standardization(score_df, numeric_columns)\n", " score_df['score'] = model.predict(score_df[feature_columns])\n", " score_df = score_df.loc[score_df.groupby('trade_date')['score'].idxmax()]\n", " score_df = score_df[['trade_date', 'score', 'ts_code']]\n", @@ -1401,23 +1554,33 @@ " return final_predictions\n" ], "outputs": [], - "execution_count": 22 + "execution_count": 47 }, { "cell_type": "code", "id": "63235069-dc59-48fb-961a-e80373e41a61", "metadata": { + "editable": true, + "scrolled": true, + "slideshow": { + "slide_type": "" + }, + "tags": [], "ExecuteTime": { - "end_time": "2025-03-31T14:45:27.262907Z", - "start_time": "2025-03-31T14:39:16.454548Z" + "end_time": "2025-04-04T15:58:02.493421Z", + "start_time": "2025-04-04T15:46:06.999789Z" } }, "source": [ "\n", "gc.collect()\n", "\n", - "final_predictions = rolling_train_predict(df.sort_values(['trade_date'], ascending=[True]), 500, 60, industry_df, None,\n", - " days=days, validation_days=120, filter_index=filter_index)\n", + "print(df[df['ts_code'] == '000001.SZ'].tail(1)[['act_factor1', 'act_factor2']])\n", + "print('finish')\n", + "# qdf = qdf[qdf['trade_date'] >= '2022-01-01']\n", + "\n", + "final_predictions = rolling_train_predict(pdf[pdf['trade_date'] >= '2023-01-01'], 20, 1, feature_columns,\n", + " days=days, validation_days=0, filter_index=filter_index)\n", "final_predictions.to_csv('predictions_test.tsv', index=False)\n" ], "outputs": [ @@ -1425,201 +1588,2280 @@ "name": "stdout", "output_type": "stream", "text": [ - "去极值\n", - "去极值\n", - "检测到 21 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'act_factor3', 'log(circ_mv)', 'cov', 'delta_cov', 'alpha_22_improved', 'turnover_std', 'log_close', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'mv_adjusted_volume', 'nonlinear_mv_volume']\n", - "最小日期: 2020-03-18\n", - "最大日期: 2022-04-08\n", - "最小日期: 2022-04-11\n", - "最大日期: 2022-07-07\n", - "原始训练集大小: 402509\n", - "划分后的训练集大小: 307874, 验证集大小: 94635\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[1]\ttrain's ndcg@1: 0.519951\tvalid's ndcg@1: 0.628242\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 26 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'return_kurtosis', 'vol_spike', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'act_factor3', 'log(circ_mv)', 'cov', 'delta_cov', 'alpha_22_improved', 'turnover_std', 'resonance_factor', 'log_close', 'obv-maobv_6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_lg_vol_minus_sell_lg_vol', 'buy_elg_vol_minus_sell_elg_vol', 'mv_adjusted_volume', 'nonlinear_mv_volume']\n", - "最小日期: 2020-06-16\n", - "最大日期: 2022-07-07\n", - "最小日期: 2022-07-08\n", - "最大日期: 2022-09-30\n", - "原始训练集大小: 401052\n", - "划分后的训练集大小: 306109, 验证集大小: 94943\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[19]\ttrain's ndcg@1: 0.656354\tvalid's ndcg@1: 0.628231\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 14 个可能漂移的特征: ['vol', 'turnover_rate', 'vol_spike', 'atr_14', 'atr_6', 'log(circ_mv)', 'alpha_22_improved', 'turnover_std', 'log_close', 'obv-maobv_6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_elg_vol_minus_sell_elg_vol']\n", - "最小日期: 2020-09-10\n", - "最大日期: 2022-09-30\n", - "最小日期: 2022-10-10\n", - "最大日期: 2022-12-30\n", - "原始训练集大小: 398374\n", - "划分后的训练集大小: 303799, 验证集大小: 94575\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[8]\ttrain's ndcg@1: 0.624175\tvalid's ndcg@1: 0.60186\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 17 个可能漂移的特征: ['vol', 'turnover_rate', 'return_kurtosis', 'vol_spike', 'atr_14', 'atr_6', 'act_factor3', 'log(circ_mv)', 'turnover_std', 'log_close', 'obv-maobv_6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_elg_vol_minus_sell_elg_vol', 'mv_adjusted_volume', 'nonlinear_mv_volume']\n", - "最小日期: 2020-12-11\n", - "最大日期: 2022-12-30\n", - "最小日期: 2023-01-03\n", + " act_factor1 act_factor2\n", + "5115129 -0.222482 -0.256946\n", + "finish\n", + "最大日期: 2023-02-07\n", + "原始训练集大小: 6846\n", + "划分后的训练集大小: 6846, 验证集大小: 355\n", + "[100]\ttrain's ndcg@1: 0.9715\tvalid's ndcg@1: 1\n", + "最大日期: 2023-02-08\n", + "原始训练集大小: 6811\n", + "划分后的训练集大小: 6811, 验证集大小: 327\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-02-09\n", + "原始训练集大小: 6872\n", + "划分后的训练集大小: 6872, 验证集大小: 356\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-02-10\n", + "原始训练集大小: 6853\n", + "划分后的训练集大小: 6853, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.954\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-02-13\n", + "原始训练集大小: 6838\n", + "划分后的训练集大小: 6838, 验证集大小: 340\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-02-14\n", + "原始训练集大小: 6853\n", + "划分后的训练集大小: 6853, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.96175\tvalid's ndcg@1: 1\n", + "最大日期: 2023-02-15\n", + "原始训练集大小: 6828\n", + "划分后的训练集大小: 6828, 验证集大小: 328\n", + "[100]\ttrain's ndcg@1: 0.945\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-02-16\n", + "原始训练集大小: 6850\n", + "划分后的训练集大小: 6850, 验证集大小: 348\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-02-17\n", + "原始训练集大小: 6860\n", + "划分后的训练集大小: 6860, 验证集大小: 362\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-02-20\n", + "原始训练集大小: 6818\n", + "划分后的训练集大小: 6818, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-02-21\n", + "原始训练集大小: 6862\n", + "划分后的训练集大小: 6862, 验证集大小: 342\n", + "[100]\ttrain's ndcg@1: 0.956875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-02-22\n", + "原始训练集大小: 6855\n", + "划分后的训练集大小: 6855, 验证集大小: 359\n", + "[100]\ttrain's ndcg@1: 0.952\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-02-23\n", + "原始训练集大小: 6822\n", + "划分后的训练集大小: 6822, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-02-24\n", + "原始训练集大小: 6857\n", + "划分后的训练集大小: 6857, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-02-27\n", + "原始训练集大小: 6854\n", + "划分后的训练集大小: 6854, 验证集大小: 371\n", + "[100]\ttrain's ndcg@1: 0.95175\tvalid's ndcg@1: 1\n", + "最大日期: 2023-02-28\n", + "原始训练集大小: 6813\n", + "划分后的训练集大小: 6813, 验证集大小: 310\n", + "[100]\ttrain's ndcg@1: 0.957375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-01\n", + "原始训练集大小: 6858\n", + "划分后的训练集大小: 6858, 验证集大小: 346\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-03-02\n", + "原始训练集大小: 6845\n", + "划分后的训练集大小: 6845, 验证集大小: 353\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-03-03\n", + "原始训练集大小: 6842\n", + "划分后的训练集大小: 6842, 验证集大小: 333\n", + "[100]\ttrain's ndcg@1: 0.976125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-06\n", + "原始训练集大小: 6868\n", + "划分后的训练集大小: 6868, 验证集大小: 351\n", + "[100]\ttrain's ndcg@1: 0.937875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-07\n", + "原始训练集大小: 6858\n", + "划分后的训练集大小: 6858, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.930125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-08\n", + "原始训练集大小: 6833\n", + "划分后的训练集大小: 6833, 验证集大小: 302\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-09\n", + "原始训练集大小: 6835\n", + "划分后的训练集大小: 6835, 验证集大小: 358\n", + "[100]\ttrain's ndcg@1: 0.97225\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-10\n", + "原始训练集大小: 6838\n", + "划分后的训练集大小: 6838, 验证集大小: 347\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-13\n", + "原始训练集大小: 6808\n", + "划分后的训练集大小: 6808, 验证集大小: 310\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-14\n", + "原始训练集大小: 6846\n", + "划分后的训练集大小: 6846, 验证集大小: 383\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-15\n", + "原始训练集大小: 6843\n", + "划分后的训练集大小: 6843, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.97075\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-03-16\n", + "原始训练集大小: 6822\n", + "划分后的训练集大小: 6822, 验证集大小: 327\n", + "[100]\ttrain's ndcg@1: 0.9435\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-17\n", + "原始训练集大小: 6839\n", + "划分后的训练集大小: 6839, 验证集大小: 379\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-03-20\n", + "原始训练集大小: 6829\n", + "划分后的训练集大小: 6829, 验证集大小: 315\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 0.81\n", + "最大日期: 2023-03-21\n", + "原始训练集大小: 6828\n", + "划分后的训练集大小: 6828, 验证集大小: 341\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-22\n", + "原始训练集大小: 6822\n", + "划分后的训练集大小: 6822, 验证集大小: 353\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-23\n", + "原始训练集大小: 6817\n", + "划分后的训练集大小: 6817, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.976125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-24\n", + "原始训练集大小: 6845\n", + "划分后的训练集大小: 6845, 验证集大小: 371\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-27\n", + "原始训练集大小: 6811\n", + "划分后的训练集大小: 6811, 验证集大小: 337\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-28\n", + "原始训练集大小: 6825\n", + "划分后的训练集大小: 6825, 验证集大小: 324\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-29\n", + "原始训练集大小: 6841\n", + "划分后的训练集大小: 6841, 验证集大小: 362\n", + "[100]\ttrain's ndcg@1: 0.97225\tvalid's ndcg@1: 0.64\n", + "最大日期: 2023-03-30\n", + "原始训练集大小: 6838\n", + "划分后的训练集大小: 6838, 验证集大小: 350\n", + "[100]\ttrain's ndcg@1: 0.967625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-03-31\n", + "原始训练集大小: 6803\n", + "划分后的训练集大小: 6803, 验证集大小: 298\n", + "[100]\ttrain's ndcg@1: 0.957875\tvalid's ndcg@1: 1\n", "最大日期: 2023-04-03\n", - "原始训练集大小: 395305\n", - "划分后的训练集大小: 305409, 验证集大小: 89896\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[23]\ttrain's ndcg@1: 0.711527\tvalid's ndcg@1: 0.58914\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 18 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'return_kurtosis', 'vol_spike', 'obv', 'maobv_6', 'rsi_3', 'act_factor3', 'delta_cov', 'resonance_factor', 'obv-maobv_6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'buy_elg_vol_minus_sell_elg_vol', 'mv_adjusted_volume', 'nonlinear_mv_volume']\n", - "最小日期: 2021-03-15\n", - "最大日期: 2023-04-03\n", - "最小日期: 2023-04-04\n", + "原始训练集大小: 6829\n", + "划分后的训练集大小: 6829, 验证集大小: 377\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-04\n", + "原始训练集大小: 6817\n", + "划分后的训练集大小: 6817, 验证集大小: 333\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-04-06\n", + "原始训练集大小: 6834\n", + "划分后的训练集大小: 6834, 验证集大小: 319\n", + "[100]\ttrain's ndcg@1: 0.948125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-07\n", + "原始训练集大小: 6843\n", + "划分后的训练集大小: 6843, 验证集大小: 367\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-04-10\n", + "原始训练集大小: 6823\n", + "划分后的训练集大小: 6823, 验证集大小: 327\n", + "[100]\ttrain's ndcg@1: 0.976375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-11\n", + "原始训练集大小: 6851\n", + "划分后的训练集大小: 6851, 验证集大小: 338\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-12\n", + "原始训练集大小: 6791\n", + "划分后的训练集大小: 6791, 验证集大小: 323\n", + "[100]\ttrain's ndcg@1: 0.956875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-13\n", + "原始训练集大小: 6815\n", + "划分后的训练集大小: 6815, 验证集大小: 349\n", + "[100]\ttrain's ndcg@1: 0.957875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-14\n", + "原始训练集大小: 6830\n", + "划分后的训练集大小: 6830, 验证集大小: 342\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-17\n", + "原始训练集大小: 6777\n", + "划分后的训练集大小: 6777, 验证集大小: 326\n", + "[100]\ttrain's ndcg@1: 0.957375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-18\n", + "原始训练集大小: 6787\n", + "划分后的训练集大小: 6787, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.9715\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-19\n", + "原始训练集大小: 6800\n", + "划分后的训练集大小: 6800, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-20\n", + "原始训练集大小: 6774\n", + "划分后的训练集大小: 6774, 验证集大小: 327\n", + "[100]\ttrain's ndcg@1: 0.949375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-04-21\n", + "原始训练集大小: 6784\n", + "划分后的训练集大小: 6784, 验证集大小: 335\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-24\n", + "原始训练集大小: 6771\n", + "划分后的训练集大小: 6771, 验证集大小: 358\n", + "[100]\ttrain's ndcg@1: 0.968375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-25\n", + "原始训练集大小: 6759\n", + "划分后的训练集大小: 6759, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.96275\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-26\n", + "原始训练集大小: 6759\n", + "划分后的训练集大小: 6759, 验证集大小: 324\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-04-27\n", + "原始训练集大小: 6777\n", + "划分后的训练集大小: 6777, 验证集大小: 380\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-04-28\n", + "原始训练集大小: 6706\n", + "划分后的训练集大小: 6706, 验证集大小: 279\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-04\n", + "原始训练集大小: 6760\n", + "划分后的训练集大小: 6760, 验证集大小: 352\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-05\n", + "原始训练集大小: 6756\n", + "划分后的训练集大小: 6756, 验证集大小: 373\n", + "[100]\ttrain's ndcg@1: 0.956875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-08\n", + "原始训练集大小: 6729\n", + "划分后的训练集大小: 6729, 验证集大小: 306\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-09\n", + "原始训练集大小: 6759\n", + "划分后的训练集大小: 6759, 验证集大小: 349\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-10\n", + "原始训练集大小: 6758\n", + "划分后的训练集大小: 6758, 验证集大小: 366\n", + "[100]\ttrain's ndcg@1: 0.976125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-11\n", + "原始训练集大小: 6753\n", + "划分后的训练集大小: 6753, 验证集大小: 322\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-12\n", + "原始训练集大小: 6760\n", + "划分后的训练集大小: 6760, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.96125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-05-15\n", + "原始训练集大小: 6776\n", + "划分后的训练集大小: 6776, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.967125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-16\n", + "原始训练集大小: 6750\n", + "划分后的训练集大小: 6750, 验证集大小: 323\n", + "[100]\ttrain's ndcg@1: 0.939625\tvalid's ndcg@1: 0.81\n", + "最大日期: 2023-05-17\n", + "原始训练集大小: 6772\n", + "划分后的训练集大小: 6772, 验证集大小: 364\n", + "[100]\ttrain's ndcg@1: 0.9535\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-18\n", + "原始训练集大小: 6754\n", + "划分后的训练集大小: 6754, 验证集大小: 308\n", + "[100]\ttrain's ndcg@1: 0.939375\tvalid's ndcg@1: 0.81\n", + "最大日期: 2023-05-19\n", + "原始训练集大小: 6773\n", + "划分后的训练集大小: 6773, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.955375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-22\n", + "原始训练集大小: 6790\n", + "划分后的训练集大小: 6790, 验证集大小: 371\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-23\n", + "原始训练集大小: 6754\n", + "划分后的训练集大小: 6754, 验证集大小: 291\n", + "[100]\ttrain's ndcg@1: 0.946\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-05-24\n", + "原始训练集大小: 6768\n", + "划分后的训练集大小: 6768, 验证集大小: 349\n", + "[100]\ttrain's ndcg@1: 0.976625\tvalid's ndcg@1: 0.81\n", + "最大日期: 2023-05-25\n", + "原始训练集大小: 6752\n", + "划分后的训练集大小: 6752, 验证集大小: 342\n", + "[100]\ttrain's ndcg@1: 0.976375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-26\n", + "原始训练集大小: 6757\n", + "划分后的训练集大小: 6757, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.941125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-29\n", + "原始训练集大小: 6776\n", + "划分后的训练集大小: 6776, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.96475\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-30\n", + "原始训练集大小: 6724\n", + "划分后的训练集大小: 6724, 验证集大小: 328\n", + "[100]\ttrain's ndcg@1: 0.96175\tvalid's ndcg@1: 1\n", + "最大日期: 2023-05-31\n", + "原始训练集大小: 6782\n", + "划分后的训练集大小: 6782, 验证集大小: 337\n", + "[100]\ttrain's ndcg@1: 0.938125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-06-01\n", + "原始训练集大小: 6770\n", + "划分后的训练集大小: 6770, 验证集大小: 340\n", + "[100]\ttrain's ndcg@1: 0.927\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-02\n", + "原始训练集大小: 6728\n", + "划分后的训练集大小: 6728, 验证集大小: 331\n", + "[100]\ttrain's ndcg@1: 0.92725\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-06-05\n", + "原始训练集大小: 6745\n", + "划分后的训练集大小: 6745, 验证集大小: 323\n", + "[100]\ttrain's ndcg@1: 0.94325\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-06\n", + "原始训练集大小: 6764\n", + "划分后的训练集大小: 6764, 验证集大小: 368\n", + "[100]\ttrain's ndcg@1: 0.919375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-06-07\n", + "原始训练集大小: 6692\n", + "划分后的训练集大小: 6692, 验证集大小: 294\n", + "[100]\ttrain's ndcg@1: 0.943\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-08\n", + "原始训练集大小: 6698\n", + "划分后的训练集大小: 6698, 验证集大小: 328\n", + "[100]\ttrain's ndcg@1: 0.93375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-09\n", + "原始训练集大小: 6723\n", + "划分后的训练集大小: 6723, 验证集大小: 370\n", + "[100]\ttrain's ndcg@1: 0.93425\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-12\n", + "原始训练集大小: 6693\n", + "划分后的训练集大小: 6693, 验证集大小: 309\n", + "[100]\ttrain's ndcg@1: 0.976125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-13\n", + "原始训练集大小: 6709\n", + "划分后的训练集大小: 6709, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.91675\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-14\n", + "原始训练集大小: 6688\n", + "划分后的训练集大小: 6688, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-06-15\n", + "原始训练集大小: 6711\n", + "划分后的训练集大小: 6711, 验证集大小: 331\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-06-16\n", + "原始训练集大小: 6716\n", + "划分后的训练集大小: 6716, 验证集大小: 349\n", + "[100]\ttrain's ndcg@1: 0.962\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-06-19\n", + "原始训练集大小: 6684\n", + "划分后的训练集大小: 6684, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.956625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-20\n", + "原始训练集大小: 6707\n", + "划分后的训练集大小: 6707, 验证集大小: 314\n", + "[100]\ttrain's ndcg@1: 0.94275\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-06-21\n", + "原始训练集大小: 6712\n", + "划分后的训练集大小: 6712, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.9435\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-26\n", + "原始训练集大小: 6686\n", + "划分后的训练集大小: 6686, 验证集大小: 316\n", + "[100]\ttrain's ndcg@1: 0.962\tvalid's ndcg@1: 0.81\n", + "最大日期: 2023-06-27\n", + "原始训练集大小: 6668\n", + "划分后的训练集大小: 6668, 验证集大小: 312\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-28\n", + "原始训练集大小: 6708\n", + "划分后的训练集大小: 6708, 验证集大小: 383\n", + "[100]\ttrain's ndcg@1: 0.956375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-29\n", + "原始训练集大小: 6652\n", + "划分后的训练集大小: 6652, 验证集大小: 272\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2023-06-30\n", + "原始训练集大小: 6685\n", + "划分后的训练集大小: 6685, 验证集大小: 370\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-03\n", + "原始训练集大小: 6714\n", + "划分后的训练集大小: 6714, 验证集大小: 369\n", + "[100]\ttrain's ndcg@1: 0.9715\tvalid's ndcg@1: 1\n", "最大日期: 2023-07-04\n", - "原始训练集大小: 394279\n", - "划分后的训练集大小: 303561, 验证集大小: 90718\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[1]\ttrain's ndcg@1: 0.570726\tvalid's ndcg@1: 0.62316\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 25 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'return_skew', 'return_kurtosis', 'vol_spike', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'act_factor2', 'act_factor3', 'log(circ_mv)', 'delta_cov', 'alpha_22_improved', 'turnover_std', 'resonance_factor', 'log_close', 'obv-maobv_6', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'mv_adjusted_volume', 'nonlinear_mv_volume']\n", - "最小日期: 2021-06-11\n", - "最大日期: 2023-07-04\n", - "最小日期: 2023-07-05\n", + "原始训练集大小: 6666\n", + "划分后的训练集大小: 6666, 验证集大小: 283\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-05\n", + "原始训练集大小: 6723\n", + "划分后的训练集大小: 6723, 验证集大小: 380\n", + "[100]\ttrain's ndcg@1: 0.943\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-06\n", + "原始训练集大小: 6698\n", + "划分后的训练集大小: 6698, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.95275\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-07-07\n", + "原始训练集大小: 6719\n", + "划分后的训练集大小: 6719, 验证集大小: 315\n", + "[100]\ttrain's ndcg@1: 0.942\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-07-10\n", + "原始训练集大小: 6746\n", + "划分后的训练集大小: 6746, 验证集大小: 355\n", + "[100]\ttrain's ndcg@1: 0.95175\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-07-11\n", + "原始训练集大小: 6684\n", + "划分后的训练集大小: 6684, 验证集大小: 308\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-07-12\n", + "原始训练集大小: 6729\n", + "划分后的训练集大小: 6729, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.976125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-13\n", + "原始训练集大小: 6746\n", + "划分后的训练集大小: 6746, 验证集大小: 356\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-14\n", + "原始训练集大小: 6685\n", + "划分后的训练集大小: 6685, 验证集大小: 282\n", + "[100]\ttrain's ndcg@1: 0.946875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-17\n", + "原始训练集大小: 6703\n", + "划分后的训练集大小: 6703, 验证集大小: 349\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-18\n", + "原始训练集大小: 6742\n", + "划分后的训练集大小: 6742, 验证集大小: 388\n", + "[100]\ttrain's ndcg@1: 0.96175\tvalid's ndcg@1: 0.7225\n", + "最大日期: 2023-07-19\n", + "原始训练集大小: 6664\n", + "划分后的训练集大小: 6664, 验证集大小: 261\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-20\n", + "原始训练集大小: 6704\n", + "划分后的训练集大小: 6704, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-21\n", + "原始训练集大小: 6747\n", + "划分后的训练集大小: 6747, 验证集大小: 397\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-24\n", + "原始训练集大小: 6703\n", + "划分后的训练集大小: 6703, 验证集大小: 272\n", + "[100]\ttrain's ndcg@1: 0.966625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-25\n", + "原始训练集大小: 6590\n", + "划分后的训练集大小: 6590, 验证集大小: 199\n", + "[100]\ttrain's ndcg@1: 0.97075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-26\n", + "原始训练集大小: 6331\n", + "划分后的训练集大小: 6331, 验证集大小: 124\n", + "[100]\ttrain's ndcg@1: 0.9625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-07-27\n", + "原始训练集大小: 6179\n", + "划分后的训练集大小: 6179, 验证集大小: 120\n", + "[100]\ttrain's ndcg@1: 0.939375\tvalid's ndcg@1: 0.81\n", + "最大日期: 2023-07-28\n", + "原始训练集大小: 6139\n", + "划分后的训练集大小: 6139, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.961\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-07-31\n", + "原始训练集大小: 6079\n", + "划分后的训练集大小: 6079, 验证集大小: 309\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-01\n", + "原始训练集大小: 6130\n", + "划分后的训练集大小: 6130, 验证集大小: 334\n", + "[100]\ttrain's ndcg@1: 0.938375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-02\n", + "原始训练集大小: 6050\n", + "划分后的训练集大小: 6050, 验证集大小: 300\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-03\n", + "原始训练集大小: 5975\n", + "划分后的训练集大小: 5975, 验证集大小: 268\n", + "[100]\ttrain's ndcg@1: 0.965875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-04\n", + "原始训练集大小: 5968\n", + "划分后的训练集大小: 5968, 验证集大小: 308\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-07\n", + "原始训练集大小: 5960\n", + "划分后的训练集大小: 5960, 验证集大小: 347\n", + "[100]\ttrain's ndcg@1: 0.937625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-08-08\n", + "原始训练集大小: 5938\n", + "划分后的训练集大小: 5938, 验证集大小: 286\n", + "[100]\ttrain's ndcg@1: 0.9715\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-09\n", + "原始训练集大小: 5908\n", + "划分后的训练集大小: 5908, 验证集大小: 324\n", + "[100]\ttrain's ndcg@1: 0.943\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-08-10\n", + "原始训练集大小: 5897\n", + "划分后的训练集大小: 5897, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.966625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-11\n", + "原始训练集大小: 5909\n", + "划分后的训练集大小: 5909, 验证集大小: 294\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-08-14\n", + "原始训练集大小: 5900\n", + "划分后的训练集大小: 5900, 验证集大小: 340\n", + "[100]\ttrain's ndcg@1: 1\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-15\n", + "原始训练集大小: 5846\n", + "划分后的训练集大小: 5846, 验证集大小: 334\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-16\n", + "原始训练集大小: 5904\n", + "划分后的训练集大小: 5904, 验证集大小: 319\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-17\n", + "原始训练集大小: 5883\n", + "划分后的训练集大小: 5883, 验证集大小: 333\n", + "[100]\ttrain's ndcg@1: 0.959875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-18\n", + "原始训练集大小: 5783\n", + "划分后的训练集大小: 5783, 验证集大小: 297\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-21\n", + "原始训练集大小: 5827\n", + "划分后的训练集大小: 5827, 验证集大小: 316\n", + "[100]\ttrain's ndcg@1: 0.966875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-22\n", + "原始训练集大小: 5989\n", + "划分后的训练集大小: 5989, 验证集大小: 361\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-23\n", + "原始训练集大小: 6164\n", + "划分后的训练集大小: 6164, 验证集大小: 299\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-08-24\n", + "原始训练集大小: 6373\n", + "划分后的训练集大小: 6373, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 0.976375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-25\n", + "原始训练集大小: 6421\n", + "划分后的训练集大小: 6421, 验证集大小: 378\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-28\n", + "原始训练集大小: 6382\n", + "划分后的训练集大小: 6382, 验证集大小: 270\n", + "[100]\ttrain's ndcg@1: 0.986125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-29\n", + "原始训练集大小: 6400\n", + "划分后的训练集大小: 6400, 验证集大小: 352\n", + "[100]\ttrain's ndcg@1: 0.98125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-30\n", + "原始训练集大小: 6467\n", + "划分后的训练集大小: 6467, 验证集大小: 367\n", + "[100]\ttrain's ndcg@1: 0.966625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-08-31\n", + "原始训练集大小: 6481\n", + "划分后的训练集大小: 6481, 验证集大小: 282\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-01\n", + "原始训练集大小: 6512\n", + "划分后的训练集大小: 6512, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.94375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-04\n", + "原始训练集大小: 6525\n", + "划分后的训练集大小: 6525, 验证集大小: 360\n", + "[100]\ttrain's ndcg@1: 0.976125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-09-05\n", + "原始训练集大小: 6555\n", + "划分后的训练集大小: 6555, 验证集大小: 316\n", + "[100]\ttrain's ndcg@1: 0.957125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-09-06\n", + "原始训练集大小: 6572\n", + "划分后的训练集大小: 6572, 验证集大小: 341\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-07\n", + "原始训练集大小: 6556\n", + "划分后的训练集大小: 6556, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-08\n", + "原始训练集大小: 6582\n", + "划分后的训练集大小: 6582, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.95375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-11\n", + "原始训练集大小: 6603\n", + "划分后的训练集大小: 6603, 验证集大小: 361\n", + "[100]\ttrain's ndcg@1: 0.939125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-12\n", + "原始训练集大小: 6586\n", + "划分后的训练集大小: 6586, 验证集大小: 317\n", + "[100]\ttrain's ndcg@1: 0.957875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-13\n", + "原始训练集大小: 6581\n", + "划分后的训练集大小: 6581, 验证集大小: 314\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 0.81\n", + "最大日期: 2023-09-14\n", + "原始训练集大小: 6630\n", + "划分后的训练集大小: 6630, 验证集大小: 382\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-15\n", + "原始训练集大小: 6625\n", + "划分后的训练集大小: 6625, 验证集大小: 292\n", + "[100]\ttrain's ndcg@1: 0.967375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-18\n", + "原始训练集大小: 6650\n", + "划分后的训练集大小: 6650, 验证集大小: 341\n", + "[100]\ttrain's ndcg@1: 0.958875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-19\n", + "原始训练集大小: 6665\n", + "划分后的训练集大小: 6665, 验证集大小: 376\n", + "[100]\ttrain's ndcg@1: 0.96125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-09-20\n", + "原始训练集大小: 6662\n", + "划分后的训练集大小: 6662, 验证集大小: 296\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-21\n", + "原始训练集大小: 6676\n", + "划分后的训练集大小: 6676, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.9535\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-22\n", + "原始训练集大小: 6642\n", + "划分后的训练集大小: 6642, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.966875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-25\n", + "原始训练集大小: 6685\n", + "划分后的训练集大小: 6685, 验证集大小: 313\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 1\n", "最大日期: 2023-09-26\n", - "原始训练集大小: 392902\n", - "划分后的训练集大小: 300091, 验证集大小: 92811\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[4]\ttrain's ndcg@1: 0.623501\tvalid's ndcg@1: 0.608889\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 11 个可能漂移的特征: ['pct_chg', 'return_skew', 'return_kurtosis', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'act_factor3', 'delta_cov', 'alpha_22_improved', 'resonance_factor']\n", - "最小日期: 2021-09-06\n", - "最大日期: 2023-09-26\n", - "最小日期: 2023-09-27\n", + "原始训练集大小: 6671\n", + "划分后的训练集大小: 6671, 验证集大小: 338\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-27\n", + "原始训练集大小: 6622\n", + "划分后的训练集大小: 6622, 验证集大小: 318\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-09-28\n", + "原始训练集大小: 6647\n", + "划分后的训练集大小: 6647, 验证集大小: 307\n", + "[100]\ttrain's ndcg@1: 0.96125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-09\n", + "原始训练集大小: 6697\n", + "划分后的训练集大小: 6697, 验证集大小: 389\n", + "[100]\ttrain's ndcg@1: 0.94325\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-10\n", + "原始训练集大小: 6637\n", + "划分后的训练集大小: 6637, 验证集大小: 300\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-10-11\n", + "原始训练集大小: 6621\n", + "划分后的训练集大小: 6621, 验证集大小: 300\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-12\n", + "原始训练集大小: 6688\n", + "划分后的训练集大小: 6688, 验证集大小: 408\n", + "[100]\ttrain's ndcg@1: 0.956625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-13\n", + "原始训练集大小: 6609\n", + "划分后的训练集大小: 6609, 验证集大小: 250\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-16\n", + "原始训练集大小: 6596\n", + "划分后的训练集大小: 6596, 验证集大小: 307\n", + "[100]\ttrain's ndcg@1: 1\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-17\n", + "原始训练集大小: 6571\n", + "划分后的训练集大小: 6571, 验证集大小: 336\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-18\n", + "原始训练集大小: 6511\n", + "划分后的训练集大小: 6511, 验证集大小: 257\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-19\n", + "原始训练集大小: 6519\n", + "划分后的训练集大小: 6519, 验证集大小: 322\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-20\n", + "原始训练集大小: 6482\n", + "划分后的训练集大小: 6482, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.976125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-23\n", + "原始训练集大小: 6507\n", + "划分后的训练集大小: 6507, 验证集大小: 317\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-24\n", + "原始训练集大小: 6524\n", + "划分后的训练集大小: 6524, 验证集大小: 358\n", + "[100]\ttrain's ndcg@1: 0.9905\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-25\n", + "原始训练集大小: 6484\n", + "划分后的训练集大小: 6484, 验证集大小: 336\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-10-26\n", + "原始训练集大小: 6482\n", + "划分后的训练集大小: 6482, 验证集大小: 294\n", + "[100]\ttrain's ndcg@1: 0.9905\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-27\n", + "原始训练集大小: 6523\n", + "划分后的训练集大小: 6523, 验证集大小: 384\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-30\n", + "原始训练集大小: 6488\n", + "划分后的训练集大小: 6488, 验证集大小: 309\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-10-31\n", + "原始训练集大小: 6484\n", + "划分后的训练集大小: 6484, 验证集大小: 309\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-01\n", + "原始训练集大小: 6566\n", + "划分后的训练集大小: 6566, 验证集大小: 420\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-02\n", + "原始训练集大小: 6512\n", + "划分后的训练集大小: 6512, 验证集大小: 264\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-03\n", + "原始训练集大小: 6531\n", + "划分后的训练集大小: 6531, 验证集大小: 326\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-06\n", + "原始训练集大小: 6539\n", + "划分后的训练集大小: 6539, 验证集大小: 397\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-07\n", + "原始训练集大小: 6520\n", + "划分后的训练集大小: 6520, 验证集大小: 281\n", + "[100]\ttrain's ndcg@1: 0.97175\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-08\n", + "原始训练集大小: 6571\n", + "划分后的训练集大小: 6571, 验证集大小: 351\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-09\n", + "原始训练集大小: 6500\n", + "划分后的训练集大小: 6500, 验证集大小: 337\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-10\n", + "原始训练集大小: 6552\n", + "划分后的训练集大小: 6552, 验证集大小: 302\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-13\n", + "原始训练集大小: 6594\n", + "划分后的训练集大小: 6594, 验证集大小: 349\n", + "[100]\ttrain's ndcg@1: 0.956625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-11-14\n", + "原始训练集大小: 6601\n", + "划分后的训练集大小: 6601, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-15\n", + "原始训练集大小: 6647\n", + "划分后的训练集大小: 6647, 验证集大小: 303\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-16\n", + "原始训练集大小: 6694\n", + "划分后的训练集大小: 6694, 验证集大小: 369\n", + "[100]\ttrain's ndcg@1: 0.977125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-17\n", + "原始训练集大小: 6650\n", + "划分后的训练集大小: 6650, 验证集大小: 301\n", + "[100]\ttrain's ndcg@1: 1\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-20\n", + "原始训练集大小: 6645\n", + "划分后的训练集大小: 6645, 验证集大小: 312\n", + "[100]\ttrain's ndcg@1: 0.976125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-21\n", + "原始训练集大小: 6674\n", + "划分后的训练集大小: 6674, 验证集大小: 387\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-22\n", + "原始训练集大小: 6617\n", + "划分后的训练集大小: 6617, 验证集大小: 279\n", + "[100]\ttrain's ndcg@1: 0.976125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-23\n", + "原始训练集大小: 6661\n", + "划分后的训练集大小: 6661, 验证集大小: 338\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-24\n", + "原始训练集大小: 6633\n", + "划分后的训练集大小: 6633, 验证集大小: 356\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 0.81\n", + "最大日期: 2023-11-27\n", + "原始训练集大小: 6610\n", + "划分后的训练集大小: 6610, 验证集大小: 286\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-28\n", + "原始训练集大小: 6663\n", + "划分后的训练集大小: 6663, 验证集大小: 362\n", + "[100]\ttrain's ndcg@1: 1\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-29\n", + "原始训练集大小: 6572\n", + "划分后的训练集大小: 6572, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-11-30\n", + "原始训练集大小: 6611\n", + "划分后的训练集大小: 6611, 验证集大小: 303\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-01\n", + "原始训练集大小: 6619\n", + "划分后的训练集大小: 6619, 验证集大小: 334\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-12-04\n", + "原始训练集大小: 6536\n", + "划分后的训练集大小: 6536, 验证集大小: 314\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-05\n", + "原始训练集大小: 6551\n", + "划分后的训练集大小: 6551, 验证集大小: 296\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-06\n", + "原始训练集大小: 6557\n", + "划分后的训练集大小: 6557, 验证集大小: 357\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-07\n", + "原始训练集大小: 6549\n", + "划分后的训练集大小: 6549, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 0.97075\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-12-08\n", + "原始训练集大小: 6557\n", + "划分后的训练集大小: 6557, 验证集大小: 310\n", + "[100]\ttrain's ndcg@1: 0.98125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-11\n", + "原始训练集大小: 6551\n", + "划分后的训练集大小: 6551, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-12\n", + "原始训练集大小: 6565\n", + "划分后的训练集大小: 6565, 验证集大小: 357\n", + "[100]\ttrain's ndcg@1: 0.9515\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-13\n", + "原始训练集大小: 6560\n", + "划分后的训练集大小: 6560, 验证集大小: 298\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-14\n", + "原始训练集大小: 6550\n", + "划分后的训练集大小: 6550, 验证集大小: 359\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-15\n", + "原始训练集大小: 6588\n", + "划分后的训练集大小: 6588, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.976375\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-18\n", + "原始训练集大小: 6560\n", + "划分后的训练集大小: 6560, 验证集大小: 284\n", + "[100]\ttrain's ndcg@1: 0.98125\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-19\n", + "原始训练集大小: 6523\n", + "划分后的训练集大小: 6523, 验证集大小: 350\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2023-12-20\n", + "原始训练集大小: 6573\n", + "划分后的训练集大小: 6573, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 1\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-21\n", + "原始训练集大小: 6553\n", + "划分后的训练集大小: 6553, 验证集大小: 318\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-22\n", + "原始训练集大小: 6534\n", + "划分后的训练集大小: 6534, 验证集大小: 337\n", + "[100]\ttrain's ndcg@1: 1\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-25\n", + "原始训练集大小: 6586\n", + "划分后的训练集大小: 6586, 验证集大小: 338\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-26\n", + "原始训练集大小: 6544\n", + "划分后的训练集大小: 6544, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", "最大日期: 2023-12-27\n", - "原始训练集大小: 386164\n", - "划分后的训练集大小: 296301, 验证集大小: 89863\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[38]\ttrain's ndcg@1: 0.76403\tvalid's ndcg@1: 0.675597\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 14 个可能漂移的特征: ['pct_chg', 'turnover_rate', 'vol_spike', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'act_factor3', 'log(circ_mv)', 'cov', 'delta_cov', 'alpha_22_improved', 'turnover_std', 'log_close']\n", - "最小日期: 2021-12-08\n", - "最大日期: 2023-12-27\n", - "最小日期: 2023-12-28\n", + "原始训练集大小: 6571\n", + "划分后的训练集大小: 6571, 验证集大小: 356\n", + "[100]\ttrain's ndcg@1: 0.947625\tvalid's ndcg@1: 0.7225\n", + "最大日期: 2023-12-28\n", + "原始训练集大小: 6607\n", + "划分后的训练集大小: 6607, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2023-12-29\n", + "原始训练集大小: 6568\n", + "划分后的训练集大小: 6568, 验证集大小: 295\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-01-02\n", + "原始训练集大小: 6627\n", + "划分后的训练集大小: 6627, 验证集大小: 373\n", + "[100]\ttrain's ndcg@1: 0.98125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-03\n", + "原始训练集大小: 6670\n", + "划分后的训练集大小: 6670, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.962\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-04\n", + "原始训练集大小: 6647\n", + "划分后的训练集大小: 6647, 验证集大小: 334\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-05\n", + "原始训练集大小: 6643\n", + "划分后的训练集大小: 6643, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-08\n", + "原始训练集大小: 6649\n", + "划分后的训练集大小: 6649, 验证集大小: 316\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-09\n", + "原始训练集大小: 6636\n", + "划分后的训练集大小: 6636, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-10\n", + "原始训练集大小: 6626\n", + "划分后的训练集大小: 6626, 验证集大小: 347\n", + "[100]\ttrain's ndcg@1: 0.957875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-11\n", + "原始训练集大小: 6628\n", + "划分后的训练集大小: 6628, 验证集大小: 300\n", + "[100]\ttrain's ndcg@1: 0.968125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-12\n", + "原始训练集大小: 6601\n", + "划分后的训练集大小: 6601, 验证集大小: 332\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-01-15\n", + "原始训练集大小: 6603\n", + "划分后的训练集大小: 6603, 验证集大小: 341\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-16\n", + "原始训练集大小: 6632\n", + "划分后的训练集大小: 6632, 验证集大小: 313\n", + "[100]\ttrain's ndcg@1: 0.957375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-17\n", + "原始训练集大小: 6647\n", + "划分后的训练集大小: 6647, 验证集大小: 365\n", + "[100]\ttrain's ndcg@1: 0.96175\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-18\n", + "原始训练集大小: 6648\n", + "划分后的训练集大小: 6648, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 1\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-19\n", + "原始训练集大小: 6646\n", + "划分后的训练集大小: 6646, 验证集大小: 316\n", + "[100]\ttrain's ndcg@1: 0.919125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-22\n", + "原始训练集大小: 6669\n", + "划分后的训练集大小: 6669, 验证集大小: 360\n", + "[100]\ttrain's ndcg@1: 0.966875\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-01-23\n", + "原始训练集大小: 6660\n", + "划分后的训练集大小: 6660, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-24\n", + "原始训练集大小: 6649\n", + "划分后的训练集大小: 6649, 验证集大小: 309\n", + "[100]\ttrain's ndcg@1: 0.96125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-01-25\n", + "原始训练集大小: 6649\n", + "划分后的训练集大小: 6649, 验证集大小: 356\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-26\n", + "原始训练集大小: 6626\n", + "划分后的训练集大小: 6626, 验证集大小: 316\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-01-29\n", + "原始训练集大小: 6666\n", + "划分后的训练集大小: 6666, 验证集大小: 335\n", + "[100]\ttrain's ndcg@1: 0.95275\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-30\n", + "原始训练集大小: 6636\n", + "划分后的训练集大小: 6636, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.976125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-01-31\n", + "原始训练集大小: 6595\n", + "划分后的训练集大小: 6595, 验证集大小: 298\n", + "[100]\ttrain's ndcg@1: 0.9335\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-02-01\n", + "原始训练集大小: 6607\n", + "划分后的训练集大小: 6607, 验证集大小: 346\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-02-02\n", + "原始训练集大小: 6646\n", + "划分后的训练集大小: 6646, 验证集大小: 364\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-02-05\n", + "原始训练集大小: 6645\n", + "划分后的训练集大小: 6645, 验证集大小: 315\n", + "[100]\ttrain's ndcg@1: 0.962\tvalid's ndcg@1: 1\n", + "最大日期: 2024-02-06\n", + "原始训练集大小: 6659\n", + "划分后的训练集大小: 6659, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.920875\tvalid's ndcg@1: 0.64\n", + "最大日期: 2024-02-07\n", + "原始训练集大小: 6657\n", + "划分后的训练集大小: 6657, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.949125\tvalid's ndcg@1: 0.5625\n", + "最大日期: 2024-02-08\n", + "原始训练集大小: 6677\n", + "划分后的训练集大小: 6677, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.941719\tvalid's ndcg@1: 0.224377\n", + "最大日期: 2024-02-19\n", + "原始训练集大小: 6684\n", + "划分后的训练集大小: 6684, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.870884\tvalid's ndcg@1: 0.64\n", + "最大日期: 2024-02-20\n", + "原始训练集大小: 6684\n", + "划分后的训练集大小: 6684, 验证集大小: 341\n", + "[100]\ttrain's ndcg@1: 0.938647\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-02-21\n", + "原始训练集大小: 6708\n", + "划分后的训练集大小: 6708, 验证集大小: 337\n", + "[100]\ttrain's ndcg@1: 0.903469\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-02-22\n", + "原始训练集大小: 6667\n", + "划分后的训练集大小: 6667, 验证集大小: 324\n", + "[100]\ttrain's ndcg@1: 0.943663\tvalid's ndcg@1: 1\n", + "最大日期: 2024-02-23\n", + "原始训练集大小: 6691\n", + "划分后的训练集大小: 6691, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.858945\tvalid's ndcg@1: 1\n", + "最大日期: 2024-02-26\n", + "原始训练集大小: 6709\n", + "划分后的训练集大小: 6709, 验证集大小: 334\n", + "[100]\ttrain's ndcg@1: 0.838375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-02-27\n", + "原始训练集大小: 6702\n", + "划分后的训练集大小: 6702, 验证集大小: 353\n", + "[100]\ttrain's ndcg@1: 0.88207\tvalid's ndcg@1: 1\n", + "最大日期: 2024-02-28\n", + "原始训练集大小: 6691\n", + "划分后的训练集大小: 6691, 验证集大小: 318\n", + "[100]\ttrain's ndcg@1: 0.919707\tvalid's ndcg@1: 1\n", + "最大日期: 2024-02-29\n", + "原始训练集大小: 6737\n", + "划分后的训练集大小: 6737, 验证集大小: 355\n", + "[100]\ttrain's ndcg@1: 0.841\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-03-01\n", + "原始训练集大小: 6721\n", + "划分后的训练集大小: 6721, 验证集大小: 340\n", + "[100]\ttrain's ndcg@1: 0.896375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-03-04\n", + "原始训练集大小: 6753\n", + "划分后的训练集大小: 6753, 验证集大小: 348\n", + "[100]\ttrain's ndcg@1: 0.907413\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-05\n", + "原始训练集大小: 6749\n", + "划分后的训练集大小: 6749, 验证集大小: 331\n", + "[100]\ttrain's ndcg@1: 0.88975\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-06\n", + "原始训练集大小: 6762\n", + "划分后的训练集大小: 6762, 验证集大小: 356\n", + "[100]\ttrain's ndcg@1: 0.892788\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-03-07\n", + "原始训练集大小: 6814\n", + "划分后的训练集大小: 6814, 验证集大小: 350\n", + "[100]\ttrain's ndcg@1: 0.885288\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-03-08\n", + "原始训练集大小: 6771\n", + "划分后的训练集大小: 6771, 验证集大小: 303\n", + "[100]\ttrain's ndcg@1: 0.930288\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-11\n", + "原始训练集大小: 6755\n", + "划分后的训练集大小: 6755, 验证集大小: 348\n", + "[100]\ttrain's ndcg@1: 0.948125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-12\n", + "原始训练集大小: 6780\n", + "划分后的训练集大小: 6780, 验证集大小: 340\n", + "[100]\ttrain's ndcg@1: 0.910375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-03-13\n", + "原始训练集大小: 6752\n", + "划分后的训练集大小: 6752, 验证集大小: 316\n", + "[100]\ttrain's ndcg@1: 0.905522\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-14\n", + "原始训练集大小: 6745\n", + "划分后的训练集大小: 6745, 验证集大小: 338\n", + "[100]\ttrain's ndcg@1: 0.935163\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-03-15\n", + "原始训练集大小: 6760\n", + "划分后的训练集大小: 6760, 验证集大小: 335\n", + "[100]\ttrain's ndcg@1: 0.933\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-18\n", + "原始训练集大小: 6751\n", + "划分后的训练集大小: 6751, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.9425\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-03-19\n", + "原始训练集大小: 6717\n", + "划分后的训练集大小: 6717, 验证集大小: 307\n", + "[100]\ttrain's ndcg@1: 0.947125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-20\n", + "原始训练集大小: 6729\n", + "划分后的训练集大小: 6729, 验证集大小: 349\n", + "[100]\ttrain's ndcg@1: 0.947375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-21\n", + "原始训练集大小: 6738\n", + "划分后的训练集大小: 6738, 验证集大小: 333\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-22\n", + "原始训练集大小: 6692\n", + "划分后的训练集大小: 6692, 验证集大小: 308\n", + "[100]\ttrain's ndcg@1: 0.95225\tvalid's ndcg@1: 0.7225\n", + "最大日期: 2024-03-25\n", + "原始训练集大小: 6690\n", + "划分后的训练集大小: 6690, 验证集大小: 332\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-03-26\n", + "原始训练集大小: 6663\n", + "划分后的训练集大小: 6663, 验证集大小: 326\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-27\n", + "原始训练集大小: 6705\n", + "划分后的训练集大小: 6705, 验证集大小: 360\n", + "[100]\ttrain's ndcg@1: 0.956625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-03-28\n", + "原始训练集大小: 6647\n", + "划分后的训练集大小: 6647, 验证集大小: 297\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", "最大日期: 2024-03-29\n", - "原始训练集大小: 379125\n", - "划分后的训练集大小: 293170, 验证集大小: 85955\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[17]\ttrain's ndcg@1: 0.707121\tvalid's ndcg@1: 0.6345\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 13 个可能漂移的特征: ['vol', 'turnover_rate', 'vol_spike', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'log(circ_mv)', 'turnover_std', 'log_close', 'obv-maobv_6', 'mv_adjusted_volume', 'nonlinear_mv_volume']\n", - "最小日期: 2022-03-10\n", - "最大日期: 2024-03-29\n", - "最小日期: 2024-04-01\n", + "原始训练集大小: 6666\n", + "划分后的训练集大小: 6666, 验证集大小: 359\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-04-01\n", + "原始训练集大小: 6640\n", + "划分后的训练集大小: 6640, 验证集大小: 322\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-02\n", + "原始训练集大小: 6617\n", + "划分后的训练集大小: 6617, 验证集大小: 308\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-04-03\n", + "原始训练集大小: 6594\n", + "划分后的训练集大小: 6594, 验证集大小: 333\n", + "[100]\ttrain's ndcg@1: 0.962\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-08\n", + "原始训练集大小: 6569\n", + "划分后的训练集大小: 6569, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-04-09\n", + "原始训练集大小: 6604\n", + "划分后的训练集大小: 6604, 验证集大小: 338\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-04-10\n", + "原始训练集大小: 6582\n", + "划分后的训练集大小: 6582, 验证集大小: 326\n", + "[100]\ttrain's ndcg@1: 0.956875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-11\n", + "原始训练集大小: 6588\n", + "划分后的训练集大小: 6588, 验证集大小: 346\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-12\n", + "原始训练集大小: 6605\n", + "划分后的训练集大小: 6605, 验证集大小: 333\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-15\n", + "原始训练集大小: 6594\n", + "划分后的训练集大小: 6594, 验证集大小: 327\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-16\n", + "原始训练集大小: 6562\n", + "划分后的训练集大小: 6562, 验证集大小: 303\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-17\n", + "原始训练集大小: 6585\n", + "划分后的训练集大小: 6585, 验证集大小: 353\n", + "[100]\ttrain's ndcg@1: 0.947875\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-04-18\n", + "原始训练集大小: 6625\n", + "划分后的训练集大小: 6625, 验证集大小: 347\n", + "[100]\ttrain's ndcg@1: 0.925\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-19\n", + "原始训练集大小: 6593\n", + "划分后的训练集大小: 6593, 验证集大小: 317\n", + "[100]\ttrain's ndcg@1: 0.9535\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-22\n", + "原始训练集大小: 6617\n", + "划分后的训练集大小: 6617, 验证集大小: 357\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-23\n", + "原始训练集大小: 6675\n", + "划分后的训练集大小: 6675, 验证集大小: 366\n", + "[100]\ttrain's ndcg@1: 0.9635\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-24\n", + "原始训练集大小: 6662\n", + "划分后的训练集大小: 6662, 验证集大小: 319\n", + "[100]\ttrain's ndcg@1: 0.966875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-04-25\n", + "原始训练集大小: 6681\n", + "划分后的训练集大小: 6681, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.8925\tvalid's ndcg@1: 0.7225\n", + "最大日期: 2024-04-26\n", + "原始训练集大小: 6668\n", + "划分后的训练集大小: 6668, 验证集大小: 347\n", + "[100]\ttrain's ndcg@1: 0.940625\tvalid's ndcg@1: 0.49\n", + "最大日期: 2024-04-29\n", + "原始训练集大小: 6714\n", + "划分后的训练集大小: 6714, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-04-30\n", + "原始训练集大小: 6699\n", + "划分后的训练集大小: 6699, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.894\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-06\n", + "原始训练集大小: 6703\n", + "划分后的训练集大小: 6703, 验证集大小: 326\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-07\n", + "原始训练集大小: 6733\n", + "划分后的训练集大小: 6733, 验证集大小: 338\n", + "[100]\ttrain's ndcg@1: 0.93525\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-08\n", + "原始训练集大小: 6753\n", + "划分后的训练集大小: 6753, 验证集大小: 353\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-09\n", + "原始训练集大小: 6731\n", + "划分后的训练集大小: 6731, 验证集大小: 303\n", + "[100]\ttrain's ndcg@1: 0.97175\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-10\n", + "原始训练集大小: 6763\n", + "划分后的训练集大小: 6763, 验证集大小: 370\n", + "[100]\ttrain's ndcg@1: 0.894875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-13\n", + "原始训练集大小: 6786\n", + "划分后的训练集大小: 6786, 验证集大小: 349\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-05-14\n", + "原始训练集大小: 6780\n", + "划分后的训练集大小: 6780, 验证集大小: 340\n", + "[100]\ttrain's ndcg@1: 0.95225\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-05-15\n", + "原始训练集大小: 6790\n", + "划分后的训练集大小: 6790, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.917125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-16\n", + "原始训练集大小: 6807\n", + "划分后的训练集大小: 6807, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.913\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-17\n", + "原始训练集大小: 6886\n", + "划分后的训练集大小: 6886, 验证集大小: 382\n", + "[100]\ttrain's ndcg@1: 0.94625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-20\n", + "原始训练集大小: 6860\n", + "划分后的训练集大小: 6860, 验证集大小: 327\n", + "[100]\ttrain's ndcg@1: 0.950875\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-05-21\n", + "原始训练集大小: 6813\n", + "划分后的训练集大小: 6813, 验证集大小: 300\n", + "[100]\ttrain's ndcg@1: 0.947625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-05-22\n", + "原始训练集大小: 6880\n", + "划分后的训练集大小: 6880, 验证集大小: 384\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-23\n", + "原始训练集大小: 6877\n", + "划分后的训练集大小: 6877, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-05-24\n", + "原始训练集大小: 6791\n", + "划分后的训练集大小: 6791, 验证集大小: 280\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-05-27\n", + "原始训练集大小: 6854\n", + "划分后的训练集大小: 6854, 验证集大小: 382\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-28\n", + "原始训练集大小: 6877\n", + "划分后的训练集大小: 6877, 验证集大小: 368\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-29\n", + "原始训练集大小: 6838\n", + "划分后的训练集大小: 6838, 验证集大小: 308\n", + "[100]\ttrain's ndcg@1: 0.956875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-05-30\n", + "原始训练集大小: 6858\n", + "划分后的训练集大小: 6858, 验证集大小: 363\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-05-31\n", + "原始训练集大小: 6854\n", + "划分后的训练集大小: 6854, 验证集大小: 340\n", + "[100]\ttrain's ndcg@1: 0.947625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-03\n", + "原始训练集大小: 6907\n", + "划分后的训练集大小: 6907, 验证集大小: 379\n", + "[100]\ttrain's ndcg@1: 0.966875\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-06-04\n", + "原始训练集大小: 6899\n", + "划分后的训练集大小: 6899, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-06-05\n", + "原始训练集大小: 6867\n", + "划分后的训练集大小: 6867, 验证集大小: 321\n", + "[100]\ttrain's ndcg@1: 0.96125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-06-06\n", + "原始训练集大小: 6950\n", + "划分后的训练集大小: 6950, 验证集大小: 386\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-07\n", + "原始训练集大小: 6911\n", + "划分后的训练集大小: 6911, 验证集大小: 331\n", + "[100]\ttrain's ndcg@1: 0.943\tvalid's ndcg@1: 0.7225\n", + "最大日期: 2024-06-11\n", + "原始训练集大小: 6863\n", + "划分后的训练集大小: 6863, 验证集大小: 301\n", + "[100]\ttrain's ndcg@1: 0.956625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-12\n", + "原始训练集大小: 6904\n", + "划分后的训练集大小: 6904, 验证集大小: 381\n", + "[100]\ttrain's ndcg@1: 0.952\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-06-13\n", + "原始训练集大小: 6876\n", + "划分后的训练集大小: 6876, 验证集大小: 315\n", + "[100]\ttrain's ndcg@1: 0.96125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-06-14\n", + "原始训练集大小: 6876\n", + "划分后的训练集大小: 6876, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.97075\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-17\n", + "原始训练集大小: 6845\n", + "划分后的训练集大小: 6845, 验证集大小: 351\n", + "[100]\ttrain's ndcg@1: 0.947375\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-06-18\n", + "原始训练集大小: 6848\n", + "划分后的训练集大小: 6848, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-19\n", + "原始训练集大小: 6946\n", + "划分后的训练集大小: 6946, 验证集大小: 398\n", + "[100]\ttrain's ndcg@1: 0.952\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-20\n", + "原始训练集大小: 6866\n", + "划分后的训练集大小: 6866, 验证集大小: 304\n", + "[100]\ttrain's ndcg@1: 0.956875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-21\n", + "原始训练集大小: 6860\n", + "划分后的训练集大小: 6860, 验证集大小: 348\n", + "[100]\ttrain's ndcg@1: 0.96175\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-24\n", + "原始训练集大小: 6960\n", + "划分后的训练集大小: 6960, 验证集大小: 380\n", + "[100]\ttrain's ndcg@1: 0.93475\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-25\n", + "原始训练集大小: 6902\n", + "划分后的训练集大小: 6902, 验证集大小: 324\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-06-26\n", + "原始训练集大小: 6868\n", + "划分后的训练集大小: 6868, 验证集大小: 334\n", + "[100]\ttrain's ndcg@1: 1\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-27\n", + "原始训练集大小: 6921\n", + "划分后的训练集大小: 6921, 验证集大小: 361\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-06-28\n", + "原始训练集大小: 6897\n", + "划分后的训练集大小: 6897, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.9435\tvalid's ndcg@1: 0.81\n", "最大日期: 2024-07-01\n", - "原始训练集大小: 379627\n", - "划分后的训练集大小: 290158, 验证集大小: 89469\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[44]\ttrain's ndcg@1: 0.776797\tvalid's ndcg@1: 0.610802\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 18 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'return_kurtosis', 'vol_spike', 'atr_6', 'maobv_6', 'rsi_3', 'act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'turnover_std', 'resonance_factor', 'log_close', 'obv-maobv_6', 'mv_adjusted_volume', 'nonlinear_mv_volume']\n", - "最小日期: 2022-06-10\n", - "最大日期: 2024-07-01\n", - "最小日期: 2024-07-02\n", + "原始训练集大小: 6877\n", + "划分后的训练集大小: 6877, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.953\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-02\n", + "原始训练集大小: 6869\n", + "划分后的训练集大小: 6869, 验证集大小: 371\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-03\n", + "原始训练集大小: 6844\n", + "划分后的训练集大小: 6844, 验证集大小: 305\n", + "[100]\ttrain's ndcg@1: 0.947125\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-07-04\n", + "原始训练集大小: 6917\n", + "划分后的训练集大小: 6917, 验证集大小: 394\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-07-05\n", + "原始训练集大小: 6850\n", + "划分后的训练集大小: 6850, 验证集大小: 319\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-07-08\n", + "原始训练集大小: 6848\n", + "划分后的训练集大小: 6848, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-09\n", + "原始训练集大小: 6940\n", + "划分后的训练集大小: 6940, 验证集大小: 393\n", + "[100]\ttrain's ndcg@1: 0.956875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-10\n", + "原始训练集大小: 6855\n", + "划分后的训练集大小: 6855, 验证集大小: 296\n", + "[100]\ttrain's ndcg@1: 0.97175\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-11\n", + "原始训练集大小: 6888\n", + "划分后的训练集大小: 6888, 验证集大小: 348\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-12\n", + "原始训练集大小: 6896\n", + "划分后的训练集大小: 6896, 验证集大小: 352\n", + "[100]\ttrain's ndcg@1: 0.91725\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-07-15\n", + "原始训练集大小: 6879\n", + "划分后的训练集大小: 6879, 验证集大小: 334\n", + "[100]\ttrain's ndcg@1: 0.97325\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-16\n", + "原始训练集大小: 6851\n", + "划分后的训练集大小: 6851, 验证集大小: 302\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-07-17\n", + "原始训练集大小: 6827\n", + "划分后的训练集大小: 6827, 验证集大小: 374\n", + "[100]\ttrain's ndcg@1: 0.956375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-18\n", + "原始训练集大小: 6863\n", + "划分后的训练集大小: 6863, 验证集大小: 340\n", + "[100]\ttrain's ndcg@1: 0.953\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-19\n", + "原始训练集大小: 6868\n", + "划分后的训练集大小: 6868, 验证集大小: 353\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-22\n", + "原始训练集大小: 6832\n", + "划分后的训练集大小: 6832, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.968375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-23\n", + "原始训练集大小: 6846\n", + "划分后的训练集大小: 6846, 验证集大小: 338\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-24\n", + "原始训练集大小: 6888\n", + "划分后的训练集大小: 6888, 验证集大小: 376\n", + "[100]\ttrain's ndcg@1: 0.9715\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-25\n", + "原始训练集大小: 6824\n", + "划分后的训练集大小: 6824, 验证集大小: 297\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-26\n", + "原始训练集大小: 6839\n", + "划分后的训练集大小: 6839, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-29\n", + "原始训练集大小: 6889\n", + "划分后的训练集大小: 6889, 验证集大小: 370\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-30\n", + "原始训练集大小: 6855\n", + "划分后的训练集大小: 6855, 验证集大小: 337\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-07-31\n", + "原始训练集大小: 6856\n", + "划分后的训练集大小: 6856, 验证集大小: 306\n", + "[100]\ttrain's ndcg@1: 0.96275\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-01\n", + "原始训练集大小: 6841\n", + "划分后的训练集大小: 6841, 验证集大小: 379\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-02\n", + "原始训练集大小: 6847\n", + "划分后的训练集大小: 6847, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-08-05\n", + "原始训练集大小: 6850\n", + "划分后的训练集大小: 6850, 验证集大小: 332\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-06\n", + "原始训练集大小: 6811\n", + "划分后的训练集大小: 6811, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-07\n", + "原始训练集大小: 6849\n", + "划分后的训练集大小: 6849, 验证集大小: 334\n", + "[100]\ttrain's ndcg@1: 0.97225\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-08\n", + "原始训练集大小: 6869\n", + "划分后的训练集大小: 6869, 验证集大小: 368\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-09\n", + "原始训练集大小: 6837\n", + "划分后的训练集大小: 6837, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-12\n", + "原始训练集大小: 6834\n", + "划分后的训练集大小: 6834, 验证集大小: 331\n", + "[100]\ttrain's ndcg@1: 1\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-13\n", + "原始训练集大小: 6893\n", + "划分后的训练集大小: 6893, 验证集大小: 361\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-08-14\n", + "原始训练集大小: 6855\n", + "划分后的训练集大小: 6855, 验证集大小: 336\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-15\n", + "原始训练集大小: 6840\n", + "划分后的训练集大小: 6840, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 1\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-16\n", + "原始训练集大小: 6847\n", + "划分后的训练集大小: 6847, 验证集大小: 360\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-19\n", + "原始训练集大小: 6872\n", + "划分后的训练集大小: 6872, 验证集大小: 369\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-20\n", + "原始训练集大小: 6834\n", + "划分后的训练集大小: 6834, 验证集大小: 300\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-21\n", + "原始训练集大小: 6833\n", + "划分后的训练集大小: 6833, 验证集大小: 375\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-22\n", + "原始训练集大小: 6880\n", + "划分后的训练集大小: 6880, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-23\n", + "原始训练集大小: 6853\n", + "划分后的训练集大小: 6853, 验证集大小: 327\n", + "[100]\ttrain's ndcg@1: 0.981\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-26\n", + "原始训练集大小: 6837\n", + "划分后的训练集大小: 6837, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-08-27\n", + "原始训练集大小: 6830\n", + "划分后的训练集大小: 6830, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-08-28\n", + "原始训练集大小: 6880\n", + "划分后的训练集大小: 6880, 验证集大小: 356\n", + "[100]\ttrain's ndcg@1: 0.966875\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-08-29\n", + "原始训练集大小: 6851\n", + "划分后的训练集大小: 6851, 验证集大小: 350\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-08-30\n", + "原始训练集大小: 6837\n", + "划分后的训练集大小: 6837, 验证集大小: 311\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-02\n", + "原始训练集大小: 6849\n", + "划分后的训练集大小: 6849, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-03\n", + "原始训练集大小: 6855\n", + "划分后的训练集大小: 6855, 验证集大小: 360\n", + "[100]\ttrain's ndcg@1: 0.94325\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-09-04\n", + "原始训练集大小: 6806\n", + "划分后的训练集大小: 6806, 验证集大小: 285\n", + "[100]\ttrain's ndcg@1: 0.96125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-05\n", + "原始训练集大小: 6817\n", + "划分后的训练集大小: 6817, 验证集大小: 379\n", + "[100]\ttrain's ndcg@1: 0.937625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-09-06\n", + "原始训练集大小: 6860\n", + "划分后的训练集大小: 6860, 验证集大小: 363\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-09\n", + "原始训练集大小: 6838\n", + "划分后的训练集大小: 6838, 验证集大小: 309\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-10\n", + "原始训练集大小: 6845\n", + "划分后的训练集大小: 6845, 验证集大小: 368\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-11\n", + "原始训练集大小: 6848\n", + "划分后的训练集大小: 6848, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-12\n", + "原始训练集大小: 6883\n", + "划分后的训练集大小: 6883, 验证集大小: 360\n", + "[100]\ttrain's ndcg@1: 0.956625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-13\n", + "原始训练集大小: 6857\n", + "划分后的训练集大小: 6857, 验证集大小: 334\n", + "[100]\ttrain's ndcg@1: 0.957375\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-09-18\n", + "原始训练集大小: 6814\n", + "划分后的训练集大小: 6814, 验证集大小: 326\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-19\n", + "原始训练集大小: 6888\n", + "划分后的训练集大小: 6888, 验证集大小: 374\n", + "[100]\ttrain's ndcg@1: 0.967375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-20\n", + "原始训练集大小: 6852\n", + "划分后的训练集大小: 6852, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-23\n", + "原始训练集大小: 6799\n", + "划分后的训练集大小: 6799, 验证集大小: 291\n", + "[100]\ttrain's ndcg@1: 0.953\tvalid's ndcg@1: 0.64\n", + "最大日期: 2024-09-24\n", + "原始训练集大小: 6825\n", + "划分后的训练集大小: 6825, 验证集大小: 353\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 0.81\n", "最大日期: 2024-09-25\n", - "原始训练集大小: 381403\n", - "划分后的训练集大小: 284687, 验证集大小: 96716\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[49]\ttrain's ndcg@1: 0.787077\tvalid's ndcg@1: 0.579916\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 20 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'vol_spike', 'atr_14', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'act_factor3', 'log(circ_mv)', 'cov', 'delta_cov', 'alpha_22_improved', 'turnover_std', 'resonance_factor', 'log_close', 'obv-maobv_6', 'mv_adjusted_volume', 'nonlinear_mv_volume']\n", - "最小日期: 2022-09-02\n", - "最大日期: 2024-09-25\n", - "最小日期: 2024-09-26\n", + "原始训练集大小: 6841\n", + "划分后的训练集大小: 6841, 验证集大小: 370\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-26\n", + "原始训练集大小: 6782\n", + "划分后的训练集大小: 6782, 验证集大小: 271\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-09-27\n", + "原始训练集大小: 6800\n", + "划分后的训练集大小: 6800, 验证集大小: 374\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-09-30\n", + "原始训练集大小: 6786\n", + "划分后的训练集大小: 6786, 验证集大小: 336\n", + "[100]\ttrain's ndcg@1: 0.957625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-08\n", + "原始训练集大小: 6757\n", + "划分后的训练集大小: 6757, 验证集大小: 282\n", + "[100]\ttrain's ndcg@1: 0.947875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-09\n", + "原始训练集大小: 6616\n", + "划分后的训练集大小: 6616, 验证集大小: 203\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-10\n", + "原始训练集大小: 6577\n", + "划分后的训练集大小: 6577, 验证集大小: 321\n", + "[100]\ttrain's ndcg@1: 0.95225\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-11\n", + "原始训练集大小: 6635\n", + "划分后的训练集大小: 6635, 验证集大小: 343\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-14\n", + "原始训练集大小: 6589\n", + "划分后的训练集大小: 6589, 验证集大小: 333\n", + "[100]\ttrain's ndcg@1: 0.952\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-15\n", + "原始训练集大小: 6535\n", + "划分后的训练集大小: 6535, 验证集大小: 309\n", + "[100]\ttrain's ndcg@1: 0.9345\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-10-16\n", + "原始训练集大小: 6594\n", + "划分后的训练集大小: 6594, 验证集大小: 368\n", + "[100]\ttrain's ndcg@1: 0.957875\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-10-17\n", + "原始训练集大小: 6546\n", + "划分后的训练集大小: 6546, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.9525\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-18\n", + "原始训练集大小: 6566\n", + "划分后的训练集大小: 6566, 验证集大小: 359\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-10-21\n", + "原始训练集大小: 6535\n", + "划分后的训练集大小: 6535, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 0.938625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-10-22\n", + "原始训练集大小: 6520\n", + "划分后的训练集大小: 6520, 验证集大小: 319\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-23\n", + "原始训练集大小: 6530\n", + "划分后的训练集大小: 6530, 验证集大小: 336\n", + "[100]\ttrain's ndcg@1: 0.96125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-10-24\n", + "原始训练集大小: 6479\n", + "划分后的训练集大小: 6479, 验证集大小: 323\n", + "[100]\ttrain's ndcg@1: 0.956625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-25\n", + "原始训练集大小: 6481\n", + "划分后的训练集大小: 6481, 验证集大小: 341\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-28\n", + "原始训练集大小: 6528\n", + "划分后的训练集大小: 6528, 验证集大小: 338\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-29\n", + "原始训练集大小: 6499\n", + "划分后的训练集大小: 6499, 验证集大小: 324\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-30\n", + "原始训练集大小: 6430\n", + "划分后的训练集大小: 6430, 验证集大小: 301\n", + "[100]\ttrain's ndcg@1: 0.96175\tvalid's ndcg@1: 1\n", + "最大日期: 2024-10-31\n", + "原始训练集大小: 6496\n", + "划分后的训练集大小: 6496, 验证集大小: 337\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-01\n", + "原始训练集大小: 6461\n", + "划分后的训练集大小: 6461, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.97225\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-04\n", + "原始训练集大小: 6447\n", + "划分后的训练集大小: 6447, 验证集大小: 322\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-05\n", + "原始训练集大小: 6494\n", + "划分后的训练集大小: 6494, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-06\n", + "原始训练集大小: 6638\n", + "划分后的训练集大小: 6638, 验证集大小: 347\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-11-07\n", + "原始训练集大小: 6617\n", + "划分后的训练集大小: 6617, 验证集大小: 300\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-08\n", + "原始训练集大小: 6586\n", + "划分后的训练集大小: 6586, 验证集大小: 312\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-11-11\n", + "原始训练集大小: 6501\n", + "划分后的训练集大小: 6501, 验证集大小: 248\n", + "[100]\ttrain's ndcg@1: 0.966625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-12\n", + "原始训练集大小: 6459\n", + "划分后的训练集大小: 6459, 验证集大小: 267\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-13\n", + "原始训练集大小: 6411\n", + "划分后的训练集大小: 6411, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.956625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-14\n", + "原始训练集大小: 6395\n", + "划分后的训练集大小: 6395, 验证集大小: 304\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-11-15\n", + "原始训练集大小: 6366\n", + "划分后的训练集大小: 6366, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.966875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-18\n", + "原始训练集大小: 6389\n", + "划分后的训练集大小: 6389, 验证集大小: 352\n", + "[100]\ttrain's ndcg@1: 0.957125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-11-19\n", + "原始训练集大小: 6400\n", + "划分后的训练集大小: 6400, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.937875\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-11-20\n", + "原始训练集大小: 6409\n", + "划分后的训练集大小: 6409, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.930625\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-21\n", + "原始训练集大小: 6412\n", + "划分后的训练集大小: 6412, 验证集大小: 326\n", + "[100]\ttrain's ndcg@1: 0.947875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-22\n", + "原始训练集大小: 6423\n", + "划分后的训练集大小: 6423, 验证集大小: 352\n", + "[100]\ttrain's ndcg@1: 0.965875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-25\n", + "原始训练集大小: 6433\n", + "划分后的训练集大小: 6433, 验证集大小: 348\n", + "[100]\ttrain's ndcg@1: 0.902375\tvalid's ndcg@1: 0.81\n", + "最大日期: 2024-11-26\n", + "原始训练集大小: 6422\n", + "划分后的训练集大小: 6422, 验证集大小: 313\n", + "[100]\ttrain's ndcg@1: 0.957375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-27\n", + "原始训练集大小: 6466\n", + "划分后的训练集大小: 6466, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.9715\tvalid's ndcg@1: 1\n", + "最大日期: 2024-11-28\n", + "原始训练集大小: 6476\n", + "划分后的训练集大小: 6476, 验证集大小: 347\n", + "[100]\ttrain's ndcg@1: 0.914\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-11-29\n", + "原始训练集大小: 6458\n", + "划分后的训练集大小: 6458, 验证集大小: 321\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-02\n", + "原始训练集大小: 6474\n", + "划分后的训练集大小: 6474, 验证集大小: 338\n", + "[100]\ttrain's ndcg@1: 0.924\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-03\n", + "原始训练集大小: 6505\n", + "划分后的训练集大小: 6505, 验证集大小: 360\n", + "[100]\ttrain's ndcg@1: 0.9715\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-04\n", + "原始训练集大小: 6463\n", + "划分后的训练集大小: 6463, 验证集大小: 305\n", + "[100]\ttrain's ndcg@1: 0.915\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-12-05\n", + "原始训练集大小: 6507\n", + "划分后的训练集大小: 6507, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.938375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-06\n", + "原始训练集大小: 6520\n", + "划分后的训练集大小: 6520, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.9525\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-09\n", + "原始训练集大小: 6592\n", + "划分后的训练集大小: 6592, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.938125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2024-12-10\n", + "原始训练集大小: 6667\n", + "划分后的训练集大小: 6667, 验证集大小: 342\n", + "[100]\ttrain's ndcg@1: 0.947375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-11\n", + "原始训练集大小: 6675\n", + "划分后的训练集大小: 6675, 验证集大小: 328\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-12\n", + "原始训练集大小: 6707\n", + "划分后的训练集大小: 6707, 验证集大小: 336\n", + "[100]\ttrain's ndcg@1: 0.9245\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-13\n", + "原始训练集大小: 6726\n", + "划分后的训练集大小: 6726, 验证集大小: 349\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-16\n", + "原始训练集大小: 6692\n", + "划分后的训练集大小: 6692, 验证集大小: 318\n", + "[100]\ttrain's ndcg@1: 0.94425\tvalid's ndcg@1: 0.5625\n", + "最大日期: 2024-12-17\n", + "原始训练集大小: 6706\n", + "划分后的训练集大小: 6706, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.948375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-18\n", + "原始训练集大小: 6707\n", + "划分后的训练集大小: 6707, 验证集大小: 346\n", + "[100]\ttrain's ndcg@1: 0.96125\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-19\n", + "原始训练集大小: 6694\n", + "划分后的训练集大小: 6694, 验证集大小: 313\n", + "[100]\ttrain's ndcg@1: 0.965875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-20\n", + "原始训练集大小: 6687\n", + "划分后的训练集大小: 6687, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.929875\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-23\n", + "原始训练集大小: 6691\n", + "划分后的训练集大小: 6691, 验证集大小: 352\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-24\n", + "原始训练集大小: 6709\n", + "划分后的训练集大小: 6709, 验证集大小: 331\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", "最大日期: 2024-12-25\n", - "原始训练集大小: 378304\n", - "划分后的训练集大小: 284976, 验证集大小: 93328\n", - "Training until validation scores don't improve for 50 rounds\n", - "[100]\ttrain's ndcg@1: 0.840198\tvalid's ndcg@1: 0.629064\n", - "Early stopping, best iteration is:\n", - "[98]\ttrain's ndcg@1: 0.836808\tvalid's ndcg@1: 0.644301\n", - "Evaluated only: ndcg@1\n", - "去极值\n", - "去极值\n", - "检测到 17 个可能漂移的特征: ['vol', 'pct_chg', 'turnover_rate', 'return_skew', 'obv', 'maobv_6', 'rsi_3', 'act_factor1', 'log(circ_mv)', 'cov', 'delta_cov', 'alpha_22_improved', 'resonance_factor', 'log_close', 'obv-maobv_6', 'mv_adjusted_volume', 'nonlinear_mv_volume']\n", - "最小日期: 2022-12-05\n", - "最大日期: 2024-12-25\n", - "最小日期: 2024-12-26\n", + "原始训练集大小: 6721\n", + "划分后的训练集大小: 6721, 验证集大小: 357\n", + "[100]\ttrain's ndcg@1: 0.956375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-26\n", + "原始训练集大小: 6696\n", + "划分后的训练集大小: 6696, 验证集大小: 322\n", + "[100]\ttrain's ndcg@1: 0.981\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-27\n", + "原始训练集大小: 6691\n", + "划分后的训练集大小: 6691, 验证集大小: 316\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-30\n", + "原始训练集大小: 6703\n", + "划分后的训练集大小: 6703, 验证集大小: 350\n", + "[100]\ttrain's ndcg@1: 0.957375\tvalid's ndcg@1: 1\n", + "最大日期: 2024-12-31\n", + "原始训练集大小: 6696\n", + "划分后的训练集大小: 6696, 验证集大小: 353\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-02\n", + "原始训练集大小: 6707\n", + "划分后的训练集大小: 6707, 验证集大小: 316\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-03\n", + "原始训练集大小: 6725\n", + "划分后的训练集大小: 6725, 验证集大小: 362\n", + "[100]\ttrain's ndcg@1: 0.96175\tvalid's ndcg@1: 0.81\n", + "最大日期: 2025-01-06\n", + "原始训练集大小: 6742\n", + "划分后的训练集大小: 6742, 验证集大小: 342\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-07\n", + "原始训练集大小: 6742\n", + "划分后的训练集大小: 6742, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.97075\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2025-01-08\n", + "原始训练集大小: 6768\n", + "划分后的训练集大小: 6768, 验证集大小: 368\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-09\n", + "原始训练集大小: 6757\n", + "划分后的训练集大小: 6757, 验证集大小: 317\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-10\n", + "原始训练集大小: 6756\n", + "划分后的训练集大小: 6756, 验证集大小: 335\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-13\n", + "原始训练集大小: 6766\n", + "划分后的训练集大小: 6766, 验证集大小: 359\n", + "[100]\ttrain's ndcg@1: 0.981\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-14\n", + "原始训练集大小: 6732\n", + "划分后的训练集大小: 6732, 验证集大小: 284\n", + "[100]\ttrain's ndcg@1: 0.96125\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-15\n", + "原始训练集大小: 6752\n", + "划分后的训练集大小: 6752, 验证集大小: 364\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-16\n", + "原始训练集大小: 6731\n", + "划分后的训练集大小: 6731, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-17\n", + "原始训练集大小: 6720\n", + "划分后的训练集大小: 6720, 验证集大小: 302\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-20\n", + "原始训练集大小: 6729\n", + "划分后的训练集大小: 6729, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.97125\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-21\n", + "原始训练集大小: 6707\n", + "划分后的训练集大小: 6707, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-22\n", + "原始训练集大小: 6705\n", + "划分后的训练集大小: 6705, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-23\n", + "原始训练集大小: 6692\n", + "划分后的训练集大小: 6692, 验证集大小: 344\n", + "[100]\ttrain's ndcg@1: 0.995125\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-24\n", + "原始训练集大小: 6690\n", + "划分后的训练集大小: 6690, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.9715\tvalid's ndcg@1: 1\n", + "最大日期: 2025-01-27\n", + "原始训练集大小: 6704\n", + "划分后的训练集大小: 6704, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.976375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2025-02-05\n", + "原始训练集大小: 6708\n", + "划分后的训练集大小: 6708, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-06\n", + "原始训练集大小: 6675\n", + "划分后的训练集大小: 6675, 验证集大小: 320\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2025-02-07\n", + "原始训练集大小: 6704\n", + "划分后的训练集大小: 6704, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.967125\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-10\n", + "原始训练集大小: 6690\n", + "划分后的训练集大小: 6690, 验证集大小: 348\n", + "[100]\ttrain's ndcg@1: 0.9535\tvalid's ndcg@1: 0.7225\n", + "最大日期: 2025-02-11\n", + "原始训练集大小: 6673\n", + "划分后的训练集大小: 6673, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.985375\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-12\n", + "原始训练集大小: 6686\n", + "划分后的训练集大小: 6686, 验证集大小: 333\n", + "[100]\ttrain's ndcg@1: 0.975625\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-13\n", + "原始训练集大小: 6675\n", + "划分后的训练集大小: 6675, 验证集大小: 357\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-14\n", + "原始训练集大小: 6666\n", + "划分后的训练集大小: 6666, 验证集大小: 308\n", + "[100]\ttrain's ndcg@1: 0.976375\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-17\n", + "原始训练集大小: 6684\n", + "划分后的训练集大小: 6684, 验证集大小: 353\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-18\n", + "原始训练集大小: 6666\n", + "划分后的训练集大小: 6666, 验证集大小: 341\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-19\n", + "原始训练集大小: 6705\n", + "划分后的训练集大小: 6705, 验证集大小: 323\n", + "[100]\ttrain's ndcg@1: 0.99025\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-20\n", + "原始训练集大小: 6686\n", + "划分后的训练集大小: 6686, 验证集大小: 345\n", + "[100]\ttrain's ndcg@1: 0.965875\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-21\n", + "原始训练集大小: 6684\n", + "划分后的训练集大小: 6684, 验证集大小: 323\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-24\n", + "原始训练集大小: 6714\n", + "划分后的训练集大小: 6714, 验证集大小: 332\n", + "[100]\ttrain's ndcg@1: 0.967375\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-25\n", + "原始训练集大小: 6701\n", + "划分后的训练集大小: 6701, 验证集大小: 341\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-26\n", + "原始训练集大小: 6684\n", + "划分后的训练集大小: 6684, 验证集大小: 313\n", + "[100]\ttrain's ndcg@1: 0.985625\tvalid's ndcg@1: 1\n", + "最大日期: 2025-02-27\n", + "原始训练集大小: 6716\n", + "划分后的训练集大小: 6716, 验证集大小: 361\n", + "[100]\ttrain's ndcg@1: 0.966125\tvalid's ndcg@1: 0.81\n", + "最大日期: 2025-02-28\n", + "原始训练集大小: 6711\n", + "划分后的训练集大小: 6711, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.947375\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2025-03-03\n", + "原始训练集大小: 6708\n", + "划分后的训练集大小: 6708, 验证集大小: 317\n", + "[100]\ttrain's ndcg@1: 0.957125\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-04\n", + "原始训练集大小: 6729\n", + "划分后的训练集大小: 6729, 验证集大小: 351\n", + "[100]\ttrain's ndcg@1: 0.94525\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-05\n", + "原始训练集大小: 6704\n", + "划分后的训练集大小: 6704, 验证集大小: 329\n", + "[100]\ttrain's ndcg@1: 0.957125\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-06\n", + "原始训练集大小: 6709\n", + "划分后的训练集大小: 6709, 验证集大小: 325\n", + "[100]\ttrain's ndcg@1: 0.953\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-07\n", + "原始训练集大小: 6703\n", + "划分后的训练集大小: 6703, 验证集大小: 339\n", + "[100]\ttrain's ndcg@1: 0.950125\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-10\n", + "原始训练集大小: 6705\n", + "划分后的训练集大小: 6705, 验证集大小: 350\n", + "[100]\ttrain's ndcg@1: 0.9615\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-11\n", + "原始训练集大小: 6715\n", + "划分后的训练集大小: 6715, 验证集大小: 335\n", + "[100]\ttrain's ndcg@1: 0.932125\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2025-03-12\n", + "原始训练集大小: 6712\n", + "划分后的训练集大小: 6712, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.975875\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-13\n", + "原始训练集大小: 6691\n", + "划分后的训练集大小: 6691, 验证集大小: 336\n", + "[100]\ttrain's ndcg@1: 0.9435\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-14\n", + "原始训练集大小: 6704\n", + "划分后的训练集大小: 6704, 验证集大小: 321\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-17\n", + "原始训练集大小: 6709\n", + "划分后的训练集大小: 6709, 验证集大小: 358\n", + "[100]\ttrain's ndcg@1: 0.959875\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-18\n", + "原始训练集大小: 6685\n", + "划分后的训练集大小: 6685, 验证集大小: 317\n", + "[100]\ttrain's ndcg@1: 0.947375\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-19\n", + "原始训练集大小: 6697\n", + "划分后的训练集大小: 6697, 验证集大小: 335\n", + "[100]\ttrain's ndcg@1: 0.97225\tvalid's ndcg@1: 0.9025\n", + "最大日期: 2025-03-20\n", + "原始训练集大小: 6698\n", + "划分后的训练集大小: 6698, 验证集大小: 346\n", + "[100]\ttrain's ndcg@1: 0.966625\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-21\n", + "原始训练集大小: 6697\n", + "划分后的训练集大小: 6697, 验证集大小: 322\n", + "[100]\ttrain's ndcg@1: 0.950125\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-24\n", + "原始训练集大小: 6701\n", + "划分后的训练集大小: 6701, 验证集大小: 336\n", + "[100]\ttrain's ndcg@1: 0.971\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-25\n", + "原始训练集大小: 6714\n", + "划分后的训练集大小: 6714, 验证集大小: 354\n", + "[100]\ttrain's ndcg@1: 0.966375\tvalid's ndcg@1: 0.9025\n", "最大日期: 2025-03-26\n", - "原始训练集大小: 371843\n", - "划分后的训练集大小: 289769, 验证集大小: 82074\n", - "Training until validation scores don't improve for 50 rounds\n", - "Early stopping, best iteration is:\n", - "[2]\ttrain's ndcg@1: 0.592644\tvalid's ndcg@1: 0.596307\n", - "Evaluated only: ndcg@1\n" + "原始训练集大小: 6731\n", + "划分后的训练集大小: 6731, 验证集大小: 330\n", + "[100]\ttrain's ndcg@1: 0.9805\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-27\n", + "原始训练集大小: 6697\n", + "划分后的训练集大小: 6697, 验证集大小: 327\n", + "[100]\ttrain's ndcg@1: 0.98075\tvalid's ndcg@1: 1\n", + "最大日期: 2025-03-28\n", + "原始训练集大小: 6358\n", + "划分后的训练集大小: 6358, 验证集大小: 327\n", + "[100]\ttrain's ndcg@1: 0.887237\tvalid's ndcg@1: 0.9025\n" ] } ], - "execution_count": 23 + "execution_count": 48 }, { + "cell_type": "code", + "id": "10f15e935aa02a34", "metadata": { "ExecuteTime": { - "end_time": "2025-03-31T14:45:27.345941Z", - "start_time": "2025-03-31T14:45:27.342565Z" + "end_time": "2025-04-04T15:58:02.865185Z", + "start_time": "2025-04-04T15:58:02.605106Z" } }, - "cell_type": "code", - "source": "print('finish')", - "id": "10f15e935aa02a34", + "source": [ + "print(df[df['ts_code'] == '000001.SZ'].tail(1)[['act_factor1', 'act_factor2']])\n", + "print('finish')" + ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + " act_factor1 act_factor2\n", + "5115129 -0.222482 -0.256946\n", "finish\n" ] } ], - "execution_count": 24 + "execution_count": 49 }, { "cell_type": "code", "id": "0dc75517-c857-4f1d-8815-e807400a6d33", "metadata": { "ExecuteTime": { - "end_time": "2025-03-31T14:45:27.395705Z", - "start_time": "2025-03-31T14:45:27.393319Z" + "end_time": "2025-04-04T15:58:04.052383Z", + "start_time": "2025-04-04T15:58:02.926348Z" } }, - "source": [], - "outputs": [], - "execution_count": null + "source": [ + "train_data = pdf[filter_index & (pdf['trade_date'] == '2023-01-03')]\n", + "# train_data = train_data.dropna(subset=feature_columns)\n", + "# train_data = train_data.dropna(subset=['label'])\n", + "train_data = train_data.reset_index(drop=True)\n", + "print(len(train_data))\n" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "384\n" + ] + } + ], + "execution_count": 50 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-04T15:58:04.071469Z", + "start_time": "2025-04-04T15:58:04.052383Z" + } + }, + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "def analyze_nan_factors(df, factor_columns):\n", + " \"\"\"\n", + " 分析 DataFrame 中指定因子列的 NaN 值情况。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 包含因子数据的 DataFrame。\n", + " factor_columns (list): 包含因子列名的列表。\n", + " \"\"\"\n", + "\n", + " print(\"### 各因子 NaN 值占比 ###\")\n", + " nan_percentage = df[factor_columns].isnull().sum() / len(df) * 100\n", + " print(nan_percentage.sort_values(ascending=False))\n", + " print(\"\\n\")\n", + "\n", + " print(\"### 包含 NaN 值最多的前 5 个因子 ###\")\n", + " top_nan_factors = nan_percentage[nan_percentage > 0].sort_values(ascending=False).head(5)\n", + " print(top_nan_factors)\n", + " print(\"\\n\")\n", + "\n", + " if not top_nan_factors.empty:\n", + " for factor in top_nan_factors.index:\n", + " print(f\"### 因子 '{factor}' 的 NaN 值分析 ###\")\n", + "\n", + " # 按交易日期分组,计算每日 NaN 值数量\n", + " nan_by_date = df.groupby('trade_date')[factor].apply(lambda x: x.isnull().sum())\n", + " print(\"\\n每日 NaN 值数量:\")\n", + " print(nan_by_date.sort_values(ascending=False).head())\n", + "\n", + " # # 按股票代码分组,计算每只股票 NaN 值数量\n", + " # nan_by_stock = df.groupby('ts_code')[factor].apply(lambda x: x.isnull().sum())\n", + " # print(\"\\n每只股票 NaN 值数量:\")\n", + " # print(nan_by_stock.sort_values(ascending=False).head())\n", + "\n", + " print(\"-\" * 30)\n", + " print(\"\\n\")\n", + "\n", + "# 假设您的 DataFrame 名称是 pdf,并且您已经定义了 feature_columns\n", + "if 'pdf' in locals() and 'feature_columns' in locals():\n", + " analyze_nan_factors(train_data.copy(), feature_columns)\n", + "else:\n", + " print(\"请确保您的 DataFrame 名称为 'pdf' 且因子列名列表为 'feature_columns' 后再运行代码。\")" + ], + "id": "53ce0624ed8e3123", + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### 各因子 NaN 值占比 ###\n", + "mv_growth 2.864583\n", + "industry_rank_act_factor3 0.781250\n", + "industry_act_factor2 0.781250\n", + "std_return_90 - std_return_90_2 0.781250\n", + "industry_obv 0.781250\n", + " ... \n", + "cat_vol_spike 0.000000\n", + "up 0.000000\n", + "down 0.000000\n", + "obv-maobv_6 0.000000\n", + "vol 0.000000\n", + "Length: 88, dtype: float64\n", + "\n", + "\n", + "### 包含 NaN 值最多的前 5 个因子 ###\n", + "mv_growth 2.864583\n", + "industry_rank_act_factor3 0.781250\n", + "industry_obv 0.781250\n", + "industry_rank_act_factor2 0.781250\n", + "industry_rank_act_factor1 0.781250\n", + "dtype: float64\n", + "\n", + "\n", + "### 因子 'mv_growth' 的 NaN 值分析 ###\n", + "\n", + "每日 NaN 值数量:\n", + "trade_date\n", + "2023-01-03 11\n", + "Name: mv_growth, dtype: int64\n", + "------------------------------\n", + "\n", + "\n", + "### 因子 'industry_rank_act_factor3' 的 NaN 值分析 ###\n", + "\n", + "每日 NaN 值数量:\n", + "trade_date\n", + "2023-01-03 3\n", + "Name: industry_rank_act_factor3, dtype: int64\n", + "------------------------------\n", + "\n", + "\n", + "### 因子 'industry_obv' 的 NaN 值分析 ###\n", + "\n", + "每日 NaN 值数量:\n", + "trade_date\n", + "2023-01-03 3\n", + "Name: industry_obv, dtype: int64\n", + "------------------------------\n", + "\n", + "\n", + "### 因子 'industry_rank_act_factor2' 的 NaN 值分析 ###\n", + "\n", + "每日 NaN 值数量:\n", + "trade_date\n", + "2023-01-03 3\n", + "Name: industry_rank_act_factor2, dtype: int64\n", + "------------------------------\n", + "\n", + "\n", + "### 因子 'industry_rank_act_factor1' 的 NaN 值分析 ###\n", + "\n", + "每日 NaN 值数量:\n", + "trade_date\n", + "2023-01-03 3\n", + "Name: industry_rank_act_factor1, dtype: int64\n", + "------------------------------\n", + "\n", + "\n" + ] + } + ], + "execution_count": 51 } ], "metadata": { diff --git a/code/train/RollingRank.py b/code/train/RollingRank.py deleted file mode 100644 index a34f5ad..0000000 --- a/code/train/RollingRank.py +++ /dev/null @@ -1,1250 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[1]: - - -# %load_ext autoreload -# %autoreload 2 - -import pandas as pd -import warnings - -warnings.filterwarnings("ignore") - -pd.set_option('display.max_columns', None) - - -# In[2]: - - -from utils.utils import read_and_merge_h5_data - -print('daily data') -df = read_and_merge_h5_data('../../data/daily_data.h5', key='daily_data', - columns=['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg'], - df=None) - -print('daily basic') -df = read_and_merge_h5_data('../../data/daily_basic.h5', key='daily_basic', - columns=['ts_code', 'trade_date', 'turnover_rate', 'pe_ttm', 'circ_mv', 'volume_ratio', - 'is_st'], df=df, join='inner') - -print('stk limit') -df = read_and_merge_h5_data('../../data/stk_limit.h5', key='stk_limit', - columns=['ts_code', 'trade_date', 'pre_close', 'up_limit', 'down_limit'], - df=df) -print('money flow') -df = read_and_merge_h5_data('../../data/money_flow.h5', key='money_flow', - columns=['ts_code', 'trade_date', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', - 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol'], - df=df) -print('cyq perf') -df = read_and_merge_h5_data('../../data/cyq_perf.h5', key='cyq_perf', - columns=['ts_code', 'trade_date', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct', - 'cost_50pct', - 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate'], - df=df) -print(df.info()) - - -# In[3]: - - -print('industry') -industry_df = read_and_merge_h5_data('../../data/industry_data.h5', key='industry_data', - columns=['ts_code', 'l2_code', 'in_date'], - df=None, on=['ts_code'], join='left') - - -def merge_with_industry_data(df, industry_df): - # 确保日期字段是 datetime 类型 - df['trade_date'] = pd.to_datetime(df['trade_date']) - industry_df['in_date'] = pd.to_datetime(industry_df['in_date']) - - # 对 industry_df 按 ts_code 和 in_date 排序 - industry_df_sorted = industry_df.sort_values(['in_date', 'ts_code']) - - # 对原始 df 按 ts_code 和 trade_date 排序 - df_sorted = df.sort_values(['trade_date', 'ts_code']) - - # 使用 merge_asof 进行向后合并 - merged = pd.merge_asof( - df_sorted, - industry_df_sorted, - by='ts_code', # 按 ts_code 分组 - left_on='trade_date', - right_on='in_date', - direction='backward' - ) - - # 获取每个 ts_code 的最早 in_date 记录 - min_in_date_per_ts = (industry_df_sorted - .groupby('ts_code') - .first() - .reset_index()[['ts_code', 'l2_code']]) - - # 填充未匹配到的记录(trade_date 早于所有 in_date 的情况) - merged['l2_code'] = merged['l2_code'].fillna( - merged['ts_code'].map(min_in_date_per_ts.set_index('ts_code')['l2_code']) - ) - - # 保留需要的列并重置索引 - result = merged.reset_index(drop=True) - return result - - -# 使用示例 -df = merge_with_industry_data(df, industry_df) -# print(mdf[mdf['ts_code'] == '600751.SH'][['ts_code', 'trade_date', 'l2_code']]) - - -# In[4]: - - -def calculate_indicators(df): - """ - 计算四个指标:当日涨跌幅、5日移动平均、RSI、MACD。 - """ - df = df.sort_values('trade_date') - df['daily_return'] = (df['close'] - df['pre_close']) / df['pre_close'] * 100 - # df['5_day_ma'] = df['close'].rolling(window=5).mean() - delta = df['close'].diff() - gain = delta.where(delta > 0, 0) - loss = -delta.where(delta < 0, 0) - avg_gain = gain.rolling(window=14).mean() - avg_loss = loss.rolling(window=14).mean() - rs = avg_gain / avg_loss - df['RSI'] = 100 - (100 / (1 + rs)) - - # 计算MACD - ema12 = df['close'].ewm(span=12, adjust=False).mean() - ema26 = df['close'].ewm(span=26, adjust=False).mean() - df['MACD'] = ema12 - ema26 - df['Signal_line'] = df['MACD'].ewm(span=9, adjust=False).mean() - df['MACD_hist'] = df['MACD'] - df['Signal_line'] - - # 4. 情绪因子1:市场上涨比例(Up Ratio) - df['up_ratio'] = df['daily_return'].apply(lambda x: 1 if x > 0 else 0) - df['up_ratio_20d'] = df['up_ratio'].rolling(window=20).mean() # 过去20天上涨比例 - - # 5. 情绪因子2:成交量变化率(Volume Change Rate) - df['volume_mean'] = df['vol'].rolling(window=20).mean() # 过去20天的平均成交量 - df['volume_change_rate'] = (df['vol'] - df['volume_mean']) / df['volume_mean'] * 100 # 成交量变化率 - - # 6. 情绪因子3:波动率(Volatility) - df['volatility'] = df['daily_return'].rolling(window=20).std() # 过去20天的日收益率标准差 - - # 7. 情绪因子4:成交额变化率(Amount Change Rate) - df['amount_mean'] = df['amount'].rolling(window=20).mean() # 过去20天的平均成交额 - df['amount_change_rate'] = (df['amount'] - df['amount_mean']) / df['amount_mean'] * 100 # 成交额变化率 - - return df - - -def generate_index_indicators(h5_filename): - df = pd.read_hdf(h5_filename, key='index_data') - df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d') - df = df.sort_values('trade_date') - - # 计算每个ts_code的相关指标 - df_indicators = [] - for ts_code in df['ts_code'].unique(): - df_index = df[df['ts_code'] == ts_code].copy() - df_index = calculate_indicators(df_index) - df_indicators.append(df_index) - - # 合并所有指数的结果 - df_all_indicators = pd.concat(df_indicators, ignore_index=True) - - # 保留trade_date列,并将同一天的数据按ts_code合并成一行 - df_final = df_all_indicators.pivot_table( - index='trade_date', - columns='ts_code', - values=['daily_return', 'RSI', 'MACD', 'Signal_line', - 'MACD_hist', 'up_ratio_20d', 'volume_change_rate', 'volatility', - 'amount_change_rate', 'amount_mean'], - aggfunc='last' - ) - - df_final.columns = [f"{col[1]}_{col[0]}" for col in df_final.columns] - df_final = df_final.reset_index() - - return df_final - - -# 使用函数 -h5_filename = '../../data/index_data.h5' -index_data = generate_index_indicators(h5_filename) -index_data = index_data.dropna() - - -# In[5]: - - -import numpy as np -import talib - - -def get_rolling_factor(df): - old_columns = df.columns.tolist()[:] - # 按股票和日期排序 - df = df.sort_values(by=['ts_code', 'trade_date']) - grouped = df.groupby('ts_code', group_keys=False) - - # df["gap_next_open"] = (df["open"].shift(-1) - df["close"]) / df["close"] - - df['return_skew'] = grouped['pct_chg'].rolling(window=5).skew().reset_index(0, drop=True) - df['return_kurtosis'] = grouped['pct_chg'].rolling(window=5).kurt().reset_index(0, drop=True) - - # 因子 1:短期成交量变化率 - df['volume_change_rate'] = ( - grouped['vol'].rolling(window=2).mean() / - grouped['vol'].rolling(window=10).mean() - 1 - ).reset_index(level=0, drop=True) # 确保索引对齐 - - # 因子 2:成交量突破信号 - max_volume = grouped['vol'].rolling(window=5).max().reset_index(level=0, drop=True) # 确保索引对齐 - df['cat_volume_breakout'] = (df['vol'] > max_volume) - - # 因子 3:换手率均线偏离度 - mean_turnover = grouped['turnover_rate'].rolling(window=3).mean().reset_index(level=0, drop=True) - std_turnover = grouped['turnover_rate'].rolling(window=3).std().reset_index(level=0, drop=True) - df['turnover_deviation'] = (df['turnover_rate'] - mean_turnover) / std_turnover - - # 因子 4:换手率激增信号 - df['cat_turnover_spike'] = (df['turnover_rate'] > mean_turnover + 2 * std_turnover) - - # 因子 5:量比均值 - df['avg_volume_ratio'] = grouped['volume_ratio'].rolling(window=3).mean().reset_index(level=0, drop=True) - - # 因子 6:量比突破信号 - max_volume_ratio = grouped['volume_ratio'].rolling(window=5).max().reset_index(level=0, drop=True) - df['cat_volume_ratio_breakout'] = (df['volume_ratio'] > max_volume_ratio) - - df['vol_spike'] = grouped.apply( - lambda x: pd.Series(x['vol'].rolling(20).mean(), index=x.index) - ) - df['vol_std_5'] = df['vol'].pct_change().rolling(5).std() - - # 计算 ATR - df['atr_14'] = grouped.apply( - lambda x: pd.Series(talib.ATR(x['high'].values, x['low'].values, x['close'].values, timeperiod=14), - index=x.index) - ) - df['atr_6'] = grouped.apply( - lambda x: pd.Series(talib.ATR(x['high'].values, x['low'].values, x['close'].values, timeperiod=6), - index=x.index) - ) - - # 计算 OBV 及其均线 - df['obv'] = grouped.apply( - lambda x: pd.Series(talib.OBV(x['close'].values, x['vol'].values), index=x.index) - ) - df['maobv_6'] = grouped.apply( - lambda x: pd.Series(talib.SMA(x['obv'].values, timeperiod=6), index=x.index) - ) - - df['rsi_3'] = grouped.apply( - lambda x: pd.Series(talib.RSI(x['close'].values, timeperiod=3), index=x.index) - ) - # df['rsi_6'] = grouped.apply( - # lambda x: pd.Series(talib.RSI(x['close'].values, timeperiod=6), index=x.index) - # ) - # df['rsi_9'] = grouped.apply( - # lambda x: pd.Series(talib.RSI(x['close'].values, timeperiod=9), index=x.index) - # ) - - # 计算 return_10 和 return_20 - df['return_5'] = grouped['close'].apply(lambda x: x / x.shift(5) - 1) - # df['return_10'] = grouped['close'].apply(lambda x: x / x.shift(10) - 1) - df['return_20'] = grouped['close'].apply(lambda x: x / x.shift(20) - 1) - - # df['avg_close_5'] = grouped['close'].apply(lambda x: x.rolling(window=5).mean() / x) - - # 计算标准差指标 - df['std_return_5'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=5).std()) - # df['std_return_15'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=15).std()) - # df['std_return_25'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=25).std()) - df['std_return_90'] = grouped['close'].apply(lambda x: x.pct_change().rolling(window=90).std()) - df['std_return_90_2'] = grouped['close'].apply(lambda x: x.shift(10).pct_change().rolling(window=90).std()) - - # 计算 EMA 指标 - df['_ema_5'] = grouped['close'].apply( - lambda x: pd.Series(talib.EMA(x.values, timeperiod=5), index=x.index) - ) - df['_ema_13'] = grouped['close'].apply( - lambda x: pd.Series(talib.EMA(x.values, timeperiod=13), index=x.index) - ) - df['_ema_20'] = grouped['close'].apply( - lambda x: pd.Series(talib.EMA(x.values, timeperiod=20), index=x.index) - ) - df['_ema_60'] = grouped['close'].apply( - lambda x: pd.Series(talib.EMA(x.values, timeperiod=60), index=x.index) - ) - - # 计算 act_factor1, act_factor2, act_factor3, act_factor4 - df['act_factor1'] = grouped['_ema_5'].apply( - lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 50 - ) - df['act_factor2'] = grouped['_ema_13'].apply( - lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 40 - ) - df['act_factor3'] = grouped['_ema_20'].apply( - lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 21 - ) - df['act_factor4'] = grouped['_ema_60'].apply( - lambda x: np.arctan((x / x.shift(1) - 1) * 100) * 57.3 / 10 - ) - - # 根据 trade_date 截面计算排名 - df['rank_act_factor1'] = df.groupby('trade_date', group_keys=False)['act_factor1'].rank(ascending=False, pct=True) - df['rank_act_factor2'] = df.groupby('trade_date', group_keys=False)['act_factor2'].rank(ascending=False, pct=True) - df['rank_act_factor3'] = df.groupby('trade_date', group_keys=False)['act_factor3'].rank(ascending=False, pct=True) - - df['log(circ_mv)'] = np.log(df['circ_mv']) - - def rolling_covariance(x, y, window): - return x.rolling(window).cov(y) - - def delta(series, period): - return series.diff(period) - - def rank(series): - return series.rank(pct=True) - - def stddev(series, window): - return series.rolling(window).std() - - window_high_volume = 5 - window_close_stddev = 20 - period_delta = 5 - df['cov'] = rolling_covariance(df['high'], df['vol'], window_high_volume) - df['delta_cov'] = delta(df['cov'], period_delta) - df['_rank_stddev'] = rank(stddev(df['close'], window_close_stddev)) - df['alpha_22_improved'] = -1 * df['delta_cov'] * df['_rank_stddev'] - - df['alpha_003'] = np.where(df['high'] != df['low'], - (df['close'] - df['open']) / (df['high'] - df['low']), - 0) - - df['alpha_007'] = grouped.apply(lambda x: x['close'].rolling(5).corr(x['vol'])).reset_index(level=0, drop=True) - df['alpha_007'] = df.groupby('trade_date', group_keys=False)['alpha_007'].rank(ascending=True, pct=True) - - df['alpha_013'] = grouped['close'].transform(lambda x: x.rolling(5).sum() - x.rolling(20).sum()) - df['alpha_013'] = df.groupby('trade_date', group_keys=False)['alpha_013'].rank(ascending=True, pct=True) - - df['cat_up_limit'] = (df['close'] == df['up_limit']) # 是否涨停(1表示涨停,0表示未涨停) - df['cat_down_limit'] = (df['close'] == df['down_limit']) # 是否跌停(1表示跌停,0表示未跌停) - df['up_limit_count_10d'] = grouped['cat_up_limit'].rolling(window=10, min_periods=1).sum().reset_index(level=0, - drop=True) - df['down_limit_count_10d'] = grouped['cat_down_limit'].rolling(window=10, min_periods=1).sum().reset_index(level=0, - drop=True) - - # 3. 最近连续涨跌停天数 - def calculate_consecutive_limits(series): - """ - 计算连续涨停/跌停天数。 - """ - consecutive_up = series * (series.groupby((series != series.shift()).cumsum()).cumcount() + 1) - consecutive_down = series * (series.groupby((series != series.shift()).cumsum()).cumcount() + 1) - return consecutive_up, consecutive_down - - # 连续涨停天数 - df['consecutive_up_limit'] = grouped['cat_up_limit'].apply( - lambda x: calculate_consecutive_limits(x)[0] - ).reset_index(level=0, drop=True) - - df['vol_break'] = np.where((df['close'] > df['cost_85pct']) & (df['volume_ratio'] > 2), 1, 0) - - df['weight_roc5'] = grouped['weight_avg'].apply(lambda x: x.pct_change(5)) - - def rolling_corr(group): - roc_close = group['close'].pct_change() - roc_weight = group['weight_avg'].pct_change() - return roc_close.rolling(10).corr(roc_weight) - - df['price_cost_divergence'] = grouped.apply(rolling_corr) - - df['smallcap_concentration'] = (1 / df['log(circ_mv)']) * (df['cost_85pct'] - df['cost_15pct']) - - # 16. 筹码稳定性指数 (20日波动率) - df['weight_std20'] = grouped['weight_avg'].apply(lambda x: x.rolling(20).std()) - df['cost_stability'] = df['weight_std20'] / grouped['weight_avg'].transform(lambda x: x.rolling(20).mean()) - - # 17. 成本区间突破标记 - df['high_cost_break_days'] = grouped.apply(lambda g: g['close'].gt(g['cost_95pct']).rolling(5).sum()) - - # 20. 筹码-流动性风险 - df['liquidity_risk'] = (df['cost_95pct'] - df['cost_5pct']) * ( - 1 / grouped['vol'].transform(lambda x: x.rolling(10).mean())) - - # 7. 市值波动率因子 - df['turnover_std'] = grouped['turnover_rate'].rolling(window=20).std().reset_index(level=0, drop=True) - df['mv_volatility'] = grouped.apply(lambda x: x['turnover_std'] / x['log(circ_mv)']).reset_index(level=0, drop=True) - - # 8. 市值成长性因子 - df['volume_growth'] = grouped['vol'].pct_change(periods=20).reset_index(level=0, drop=True) - df['mv_growth'] = grouped.apply(lambda x: x['volume_growth'] / x['log(circ_mv)']).reset_index(level=0, drop=True) - - df["ar"] = df["high"].div(df["open"]).rolling(3).sum() / df["open"].div(df["low"]).rolling(3).sum() * 100 - # 计算 BR 指标 - df["pre_close"] = df["close"].shift(1) - df["br_up"] = (df["high"] - df["pre_close"]).clip(lower=0) - df["br_down"] = (df["pre_close"] - df["low"]).clip(lower=0) - df["br"] = df["br_up"].rolling(3).sum() / df["br_down"].rolling(3).sum() * 100 - df['arbr'] = df['ar'] - df['br'] - df.drop(columns=["pre_close", "br_up", "br_down", 'ar', 'br'], inplace=True) - - df.drop(columns=['weight_std20'], inplace=True, errors='ignore') - new_columns = [col for col in df.columns.tolist()[:] if col not in old_columns] - - return df, new_columns - - -def get_simple_factor(df): - old_columns = df.columns.tolist()[:] - df = df.sort_values(by=['ts_code', 'trade_date']) - - alpha = 0.5 - df['momentum_factor'] = df['volume_change_rate'] + alpha * df['turnover_deviation'] - df['resonance_factor'] = df['volume_ratio'] * df['pct_chg'] - df['log_close'] = np.log(df['close']) - - df['cat_vol_spike'] = df['vol'] > 2 * df['vol_spike'] - - df['up'] = (df['high'] - df[['close', 'open']].max(axis=1)) / df['close'] - df['down'] = (df[['close', 'open']].min(axis=1) - df['low']) / df['close'] - - df['obv-maobv_6'] = df['obv'] - df['maobv_6'] - - # 计算比值指标 - df['std_return_5 / std_return_90'] = df['std_return_5'] / df['std_return_90'] - # df['std_return_5 / std_return_25'] = df['std_return_5'] / df['std_return_25'] - - # 计算标准差差值 - df['std_return_90 - std_return_90_2'] = df['std_return_90'] - df['std_return_90_2'] - - # df['cat_af1'] = df['act_factor1'] > 0 - df['cat_af2'] = df['act_factor2'] > df['act_factor1'] - df['cat_af3'] = df['act_factor3'] > df['act_factor2'] - df['cat_af4'] = df['act_factor4'] > df['act_factor3'] - - # 计算 act_factor5 和 act_factor6 - df['act_factor5'] = df['act_factor1'] + df['act_factor2'] + df['act_factor3'] + df['act_factor4'] - df['act_factor6'] = (df['act_factor1'] - df['act_factor2']) / np.sqrt( - df['act_factor1'] ** 2 + df['act_factor2'] ** 2) - - df['active_buy_volume_large'] = df['buy_lg_vol'] / df['net_mf_vol'] - df['active_buy_volume_big'] = df['buy_elg_vol'] / df['net_mf_vol'] - df['active_buy_volume_small'] = df['buy_sm_vol'] / df['net_mf_vol'] - - df['buy_lg_vol_minus_sell_lg_vol'] = (df['buy_lg_vol'] - df['sell_lg_vol']) / df['net_mf_vol'] - df['buy_elg_vol_minus_sell_elg_vol'] = (df['buy_elg_vol'] - df['sell_elg_vol']) / df['net_mf_vol'] - - df['log(circ_mv)'] = np.log(df['circ_mv']) - - df['ctrl_strength'] = (df['cost_85pct'] - df['cost_15pct']) / (df['his_high'] - df['his_low']) - - df['low_cost_dev'] = (df['close'] - df['cost_5pct']) / (df['cost_50pct'] - df['cost_5pct']) - - df['asymmetry'] = (df['cost_95pct'] - df['cost_50pct']) / (df['cost_50pct'] - df['cost_5pct']) - - df['lock_factor'] = df['turnover_rate'] * ( - 1 - (df['cost_95pct'] - df['cost_5pct']) / (df['his_high'] - df['his_low'])) - - df['cat_vol_break'] = (df['close'] > df['cost_85pct']) & (df['volume_ratio'] > 2) - - df['cost_atr_adj'] = (df['cost_95pct'] - df['cost_5pct']) / df['atr_14'] - - # 12. 小盘股筹码集中度 - df['smallcap_concentration'] = (1 / df['log(circ_mv)']) * (df['cost_85pct'] - df['cost_15pct']) - - df['cat_golden_resonance'] = ((df['close'] > df['weight_avg']) & - (df['volume_ratio'] > 1.5) & - (df['winner_rate'] > 0.7)) - - df['mv_turnover_ratio'] = df['turnover_rate'] / df['log(circ_mv)'] - - df['mv_adjusted_volume'] = df['vol'] / df['log(circ_mv)'] - - df['mv_weighted_turnover'] = df['turnover_rate'] * (1 / df['log(circ_mv)']) - - df['nonlinear_mv_volume'] = df['vol'] / df['log(circ_mv)'] - - df['mv_volume_ratio'] = df['volume_ratio'] / df['log(circ_mv)'] - - df['mv_momentum'] = df['turnover_rate'] * df['volume_ratio'] / df['log(circ_mv)'] - - drop_columns = [col for col in df.columns if col.startswith('_')] - df.drop(columns=drop_columns, inplace=True, errors='ignore') - - new_columns = [col for col in df.columns.tolist()[:] if col not in old_columns] - return df, new_columns - - -# In[6]: - - -from utils.factor import get_act_factor - - -def read_industry_data(h5_filename): - # 读取 H5 文件中所有的行业数据 - industry_data = pd.read_hdf(h5_filename, key='sw_daily', columns=[ - 'ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'pe', 'pb', 'vol' - ]) # 假设 H5 文件的键是 'industry_data' - industry_data = industry_data.sort_values(by=['ts_code', 'trade_date']) - industry_data = industry_data.reindex() - industry_data['trade_date'] = pd.to_datetime(industry_data['trade_date'], format='%Y%m%d') - - grouped = industry_data.groupby('ts_code', group_keys=False) - industry_data['obv'] = grouped.apply( - lambda x: pd.Series(talib.OBV(x['close'].values, x['vol'].values), index=x.index) - ) - industry_data['return_5'] = grouped['close'].apply(lambda x: x / x.shift(5) - 1) - industry_data['return_20'] = grouped['close'].apply(lambda x: x / x.shift(20) - 1) - - industry_data = get_act_factor(industry_data, cat=False) - industry_data = industry_data.sort_values(by=['trade_date', 'ts_code']) - - # # 计算每天每个 ts_code 的因子和当天所有 ts_code 的中位数的偏差 - # factor_columns = ['obv', 'return_5', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4'] # 因子列 - # - # for factor in factor_columns: - # if factor in industry_data.columns: - # # 计算每天每个 ts_code 的因子值与当天所有 ts_code 的中位数的偏差 - # industry_data[f'{factor}_deviation'] = industry_data.groupby('trade_date')[factor].transform( - # lambda x: x - x.mean()) - - industry_data['return_5_percentile'] = industry_data.groupby('trade_date')['return_5'].transform( - lambda x: x.rank(pct=True)) - industry_data['return_20_percentile'] = industry_data.groupby('trade_date')['return_20'].transform( - lambda x: x.rank(pct=True)) - industry_data = industry_data.drop(columns=['open', 'close', 'high', 'low', 'pe', 'pb', 'vol']) - - industry_data = industry_data.rename( - columns={col: f'industry_{col}' for col in industry_data.columns if col not in ['ts_code', 'trade_date']}) - - industry_data = industry_data.rename(columns={'ts_code': 'cat_l2_code'}) - return industry_data - - -industry_df = read_industry_data('../../data/sw_daily.h5') - - -# In[7]: - - -origin_columns = df.columns.tolist() -origin_columns = [col for col in origin_columns if - col not in ['turnover_rate', 'pe_ttm', 'volume_ratio', 'vol', 'pct_chg', 'l2_code', 'winner_rate']] -origin_columns = [col for col in origin_columns if col not in index_data.columns] -origin_columns = [col for col in origin_columns if 'cyq' not in col] -print(origin_columns) - - -# In[8]: - - -def filter_data(df): - # df = df.groupby('trade_date').apply(lambda x: x.nlargest(1000, 'act_factor1')) - df = df[~df['is_st']] - df = df[~df['ts_code'].str.endswith('BJ')] - df = df[~df['ts_code'].str.startswith('30')] - df = df[~df['ts_code'].str.startswith('68')] - df = df[~df['ts_code'].str.startswith('8')] - df = df[df['trade_date'] >= '20180101'] - df = df.drop(columns=['in_date']) - df = df.reset_index(drop=True) - return df - - -df = filter_data(df) -# df = get_technical_factor(df) -# df = get_act_factor(df) -# df = get_money_flow_factor(df) -# df = get_alpha_factor(df) -# df = get_limit_factor(df) -# df = get_cyp_perf_factor(df) -# df = get_mv_factors(df) -df, _ = get_rolling_factor(df) -df, _ = get_simple_factor(df) -# df = df.merge(industry_df, on=['l2_code', 'trade_date'], how='left') -df = df.rename(columns={'l2_code': 'cat_l2_code'}) -# df = df.merge(index_data, on='trade_date', how='left') - -print(df.info()) - - -# In[9]: - - -from scipy.stats import ks_2samp, wasserstein_distance -from sklearn.metrics import roc_auc_score -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import StandardScaler - - -def remove_shifted_features(train_data, test_data, feature_columns, ks_threshold=0.05, wasserstein_threshold=0.1, - importance_threshold=0.05): - dropped_features = [] - - # **统计数据漂移** - numeric_columns = train_data.select_dtypes(include=['float64', 'int64']).columns - numeric_columns = [col for col in numeric_columns if col in feature_columns] - for feature in numeric_columns: - ks_stat, p_value = ks_2samp(train_data[feature], test_data[feature]) - wasserstein_dist = wasserstein_distance(train_data[feature], test_data[feature]) - - if p_value < ks_threshold and wasserstein_dist > wasserstein_threshold: - dropped_features.append(feature) - - print(f"检测到 {len(dropped_features)} 个可能漂移的特征: {dropped_features}") - - # **应用阈值进行最终筛选** - filtered_features = [f for f in feature_columns if f not in dropped_features] - - return filtered_features, dropped_features - - - -# In[10]: - - -def create_deviation_within_dates(df, feature_columns): - groupby_col = 'cat_l2_code' # 使用 trade_date 进行分组 - new_columns = {} - ret_feature_columns = feature_columns[:] - - # 自动选择所有数值型特征 - num_features = [col for col in feature_columns if 'cat' not in col and 'index' not in col] - - # num_features = ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'cat_vol_spike', 'obv', 'maobv_6', 'return_5', 'return_10', 'return_20', 'std_return_5', 'std_return_15', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'act_factor5', 'act_factor6', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'active_buy_volume_large', 'active_buy_volume_big', 'active_buy_volume_small', 'alpha_022', 'alpha_003', 'alpha_007', 'alpha_013'] - num_features = [col for col in num_features if 'cat' not in col and 'industry' not in col] - num_features = [col for col in num_features if 'limit' not in col] - num_features = [col for col in num_features if 'cyq' not in col] - - # 遍历所有数值型特征 - for feature in num_features: - if feature == 'trade_date': # 不需要对 'trade_date' 计算偏差 - continue - - # grouped_mean = df.groupby(['trade_date'])[feature].transform('mean') - # deviation_col_name = f'deviation_mean_{feature}' - # new_columns[deviation_col_name] = df[feature] - grouped_mean - # ret_feature_columns.append(deviation_col_name) - - grouped_mean = df.groupby(['trade_date', groupby_col])[feature].transform('mean') - deviation_col_name = f'deviation_mean_{feature}' - new_columns[deviation_col_name] = df[feature] - grouped_mean - ret_feature_columns.append(deviation_col_name) - - # 将新计算的偏差特征与原始 DataFrame 合并 - df = pd.concat([df, pd.DataFrame(new_columns)], axis=1) - - # for feature in ['obv', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4']: - # df[f'deviation_industry_{feature}'] = df[feature] - df[f'industry_{feature}'] - - return df, ret_feature_columns - - -# In[11]: - - -import pandas as pd - - -def remove_outliers_label_percentile(label: pd.Series, lower_percentile: float = 0.01, upper_percentile: float = 0.99, - log=True): - if not (0 <= lower_percentile < upper_percentile <= 1): - raise ValueError("Percentile values must satisfy 0 <= lower_percentile < upper_percentile <= 1.") - - # Calculate lower and upper bounds based on percentiles - lower_bound = label.quantile(lower_percentile) - upper_bound = label.quantile(upper_percentile) - - # Filter out values outside the bounds - filtered_label = label[(label >= lower_bound) & (label <= upper_bound)] - - # Print the number of removed outliers - if log: - print(f"Removed {len(label) - len(filtered_label)} outliers.") - return filtered_label - - -def calculate_risk_adjusted_target(df, days=5): - df = df.sort_values(by=['ts_code', 'trade_date']) - - df['future_close'] = df.groupby('ts_code')['close'].shift(-days) - df['future_open'] = df.groupby('ts_code')['open'].shift(-1) - df['future_return'] = (df['future_close'] - df['future_open']) / df['future_open'] - - df['future_volatility'] = df.groupby('ts_code')['future_return'].rolling(days, min_periods=1).std().reset_index( - level=0, drop=True) - sharpe_ratio = df['future_return'] * df['future_volatility'] - sharpe_ratio.replace([np.inf, -np.inf], np.nan, inplace=True) - - return sharpe_ratio - - -def calculate_score(df, days=5, lambda_param=1.0): - def calculate_max_drawdown(prices): - peak = prices.iloc[0] # 初始化峰值 - max_drawdown = 0 # 初始化最大回撤 - - for price in prices: - if price > peak: - peak = price # 更新峰值 - else: - drawdown = (peak - price) / peak # 计算当前回撤 - max_drawdown = max(max_drawdown, drawdown) # 更新最大回撤 - - return max_drawdown - - def compute_stock_score(stock_df): - stock_df = stock_df.sort_values(by=['trade_date']) - future_return = stock_df['future_return'] - volatility = stock_df['close'].pct_change().rolling(days).std().shift(-days) - max_drawdown = stock_df['close'].rolling(days).apply(calculate_max_drawdown, raw=False).shift(-days) - score = future_return - lambda_param * max_drawdown - - return score - - scores = df.groupby('ts_code').apply(lambda x: compute_stock_score(x)) - scores = scores.reset_index(level=0, drop=True) - - return scores - - -def remove_highly_correlated_features(df, feature_columns, threshold=0.9): - numeric_features = df[feature_columns].select_dtypes(include=[np.number]).columns.tolist() - if not numeric_features: - raise ValueError("No numeric features found in the provided data.") - - # 先找出需要强制保留的特征 - always_keep = [col for col in feature_columns if 'act' in col or 'af' in col] - features_to_check = [col for col in numeric_features if col not in always_keep] - - corr_matrix = df[features_to_check].corr().abs() - upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool)) - to_drop = [column for column in upper.columns if any(upper[column] > threshold)] - - remaining_features = [col for col in feature_columns if col not in to_drop or col in always_keep] - return remaining_features - - -import pandas as pd -from sklearn.preprocessing import StandardScaler - - -def cross_sectional_standardization(df, features): - df_sorted = df.sort_values(by='trade_date') # 按时间排序 - df_standardized = df_sorted.copy() - - for date in df_sorted['trade_date'].unique(): - # 获取当前时间点的数据 - current_data = df_standardized[df_standardized['trade_date'] == date] - - # 只对指定特征进行标准化 - scaler = StandardScaler() - standardized_values = scaler.fit_transform(current_data[features]) - - # 将标准化结果重新赋值回去 - df_standardized.loc[df_standardized['trade_date'] == date, features] = standardized_values - - return df_standardized - - -import numpy as np -import pandas as pd -import statsmodels.api as sm - -from concurrent.futures import ProcessPoolExecutor - - -def neutralize_manual(df, features, industry_col, mkt_cap_col): - """ 手动实现简单回归以提升速度 """ - - for col in features: - residuals = [] - for _, group in df.groupby(industry_col): - if len(group) > 1: - x = np.log(group[mkt_cap_col]) # 市值对数 - y = group[col] # 因子值 - beta = np.cov(y, x)[0, 1] / np.var(x) # 计算斜率 - alpha = np.mean(y) - beta * np.mean(x) # 计算截距 - resid = y - (alpha + beta * x) # 计算残差 - residuals.extend(resid) - else: - residuals.extend(group[col]) # 样本不足时保留原值 - - df[col] = residuals - - return df - - -import gc - -gc.collect() - - -def mad_filter(df, features, n=3): - df = df.copy() - for col in features: - median = df[col].median() - mad = np.median(np.abs(df[col] - median)) - upper = median + n * mad - lower = median - n * mad - df[col] = np.clip(df[col], lower, upper) # 截断极值 - return df - - -def percentile_filter(df, features, lower_percentile=0.01, upper_percentile=0.99): - df = df.copy() - for col in features: - # 按日期分组计算上下百分位数 - lower_bound = df.groupby('trade_date')[col].transform( - lambda x: x.quantile(lower_percentile) - ) - upper_bound = df.groupby('trade_date')[col].transform( - lambda x: x.quantile(upper_percentile) - ) - # 截断超出范围的值 - df[col] = np.clip(df[col], lower_bound, upper_bound) - return df - - -from scipy.stats import iqr - - -def iqr_filter(df, features): - df = df.copy() - for col in features: - df[col] = df.groupby('trade_date')[col].transform( - lambda x: (x - x.median()) / iqr(x) if iqr(x) != 0 else x - ) - return df - - -def quantile_filter(df, features, lower_quantile=0.01, upper_quantile=0.99, window=60): - df = df.copy() - for col in features: - # 计算 rolling 统计量,需要按日期进行 groupby - rolling_lower = df.groupby('trade_date')[col].transform(lambda x: x.rolling(window=min(len(x), window)).quantile(lower_quantile)) - rolling_upper = df.groupby('trade_date')[col].transform(lambda x: x.rolling(window=min(len(x), window)).quantile(upper_quantile)) - - # 对数据进行裁剪 - df[col] = np.clip(df[col], rolling_lower, rolling_upper) - - return df - - -# In[12]: - - -# print(test_data.head()[['act_factor1', 'act_factor2', 'ts_code', 'trade_date']]) - - -# In[13]: - - -from sklearn.preprocessing import StandardScaler -import lightgbm as lgb -import matplotlib.pyplot as plt -from sklearn.decomposition import PCA - - -def train_light_model(train_data_df, params, feature_columns, callbacks, evals, - print_feature_importance=True, num_boost_round=100, - validation_days=180, use_pca=False, split_date=None): # 新增参数:validation_days - # 确保数据按时间排序 - train_data_df = train_data_df.sort_values(by='trade_date') - - numeric_columns = train_data_df.select_dtypes(include=['float64', 'int64']).columns - numeric_columns = [col for col in numeric_columns if col in feature_columns] - # X_train.loc[:, numeric_columns] = scaler.fit_transform(X_train[numeric_columns]) - # X_val.loc[:, numeric_columns] = scaler.transform(X_val[numeric_columns]) - # train_data_df = cross_sectional_standardization(train_data_df, numeric_columns) - - # 去除标签为空的样本 - train_data_df = train_data_df.dropna(subset=['label']) - print('原始训练集大小: ', len(train_data_df)) - - # 按时间顺序划分训练集和验证集 - if split_date is None: - all_dates = train_data_df['trade_date'].unique() # 获取所有唯一的 trade_date - split_date = all_dates[-validation_days] # 划分点为倒数第 validation_days 天 - train_data_split = train_data_df[train_data_df['trade_date'] < split_date] # 训练集 - val_data_split = train_data_df[train_data_df['trade_date'] >= split_date] # 验证集 - - # 打印划分结果 - print(f"划分后的训练集大小: {len(train_data_split)}, 验证集大小: {len(val_data_split)}") - - # 提取特征和标签 - X_train = train_data_split[feature_columns] - y_train = train_data_split['label'] - - X_val = val_data_split[feature_columns] - y_val = val_data_split['label'] - - # 标准化数值特征 - scaler = StandardScaler() - - - # 计算每个 trade_date 内的样本数(LTR 需要 group 信息) - train_groups = train_data_split.groupby('trade_date').size().tolist() - val_groups = val_data_split.groupby('trade_date').size().tolist() - - # 处理类别特征 - categorical_feature = [col for col in feature_columns if 'cat' in col] - - pca = None - if use_pca: - pca = PCA(n_components=0.95) # 或指定 n_components=固定值(如 10) - numeric_features = [col for col in feature_columns if col not in categorical_feature] - numeric_pca = pca.fit_transform(X_train[numeric_features]) - X_train = pd.concat([pd.DataFrame(numeric_pca, index=X_train.index), X_train[categorical_feature]], axis=1) - - numeric_pca = pca.transform(X_val[numeric_features]) - X_val = pd.concat([pd.DataFrame(numeric_pca, index=X_val.index), X_val[categorical_feature]], axis=1) - - # 计算权重(基于时间) - # trade_date = train_data_split['trade_date'] # 交易日期 - # weights = (trade_date - trade_date.min()).dt.days / (trade_date.max() - trade_date.min()).days + 1 - # weights = train_data_split.groupby('trade_date')['std_return_5'].transform( - # lambda x: x / x.mean() - # ) - ud = sorted(train_data_split["trade_date"].unique().tolist()) - date_weights = {date: weight * weight for date, weight in zip(ud, np.linspace(1, 10, len(ud)))} - params['weight'] = train_data_split["trade_date"].map(date_weights).tolist() - - train_dataset = lgb.Dataset( - X_train, label=y_train, group=train_groups, - categorical_feature=categorical_feature - ) - - # weights = val_data_split.groupby('trade_date')['std_return_5'].transform( - # lambda x: x / x.mean() - # ) - val_dataset = lgb.Dataset( - X_val, label=y_val, group=val_groups, - categorical_feature=categorical_feature - ) - - # 训练模型 - model = lgb.train( - params, train_dataset, num_boost_round=num_boost_round, - valid_sets=[train_dataset, val_dataset], valid_names=['train', 'valid'], - callbacks=callbacks - ) - - # 打印特征重要性(如果需要) - if print_feature_importance: - lgb.plot_metric(evals) - lgb.plot_importance(model, importance_type='split', max_num_features=20) - plt.show() - - return model, scaler, pca - - -# In[14]: - - -days = 2 -df['future_return'] = (df.groupby('ts_code')['close'].shift(-days) - df.groupby('ts_code')['open'].shift(-1)) / \ - df.groupby('ts_code')['open'].shift(-1) -df['future_volatility'] = ( - df.groupby('ts_code')['future_return'] - .transform(lambda x: x.rolling(days).std()) -) - -df['future_score'] = ( - 0.7 * df['future_return'] + - 0.3 * df['future_volatility'] -) - -filter_index = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99)) -filter_index = df['future_volatility'].between(df['future_volatility'].quantile(0.01), - df['future_volatility'].quantile(0.99)) | filter_index -df['label'] = df.groupby('trade_date', group_keys=False)['future_score'].transform( - lambda x: pd.qcut(x, q=50, labels=False, duplicates='drop') -) -# industry_df = industry_df.sort_values(by=['trade_date']) - -# df = df.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left') -df = df.sort_values(['trade_date']) - -df = df.replace([np.inf, -np.inf], np.nan) - -feature_columns = [col for col in df.columns] -feature_columns = [col for col in feature_columns if col not in ['trade_date', - 'ts_code', - 'label']] -feature_columns = [col for col in feature_columns if 'future' not in col] -feature_columns = [col for col in feature_columns if 'label' not in col] -feature_columns = [col for col in feature_columns if 'score' not in col] -feature_columns = [col for col in feature_columns if 'gen' not in col] -feature_columns = [col for col in feature_columns if 'cat_l2_code' not in col] -feature_columns = [col for col in feature_columns if col not in origin_columns] -feature_columns = [col for col in feature_columns if not col.startswith('_')] - -numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns -numeric_columns = [col for col in numeric_columns if col in feature_columns] - -qdf = quantile_filter(df, numeric_columns, window=20) - - -# In[15]: - - -# print('train data size: ', len(train_data)) - -label_gain = list(range(len(df['label'].unique()))) -label_gain = [gain * gain for gain in label_gain] -light_params = { - 'label_gain': label_gain, - 'objective': 'lambdarank', - 'metric': 'lambdarank', - 'learning_rate': 0.05, - 'num_leaves': 1024, - 'min_data_in_leaf': 128, - 'max_depth': 16, - 'max_bin': 1024, - 'feature_fraction': 0.7, - 'bagging_fraction': 1, - 'bagging_freq': 5, - 'lambda_l1': 0.1, - 'lambda_l2': 0.1, - # 'boosting': 'dart', - 'verbosity': -1, - 'extra_trees': True, - 'max_position': 5, - 'ndcg_at': 1, - 'quant_train_renew_leaf': True, - 'lambdarank_truncation_level': 5, - 'lambdarank_position_bias_regularization': 1, - 'seed': 7 -} -evals = {} - -gc.collect() - - -# In[16]: - - -gc.collect() - - -def rolling_train_predict(df, train_days, test_days, industry_df, index_df, days=5, use_pca=False, validation_days=60, filter_index=None): - # 1. 按照交易日期排序 - unique_dates = df[df['trade_date'] >= '2020-01-01']['trade_date'].unique().tolist() - unique_dates = sorted(unique_dates) - n = len(unique_dates) - - # 2. 计算需要跳过的天数,使后续窗口对齐 - extra_days = (n - train_days) % test_days - start_index = extra_days # 从此索引开始滚动 - - predictions_list = [] - - - def select_pre_zt_stocks_dynamic( - stock_df, - ): - stock_df = stock_df.groupby('trade_date', group_keys=False).apply( - lambda x: x.nlargest(1000, 'return_20') - ) - return stock_df - - df = select_pre_zt_stocks_dynamic(df) - - feature_columns = [col for col in df.columns] - feature_columns = [col for col in feature_columns if col not in ['trade_date', - 'ts_code', - 'label']] - feature_columns = [col for col in feature_columns if 'future' not in col] - feature_columns = [col for col in feature_columns if 'label' not in col] - feature_columns = [col for col in feature_columns if 'score' not in col] - feature_columns = [col for col in feature_columns if 'gen' not in col] - feature_columns = [col for col in feature_columns if 'cat_l2_code' not in col] - feature_columns = [col for col in feature_columns if col not in origin_columns] - feature_columns = [col for col in feature_columns if not col.startswith('_')] - - numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns - numeric_columns = [col for col in numeric_columns if col in feature_columns] - df = cross_sectional_standardization(df, numeric_columns) - - for start in range(start_index, n - train_days - test_days + 1, test_days): - gc.collect() - - train_dates = unique_dates[start: start + train_days] - test_dates = unique_dates[start + train_days: start + train_days + test_days] - - # 根据日期筛选数据 - train_data = df[filter_index & df['trade_date'].isin(train_dates)] - test_data = df[df['trade_date'].isin(test_dates)] - - train_data = train_data.sort_values('trade_date') - test_data = test_data.sort_values('trade_date') - - - industry_df = industry_df.sort_values(by=['trade_date']) - # index_df = index_df.sort_values(by=['trade_date']) - - train_data = train_data.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left') - # # train_data = train_data.merge(index_df, on='trade_date', how='left') - test_data = test_data.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left') - # # test_data = test_data.merge(index_df, on='trade_date', how='left') - - # train_data, test_data = train_data.replace([np.inf, -np.inf], np.nan), test_data.replace([np.inf, -np.inf], - # np.nan) - - feature_columns = [col for col in train_data.columns if col in train_data.columns] - feature_columns = [col for col in feature_columns if col not in ['trade_date', - 'ts_code', - 'label']] - feature_columns = [col for col in feature_columns if 'future' not in col] - feature_columns = [col for col in feature_columns if 'label' not in col] - feature_columns = [col for col in feature_columns if 'score' not in col] - feature_columns = [col for col in feature_columns if 'gen' not in col] - feature_columns = [col for col in feature_columns if 'cat_l2_code' not in col] - feature_columns = [col for col in feature_columns if col not in origin_columns] - feature_columns = [col for col in feature_columns if not col.startswith('_')] - - numeric_columns = train_data.select_dtypes(include=['float64', 'int64']).columns - numeric_columns = [col for col in numeric_columns if col in feature_columns] - # print('去极值') - train_data = quantile_filter(train_data, numeric_columns) # 去极值 - # # print('中性化') - # # train_data = neutralize_manual(train_data, numeric_columns, industry_col='cat_l2_code', mkt_cap_col='log(circ_mv)') # 中性化 - # print('去极值') - test_data = quantile_filter(test_data, numeric_columns) # 去极值 - - all_dates = train_data['trade_date'].unique() # 获取所有唯一的 trade_date - split_date = all_dates[-validation_days] # 划分点为倒数第 validation_days 天 - train_data_split = train_data[train_data['trade_date'] < split_date] # 训练集 - val_data_split = train_data[train_data['trade_date'] >= split_date] # 验证集 - - feature_columns, _ = remove_shifted_features(train_data_split[train_data_split['label'] == train_data_split['label'].max()], - val_data_split[val_data_split['label'] == val_data_split['label'].max()], - feature_columns) - - feature_columns = remove_highly_correlated_features(train_data[train_data['label'] == train_data['label'].max()], - feature_columns) - - train_data = train_data.dropna(subset=feature_columns) - train_data = train_data.dropna(subset=['label']) - train_data = train_data.reset_index(drop=True) - - # print(test_data.tail()) - test_data = test_data.dropna(subset=feature_columns) - # test_data = test_data.dropna(subset=['label']) - test_data = test_data.reset_index(drop=True) - - # print(len(train_data)) - print(f"最小日期: {train_data['trade_date'].min().strftime('%Y-%m-%d')}") - print(f"最大日期: {train_data['trade_date'].max().strftime('%Y-%m-%d')}") - # print(len(test_data)) - print(f"最小日期: {test_data['trade_date'].min().strftime('%Y-%m-%d')}") - print(f"最大日期: {test_data['trade_date'].max().strftime('%Y-%m-%d')}") - - cat_columns = [col for col in df.columns if col.startswith('cat')] - for col in cat_columns: - train_data[col] = train_data[col].astype('category') - test_data[col] = test_data[col].astype('category') - - label_gain = list(range(len(train_data['label'].unique()))) - label_gain = [(gain + 1) * (gain + 1) for gain in label_gain] - light_params['label_gain'] = label_gain - - # ud = train_data["trade_date"].unique() - # date_weights = {date: weight for date, weight in zip(ud, np.linspace(1, 2, len(unique_dates)))} - # light_params['weight'] = train_data["trade_date"].map(date_weights).tolist() - - # print(f'feature_columns: {feature_columns}') - feature_contri = [2 if feat.startswith('act_factor') else 1 for feat in feature_columns] - light_params['feature_contri'] = feature_contri - model, _, _ = train_light_model(train_data.dropna(subset=['label']), - light_params, feature_columns, - [lgb.log_evaluation(period=100), - lgb.callback.record_evaluation(evals), - lgb.early_stopping(50, first_metric_only=True) - ], evals, - num_boost_round=3000, validation_days=validation_days, - print_feature_importance=False, use_pca=False) - - score_df = test_data.copy() - numeric_columns = score_df.select_dtypes(include=['float64', 'int64']).columns - numeric_columns = [col for col in numeric_columns if col in feature_columns] - score_df = cross_sectional_standardization(score_df, numeric_columns) - score_df['score'] = model.predict(score_df[feature_columns]) - score_df = score_df.loc[score_df.groupby('trade_date')['score'].idxmax()] - score_df = score_df[['trade_date', 'score', 'ts_code']] - predictions_list.append(score_df) - - # m = 5 - # all_data = [] - # for i, trade_date in enumerate(sorted(score_df['trade_date'].unique().tolist())): - # # 提取当前日期的数据 - # current_data = score_df[score_df['trade_date'] == trade_date] - # all_data.append(current_data) - # - # numeric_columns = [col for col in feature_columns if col in current_data.select_dtypes(include=['float64', 'int64']).columns] - # current_data = cross_sectional_standardization(current_data, numeric_columns) - # current_data['score'] = model.predict(current_data[feature_columns]) - # daily_top_score = current_data.loc[[current_data['score'].idxmax()]] - # predictions_list.append(daily_top_score[['trade_date', 'score', 'ts_code']]) - # - # if i % m == 0: - # train_data_split = pd.concat(all_data) - # train_data_split = train_data_split.dropna(subset=['label']) - # - # X_train = train_data_split[feature_columns] - # y_train = train_data_split['label'] - # - # train_groups = train_data_split.groupby('trade_date').size().tolist() - # categorical_feature = [col for col in feature_columns if 'cat' in col] - # - # train_dataset = lgb.Dataset( - # X_train, label=y_train, group=train_groups, - # categorical_feature=categorical_feature - # ) - # - # model = lgb.train( - # light_params, train_dataset, num_boost_round=36, - # init_model=model - # ) - # all_data = [] - - final_predictions = pd.concat(predictions_list, ignore_index=True) - return final_predictions - - -# In[ ]: - - -gc.collect() - -print(df[df['ts_code'] == '000001.SZ'].tail(1)[['act_factor1', 'act_factor2']]) -print('finish') -# qdf = qdf[qdf['trade_date'] >= '2022-01-01'] - -final_predictions = rolling_train_predict(df[df['trade_date'] >= '2022-01-01'], 90, 5, industry_df, None, - days=days, validation_days=10, filter_index=filter_index) -final_predictions.to_csv('predictions_test.tsv', index=False) - - -# In[ ]: - - -print(df[df['ts_code'] == '000001.SZ'].tail(1)[['act_factor1', 'act_factor2']]) -print('finish') - - -# In[ ]: - - - - diff --git a/code/train/predictions_test.tsv b/code/train/predictions_test.tsv index 0a2fe9b..cbb2427 100644 --- a/code/train/predictions_test.tsv +++ b/code/train/predictions_test.tsv @@ -1,262 +1,521 @@ trade_date,score,ts_code -2024-03-01,0.48944956369028353,600515.SH -2024-03-04,0.4910973129007265,601377.SH -2024-03-05,0.49755441935533035,601377.SH -2024-03-06,0.48530227310531543,000950.SZ -2024-03-07,0.4852382924633875,002252.SZ -2024-03-08,0.4295690224121115,000650.SZ -2024-03-11,0.4772666567296332,002539.SZ -2024-03-12,0.44912255948878027,002030.SZ -2024-03-13,0.48036470172022555,603366.SH -2024-03-14,0.47455902892485136,002616.SZ -2024-03-15,0.4898609892396381,002616.SZ -2024-03-18,0.4898609892396381,002616.SZ -2024-03-19,0.4585803401938102,600749.SH -2024-03-20,0.4717940942781549,601616.SH -2024-03-21,0.4898609892396381,002616.SZ -2024-03-22,0.4921881826907514,600268.SH -2024-03-25,0.4529948903273269,000910.SZ -2024-03-26,0.468535149074664,600163.SH -2024-03-27,0.45345883846621166,600268.SH -2024-03-28,0.4629678911934166,603689.SH -2024-03-29,0.4576699667200496,600479.SH -2024-04-01,0.4880682627555449,000407.SZ -2024-04-02,0.4658882567202438,002228.SZ -2024-04-03,0.46661866733947643,600279.SH -2024-04-08,0.4348058590086616,601199.SH -2024-04-09,0.440404827771838,600279.SH -2024-04-10,0.45436095343545857,600279.SH -2024-04-11,0.4860610115557819,002807.SZ -2024-04-12,0.49251811801038575,002807.SZ -2024-04-15,0.45282134310413785,002267.SZ -2024-04-16,0.44573083040693495,601200.SH -2024-04-17,0.4755082230960848,600681.SH -2024-04-18,0.46969708080904654,600681.SH -2024-04-19,0.4763960575203315,601963.SH -2024-04-22,0.4797611675632624,601006.SH -2024-04-23,0.4417060612494253,600905.SH -2024-04-24,0.467078149060861,600681.SH -2024-04-25,0.48593234463506524,601016.SH -2024-04-26,0.485704669384595,600248.SH -2024-04-29,0.4856232616952012,000088.SZ -2024-04-30,0.47658127432737996,600717.SH -2024-05-06,0.485599247202529,600057.SH -2024-05-07,0.48502517567793635,600928.SH -2024-05-08,0.4875800938455082,601997.SH -2024-05-09,0.4764814479757618,601990.SH -2024-05-10,0.4767299756060024,601187.SH -2024-05-13,0.48339009051626075,002252.SZ -2024-05-14,0.49804720312809037,601236.SH -2024-05-15,0.4754440788180303,601669.SH -2024-05-16,0.47188100886784723,002252.SZ -2024-05-17,0.4738812084576224,000505.SZ -2024-05-20,0.47680745811007763,600300.SH -2024-05-21,0.4914822821325402,000919.SZ -2024-05-22,0.43568399742751623,603777.SH -2024-05-23,0.48230237417866073,000919.SZ -2024-05-24,0.45217189085141946,600846.SH -2024-05-27,0.4822386303700534,000012.SZ -2024-05-28,0.4911043379651643,000012.SZ -2024-05-29,0.4593967921412618,000012.SZ -2024-05-30,0.46327623228814613,600033.SH -2024-05-31,0.48434217554317305,601006.SH -2024-06-03,0.49496311907072943,601158.SH -2024-06-04,0.49311491712360267,601158.SH -2024-06-05,0.4662101696226407,600681.SH -2024-06-06,0.44598437609141306,600507.SH -2024-06-07,0.46683069546117434,002936.SZ -2024-06-11,0.48392216170099567,002936.SZ -2024-06-12,0.48392216170099567,002936.SZ -2024-06-13,0.4856066420239958,601555.SH -2024-06-14,0.4626378515738043,600273.SH -2024-06-17,0.4930611701154713,601868.SH -2024-06-18,0.4850760483461876,600909.SH -2024-06-19,0.48789755402053436,600909.SH -2024-06-20,0.47168404865503394,600918.SH -2024-06-21,0.4780215106901423,002939.SZ -2024-06-24,0.4670168740500108,600507.SH -2024-06-25,0.4462181161419812,600507.SH -2024-06-26,0.47871585166988867,601108.SH -2024-06-27,0.4550530100208326,601108.SH -2024-06-28,0.4682668022638408,600056.SH -2024-07-01,0.4956846242134755,601555.SH -2024-07-02,0.4855061855012652,601375.SH -2024-07-03,0.48208040944932096,000166.SZ -2024-07-04,0.4741422882624783,002763.SZ -2024-07-05,0.4207747223564723,600279.SH -2024-07-08,0.4505916830616898,000778.SZ -2024-07-09,0.47552387696457243,600108.SH -2024-07-10,0.48433484852590997,601990.SH -2024-07-11,0.4670143394143526,600597.SH -2024-07-12,0.48598259773635294,601228.SH -2024-07-15,0.46747598383004435,600704.SH -2024-07-16,0.46517324677556354,601228.SH -2024-07-17,0.4669329317249588,600681.SH -2024-07-18,0.4342287048693295,603886.SH -2024-07-19,0.4688897638752658,002936.SZ -2024-07-22,0.4655336697859469,601008.SH -2024-07-23,0.4385299287889017,000959.SZ -2024-07-24,0.40980850428167526,600059.SH -2024-07-25,0.4354808457559223,600928.SH -2024-07-26,0.43863748866816843,002936.SZ -2024-07-29,0.4757869671100767,002936.SZ -2024-07-30,0.45055950278777573,600056.SH -2024-07-31,0.43441391812299834,000672.SZ -2024-08-01,0.46163952351711074,600597.SH -2024-08-02,0.45912773679288216,601528.SH -2024-08-05,0.42637336325271274,000012.SZ -2024-08-06,0.44417354831155165,000498.SZ -2024-08-07,0.46761174293945373,002029.SZ -2024-08-08,0.44084265961702834,600061.SH -2024-08-09,0.44756951600219536,600061.SH -2024-08-12,0.43865468410238356,600517.SH -2024-08-13,0.40119132713124916,600798.SH -2024-08-14,0.4147687048594177,600279.SH -2024-08-15,0.4285641100025751,600283.SH -2024-08-16,0.43481178678490995,600279.SH -2024-08-19,0.4334514206803078,000055.SZ -2024-08-20,0.4271544196243579,600925.SH -2024-08-21,0.44140030057394675,601718.SH -2024-08-22,0.4260043286627239,002266.SZ -2024-08-23,0.4272469992425721,002266.SZ -2024-08-26,0.43298605818458036,601718.SH -2024-08-27,0.42993335252901094,600308.SH -2024-08-28,0.44014909636073596,601216.SH -2024-08-29,0.4549086267823673,002108.SZ -2024-08-30,0.4432950051114155,603817.SH -2024-09-02,0.44924217940667366,603759.SH -2024-09-03,0.45929491873592476,603759.SH -2024-09-04,0.4555291720504659,603817.SH -2024-09-05,0.45486187663776934,000581.SZ -2024-09-06,0.458767486527876,600016.SH -2024-09-09,0.42622859802922114,000725.SZ -2024-09-10,0.47344109719180894,002239.SZ -2024-09-11,0.4602775423090333,600050.SH -2024-09-12,0.4581305095531178,603856.SH -2024-09-13,0.48196532955068866,002697.SZ -2024-09-18,0.48196532955068866,002697.SZ -2024-09-19,0.4448663482243619,600210.SH -2024-09-20,0.4894480847057984,600293.SH -2024-09-23,0.48392216170099567,002239.SZ -2024-09-24,0.43493260807615913,603182.SH -2024-09-25,0.4279590881784511,601369.SH -2024-09-26,0.457735727285402,600526.SH -2024-09-27,0.464687096497251,002818.SZ -2024-09-30,0.21397500413643297,600081.SH -2024-10-08,0.22763716829204592,605333.SH -2024-10-09,0.44498910797127905,600495.SH -2024-10-10,0.4635725472634731,600251.SH -2024-10-11,0.46083590103602623,000967.SZ -2024-10-14,0.47310129519500743,600251.SH -2024-10-15,0.4432757845922387,601727.SH -2024-10-16,0.49142274407028197,002267.SZ -2024-10-17,0.4969633584025033,600032.SH -2024-10-18,0.49050625194789943,002267.SZ -2024-10-21,0.4839204785725789,000709.SZ -2024-10-22,0.47843667953797847,002237.SZ -2024-10-23,0.4785259848937853,601577.SH -2024-10-24,0.48592022305116356,601577.SH -2024-10-25,0.4799806860019888,600820.SH -2024-10-28,0.4616976069244002,002135.SZ -2024-10-29,0.48907368099203313,600330.SH -2024-10-30,0.47786058189302977,600516.SH -2024-10-31,0.46572447890972274,600969.SH -2024-11-01,0.46269570933167936,600261.SH -2024-11-04,0.4819410916205754,600249.SH -2024-11-05,0.4866489103957071,603167.SH -2024-11-06,0.485704669384595,600423.SH -2024-11-07,0.4906974157098039,600249.SH -2024-11-08,0.47099968069944914,002328.SZ -2024-11-11,0.47924756292999116,600103.SH -2024-11-12,0.4864515748363791,600103.SH -2024-11-13,0.4682636704183581,600419.SH -2024-11-14,0.47314641913653194,000533.SZ -2024-11-15,0.48200633444426155,600103.SH -2024-11-18,0.4734312305146418,600300.SH -2024-11-19,0.481591587838489,601113.SH -2024-11-20,0.485704669384595,600493.SH -2024-11-21,0.48103812387602335,600515.SH -2024-11-22,0.48907368099203313,600284.SH -2024-11-25,0.49351892138415066,603111.SH -2024-11-26,0.49311491712360267,601187.SH -2024-11-27,0.49823564043257407,601187.SH -2024-11-28,0.49478522113574214,002091.SZ -2024-11-29,0.4744243783704977,002390.SZ -2024-12-02,0.47703304354620096,002390.SZ -2024-12-03,0.48674050526244056,002566.SZ -2024-12-04,0.4959275225246577,002753.SZ -2024-12-05,0.48839819807517926,002753.SZ -2024-12-06,0.4870618149295468,603128.SH -2024-12-09,0.49249410351771356,600425.SH -2024-12-10,0.4959275225246577,002772.SZ -2024-12-11,0.48502517567793635,600035.SH -2024-12-12,0.48907368099203313,600035.SH -2024-12-13,0.4901095168698787,600035.SH -2024-12-16,0.485704669384595,603577.SH -2024-12-17,0.42271811250681296,000533.SZ -2024-12-18,0.45253512664134277,000026.SZ -2024-12-19,0.4668403018194925,601000.SH -2024-12-20,0.47643624443298405,000026.SZ -2024-12-23,0.4405301681206755,600305.SH -2024-12-24,0.44052806294048863,000883.SZ -2024-12-25,0.448810439825342,000589.SZ -2024-12-26,0.47338854249265216,600582.SH -2024-12-27,0.4495112908067394,000830.SZ -2024-12-30,0.463164320301011,601006.SH -2024-12-31,0.4773178744459276,600004.SH -2025-01-02,0.47702414327290926,600572.SH -2025-01-03,0.4474782636368997,601163.SH -2025-01-06,0.4333771722554744,600821.SH -2025-01-07,0.44770531932040636,600004.SH -2025-01-08,0.47082512104142743,600116.SH -2025-01-09,0.4541624257750102,600004.SH -2025-01-10,0.4505883376349118,600905.SH -2025-01-13,0.4505883376349118,600905.SH -2025-01-14,0.4629277092655053,000088.SZ -2025-01-15,0.4849467618585074,601222.SH -2025-01-16,0.4904213884330184,600273.SH -2025-01-17,0.49427977331421474,002267.SZ -2025-01-20,0.4921881826907514,000088.SZ -2025-01-21,0.49980885843191936,002233.SZ -2025-01-22,0.49226959038014517,603817.SH -2025-01-23,0.4845623679956794,600731.SH -2025-01-24,0.4894480847057984,002443.SZ -2025-01-27,0.480828304199342,600475.SH -2025-02-05,0.49381191740852215,600475.SH -2025-02-06,0.48051107405830695,600219.SH -2025-02-07,0.4912337545022996,002365.SZ -2025-02-10,0.4891404807504195,002606.SZ -2025-02-11,0.48918316877240914,002454.SZ -2025-02-12,0.48841224882795287,605138.SH -2025-02-13,0.49427977331421474,603022.SH -2025-02-14,0.4961990011809636,002454.SZ -2025-02-17,0.49980885843191936,603172.SH -2025-02-18,0.4859761480409009,600526.SH -2025-02-19,0.47951904158629705,600526.SH -2025-02-20,0.4865640468808261,002972.SZ -2025-02-21,0.4878226668596109,002972.SZ -2025-02-24,0.49427977331421474,002972.SZ -2025-02-25,0.4959275225246577,002972.SZ -2025-02-26,0.49559758720502334,000850.SZ -2025-02-27,0.4962265008275085,600969.SH -2025-02-28,0.45857905703475876,000931.SZ -2025-03-03,0.475929514181944,600704.SH -2025-03-04,0.4855766924008325,603176.SH -2025-03-05,0.48947041607005387,600749.SH -2025-03-06,0.48947041607005387,600749.SH -2025-03-07,0.48852295338866114,002948.SZ -2025-03-10,0.48013938012027435,600749.SH -2025-03-11,0.4697442502219659,603916.SH -2025-03-12,0.46825376442882116,600969.SH -2025-03-13,0.485704669384595,601311.SH -2025-03-14,0.47290759442027386,600784.SH -2025-03-17,0.48236846890282975,002204.SZ -2025-03-18,0.4753161955607809,600784.SH -2025-03-19,0.4898609892396381,002627.SZ -2025-03-20,0.4898609892396381,002627.SZ -2025-03-21,0.47660773064492085,000589.SZ -2025-03-24,0.4753538392607698,000589.SZ -2025-03-25,0.4628733846203298,000589.SZ -2025-03-26,0.45948501496487415,603367.SH -2025-03-27,0.47591884404751766,600017.SH -2025-03-28,0.4765671044505851,600925.SH +2023-02-07,1.3645926551801728,002090.SZ +2023-02-08,1.6659408065254724,002253.SZ +2023-02-09,1.0229009450147413,002229.SZ +2023-02-10,1.415416364436179,002574.SZ +2023-02-13,1.3671236223454621,002717.SZ +2023-02-14,1.8915095926809309,002117.SZ +2023-02-15,1.7137757903025839,000584.SZ +2023-02-16,1.1848422328473422,603966.SH +2023-02-17,1.2416872517887552,603918.SH +2023-02-20,1.3943664595309153,600410.SH +2023-02-21,1.7629809709655193,002878.SZ +2023-02-22,1.2015788876321705,002112.SZ +2023-02-23,1.2611020834297224,605337.SH +2023-02-24,0.9802964387764386,001319.SZ +2023-02-27,1.358294061497308,002229.SZ +2023-02-28,1.4108164693525105,603528.SH +2023-03-01,1.5433347574484866,002112.SZ +2023-03-02,1.0989141023070836,603211.SH +2023-03-03,1.7052648911569537,601728.SH +2023-03-06,1.4634142386178806,000151.SZ +2023-03-07,1.342512999776796,000977.SZ +2023-03-08,1.3087219260253402,601798.SH +2023-03-09,1.492386044999466,002112.SZ +2023-03-10,2.279424995016904,601698.SH +2023-03-13,1.4513440814082623,002528.SZ +2023-03-14,1.9620693932944253,601728.SH +2023-03-15,1.8848583335186366,601138.SH +2023-03-16,1.6025875262950398,601728.SH +2023-03-17,1.7712935900184408,601179.SH +2023-03-20,1.7587696113628783,002941.SZ +2023-03-21,1.5608113355568172,601360.SH +2023-03-22,1.520865429852981,000506.SZ +2023-03-23,1.6846975797557702,002236.SZ +2023-03-24,2.104194350172441,600228.SH +2023-03-27,1.990262952663933,603533.SH +2023-03-28,1.9629619029353826,601360.SH +2023-03-29,1.6754497116847598,601858.SH +2023-03-30,1.013329851836863,600573.SH +2023-03-31,1.837328022288768,601858.SH +2023-04-03,1.554889761538179,000719.SZ +2023-04-04,1.495168905012772,002602.SZ +2023-04-06,1.5051349322678247,601360.SH +2023-04-07,1.5808943918796126,002602.SZ +2023-04-10,1.554146398860854,002681.SZ +2023-04-11,1.6372093645887016,000810.SZ +2023-04-12,1.3487333814290967,603888.SH +2023-04-13,1.2171744255667023,603083.SH +2023-04-14,1.441659972262552,600228.SH +2023-04-17,1.3044925109318324,002624.SZ +2023-04-18,1.8842959108213833,601858.SH +2023-04-19,1.7239316875916317,603258.SH +2023-04-20,1.705463946028689,601595.SH +2023-04-21,2.0563989964671876,601595.SH +2023-04-24,2.2347819519009553,601595.SH +2023-04-25,1.1581503133910735,600105.SH +2023-04-26,1.4437102169770144,603019.SH +2023-04-27,1.9209254464947922,603258.SH +2023-04-28,1.990582320638835,601949.SH +2023-05-04,2.2209871146236577,601900.SH +2023-05-05,1.1662183566183997,601801.SH +2023-05-08,1.7307668981007636,601019.SH +2023-05-09,1.628136069161757,002941.SZ +2023-05-10,1.3607560739114617,603322.SH +2023-05-11,1.31097475589197,002558.SZ +2023-05-12,1.5913812374899519,601566.SH +2023-05-15,1.6875205132758881,603518.SH +2023-05-16,1.825780942694354,600012.SH +2023-05-17,0.9777516330011825,601333.SH +2023-05-18,1.8180541101153,002780.SZ +2023-05-19,1.2138748354762128,002983.SZ +2023-05-22,0.8241913397612426,601333.SH +2023-05-23,1.5496294184079087,605011.SH +2023-05-24,1.47942444487419,603662.SH +2023-05-25,1.8484524778193987,605028.SH +2023-05-26,1.2976700928919727,603662.SH +2023-05-29,1.1393833114104626,603728.SH +2023-05-30,1.3766448503934043,605028.SH +2023-05-31,1.493200307474276,002995.SZ +2023-06-01,1.3573713204290034,603683.SH +2023-06-02,1.6042662982549014,002843.SZ +2023-06-05,1.452398646119459,603527.SH +2023-06-06,0.6426476999954945,600976.SH +2023-06-07,1.3360591470815486,600703.SH +2023-06-08,1.471179298631075,002401.SZ +2023-06-09,2.2723930529031717,603083.SH +2023-06-12,1.705228662520749,002599.SZ +2023-06-13,1.795291014879848,603000.SH +2023-06-14,1.8362091244782328,002261.SZ +2023-06-15,1.7440668724975588,600105.SH +2023-06-16,1.4316876125308198,002281.SZ +2023-06-19,1.764448403251622,603533.SH +2023-06-20,1.3320062541595132,000988.SZ +2023-06-21,2.040273484906006,600602.SH +2023-06-26,1.0926638423682808,600105.SH +2023-06-27,1.2717499103113574,600310.SH +2023-06-28,1.238071570674301,605588.SH +2023-06-29,1.502691072449812,002229.SZ +2023-06-30,1.4219667284895325,002535.SZ +2023-07-03,0.9256212736758743,002892.SZ +2023-07-04,1.53638588683099,002590.SZ +2023-07-05,1.1453135485351378,003038.SZ +2023-07-06,1.4502288274402884,600310.SH +2023-07-07,1.6320959329155738,603496.SH +2023-07-10,1.409468983618881,603786.SH +2023-07-11,1.543630092507015,603596.SH +2023-07-12,1.3059980206963548,002813.SZ +2023-07-13,1.269818365323854,002877.SZ +2023-07-14,1.0735674417220362,603663.SH +2023-07-17,1.279450736290347,603496.SH +2023-07-18,1.0545750865196295,603789.SH +2023-07-19,1.2845918425532865,002448.SZ +2023-07-20,0.8248178425303717,600778.SH +2023-07-21,1.4253142351472452,002719.SZ +2023-07-24,1.5167337765695577,600239.SH +2023-07-25,0.9755431723205327,600322.SH +2023-07-26,1.7314591159945887,600322.SH +2023-07-27,1.4318983095787687,000890.SZ +2023-07-28,0.2607663447766181,600186.SH +2023-07-31,1.2716606647875734,000882.SZ +2023-08-01,1.232967344164254,000572.SZ +2023-08-02,1.2172434983084413,600649.SH +2023-08-03,2.031423540022372,000728.SZ +2023-08-04,1.1041681076217773,002719.SZ +2023-08-07,0.782082768488005,000719.SZ +2023-08-08,1.5379808318765682,603106.SH +2023-08-09,0.9132400627157055,601878.SH +2023-08-10,1.0283723438807169,000813.SZ +2023-08-11,1.6997048868749072,000813.SZ +2023-08-14,1.4381170953423268,601059.SH +2023-08-15,1.3261950119959607,601136.SH +2023-08-16,1.4765948433106804,600322.SH +2023-08-17,1.2160642562490813,603569.SH +2023-08-18,1.1145390820804006,001299.SZ +2023-08-21,1.43434844825554,002310.SZ +2023-08-22,1.4939376416901915,601136.SH +2023-08-23,1.4060809208009935,600257.SH +2023-08-24,1.0746630400889863,001299.SZ +2023-08-25,0.9680313877550104,000712.SZ +2023-08-28,0.9848212120180476,000006.SZ +2023-08-29,1.0625310232419118,002670.SZ +2023-08-30,1.0174822295186214,600272.SH +2023-08-31,1.655329704036689,600753.SH +2023-09-01,1.0136913186181489,600257.SH +2023-09-04,1.223132439282253,000826.SZ +2023-09-05,1.325281163319983,600725.SH +2023-09-06,1.1082644806732906,001309.SZ +2023-09-07,2.0006688690129724,600189.SH +2023-09-08,1.5378052965869005,603078.SH +2023-09-11,1.392187005712765,600353.SH +2023-09-12,1.6289150515072552,603607.SH +2023-09-13,1.8471554151278224,002792.SZ +2023-09-14,1.162491430722531,603326.SH +2023-09-15,1.1999233230329651,603918.SH +2023-09-18,1.5399856787104675,002693.SZ +2023-09-19,1.1612213368595132,603667.SH +2023-09-20,1.1039842739821812,603256.SH +2023-09-21,1.7632352085072154,603933.SH +2023-09-22,1.390405966728657,002889.SZ +2023-09-25,1.0227272246465406,002767.SZ +2023-09-26,1.8385716993149068,600895.SH +2023-09-27,1.4315027916538465,002694.SZ +2023-09-28,1.987833741759668,001298.SZ +2023-10-09,1.2882629413068847,600186.SH +2023-10-10,1.6842773211667261,603110.SH +2023-10-11,2.007981444138301,600630.SH +2023-10-12,1.262491181410245,600839.SH +2023-10-13,1.937622774456844,600630.SH +2023-10-16,1.8879427740419108,000010.SZ +2023-10-17,1.7128428851802724,600895.SH +2023-10-18,1.2452194845152549,603616.SH +2023-10-19,1.7579455823833081,600599.SH +2023-10-20,1.491132967182894,600186.SH +2023-10-23,1.5210656951837707,002456.SZ +2023-10-24,1.7056650600657404,600239.SH +2023-10-25,1.7531356573153227,605555.SH +2023-10-26,1.8239874947709378,002316.SZ +2023-10-27,1.5694621676455982,603110.SH +2023-10-30,1.431096257012354,002383.SZ +2023-10-31,1.029850094768283,600200.SH +2023-11-01,1.199709815731909,001238.SZ +2023-11-02,1.7805092398798017,002437.SZ +2023-11-03,1.5737969189447927,600186.SH +2023-11-06,1.7625435208282576,603178.SH +2023-11-07,2.176118161923504,002981.SZ +2023-11-08,1.1704490092676294,600200.SH +2023-11-09,1.6561293264161698,605319.SH +2023-11-10,1.4298539778178594,603286.SH +2023-11-13,1.7710893018487925,600592.SH +2023-11-14,1.5199900674439963,603283.SH +2023-11-15,1.7561003459472064,603037.SH +2023-11-16,1.6206310845961338,002729.SZ +2023-11-17,2.187252979931234,002584.SZ +2023-11-20,1.5848110907964723,603002.SH +2023-11-21,1.3713009434388839,002889.SZ +2023-11-22,1.3620043676917186,000628.SZ +2023-11-23,1.5881517936691218,605577.SH +2023-11-24,1.897199777062565,600520.SH +2023-11-27,1.4350315493428087,605577.SH +2023-11-28,1.6499455891850736,002848.SZ +2023-11-29,1.5912153314169626,002559.SZ +2023-11-30,1.4224552717329468,000628.SZ +2023-12-01,1.4537641668706338,002725.SZ +2023-12-04,1.6973452933616748,002786.SZ +2023-12-05,1.1386246913814186,002848.SZ +2023-12-06,2.135997449829722,002786.SZ +2023-12-07,1.2283718905283283,600228.SH +2023-12-08,1.5452482849249578,600178.SH +2023-12-11,1.3278967048736914,603286.SH +2023-12-12,1.1561346229021146,600106.SH +2023-12-13,1.363585641928709,605179.SH +2023-12-14,1.8437176426506008,001318.SZ +2023-12-15,1.5041579973343826,603189.SH +2023-12-18,1.529564333070803,002313.SZ +2023-12-19,1.6472791361662253,603536.SH +2023-12-20,1.8147681418353698,002571.SZ +2023-12-21,1.3743776571819668,603389.SH +2023-12-22,1.4378491192679521,605286.SH +2023-12-25,1.643361974010536,603153.SH +2023-12-26,1.4457077367518334,605086.SH +2023-12-27,1.6963946058238606,002952.SZ +2023-12-28,1.5822601034996366,002632.SZ +2023-12-29,1.2460548717640292,603106.SH +2024-01-02,1.4507134360187202,001217.SZ +2024-01-03,1.5946782156453634,605167.SH +2024-01-04,1.2746472399697064,600593.SH +2024-01-05,1.8192997410055385,002862.SZ +2024-01-08,1.8838803180476256,002177.SZ +2024-01-09,1.845534913075768,002689.SZ +2024-01-10,1.35267547902447,002395.SZ +2024-01-11,1.1157896411225436,600716.SH +2024-01-12,1.1828382022275195,603386.SH +2024-01-15,1.0485044600160272,601226.SH +2024-01-16,1.2254253113271563,603038.SH +2024-01-17,2.2110755027236655,000638.SZ +2024-01-18,1.7336063385712743,600318.SH +2024-01-19,1.3382489081062945,603983.SH +2024-01-22,1.5320284713215426,603499.SH +2024-01-23,1.1697686557144797,002731.SZ +2024-01-24,1.4713131131840989,600638.SH +2024-01-25,1.2514521083573042,002731.SZ +2024-01-26,1.5437865732790492,600236.SH +2024-01-29,1.5288016714429649,601018.SH +2024-01-30,1.1173712586462425,600028.SH +2024-01-31,1.6422897834382393,601088.SH +2024-02-01,1.7837201614713305,600025.SH +2024-02-02,1.606531406597037,600025.SH +2024-02-05,1.8380628949384272,600350.SH +2024-02-06,1.3540991456284572,601825.SH +2024-02-07,1.0731774218815855,601088.SH +2024-02-08,1.3962376133538412,601127.SH +2024-02-19,1.5135892772139994,601088.SH +2024-02-20,0.5342044385400938,601728.SH +2024-02-21,1.3185865021354313,000001.SZ +2024-02-22,0.9879983373526517,601088.SH +2024-02-23,0.46659931993358544,600825.SH +2024-02-26,1.847522007288656,002912.SZ +2024-02-27,1.323201468573188,002229.SZ +2024-02-28,1.5414442626443279,000733.SZ +2024-02-29,1.354809310668124,002517.SZ +2024-03-01,1.4293405714288003,601127.SH +2024-03-04,1.7785965543962634,002975.SZ +2024-03-05,1.441062441807201,600750.SH +2024-03-06,1.166539012588714,601127.SH +2024-03-07,1.5005948274810337,600661.SH +2024-03-08,1.8512830538110299,002547.SZ +2024-03-11,1.3159245536898176,002632.SZ +2024-03-12,1.3027427830258336,600053.SH +2024-03-13,1.135966929041423,002875.SZ +2024-03-14,0.9808791676256735,603516.SH +2024-03-15,1.4274016908049976,603533.SH +2024-03-18,1.5839985370247616,603499.SH +2024-03-19,1.0479676882048163,603580.SH +2024-03-20,1.7477697958588945,002875.SZ +2024-03-21,2.148418958525123,603580.SH +2024-03-22,1.5539647238519647,001309.SZ +2024-03-25,1.5214824458757936,002213.SZ +2024-03-26,1.233142447455704,001309.SZ +2024-03-27,1.6261052858951475,603499.SH +2024-03-28,2.0086665757104516,603389.SH +2024-03-29,1.683796747142323,600200.SH +2024-04-01,1.5425590112108634,600200.SH +2024-04-02,1.5358445083730514,603050.SH +2024-04-03,0.9754570088906079,002343.SZ +2024-04-08,1.2990423635399238,605180.SH +2024-04-09,1.5051360712462134,605198.SH +2024-04-10,1.2361896118118223,600257.SH +2024-04-11,1.1402700573096343,600746.SH +2024-04-12,1.6420335456015955,001337.SZ +2024-04-15,1.0629609685664596,600761.SH +2024-04-16,1.0690378265815077,603358.SH +2024-04-17,1.396223191207581,600285.SH +2024-04-18,1.052116518151276,600019.SH +2024-04-19,1.1045362307807496,000612.SZ +2024-04-22,1.3380862692237887,000737.SZ +2024-04-23,1.6539052718759644,002455.SZ +2024-04-24,1.860022858672999,603018.SH +2024-04-25,1.079405904702667,603979.SH +2024-04-26,1.4919157885246148,002928.SZ +2024-04-29,1.1691494590859068,000612.SZ +2024-04-30,1.935978407738462,600866.SH +2024-05-06,1.5629423919249235,002296.SZ +2024-05-07,1.438716453650343,600866.SH +2024-05-08,1.3357301196250864,603681.SH +2024-05-09,1.719650054942437,001696.SZ +2024-05-10,1.4708983300538965,603486.SH +2024-05-13,1.5147305331933945,002668.SZ +2024-05-14,2.010131233022604,603486.SH +2024-05-15,1.0127880501973816,000099.SZ +2024-05-16,1.6108520673034152,002827.SZ +2024-05-17,1.8618175871789568,600505.SH +2024-05-20,1.8930661250227574,600789.SH +2024-05-21,1.642740564408185,600843.SH +2024-05-22,1.1386699940181981,000957.SZ +2024-05-23,1.5591234134682526,600774.SH +2024-05-24,1.4520052047082697,000737.SZ +2024-05-27,1.5035255979986453,600843.SH +2024-05-28,0.9021859764859638,002455.SZ +2024-05-29,1.3560620149335156,000957.SZ +2024-05-30,1.2414850324413589,600843.SH +2024-05-31,1.1591730337352808,600171.SH +2024-06-03,0.8403440715583144,601020.SH +2024-06-04,1.8243426732785268,600719.SH +2024-06-05,1.1109693159825809,000519.SZ +2024-06-06,0.7861134290413708,601019.SH +2024-06-07,0.5331683579368047,601919.SH +2024-06-11,1.1628229795427596,002938.SZ +2024-06-12,1.0920172532976165,002594.SZ +2024-06-13,1.0759719452849372,603160.SH +2024-06-14,1.4694593938076344,000400.SZ +2024-06-17,1.540233506659075,002938.SZ +2024-06-18,1.5849713093027924,002475.SZ +2024-06-19,1.0097826777644472,600584.SH +2024-06-20,1.8613512662706175,003043.SZ +2024-06-21,1.4588222081093947,001298.SZ +2024-06-24,1.2924834432632082,600719.SH +2024-06-25,1.7426573814818236,603228.SH +2024-06-26,1.4967593839602875,603228.SH +2024-06-27,1.0614787289739416,002384.SZ +2024-06-28,1.6598673001524897,603228.SH +2024-07-01,1.5394179361276492,002600.SZ +2024-07-02,1.4629839899470507,002241.SZ +2024-07-03,1.1321743255565848,603936.SH +2024-07-04,1.5949712873847797,002938.SZ +2024-07-05,1.743968791722742,002713.SZ +2024-07-08,1.8330911215676733,002741.SZ +2024-07-09,1.5728256519506505,605081.SH +2024-07-10,1.1183149935496726,002981.SZ +2024-07-11,1.5669538270085575,603320.SH +2024-07-12,1.5123319645241076,601000.SH +2024-07-15,1.6776603348914538,600601.SH +2024-07-16,0.9879340144315439,600795.SH +2024-07-17,1.6406886898143893,002741.SZ +2024-07-18,1.4003380382240247,603336.SH +2024-07-19,1.095575592766269,000953.SZ +2024-07-22,2.039581431592635,600611.SH +2024-07-23,2.079760618306915,600460.SH +2024-07-24,1.5846107952408408,600611.SH +2024-07-25,1.4116611030995996,600686.SH +2024-07-26,2.266863546965638,600611.SH +2024-07-29,2.6165614512258384,600611.SH +2024-07-30,2.3566165952531932,000957.SZ +2024-07-31,2.212131769797424,600686.SH +2024-08-01,1.925164298692574,600611.SH +2024-08-02,1.5341523586326276,000868.SZ +2024-08-05,1.532753088034592,600789.SH +2024-08-06,1.769104888113413,600789.SH +2024-08-07,1.6207389922590958,600811.SH +2024-08-08,1.7891095521685891,002059.SZ +2024-08-09,1.8339825828021945,600216.SH +2024-08-12,1.8258782658595791,002072.SZ +2024-08-13,1.4654051437801399,002037.SZ +2024-08-14,1.467972219610808,600187.SH +2024-08-15,1.4039592380373118,600811.SH +2024-08-16,1.2973393696082258,600187.SH +2024-08-19,1.555402315874465,600811.SH +2024-08-20,1.8302882519930046,003026.SZ +2024-08-21,1.774054410897575,002370.SZ +2024-08-22,1.2364372150399032,002642.SZ +2024-08-23,1.694075591487684,000016.SZ +2024-08-26,1.2520461275138333,002037.SZ +2024-08-27,1.2636096542032131,000810.SZ +2024-08-28,0.9396930621439854,000810.SZ +2024-08-29,1.5409549907437192,000158.SZ +2024-08-30,1.7125431985705104,000810.SZ +2024-09-02,1.65936619151994,003015.SZ +2024-09-03,1.4927333118728283,000158.SZ +2024-09-04,0.9838911709022495,002488.SZ +2024-09-05,1.5305430972289824,605218.SH +2024-09-06,1.713754434013729,600811.SH +2024-09-09,1.2461542975529223,603196.SH +2024-09-10,1.0432709697427136,603829.SH +2024-09-11,1.4577478728039832,002488.SZ +2024-09-12,1.614152274915993,000158.SZ +2024-09-13,1.6192726262489885,600698.SH +2024-09-18,1.945184512065801,600550.SH +2024-09-19,1.8934909001956586,000948.SZ +2024-09-20,2.2560879595695362,000158.SZ +2024-09-23,1.5726301807087122,000678.SZ +2024-09-24,1.6082498649813057,002622.SZ +2024-09-25,1.816189093101861,600225.SH +2024-09-26,1.6517066194990913,600838.SH +2024-09-27,1.5642055483933968,000560.SZ +2024-09-30,1.741914958643685,000608.SZ +2024-10-08,0.9308735992340073,002892.SZ +2024-10-09,1.2888764196305087,002219.SZ +2024-10-10,0.5731629423103165,600094.SH +2024-10-11,0.7785424781626621,601086.SH +2024-10-14,1.304674308248369,603038.SH +2024-10-15,1.2606936431811913,000567.SZ +2024-10-16,1.2099058274730468,002963.SZ +2024-10-17,1.9361394291514233,002208.SZ +2024-10-18,1.53823974940418,000676.SZ +2024-10-21,1.3494473936857871,000676.SZ +2024-10-22,0.9857577728279538,000099.SZ +2024-10-23,1.5771301117646603,000016.SZ +2024-10-24,1.4214032409688944,002685.SZ +2024-10-25,1.56530644149001,000004.SZ +2024-10-28,1.4895843527515737,600520.SH +2024-10-29,2.030287925399339,002693.SZ +2024-10-30,1.9262165264717217,600770.SH +2024-10-31,1.9019248781020301,600696.SH +2024-11-01,1.5536575460489568,002693.SZ +2024-11-04,1.098575967222941,002272.SZ +2024-11-05,0.9641114952274427,000010.SZ +2024-11-06,1.7267364661624087,002542.SZ +2024-11-07,1.5328854043581424,002513.SZ +2024-11-08,1.2909419128437962,600292.SH +2024-11-11,1.2969387950712983,603117.SH +2024-11-12,1.544905977876046,002456.SZ +2024-11-13,1.2915706069762762,000795.SZ +2024-11-14,1.3857033284914293,000415.SZ +2024-11-15,0.7933932647229645,000066.SZ +2024-11-18,0.9636285120786632,002402.SZ +2024-11-19,1.4870998393549268,600609.SH +2024-11-20,1.361120155066914,002312.SZ +2024-11-21,1.1380582124754879,600676.SH +2024-11-22,1.4151665532897468,603366.SH +2024-11-25,1.322706664728691,002324.SZ +2024-11-26,1.4182262308056883,002292.SZ +2024-11-27,1.2975391512896235,002127.SZ +2024-11-28,1.6209441355461172,603083.SH +2024-11-29,1.4957012962688543,002095.SZ +2024-12-02,0.938812224297941,603399.SH +2024-12-03,1.3389070925345936,603988.SH +2024-12-04,0.9724703217477085,002866.SZ +2024-12-05,1.1820066931371673,002045.SZ +2024-12-06,0.702633993004417,603955.SH +2024-12-09,0.986300912906341,002400.SZ +2024-12-10,1.0694233381915759,603009.SH +2024-12-11,1.4583996811745925,002523.SZ +2024-12-12,1.5136126137374508,000056.SZ +2024-12-13,1.5306775400034158,002403.SZ +2024-12-16,1.3548499975799122,002862.SZ +2024-12-17,1.0816603024899243,002829.SZ +2024-12-18,1.5937527009389363,002291.SZ +2024-12-19,1.4508640367466707,002115.SZ +2024-12-20,1.4821316584936668,002596.SZ +2024-12-23,1.1794986226771982,600579.SH +2024-12-24,1.7389680129185743,002827.SZ +2024-12-25,1.649017748385972,600171.SH +2024-12-26,1.7696923198048153,002281.SZ +2024-12-27,1.1337434234848607,600255.SH +2024-12-30,1.0102646147049015,603766.SH +2024-12-31,1.3947009168202393,600575.SH +2025-01-02,1.8343279919966315,600579.SH +2025-01-03,0.5208313850150224,600579.SH +2025-01-06,1.2892483141834639,002885.SZ +2025-01-07,1.5109173315820226,000785.SZ +2025-01-08,1.56448373523511,002397.SZ +2025-01-09,1.8458006748965172,600693.SH +2025-01-10,1.0446537095115835,002187.SZ +2025-01-13,1.5601399184465283,603291.SH +2025-01-14,0.9126074803611137,603111.SH +2025-01-15,1.226705737679718,603682.SH +2025-01-16,1.3681702838139207,603068.SH +2025-01-17,1.6510820690580863,002364.SZ +2025-01-20,1.3105444270738227,600397.SH +2025-01-21,1.7339910941570722,603893.SH +2025-01-22,1.373916186962813,000882.SZ +2025-01-23,1.4558533085692458,002862.SZ +2025-01-24,1.0716752882099643,603007.SH +2025-01-27,1.4865524218493547,002729.SZ +2025-02-05,1.7992871509065032,002691.SZ +2025-02-06,1.1176902844045602,002718.SZ +2025-02-07,1.4506609558427115,002611.SZ +2025-02-10,1.419948262743792,002315.SZ +2025-02-11,1.143471566043956,600602.SH +2025-02-12,1.8343837175429396,600666.SH +2025-02-13,1.6485843939147118,000681.SZ +2025-02-14,1.287261052085076,603278.SH +2025-02-17,1.5086549290752838,002261.SZ +2025-02-18,1.9579993491265792,002987.SZ +2025-02-19,1.4623554647631918,002987.SZ +2025-02-20,1.1597633131881708,603918.SH +2025-02-21,1.7742197502155852,603956.SH +2025-02-24,1.6174585863378912,603039.SH +2025-02-25,1.3183356907810295,600126.SH +2025-02-26,1.6195107763484244,600355.SH +2025-02-27,1.5830720938219507,002474.SZ +2025-02-28,1.2620992910530977,600421.SH +2025-03-03,0.9344670555786003,603275.SH +2025-03-04,1.660775349800762,600734.SH +2025-03-05,1.6850485887205457,603990.SH +2025-03-06,1.2881654331768984,000710.SZ +2025-03-07,1.69518723759051,600589.SH +2025-03-10,1.0597074552562824,603048.SH +2025-03-11,0.7876665841093328,002276.SZ +2025-03-12,1.362109917103578,603326.SH +2025-03-13,1.535070570378538,002921.SZ +2025-03-14,1.1639083018644396,002342.SZ +2025-03-17,1.5170533918197673,603960.SH +2025-03-18,0.984190240830742,002345.SZ +2025-03-19,1.4857738309978115,000665.SZ +2025-03-20,1.5977431973677243,603949.SH +2025-03-21,1.4622401586446292,002863.SZ +2025-03-24,1.7644931546709082,603090.SH +2025-03-25,1.473887697281305,002255.SZ +2025-03-26,1.5590038684257612,603090.SH +2025-03-27,1.4157780522611754,603949.SH +2025-03-28,1.046972778273044,603588.SH