diff --git a/main/data/cyq_perf.ipynb b/main/data/cyq_perf.ipynb index 70d220b..fa782de 100644 --- a/main/data/cyq_perf.ipynb +++ b/main/data/cyq_perf.ipynb @@ -75,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "1b5a82fbf4e380de", "metadata": { "ExecuteTime": { @@ -88,7 +88,7 @@ "import pandas as pd\n", "import time\n", "\n", - "h5_filename = '../../../data/sw_daily.h5'\n", + "h5_filename = '../../../data/cyq_perf.h5'\n", "\n", "trade_cal = pro.trade_cal(exchange='', start_date='20170101', end_date='20250420')\n", "trade_cal = trade_cal[trade_cal['is_open'] == 1] # 只保留交易日\n", diff --git a/main/data/index_and_industry.ipynb b/main/data/index_and_industry.ipynb index a812726..525ec00 100644 --- a/main/data/index_and_industry.ipynb +++ b/main/data/index_and_industry.ipynb @@ -39,19 +39,16 @@ "text": [ "数据已经成功存储到index_data.h5文件中\n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\liaozhaorun\\AppData\\Local\\Temp\\ipykernel_16940\\1832869062.py:13: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", - " final_df = pd.concat(all_data, ignore_index=True)\n" - ] } ], "source": [ "# 定义四个指数\n", - "index_list = ['399300.SH', '000905.SH', '000852.SH', '399006.SZ']\n", + "index_list = [\n", + " # '399300.SZ', \n", + " '000905.SH', \n", + " '000852.SH', \n", + " '399006.SZ'\n", + " ]\n", "\n", "# 获取并存储数据\n", "all_data = []\n", @@ -59,6 +56,7 @@ "for ts_code in index_list:\n", " df = pro.index_daily(ts_code=ts_code) # 可根据需要设置日期\n", " df['ts_code'] = ts_code # 添加ts_code列来区分数据\n", + " # print(df)\n", " all_data.append(df)\n", "\n", "# 合并所有数据\n", @@ -86,32 +84,32 @@ "output_type": "stream", "text": [ " ts_code trade_date close open high low \\\n", - "0 000905.SH 20250509 5721.7225 5770.4410 5770.4410 5705.1654 \n", - "1 000905.SH 20250508 5773.8056 5731.7157 5783.7915 5724.9511 \n", - "2 000905.SH 20250507 5750.2911 5805.6560 5819.2422 5713.2734 \n", - "3 000905.SH 20250506 5740.3338 5668.8762 5740.3338 5666.4698 \n", - "4 000905.SH 20250430 5631.8249 5604.6537 5647.7821 5603.1718 \n", + "0 000905.SH 20250523 5653.0436 5697.1362 5738.0829 5653.0436 \n", + "1 000905.SH 20250522 5703.2797 5739.1909 5757.7946 5701.1614 \n", + "2 000905.SH 20250521 5757.9225 5741.6885 5763.0788 5733.8275 \n", + "3 000905.SH 20250520 5747.3670 5723.5055 5759.4582 5707.8101 \n", + "4 000905.SH 20250519 5720.7949 5719.4381 5729.0703 5669.7208 \n", "... ... ... ... ... ... ... \n", - "13501 399006.SZ 20100607 1069.4680 1005.0280 1075.2250 1001.7020 \n", - "13502 399006.SZ 20100604 1027.6810 989.6810 1027.6810 986.5040 \n", - "13503 399006.SZ 20100603 998.3940 1002.3550 1026.7020 997.7750 \n", - "13504 399006.SZ 20100602 997.1190 967.6090 997.1190 952.6110 \n", - "13505 399006.SZ 20100601 973.2330 986.0150 994.7930 948.1180 \n", + "13531 399006.SZ 20100607 1069.4680 1005.0280 1075.2250 1001.7020 \n", + "13532 399006.SZ 20100604 1027.6810 989.6810 1027.6810 986.5040 \n", + "13533 399006.SZ 20100603 998.3940 1002.3550 1026.7020 997.7750 \n", + "13534 399006.SZ 20100602 997.1190 967.6090 997.1190 952.6110 \n", + "13535 399006.SZ 20100601 973.2330 986.0150 994.7930 948.1180 \n", "\n", - " pre_close change pct_chg vol amount \n", - "0 5773.8056 -52.0831 -0.9021 1.239390e+08 1.781623e+08 \n", - "1 5750.2911 23.5145 0.4089 1.361403e+08 1.870326e+08 \n", - "2 5740.3338 9.9573 0.1735 1.710118e+08 2.275662e+08 \n", - "3 5631.8249 108.5089 1.9267 1.627736e+08 2.170600e+08 \n", - "4 5604.9057 26.9192 0.4803 1.383866e+08 1.816166e+08 \n", - "... ... ... ... ... ... \n", - "13501 1027.6810 41.7870 4.0661 2.655275e+06 9.106095e+06 \n", - "13502 998.3940 29.2870 2.9334 1.500295e+06 5.269441e+06 \n", - "13503 997.1190 1.2750 0.1279 1.616805e+06 6.240835e+06 \n", - "13504 973.2330 23.8860 2.4543 1.074628e+06 4.001206e+06 \n", - "13505 1000.0000 -26.7670 -2.6767 1.356285e+06 4.924177e+06 \n", + " pre_close change pct_chg vol amount \n", + "0 5703.2797 -50.2361 -0.8808 1.143612e+08 1.481236e+08 \n", + "1 5757.9225 -54.6428 -0.9490 1.090577e+08 1.416209e+08 \n", + "2 5747.3670 10.5555 0.1837 1.158045e+08 1.551474e+08 \n", + "3 5720.7949 26.5721 0.4645 1.168966e+08 1.517512e+08 \n", + "4 5715.8491 4.9458 0.0865 1.153849e+08 1.410987e+08 \n", + "... ... ... ... ... ... \n", + "13531 1027.6810 41.7870 4.0661 2.655275e+06 9.106095e+06 \n", + "13532 998.3940 29.2870 2.9334 1.500295e+06 5.269441e+06 \n", + "13533 997.1190 1.2750 0.1279 1.616805e+06 6.240835e+06 \n", + "13534 973.2330 23.8860 2.4543 1.074628e+06 4.001206e+06 \n", + "13535 1000.0000 -26.7670 -2.6767 1.356285e+06 4.924177e+06 \n", "\n", - "[13506 rows x 11 columns]\n" + "[13536 rows x 11 columns]\n" ] } ], diff --git a/main/data/name_change.ipynb b/main/data/name_change.ipynb index fd3eea6..e1e4cda 100644 --- a/main/data/name_change.ipynb +++ b/main/data/name_change.ipynb @@ -183,7 +183,7 @@ "成功获取 000572.SZ 的数据\n", "成功获取 000573.SZ 的数据\n", "成功获取 000576.SZ 的数据\n", - "已调用300次API,等待 40.75 秒以满足速率限制...\n", + "已调用300次API,等待 40.21 秒以满足速率限制...\n", "成功获取 000581.SZ 的数据\n", "成功获取 000582.SZ 的数据\n", "成功获取 000584.SZ 的数据\n", @@ -334,7 +334,7 @@ "成功获取 000811.SZ 的数据\n", "成功获取 000812.SZ 的数据\n", "成功获取 000813.SZ 的数据\n", - "已调用300次API,等待 8.60 秒以满足速率限制...\n", + "已调用300次API,等待 40.67 秒以满足速率限制...\n", "成功获取 000815.SZ 的数据\n", "成功获取 000816.SZ 的数据\n", "成功获取 000818.SZ 的数据\n", @@ -485,7 +485,7 @@ "成功获取 001238.SZ 的数据\n", "成功获取 001239.SZ 的数据\n", "成功获取 001255.SZ 的数据\n", - "已调用300次API,等待 16.22 秒以满足速率限制...\n", + "已调用300次API,等待 40.55 秒以满足速率限制...\n", "成功获取 001256.SZ 的数据\n", "成功获取 001258.SZ 的数据\n", "成功获取 001259.SZ 的数据\n", @@ -636,7 +636,7 @@ "成功获取 002085.SZ 的数据\n", "成功获取 002086.SZ 的数据\n", "成功获取 002088.SZ 的数据\n", - "已调用300次API,等待 16.73 秒以满足速率限制...\n", + "已调用300次API,等待 40.85 秒以满足速率限制...\n", "成功获取 002090.SZ 的数据\n", "成功获取 002091.SZ 的数据\n", "成功获取 002092.SZ 的数据\n", @@ -787,7 +787,7 @@ "成功获取 002242.SZ 的数据\n", "成功获取 002243.SZ 的数据\n", "成功获取 002244.SZ 的数据\n", - "已调用300次API,等待 21.90 秒以满足速率限制...\n", + "已调用300次API,等待 39.17 秒以满足速率限制...\n", "成功获取 002245.SZ 的数据\n", "成功获取 002246.SZ 的数据\n", "成功获取 002247.SZ 的数据\n", @@ -938,7 +938,7 @@ "成功获取 002400.SZ 的数据\n", "成功获取 002401.SZ 的数据\n", "成功获取 002402.SZ 的数据\n", - "已调用300次API,等待 38.45 秒以满足速率限制...\n", + "已调用300次API,等待 39.14 秒以满足速率限制...\n", "成功获取 002403.SZ 的数据\n", "成功获取 002404.SZ 的数据\n", "成功获取 002405.SZ 的数据\n", @@ -1089,7 +1089,7 @@ "成功获取 002566.SZ 的数据\n", "成功获取 002567.SZ 的数据\n", "成功获取 002568.SZ 的数据\n", - "已调用300次API,等待 39.17 秒以满足速率限制...\n", + "已调用300次API,等待 39.79 秒以满足速率限制...\n", "成功获取 002569.SZ 的数据\n", "成功获取 002570.SZ 的数据\n", "成功获取 002571.SZ 的数据\n", @@ -1240,7 +1240,7 @@ "成功获取 002729.SZ 的数据\n", "成功获取 002730.SZ 的数据\n", "成功获取 002731.SZ 的数据\n", - "已调用300次API,等待 38.52 秒以满足速率限制...\n", + "已调用300次API,等待 40.41 秒以满足速率限制...\n", "成功获取 002732.SZ 的数据\n", "成功获取 002733.SZ 的数据\n", "成功获取 002734.SZ 的数据\n", @@ -1391,7 +1391,7 @@ "成功获取 002896.SZ 的数据\n", "成功获取 002897.SZ 的数据\n", "成功获取 002898.SZ 的数据\n", - "已调用300次API,等待 38.60 秒以满足速率限制...\n", + "已调用300次API,等待 40.53 秒以满足速率限制...\n", "成功获取 002899.SZ 的数据\n", "成功获取 002900.SZ 的数据\n", "成功获取 002901.SZ 的数据\n", @@ -1542,7 +1542,7 @@ "成功获取 300014.SZ 的数据\n", "成功获取 300015.SZ 的数据\n", "成功获取 300016.SZ 的数据\n", - "已调用300次API,等待 37.75 秒以满足速率限制...\n", + "已调用300次API,等待 40.55 秒以满足速率限制...\n", "成功获取 300017.SZ 的数据\n", "成功获取 300018.SZ 的数据\n", "成功获取 300019.SZ 的数据\n", @@ -1693,7 +1693,7 @@ "成功获取 300174.SZ 的数据\n", "成功获取 300175.SZ 的数据\n", "成功获取 300176.SZ 的数据\n", - "已调用300次API,等待 40.54 秒以满足速率限制...\n", + "已调用300次API,等待 38.94 秒以满足速率限制...\n", "成功获取 300177.SZ 的数据\n", "成功获取 300179.SZ 的数据\n", "成功获取 300180.SZ 的数据\n", @@ -1844,7 +1844,7 @@ "成功获取 300337.SZ 的数据\n", "成功获取 300338.SZ 的数据\n", "成功获取 300339.SZ 的数据\n", - "已调用300次API,等待 40.50 秒以满足速率限制...\n", + "已调用300次API,等待 37.41 秒以满足速率限制...\n", "成功获取 300340.SZ 的数据\n", "成功获取 300341.SZ 的数据\n", "成功获取 300342.SZ 的数据\n", @@ -1995,7 +1995,7 @@ "成功获取 300494.SZ 的数据\n", "成功获取 300496.SZ 的数据\n", "成功获取 300497.SZ 的数据\n", - "已调用300次API,等待 38.45 秒以满足速率限制...\n", + "已调用300次API,等待 39.25 秒以满足速率限制...\n", "成功获取 300498.SZ 的数据\n", "成功获取 300499.SZ 的数据\n", "成功获取 300500.SZ 的数据\n", @@ -2146,7 +2146,7 @@ "成功获取 300650.SZ 的数据\n", "成功获取 300651.SZ 的数据\n", "成功获取 300652.SZ 的数据\n", - "已调用300次API,等待 40.83 秒以满足速率限制...\n", + "已调用300次API,等待 39.97 秒以满足速率限制...\n", "成功获取 300653.SZ 的数据\n", "成功获取 300654.SZ 的数据\n", "成功获取 300655.SZ 的数据\n", @@ -2297,7 +2297,7 @@ "成功获取 300810.SZ 的数据\n", "成功获取 300811.SZ 的数据\n", "成功获取 300812.SZ 的数据\n", - "已调用300次API,等待 40.11 秒以满足速率限制...\n", + "已调用300次API,等待 37.73 秒以满足速率限制...\n", "成功获取 300813.SZ 的数据\n", "成功获取 300814.SZ 的数据\n", "成功获取 300815.SZ 的数据\n", @@ -2448,7 +2448,7 @@ "成功获取 300966.SZ 的数据\n", "成功获取 300967.SZ 的数据\n", "成功获取 300968.SZ 的数据\n", - "已调用300次API,等待 40.87 秒以满足速率限制...\n", + "已调用300次API,等待 41.01 秒以满足速率限制...\n", "成功获取 300969.SZ 的数据\n", "成功获取 300970.SZ 的数据\n", "成功获取 300971.SZ 的数据\n", @@ -2599,7 +2599,7 @@ "成功获取 301128.SZ 的数据\n", "成功获取 301129.SZ 的数据\n", "成功获取 301130.SZ 的数据\n", - "已调用300次API,等待 40.16 秒以满足速率限制...\n", + "已调用300次API,等待 40.96 秒以满足速率限制...\n", "成功获取 301131.SZ 的数据\n", "成功获取 301132.SZ 的数据\n", "成功获取 301133.SZ 的数据\n", @@ -2750,7 +2750,7 @@ "成功获取 301313.SZ 的数据\n", "成功获取 301314.SZ 的数据\n", "成功获取 301315.SZ 的数据\n", - "已调用300次API,等待 40.63 秒以满足速率限制...\n", + "已调用300次API,等待 40.38 秒以满足速率限制...\n", "成功获取 301316.SZ 的数据\n", "成功获取 301317.SZ 的数据\n", "成功获取 301318.SZ 的数据\n", @@ -2901,7 +2901,7 @@ "成功获取 301618.SZ 的数据\n", "成功获取 301622.SZ 的数据\n", "成功获取 301626.SZ 的数据\n", - "已调用300次API,等待 39.95 秒以满足速率限制...\n", + "已调用300次API,等待 39.97 秒以满足速率限制...\n", "成功获取 301628.SZ 的数据\n", "成功获取 301631.SZ 的数据\n", "成功获取 301633.SZ 的数据\n", @@ -3052,7 +3052,7 @@ "成功获取 600170.SH 的数据\n", "成功获取 600171.SH 的数据\n", "成功获取 600172.SH 的数据\n", - "已调用300次API,等待 39.18 秒以满足速率限制...\n", + "已调用300次API,等待 39.68 秒以满足速率限制...\n", "成功获取 600173.SH 的数据\n", "成功获取 600176.SH 的数据\n", "成功获取 600177.SH 的数据\n", @@ -3203,7 +3203,7 @@ "成功获取 600366.SH 的数据\n", "成功获取 600367.SH 的数据\n", "成功获取 600368.SH 的数据\n", - "已调用300次API,等待 40.48 秒以满足速率限制...\n", + "已调用300次API,等待 39.52 秒以满足速率限制...\n", "成功获取 600369.SH 的数据\n", "成功获取 600370.SH 的数据\n", "成功获取 600371.SH 的数据\n", @@ -3354,7 +3354,7 @@ "成功获取 600572.SH 的数据\n", "成功获取 600573.SH 的数据\n", "成功获取 600575.SH 的数据\n", - "已调用300次API,等待 39.24 秒以满足速率限制...\n", + "已调用300次API,等待 40.15 秒以满足速率限制...\n", "成功获取 600576.SH 的数据\n", "成功获取 600577.SH 的数据\n", "成功获取 600578.SH 的数据\n", @@ -3505,7 +3505,7 @@ "成功获取 600748.SH 的数据\n", "成功获取 600749.SH 的数据\n", "成功获取 600750.SH 的数据\n", - "已调用300次API,等待 39.49 秒以满足速率限制...\n", + "已调用300次API,等待 40.58 秒以满足速率限制...\n", "成功获取 600751.SH 的数据\n", "成功获取 600753.SH 的数据\n", "成功获取 600754.SH 的数据\n", @@ -3656,7 +3656,7 @@ "成功获取 600956.SH 的数据\n", "成功获取 600958.SH 的数据\n", "成功获取 600959.SH 的数据\n", - "已调用300次API,等待 40.83 秒以满足速率限制...\n", + "已调用300次API,等待 40.13 秒以满足速率限制...\n", "成功获取 600960.SH 的数据\n", "成功获取 600961.SH 的数据\n", "成功获取 600962.SH 的数据\n", @@ -3807,7 +3807,7 @@ "成功获取 601519.SH 的数据\n", "成功获取 601528.SH 的数据\n", "成功获取 601555.SH 的数据\n", - "已调用300次API,等待 40.73 秒以满足速率限制...\n", + "已调用300次API,等待 38.43 秒以满足速率限制...\n", "成功获取 601566.SH 的数据\n", "成功获取 601567.SH 的数据\n", "成功获取 601568.SH 的数据\n", @@ -3958,7 +3958,7 @@ "成功获取 603041.SH 的数据\n", "成功获取 603042.SH 的数据\n", "成功获取 603043.SH 的数据\n", - "已调用300次API,等待 40.08 秒以满足速率限制...\n", + "已调用300次API,等待 40.56 秒以满足速率限制...\n", "成功获取 603045.SH 的数据\n", "成功获取 603048.SH 的数据\n", "成功获取 603050.SH 的数据\n", @@ -4109,7 +4109,7 @@ "成功获取 603228.SH 的数据\n", "成功获取 603229.SH 的数据\n", "成功获取 603230.SH 的数据\n", - "已调用300次API,等待 40.23 秒以满足速率限制...\n", + "已调用300次API,等待 40.37 秒以满足速率限制...\n", "成功获取 603231.SH 的数据\n", "成功获取 603232.SH 的数据\n", "成功获取 603233.SH 的数据\n", @@ -4260,7 +4260,7 @@ "成功获取 603530.SH 的数据\n", "成功获取 603533.SH 的数据\n", "成功获取 603535.SH 的数据\n", - "已调用300次API,等待 40.89 秒以满足速率限制...\n", + "已调用300次API,等待 39.94 秒以满足速率限制...\n", "成功获取 603536.SH 的数据\n", "成功获取 603538.SH 的数据\n", "成功获取 603551.SH 的数据\n", @@ -4411,7 +4411,7 @@ "成功获取 603819.SH 的数据\n", "成功获取 603822.SH 的数据\n", "成功获取 603823.SH 的数据\n", - "已调用300次API,等待 38.75 秒以满足速率限制...\n", + "已调用300次API,等待 39.12 秒以满足速率限制...\n", "成功获取 603825.SH 的数据\n", "成功获取 603826.SH 的数据\n", "成功获取 603828.SH 的数据\n", @@ -4562,7 +4562,7 @@ "成功获取 605167.SH 的数据\n", "成功获取 605168.SH 的数据\n", "成功获取 605169.SH 的数据\n", - "已调用300次API,等待 40.37 秒以满足速率限制...\n", + "已调用300次API,等待 40.12 秒以满足速率限制...\n", "成功获取 605177.SH 的数据\n", "成功获取 605178.SH 的数据\n", "成功获取 605179.SH 的数据\n", @@ -4713,7 +4713,7 @@ "成功获取 688097.SH 的数据\n", "成功获取 688098.SH 的数据\n", "成功获取 688099.SH 的数据\n", - "已调用300次API,等待 39.89 秒以满足速率限制...\n", + "已调用300次API,等待 40.20 秒以满足速率限制...\n", "成功获取 688100.SH 的数据\n", "成功获取 688101.SH 的数据\n", "成功获取 688102.SH 的数据\n", @@ -4864,7 +4864,7 @@ "成功获取 688271.SH 的数据\n", "成功获取 688272.SH 的数据\n", "成功获取 688273.SH 的数据\n", - "已调用300次API,等待 39.50 秒以满足速率限制...\n", + "已调用300次API,等待 41.07 秒以满足速率限制...\n", "成功获取 688275.SH 的数据\n", "成功获取 688276.SH 的数据\n", "成功获取 688277.SH 的数据\n", @@ -5015,7 +5015,7 @@ "成功获取 688486.SH 的数据\n", "成功获取 688488.SH 的数据\n", "成功获取 688489.SH 的数据\n", - "已调用300次API,等待 39.30 秒以满足速率限制...\n", + "已调用300次API,等待 40.39 秒以满足速率限制...\n", "成功获取 688496.SH 的数据\n", "成功获取 688498.SH 的数据\n", "成功获取 688499.SH 的数据\n", @@ -5166,7 +5166,7 @@ "成功获取 688689.SH 的数据\n", "成功获取 688690.SH 的数据\n", "成功获取 688691.SH 的数据\n", - "已调用300次API,等待 40.48 秒以满足速率限制...\n", + "已调用300次API,等待 40.83 秒以满足速率限制...\n", "成功获取 688692.SH 的数据\n", "成功获取 688693.SH 的数据\n", "成功获取 688695.SH 的数据\n", @@ -5317,7 +5317,7 @@ "成功获取 835184.BJ 的数据\n", "成功获取 835185.BJ 的数据\n", "成功获取 835207.BJ 的数据\n", - "已调用300次API,等待 40.17 秒以满足速率限制...\n", + "已调用300次API,等待 41.07 秒以满足速率限制...\n", "成功获取 835237.BJ 的数据\n", "成功获取 835305.BJ 的数据\n", "成功获取 835368.BJ 的数据\n", @@ -5468,7 +5468,7 @@ "成功获取 000005.SZ 的数据\n", "成功获取 000013.SZ 的数据\n", "成功获取 000015.SZ 的数据\n", - "已调用300次API,等待 40.97 秒以满足速率限制...\n", + "已调用300次API,等待 41.06 秒以满足速率限制...\n", "成功获取 000018.SZ 的数据\n", "成功获取 000023.SZ 的数据\n", "成功获取 000024.SZ 的数据\n", @@ -5619,7 +5619,7 @@ "成功获取 300309.SZ 的数据\n", "成功获取 300312.SZ 的数据\n", "成功获取 300325.SZ 的数据\n", - "已调用300次API,等待 39.81 秒以满足速率限制...\n", + "已调用300次API,等待 41.04 秒以满足速率限制...\n", "成功获取 300330.SZ 的数据\n", "成功获取 300336.SZ 的数据\n", "成功获取 300356.SZ 的数据\n", @@ -5761,7 +5761,7 @@ "2 000001.SZ 深发展A 20070620 20120801 完成股改\n", "3 000001.SZ 深发展A 20070620 20120801 完成股改\n", "4 000001.SZ S深发展A 20061009 20070619 未股改加S\n", - "名称变化记录总数: 32259\n" + "名称变化记录总数: 32284\n" ] } ], diff --git a/main/data/top_list.ipynb b/main/data/top_list.ipynb new file mode 100644 index 0000000..b8ce057 --- /dev/null +++ b/main/data/top_list.ipynb @@ -0,0 +1,2538 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "initial_id", + "metadata": { + "ExecuteTime": { + "end_time": "2025-03-12T15:31:25.004019Z", + "start_time": "2025-03-12T15:31:24.322440Z" + } + }, + "outputs": [], + "source": [ + "from operator import index\n", + "\n", + "import tushare as ts\n", + "import pandas as pd\n", + "import time\n", + "\n", + "ts.set_token('3a0741c702ee7e5e5f2bf1f0846bafaafe4e320833240b2a7e4a685f')\n", + "pro = ts.pro_api()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "972a5ac9f79fe373", + "metadata": { + "ExecuteTime": { + "end_time": "2025-03-12T15:31:40.917015Z", + "start_time": "2025-03-12T15:31:35.958771Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " trade_date ts_code name close pct_change turnover_rate amount \\\n", + "0 20200826 000004.SZ 国农科技 23.8 -9.7117 7.21 149306898.0 \n", + "1 20200826 000004.SZ 国华网安 23.8 -9.7117 7.21 149306898.0 \n", + "\n", + " l_sell l_buy l_amount net_amount net_rate amount_rate \\\n", + "0 52431453.51 14154131.0 66585584.51 -38277322.51 -25.64 44.6 \n", + "1 52431453.51 14154131.0 66585584.51 -38277322.51 -25.64 44.6 \n", + "\n", + " float_values reason \n", + "0 1.997265e+09 日跌幅偏离值达到7%的前5只证券 \n", + "1 1.997265e+09 日跌幅偏离值达到7%的前5只证券 \n" + ] + } + ], + "source": [ + "\n", + "df = pro.top_list(trade_date='20200826')\n", + "print(df[df['ts_code'] == '000004.SZ'])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1b5a82fbf4e380de", + "metadata": { + "ExecuteTime": { + "end_time": "2025-03-12T15:30:20.421604Z", + "start_time": "2025-03-12T15:30:20.224851Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import time\n", + "\n", + "h5_filename = '../../data/top_list.h5'\n", + "\n", + "trade_cal = pro.trade_cal(exchange='', start_date='20170101', end_date='20250720')\n", + "trade_cal = trade_cal[trade_cal['is_open'] == 1] # 只保留交易日\n", + "trade_dates = trade_cal['cal_date'].tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f448da220816bf98", + "metadata": { + "ExecuteTime": { + "start_time": "2025-03-12T15:30:20.436796Z" + }, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "任务 20250718 完成\n", + "任务 20250717 完成\n", + "任务 20250715 完成\n", + "任务 20250716 完成\n", + "任务 20250714 完成\n", + "任务 20250711 完成\n", + "任务 20250710 完成\n", + "任务 20250709 完成\n", + "任务 20250708 完成\n", + "任务 20250707 完成\n", + "任务 20250704 完成\n", + "任务 20250703 完成\n", + "任务 20250702 完成\n", + "任务 20250701 完成\n", + "任务 20250630 完成\n", + "任务 20250627 完成\n", + "任务 20250626 完成\n", + "任务 20250625 完成\n", + "任务 20250624 完成\n", + "任务 20250623 完成\n", + "任务 20250620 完成\n", + "任务 20250619 完成\n", + "任务 20250618 完成\n", + "任务 20250617 完成\n", + "任务 20250616 完成\n", + "任务 20250613 完成\n", + "任务 20250612 完成\n", + "任务 20250611 完成\n", + "任务 20250610 完成\n", + "任务 20250609 完成\n", + "任务 20250606 完成\n", + "任务 20250605 完成\n", + "任务 20250604 完成\n", + "任务 20250603 完成\n", + "任务 20250530 完成\n", + "任务 20250529 完成\n", + "任务 20250528 完成\n", + "任务 20250527 完成\n", + "任务 20250526 完成\n", + "任务 20250523 完成\n", + "任务 20250522 完成\n", + "任务 20250521 完成\n", + "任务 20250520 完成\n", + "任务 20250519 完成\n", + "任务 20250516 完成\n", + "任务 20250515 完成\n", + "任务 20250514 完成\n", + "任务 20250513 完成\n", + "任务 20250512 完成\n", + "任务 20250509 完成\n", + "任务 20250508 完成\n", + "任务 20250507 完成\n", + "任务 20250506 完成\n", + "任务 20250430 完成\n", + "任务 20250429 完成\n", + "任务 20250428 完成\n", + "任务 20250425 完成\n", + "任务 20250424 完成\n", + "任务 20250423 完成\n", + "任务 20250422 完成\n", + "任务 20250421 完成\n", + "任务 20250418 完成\n", + "任务 20250417 完成\n", + "任务 20250416 完成\n", + "任务 20250415 完成\n", + "任务 20250414 完成\n", + "任务 20250411 完成\n", + "任务 20250410 完成\n", + "任务 20250409 完成\n", + "任务 20250408 完成\n", + "任务 20250407 完成\n", + "任务 20250403 完成\n", + "任务 20250402 完成\n", + "任务 20250401 完成\n", + "任务 20250331 完成\n", + "任务 20250328 完成\n", + "任务 20250327 完成\n", + "任务 20250326 完成\n", + "任务 20250325 完成\n", + "任务 20250324 完成\n", + "任务 20250321 完成\n", + "任务 20250320 完成\n", + "任务 20250319 完成\n", + "任务 20250318 完成\n", + "任务 20250317 完成\n", + "任务 20250314 完成\n", + "任务 20250313 完成\n", + "任务 20250312 完成\n", + "任务 20250311 完成\n", + "任务 20250310 完成\n", + "任务 20250307 完成\n", + "任务 20250306 完成\n", + "任务 20250305 完成\n", + "任务 20250303 完成\n", + "任务 20250304 完成\n", + "任务 20250228 完成\n", + "任务 20250227 完成\n", + "任务 20250226 完成\n", + "任务 20250225 完成\n", + "任务 20250224 完成\n", + "任务 20250221 完成\n", + "任务 20250219 完成\n", + "任务 20250220 完成\n", + "任务 20250217 完成\n", + "任务 20250218 完成\n", + "任务 20250213 完成\n", + "任务 20250214 完成\n", + "任务 20250212 完成\n", + "任务 20250211 完成\n", + "任务 20250210 完成\n", + "任务 20250207 完成\n", + "任务 20250206 完成\n", + "任务 20250205 完成\n", + "任务 20250127 完成\n", + "任务 20250124 完成\n", + "任务 20250123 完成\n", + "任务 20250122 完成\n", + "任务 20250121 完成\n", + "任务 20250120 完成\n", + "任务 20250117 完成\n", + "任务 20250116 完成\n", + "任务 20250115 完成\n", + "任务 20250114 完成\n", + "任务 20250113 完成\n", + "任务 20250110 完成\n", + "任务 20250109 完成\n", + "任务 20250108 完成\n", + "任务 20250107 完成\n", + "任务 20250106 完成\n", + "任务 20250103 完成\n", + "任务 20250102 完成\n", + "任务 20241231 完成\n", + "任务 20241230 完成\n", + "任务 20241227 完成\n", + "任务 20241226 完成\n", + "任务 20241225 完成\n", + "任务 20241224 完成\n", + "任务 20241223 完成\n", + "任务 20241220 完成\n", + "任务 20241219 完成\n", + "任务 20241218 完成\n", + "任务 20241217 完成\n", + "任务 20241216 完成\n", + "任务 20241213 完成\n", + "任务 20241212 完成\n", + "任务 20241211 完成\n", + "任务 20241210 完成\n", + "任务 20241209 完成\n", + "任务 20241206 完成\n", + "任务 20241205 完成\n", + "任务 20241204 完成\n", + "任务 20241203 完成\n", + "任务 20241202 完成\n", + "任务 20241129 完成\n", + "任务 20241128 完成\n", + "任务 20241127 完成\n", + "任务 20241126 完成\n", + "任务 20241125 完成\n", + "任务 20241122 完成\n", + "任务 20241121 完成\n", + "任务 20241120 完成\n", + "任务 20241119 完成\n", + "任务 20241118 完成\n", + "任务 20241115 完成\n", + "任务 20241114 完成\n", + "任务 20241113 完成\n", + "任务 20241112 完成\n", + "任务 20241111 完成\n", + "任务 20241108 完成\n", + "任务 20241107 完成\n", + "任务 20241106 完成\n", + "任务 20241105 完成\n", + "任务 20241104 完成\n", + "任务 20241101 完成\n", + "任务 20241031 完成\n", + "任务 20241030 完成\n", + "任务 20241029 完成\n", + "任务 20241028 完成\n", + "任务 20241025 完成\n", + "任务 20241024 完成\n", + "任务 20241023 完成\n", + "任务 20241022 完成\n", + "任务 20241021 完成\n", + "任务 20241018 完成\n", + "任务 20241017 完成\n", + "任务 20241016 完成\n", + "任务 20241015 完成\n", + "任务 20241014 完成\n", + "任务 20241011 完成\n", + "任务 20241010 完成\n", + "任务 20241009 完成\n", + "任务 20241008 完成\n", + "任务 20240930 完成\n", + "任务 20240927 完成\n", + "任务 20240926 完成\n", + "任务 20240925 完成\n", + "任务 20240924 完成\n", + "任务 20240920 完成\n", + "任务 20240923 完成\n", + "任务 20240919 完成\n", + "任务 20240918 完成\n", + "任务 20240913 完成\n", + "任务 20240912 完成\n", + "任务 20240911 完成\n", + "任务 20240910 完成\n", + "任务 20240906 完成\n", + "任务 20240909 完成\n", + "任务 20240905 完成\n", + "任务 20240904 完成\n", + "任务 20240903 完成\n", + "任务 20240902 完成\n", + "任务 20240830 完成\n", + "任务 20240829 完成\n", + "任务 20240827 完成\n", + "任务 20240828 完成\n", + "任务 20240823 完成\n", + "任务 20240826 完成\n", + "任务 20240822 完成\n", + "任务 20240821 完成\n", + "任务 20240820 完成\n", + "任务 20240819 完成\n", + "任务 20240816 完成\n", + "任务 20240815 完成\n", + "任务 20240814 完成\n", + "任务 20240813 完成\n", + "任务 20240812 完成\n", + "任务 20240809 完成\n", + "任务 20240808 完成\n", + "任务 20240807 完成\n", + "任务 20240806 完成\n", + "任务 20240805 完成\n", + "任务 20240802 完成\n", + "任务 20240801 完成\n", + "任务 20240731 完成\n", + "任务 20240730 完成\n", + "任务 20240729 完成\n", + "任务 20240726 完成\n", + "任务 20240725 完成\n", + "任务 20240724 完成\n", + "任务 20240723 完成\n", + "任务 20240722 完成\n", + "任务 20240719 完成\n", + "任务 20240718 完成\n", + "任务 20240717 完成\n", + "任务 20240716 完成\n", + "任务 20240715 完成\n", + "任务 20240712 完成\n", + "任务 20240711 完成\n", + "任务 20240710 完成\n", + "任务 20240709 完成\n", + "任务 20240708 完成\n", + "任务 20240705 完成\n", + "任务 20240704 完成\n", + "任务 20240703 完成\n", + "任务 20240702 完成\n", + "任务 20240701 完成\n", + "任务 20240628 完成\n", + "任务 20240627 完成\n", + "任务 20240626 完成\n", + "任务 20240625 完成\n", + "任务 20240624 完成\n", + "任务 20240621 完成\n", + "任务 20240620 完成\n", + "任务 20240619 完成\n", + "任务 20240618 完成\n", + "任务 20240617 完成\n", + "任务 20240614 完成\n", + "任务 20240613 完成\n", + "任务 20240612 完成\n", + "任务 20240611 完成\n", + "任务 20240607 完成\n", + "任务 20240606 完成\n", + "任务 20240605 完成\n", + "任务 20240604 完成\n", + "任务 20240603 完成\n", + "任务 20240531 完成\n", + "任务 20240530 完成\n", + "任务 20240529 完成\n", + "任务 20240528 完成\n", + "任务 20240527 完成\n", + "任务 20240524 完成\n", + "任务 20240523 完成\n", + "任务 20240522 完成\n", + "任务 20240521 完成\n", + "任务 20240520 完成\n", + "任务 20240517 完成\n", + "任务 20240516 完成\n", + "任务 20240515 完成\n", + "任务 20240514 完成\n", + "任务 20240513 完成\n", + "任务 20240510 完成\n", + "任务 20240509 完成\n", + "任务 20240508 完成\n", + "任务 20240507 完成\n", + "任务 20240506 完成\n", + "任务 20240430 完成\n", + "任务 20240429 完成\n", + "任务 20240426 完成\n", + "任务 20240425 完成\n", + "任务 20240424 完成\n", + "任务 20240423 完成\n", + "任务 20240422 完成\n", + "任务 20240419 完成\n", + "任务 20240418 完成\n", + "任务 20240417 完成\n", + "任务 20240416 完成\n", + "任务 20240415 完成\n", + "任务 20240412 完成\n", + "任务 20240411 完成\n", + "任务 20240410 完成\n", + "任务 20240409 完成\n", + "任务 20240408 完成\n", + "任务 20240403 完成\n", + "任务 20240402 完成\n", + "任务 20240401 完成\n", + "任务 20240329 完成\n", + "任务 20240328 完成\n", + "任务 20240327 完成\n", + "任务 20240326 完成\n", + "任务 20240325 完成\n", + "任务 20240322 完成\n", + "任务 20240321 完成\n", + "任务 20240320 完成\n", + "任务 20240319 完成\n", + "任务 20240318 完成\n", + "任务 20240315 完成\n", + "任务 20240314 完成\n", + "任务 20240313 完成\n", + "任务 20240312 完成\n", + "任务 20240311 完成\n", + "任务 20240308 完成\n", + "任务 20240307 完成\n", + "任务 20240306 完成\n", + "任务 20240305 完成\n", + "任务 20240304 完成\n", + "任务 20240301 完成\n", + "任务 20240229 完成\n", + "任务 20240228 完成\n", + "任务 20240227 完成\n", + "任务 20240226 完成\n", + "任务 20240223 完成\n", + "任务 20240222 完成\n", + "任务 20240221 完成\n", + "任务 20240220 完成\n", + "任务 20240219 完成\n", + "任务 20240208 完成\n", + "任务 20240207 完成\n", + "任务 20240206 完成\n", + "任务 20240205 完成\n", + "任务 20240202 完成\n", + "任务 20240201 完成\n", + "任务 20240131 完成\n", + "任务 20240130 完成\n", + "任务 20240129 完成\n", + "任务 20240126 完成\n", + "任务 20240125 完成\n", + "任务 20240124 完成\n", + "任务 20240123 完成\n", + "任务 20240122 完成\n", + "任务 20240119 完成\n", + "任务 20240118 完成\n", + "任务 20240117 完成\n", + "任务 20240116 完成\n", + "任务 20240115 完成\n", + "任务 20240112 完成\n", + "任务 20240110 完成\n", + "任务 20240111 完成\n", + "任务 20240109 完成\n", + "任务 20240108 完成\n", + "任务 20240104 完成\n", + "任务 20240105 完成\n", + "任务 20240103 完成\n", + "任务 20240102 完成\n", + "任务 20231228 完成\n", + "任务 20231229 完成\n", + "任务 20231227 完成\n", + "任务 20231226 完成\n", + "任务 20231225 完成\n", + "任务 20231222 完成\n", + "任务 20231221 完成\n", + "任务 20231220 完成\n", + "任务 20231219 完成\n", + "任务 20231218 完成\n", + "任务 20231215 完成\n", + "任务 20231214 完成\n", + "任务 20231213 完成\n", + "任务 20231212 完成\n", + "任务 20231211 完成\n", + "任务 20231208 完成\n", + "任务 20231207 完成\n", + "任务 20231206 完成\n", + "任务 20231205 完成\n", + "任务 20231204 完成\n", + "任务 20231201 完成\n", + "任务 20231130 完成\n", + "任务 20231129 完成\n", + "任务 20231128 完成\n", + "任务 20231127 完成\n", + "任务 20231124 完成\n", + "任务 20231123 完成\n", + "任务 20231122 完成\n", + "任务 20231121 完成\n", + "任务 20231120 完成\n", + "任务 20231117 完成\n", + "任务 20231116 完成\n", + "任务 20231115 完成\n", + "任务 20231114 完成\n", + "任务 20231113 完成\n", + "任务 20231110 完成\n", + "任务 20231109 完成\n", + "任务 20231108 完成\n", + "任务 20231107 完成\n", + "任务 20231106 完成\n", + "任务 20231103 完成\n", + "任务 20231101 完成\n", + "任务 20231102 完成\n", + "任务 20231031 完成\n", + "任务 20231030 完成\n", + "任务 20231027 完成\n", + "任务 20231026 完成\n", + "任务 20231025 完成\n", + "任务 20231024 完成\n", + "任务 20231020 完成\n", + "任务 20231023 完成\n", + "任务 20231019 完成\n", + "任务 20231018 完成\n", + "任务 20231016 完成\n", + "任务 20231017 完成\n", + "任务 20231013 完成\n", + "任务 20231012 完成\n", + "任务 20231011 完成\n", + "任务 20231010 完成\n", + "任务 20230928 完成\n", + "任务 20231009 完成\n", + "任务 20230927 完成\n", + "任务 20230926 完成\n", + "任务 20230925 完成\n", + "任务 20230922 完成\n", + "任务 20230920 完成\n", + "任务 20230921 完成\n", + "任务 20230918 完成\n", + "任务 20230919 完成\n", + "任务 20230915 完成\n", + "任务 20230914 完成\n", + "任务 20230913 完成\n", + "任务 20230912 完成\n", + "任务 20230911 完成\n", + "任务 20230908 完成\n", + "任务 20230907 完成\n", + "任务 20230906 完成\n", + "任务 20230904 完成\n", + "任务 20230905 完成\n", + "任务 20230901 完成\n", + "任务 20230831 完成\n", + "任务 20230830 完成\n", + "任务 20230829 完成\n", + "任务 20230825 完成\n", + "任务 20230828 完成\n", + "任务 20230824 完成\n", + "任务 20230823 完成\n", + "任务 20230822 完成\n", + "任务 20230821 完成\n", + "任务 20230817 完成\n", + "任务 20230818 完成\n", + "任务 20230816 完成\n", + "任务 20230815 完成\n", + "任务 20230814 完成\n", + "任务 20230811 完成\n", + "任务 20230810 完成\n", + "任务 20230809 完成\n", + "任务 20230807 完成\n", + "任务 20230808 完成\n", + "任务 20230804 完成\n", + "任务 20230803 完成\n", + "任务 20230801 完成\n", + "任务 20230802 完成\n", + "任务 20230731 完成\n", + "任务 20230728 完成\n", + "任务 20230727 完成\n", + "任务 20230726 完成\n", + "任务 20230725 完成\n", + "任务 20230724 完成\n", + "任务 20230721 完成\n", + "任务 20230720 完成\n", + "任务 20230719 完成\n", + "任务 20230718 完成\n", + "任务 20230717 完成\n", + "任务 20230714 完成\n", + "任务 20230713 完成\n", + "任务 20230712 完成\n", + "任务 20230711 完成\n", + "任务 20230710 完成\n", + "任务 20230707 完成\n", + "任务 20230706 完成\n", + "任务 20230705 完成\n", + "任务 20230704 完成\n", + "任务 20230703 完成\n", + "任务 20230630 完成\n", + "任务 20230629 完成\n", + "任务 20230628 完成\n", + "任务 20230627 完成\n", + "任务 20230626 完成\n", + "任务 20230621 完成\n", + "任务 20230620 完成\n", + "任务 20230619 完成\n", + "任务 20230616 完成\n", + "任务 20230615 完成\n", + "任务 20230614 完成\n", + "任务 20230613 完成\n", + "任务 20230612 完成\n", + "任务 20230609 完成\n", + "任务 20230608 完成\n", + "任务 20230607 完成\n", + "任务 20230606 完成\n", + "任务 20230605 完成\n", + "任务 20230601 完成\n", + "任务 20230602 完成\n", + "任务 20230531 完成\n", + "任务 20230530 完成\n", + "任务 20230529 完成\n", + "任务 20230525 完成\n", + "任务 20230526 完成\n", + "任务 20230524 完成\n", + "任务 20230523 完成\n", + "任务 20230519 完成\n", + "任务 20230522 完成\n", + "任务 20230518 完成\n", + "任务 20230517 完成\n", + "任务 20230516 完成\n", + "任务 20230515 完成\n", + "任务 20230512 完成\n", + "任务 20230511 完成\n", + "任务 20230510 完成\n", + "任务 20230509 完成\n", + "任务 20230508 完成\n", + "任务 20230505 完成\n", + "任务 20230504 完成\n", + "任务 20230428 完成\n", + "任务 20230427 完成\n", + "任务 20230426 完成\n", + "任务 20230425 完成\n", + "任务 20230424 完成\n", + "任务 20230421 完成\n", + "任务 20230420 完成\n", + "任务 20230419 完成\n", + "任务 20230418 完成\n", + "任务 20230417 完成\n", + "任务 20230414 完成\n", + "任务 20230413 完成\n", + "任务 20230412 完成\n", + "任务 20230411 完成\n", + "任务 20230410 完成\n", + "任务 20230407 完成\n", + "任务 20230406 完成\n", + "任务 20230404 完成\n", + "任务 20230403 完成\n", + "任务 20230331 完成\n", + "任务 20230330 完成\n", + "任务 20230329 完成\n", + "任务 20230328 完成\n", + "任务 20230327 完成\n", + "任务 20230324 完成\n", + "任务 20230323 完成\n", + "任务 20230322 完成\n", + "任务 20230321 完成\n", + "任务 20230320 完成\n", + "任务 20230317 完成\n", + "任务 20230316 完成\n", + "任务 20230315 完成\n", + "任务 20230314 完成\n", + "任务 20230313 完成\n", + "任务 20230310 完成\n", + "任务 20230309 完成\n", + "任务 20230308 完成\n", + "任务 20230307 完成\n", + "任务 20230306 完成\n", + "任务 20230303 完成\n", + "任务 20230302 完成\n", + "任务 20230301 完成\n", + "任务 20230228 完成\n", + "任务 20230227 完成\n", + "任务 20230224 完成\n", + "任务 20230223 完成\n", + "任务 20230222 完成\n", + "任务 20230221 完成\n", + "任务 20230220 完成\n", + "任务 20230217 完成\n", + "任务 20230216 完成\n", + "任务 20230215 完成\n", + "任务 20230214 完成\n", + "任务 20230213 完成\n", + "任务 20230210 完成\n", + "任务 20230209 完成\n", + "任务 20230208 完成\n", + "任务 20230207 完成\n", + "任务 20230206 完成\n", + "任务 20230203 完成\n", + "任务 20230202 完成\n", + "任务 20230201 完成\n", + "任务 20230131 完成\n", + "任务 20230130 完成\n", + "任务 20230120 完成\n", + "任务 20230119 完成\n", + "任务 20230118 完成\n", + "任务 20230117 完成\n", + "任务 20230116 完成\n", + "任务 20230113 完成\n", + "任务 20230112 完成\n", + "任务 20230111 完成\n", + "任务 20230110 完成\n", + "任务 20230109 完成\n", + "任务 20230106 完成\n", + "任务 20230105 完成\n", + "任务 20230104 完成\n", + "任务 20230103 完成\n", + "任务 20221230 完成\n", + "任务 20221229 完成\n", + "任务 20221228 完成\n", + "任务 20221227 完成\n", + "任务 20221226 完成\n", + "任务 20221223 完成\n", + "任务 20221222 完成\n", + "任务 20221221 完成\n", + "任务 20221220 完成\n", + "任务 20221219 完成\n", + "任务 20221216 完成\n", + "任务 20221215 完成\n", + "任务 20221214 完成\n", + "任务 20221213 完成\n", + "任务 20221209 完成\n", + "任务 20221212 完成\n", + "任务 20221208 完成\n", + "任务 20221207 完成\n", + "任务 20221206 完成\n", + "任务 20221205 完成\n", + "任务 20221201 完成\n", + "任务 20221202 完成\n", + "任务 20221129 完成\n", + "任务 20221130 完成\n", + "任务 20221128 完成\n", + "任务 20221125 完成\n", + "任务 20221124 完成\n", + "任务 20221123 完成\n", + "任务 20221122 完成\n", + "任务 20221121 完成\n", + "任务 20221118 完成\n", + "任务 20221117 完成\n", + "任务 20221116 完成\n", + "任务 20221115 完成\n", + "任务 20221111 完成\n", + "任务 20221114 完成\n", + "任务 20221109 完成\n", + "任务 20221110 完成\n", + "任务 20221108 完成\n", + "任务 20221107 完成\n", + "任务 20221104 完成\n", + "任务 20221103 完成\n", + "任务 20221101 完成\n", + "任务 20221102 完成\n", + "任务 20221031 完成\n", + "任务 20221028 完成\n", + "任务 20221027 完成\n", + "任务 20221026 完成\n", + "任务 20221024 完成\n", + "任务 20221025 完成\n", + "任务 20221021 完成\n", + "任务 20221020 完成\n", + "任务 20221019 完成\n", + "任务 20221018 完成\n", + "任务 20221017 完成\n", + "任务 20221014 完成\n", + "任务 20221013 完成\n", + "任务 20221012 完成\n", + "任务 20221011 完成\n", + "任务 20221010 完成\n", + "任务 20220929 完成\n", + "任务 20220930 完成\n", + "任务 20220927 完成\n", + "任务 20220928 完成\n", + "任务 20220926 完成\n", + "任务 20220923 完成\n", + "任务 20220922 完成\n", + "任务 20220921 完成\n", + "任务 20220920 完成\n", + "任务 20220919 完成\n", + "任务 20220916 完成\n", + "任务 20220915 完成\n", + "任务 20220914 完成\n", + "任务 20220913 完成\n", + "任务 20220909 完成\n", + "任务 20220908 完成\n", + "任务 20220907 完成\n", + "任务 20220906 完成\n", + "任务 20220905 完成\n", + "任务 20220902 完成\n", + "任务 20220831 完成\n", + "任务 20220901 完成\n", + "任务 20220830 完成\n", + "任务 20220829 完成\n", + "任务 20220826 完成\n", + "任务 20220825 完成\n", + "任务 20220824 完成\n", + "任务 20220823 完成\n", + "任务 20220822 完成\n", + "任务 20220819 完成\n", + "任务 20220818 完成\n", + "任务 20220817 完成\n", + "任务 20220815 完成\n", + "任务 20220816 完成\n", + "任务 20220812 完成\n", + "任务 20220811 完成\n", + "任务 20220810 完成\n", + "任务 20220809 完成\n", + "任务 20220808 完成\n", + "任务 20220805 完成\n", + "任务 20220803 完成\n", + "任务 20220804 完成\n", + "任务 20220801 完成\n", + "任务 20220802 完成\n", + "任务 20220729 完成\n", + "任务 20220728 完成\n", + "任务 20220727 完成\n", + "任务 20220726 完成\n", + "任务 20220722 完成\n", + "任务 20220725 完成\n", + "任务 20220721 完成\n", + "任务 20220720 完成\n", + "任务 20220719 完成\n", + "任务 20220718 完成\n", + "任务 20220715 完成\n", + "任务 20220714 完成\n", + "任务 20220712 完成\n", + "任务 20220713 完成\n", + "任务 20220708 完成\n", + "任务 20220711 完成\n", + "任务 20220707 完成\n", + "任务 20220706 完成\n", + "任务 20220704 完成\n", + "任务 20220705 完成\n", + "任务 20220701 完成\n", + "任务 20220630 完成\n", + "任务 20220628 完成\n", + "任务 20220629 完成\n", + "任务 20220627 完成\n", + "任务 20220624 完成\n", + "任务 20220622 完成\n", + "任务 20220623 完成\n", + "任务 20220621 完成\n", + "任务 20220620 完成\n", + "任务 20220617 完成\n", + "任务 20220616 完成\n", + "任务 20220615 完成\n", + "任务 20220614 完成\n", + "任务 20220613 完成\n", + "任务 20220610 完成\n", + "任务 20220609 完成\n", + "任务 20220608 完成\n", + "任务 20220607 完成\n", + "任务 20220606 完成\n", + "任务 20220601 完成\n", + "任务 20220602 完成\n", + "任务 20220531 完成\n", + "任务 20220530 完成\n", + "任务 20220527 完成\n", + "任务 20220526 完成\n", + "任务 20220525 完成\n", + "任务 20220524 完成\n", + "任务 20220523 完成\n", + "任务 20220520 完成\n", + "任务 20220519 完成\n", + "任务 20220518 完成\n", + "任务 20220516 完成\n", + "任务 20220517 完成\n", + "任务 20220513 完成\n", + "任务 20220512 完成\n", + "任务 20220511 完成\n", + "任务 20220510 完成\n", + "任务 20220509 完成\n", + "任务 20220506 完成\n", + "任务 20220505 完成\n", + "任务 20220429 完成\n", + "任务 20220427 完成\n", + "任务 20220428 完成\n", + "任务 20220425 完成\n", + "任务 20220426 完成\n", + "任务 20220422 完成\n", + "任务 20220421 完成\n", + "任务 20220420 完成\n", + "任务 20220419 完成\n", + "任务 20220418 完成\n", + "任务 20220415 完成\n", + "任务 20220414 完成\n", + "任务 20220413 完成\n", + "任务 20220412 完成\n", + "任务 20220411 完成\n", + "任务 20220408 完成\n", + "任务 20220407 完成\n", + "任务 20220406 完成\n", + "任务 20220401 完成\n", + "任务 20220331 完成\n", + "任务 20220330 完成\n", + "任务 20220329 完成\n", + "任务 20220328 完成\n", + "任务 20220324 完成\n", + "任务 20220325 完成\n", + "任务 20220323 完成\n", + "任务 20220322 完成\n", + "任务 20220321 完成\n", + "任务 20220318 完成\n", + "任务 20220317 完成\n", + "任务 20220316 完成\n", + "任务 20220315 完成\n", + "任务 20220314 完成\n", + "任务 20220311 完成\n", + "任务 20220310 完成\n", + "任务 20220309 完成\n", + "任务 20220308 完成\n", + "任务 20220307 完成\n", + "任务 20220304 完成\n", + "任务 20220302 完成\n", + "任务 20220303 完成\n", + "任务 20220301 完成\n", + "任务 20220228 完成\n", + "任务 20220225 完成\n", + "任务 20220224 完成\n", + "任务 20220223 完成\n", + "任务 20220222 完成\n", + "任务 20220221 完成\n", + "任务 20220218 完成\n", + "任务 20220216 完成\n", + "任务 20220217 完成\n", + "任务 20220214 完成\n", + "任务 20220215 完成\n", + "任务 20220210 完成\n", + "任务 20220211 完成\n", + "任务 20220208 完成\n", + "任务 20220209 完成\n", + "任务 20220128 完成\n", + "任务 20220207 完成\n", + "任务 20220127 完成\n", + "任务 20220126 完成\n", + "任务 20220125 完成\n", + "任务 20220124 完成\n", + "任务 20220120 完成\n", + "任务 20220121 完成\n", + "任务 20220119 完成\n", + "任务 20220118 完成\n", + "任务 20220117 完成\n", + "任务 20220114 完成\n", + "任务 20220113 完成\n", + "任务 20220112 完成\n", + "任务 20220111 完成\n", + "任务 20220110 完成\n", + "任务 20220107 完成\n", + "任务 20220106 完成\n", + "任务 20220105 完成\n", + "任务 20220104 完成\n", + "任务 20211230 完成\n", + "任务 20211231 完成\n", + "任务 20211228 完成\n", + "任务 20211229 完成\n", + "任务 20211227 完成\n", + "任务 20211224 完成\n", + "任务 20211223 完成\n", + "任务 20211222 完成\n", + "任务 20211221 完成\n", + "任务 20211220 完成\n", + "任务 20211217 完成\n", + "任务 20211216 完成\n", + "任务 20211215 完成\n", + "任务 20211214 完成\n", + "任务 20211213 完成\n", + "任务 20211210 完成\n", + "任务 20211209 完成\n", + "任务 20211208 完成\n", + "任务 20211207 完成\n", + "任务 20211206 完成\n", + "任务 20211203 完成\n", + "任务 20211202 完成\n", + "任务 20211201 完成\n", + "任务 20211130 完成\n", + "任务 20211129 完成\n", + "任务 20211126 完成\n", + "任务 20211125 完成\n", + "任务 20211124 完成\n", + "任务 20211123 完成\n", + "任务 20211122 完成\n", + "任务 20211118 完成\n", + "任务 20211119 完成\n", + "任务 20211117 完成\n", + "任务 20211116 完成\n", + "任务 20211115 完成\n", + "任务 20211112 完成\n", + "任务 20211111 完成\n", + "任务 20211110 完成\n", + "任务 20211109 完成\n", + "任务 20211108 完成\n", + "任务 20211105 完成\n", + "任务 20211104 完成\n", + "任务 20211103 完成\n", + "任务 20211102 完成\n", + "任务 20211101 完成\n", + "任务 20211029 完成\n", + "任务 20211028 完成\n", + "任务 20211027 完成\n", + "任务 20211026 完成\n", + "任务 20211025 完成\n", + "任务 20211022 完成\n", + "任务 20211021 完成\n", + "任务 20211020 完成\n", + "任务 20211019 完成\n", + "任务 20211018 完成\n", + "任务 20211015 完成\n", + "任务 20211013 完成\n", + "任务 20211014 完成\n", + "任务 20211011 完成\n", + "任务 20211012 完成\n", + "任务 20211008 完成\n", + "任务 20210930 完成\n", + "任务 20210929 完成\n", + "任务 20210928 完成\n", + "任务 20210924 完成\n", + "任务 20210927 完成\n", + "任务 20210923 完成\n", + "任务 20210922 完成\n", + "任务 20210916 完成\n", + "任务 20210917 完成\n", + "任务 20210915 完成\n", + "任务 20210914 完成\n", + "任务 20210913 完成\n", + "任务 20210910 完成\n", + "任务 20210909 完成\n", + "任务 20210908 完成\n", + "任务 20210907 完成\n", + "任务 20210906 完成\n", + "任务 20210903 完成\n", + "任务 20210902 完成\n", + "任务 20210901 完成\n", + "任务 20210831 完成\n", + "任务 20210830 完成\n", + "任务 20210827 完成\n", + "任务 20210826 完成\n", + "任务 20210825 完成\n", + "任务 20210824 完成\n", + "任务 20210823 完成\n", + "任务 20210820 完成\n", + "任务 20210819 完成\n", + "任务 20210818 完成\n", + "任务 20210817 完成\n", + "任务 20210816 完成\n", + "任务 20210813 完成\n", + "任务 20210812 完成\n", + "任务 20210811 完成\n", + "任务 20210810 完成\n", + "任务 20210809 完成\n", + "任务 20210806 完成\n", + "任务 20210805 完成\n", + "任务 20210804 完成\n", + "任务 20210803 完成\n", + "任务 20210802 完成\n", + "任务 20210730 完成\n", + "任务 20210729 完成\n", + "任务 20210728 完成\n", + "任务 20210727 完成\n", + "任务 20210726 完成\n", + "任务 20210723 完成\n", + "任务 20210722 完成\n", + "任务 20210721 完成\n", + "任务 20210720 完成\n", + "任务 20210719 完成\n", + "任务 20210716 完成\n", + "任务 20210715 完成\n", + "任务 20210714 完成\n", + "任务 20210713 完成\n", + "任务 20210712 完成\n", + "任务 20210709 完成\n", + "任务 20210708 完成\n", + "任务 20210707 完成\n", + "任务 20210706 完成\n", + "任务 20210705 完成\n", + "任务 20210702 完成\n", + "任务 20210701 完成\n", + "任务 20210630 完成\n", + "任务 20210629 完成\n", + "任务 20210628 完成\n", + "任务 20210625 完成\n", + "任务 20210624 完成\n", + "任务 20210623 完成\n", + "任务 20210622 完成\n", + "任务 20210621 完成\n", + "任务 20210618 完成\n", + "任务 20210617 完成\n", + "任务 20210616 完成\n", + "任务 20210615 完成\n", + "任务 20210611 完成\n", + "任务 20210610 完成\n", + "任务 20210609 完成\n", + "任务 20210608 完成\n", + "任务 20210607 完成\n", + "任务 20210604 完成\n", + "任务 20210603 完成\n", + "任务 20210602 完成\n", + "任务 20210601 完成\n", + "任务 20210531 完成\n", + "任务 20210528 完成\n", + "任务 20210527 完成\n", + "任务 20210525 完成\n", + "任务 20210526 完成\n", + "任务 20210524 完成\n", + "任务 20210521 完成\n", + "任务 20210520 完成\n", + "任务 20210519 完成\n", + "任务 20210517 完成\n", + "任务 20210518 完成\n", + "任务 20210513 完成\n", + "任务 20210514 完成\n", + "任务 20210512 完成\n", + "任务 20210511 完成\n", + "任务 20210510 完成\n", + "任务 20210507 完成\n", + "任务 20210506 完成\n", + "任务 20210430 完成\n", + "任务 20210429 完成\n", + "任务 20210428 完成\n", + "任务 20210426 完成\n", + "任务 20210427 完成\n", + "任务 20210423 完成\n", + "任务 20210422 完成\n", + "任务 20210421 完成\n", + "任务 20210420 完成\n", + "任务 20210419 完成\n", + "任务 20210416 完成\n", + "任务 20210415 完成\n", + "任务 20210414 完成\n", + "任务 20210413 完成\n", + "任务 20210412 完成\n", + "任务 20210408 完成\n", + "任务 20210409 完成\n", + "任务 20210407 完成\n", + "任务 20210406 完成\n", + "任务 20210401 完成\n", + "任务 20210402 完成\n", + "任务 20210331 完成\n", + "任务 20210330 完成\n", + "任务 20210326 完成\n", + "任务 20210329 完成\n", + "任务 20210325 完成\n", + "任务 20210324 完成\n", + "任务 20210323 完成\n", + "任务 20210322 完成\n", + "任务 20210319 完成\n", + "任务 20210318 完成\n", + "任务 20210317 完成\n", + "任务 20210316 完成\n", + "任务 20210315 完成\n", + "任务 20210312 完成\n", + "任务 20210311 完成\n", + "任务 20210310 完成\n", + "任务 20210309 完成\n", + "任务 20210308 完成\n", + "任务 20210305 完成\n", + "任务 20210304 完成\n", + "任务 20210303 完成\n", + "任务 20210302 完成\n", + "任务 20210301 完成\n", + "任务 20210226 完成\n", + "任务 20210225 完成\n", + "任务 20210224 完成\n", + "任务 20210223 完成\n", + "任务 20210222 完成\n", + "任务 20210219 完成\n", + "任务 20210218 完成\n", + "任务 20210210 完成\n", + "任务 20210209 完成\n", + "任务 20210208 完成\n", + "任务 20210205 完成\n", + "任务 20210204 完成\n", + "任务 20210203 完成\n", + "任务 20210202 完成\n", + "任务 20210201 完成\n", + "任务 20210128 完成\n", + "任务 20210129 完成\n", + "任务 20210127 完成\n", + "任务 20210126 完成\n", + "任务 20210125 完成\n", + "任务 20210122 完成\n", + "任务 20210121 完成\n", + "任务 20210120 完成\n", + "任务 20210119 完成\n", + "任务 20210118 完成\n", + "任务 20210115 完成\n", + "任务 20210114 完成\n", + "任务 20210113 完成\n", + "任务 20210112 完成\n", + "任务 20210111 完成\n", + "任务 20210108 完成\n", + "任务 20210107 完成\n", + "任务 20210106 完成\n", + "任务 20210105 完成\n", + "任务 20210104 完成\n", + "任务 20201231 完成\n", + "任务 20201230 完成\n", + "任务 20201229 完成\n", + "任务 20201228 完成\n", + "任务 20201225 完成\n", + "任务 20201224 完成\n", + "任务 20201223 完成\n", + "任务 20201222 完成\n", + "任务 20201221 完成\n", + "任务 20201218 完成\n", + "任务 20201217 完成\n", + "任务 20201216 完成\n", + "任务 20201215 完成\n", + "任务 20201214 完成\n", + "任务 20201211 完成\n", + "任务 20201210 完成\n", + "任务 20201209 完成\n", + "任务 20201208 完成\n", + "任务 20201207 完成\n", + "任务 20201204 完成\n", + "任务 20201203 完成\n", + "任务 20201202 完成\n", + "任务 20201201 完成\n", + "任务 20201130 完成\n", + "任务 20201127 完成\n", + "任务 20201126 完成\n", + "任务 20201125 完成\n", + "任务 20201124 完成\n", + "任务 20201123 完成\n", + "任务 20201120 完成\n", + "任务 20201119 完成\n", + "任务 20201118 完成\n", + "任务 20201117 完成\n", + "任务 20201116 完成\n", + "任务 20201113 完成\n", + "任务 20201112 完成\n", + "任务 20201111 完成\n", + "任务 20201110 完成\n", + "任务 20201109 完成\n", + "任务 20201105 完成\n", + "任务 20201106 完成\n", + "任务 20201104 完成\n", + "任务 20201103 完成\n", + "任务 20201102 完成\n", + "任务 20201030 完成\n", + "任务 20201029 完成\n", + "任务 20201028 完成\n", + "任务 20201027 完成\n", + "任务 20201026 完成\n", + "任务 20201023 完成\n", + "任务 20201022 完成\n", + "任务 20201021 完成\n", + "任务 20201020 完成\n", + "任务 20201019 完成\n", + "任务 20201016 完成\n", + "任务 20201015 完成\n", + "任务 20201014 完成\n", + "任务 20201013 完成\n", + "任务 20201012 完成\n", + "任务 20201009 完成\n", + "任务 20200930 完成\n", + "任务 20200929 完成\n", + "任务 20200928 完成\n", + "任务 20200925 完成\n", + "任务 20200924 完成\n", + "任务 20200923 完成\n", + "任务 20200922 完成\n", + "任务 20200921 完成\n", + "任务 20200918 完成\n", + "任务 20200917 完成\n", + "任务 20200916 完成\n", + "任务 20200915 完成\n", + "任务 20200914 完成\n", + "任务 20200911 完成\n", + "任务 20200910 完成\n", + "任务 20200909 完成\n", + "任务 20200908 完成\n", + "任务 20200907 完成\n", + "任务 20200904 完成\n", + "任务 20200903 完成\n", + "任务 20200902 完成\n", + "任务 20200901 完成\n", + "任务 20200831 完成\n", + "任务 20200828 完成\n", + "任务 20200827 完成\n", + "任务 20200826 完成\n", + "任务 20200825 完成\n", + "任务 20200824 完成\n", + "任务 20200821 完成\n", + "任务 20200820 完成\n", + "任务 20200819 完成\n", + "任务 20200818 完成\n", + "任务 20200817 完成\n", + "任务 20200814 完成\n", + "任务 20200813 完成\n", + "任务 20200812 完成\n", + "任务 20200811 完成\n", + "任务 20200810 完成\n", + "任务 20200807 完成\n", + "任务 20200806 完成\n", + "任务 20200805 完成\n", + "任务 20200804 完成\n", + "任务 20200803 完成\n", + "任务 20200731 完成\n", + "任务 20200730 完成\n", + "任务 20200729 完成\n", + "任务 20200728 完成\n", + "任务 20200727 完成\n", + "任务 20200724 完成\n", + "任务 20200723 完成\n", + "任务 20200722 完成\n", + "任务 20200721 完成\n", + "任务 20200720 完成\n", + "任务 20200717 完成\n", + "任务 20200716 完成\n", + "任务 20200715 完成\n", + "任务 20200714 完成\n", + "任务 20200713 完成\n", + "任务 20200710 完成\n", + "任务 20200709 完成\n", + "任务 20200708 完成\n", + "任务 20200707 完成\n", + "任务 20200706 完成\n", + "任务 20200703 完成\n", + "任务 20200702 完成\n", + "任务 20200701 完成\n", + "任务 20200630 完成\n", + "任务 20200629 完成\n", + "任务 20200624 完成\n", + "任务 20200623 完成\n", + "任务 20200622 完成\n", + "任务 20200619 完成\n", + "任务 20200618 完成\n", + "任务 20200617 完成\n", + "任务 20200615 完成\n", + "任务 20200616 完成\n", + "任务 20200611 完成\n", + "任务 20200612 完成\n", + "任务 20200609 完成\n", + "任务 20200610 完成\n", + "任务 20200608 完成\n", + "任务 20200605 完成\n", + "任务 20200604 完成\n", + "任务 20200603 完成\n", + "任务 20200601 完成\n", + "任务 20200602 完成\n", + "任务 20200529 完成\n", + "任务 20200528 完成\n", + "任务 20200527 完成\n", + "任务 20200526 完成\n", + "任务 20200525 完成\n", + "任务 20200522 完成\n", + "任务 20200521 完成\n", + "任务 20200520 完成\n", + "任务 20200518 完成\n", + "任务 20200519 完成\n", + "任务 20200515 完成\n", + "任务 20200514 完成\n", + "任务 20200513 完成\n", + "任务 20200512 完成\n", + "任务 20200511 完成\n", + "任务 20200508 完成\n", + "任务 20200507 完成\n", + "任务 20200506 完成\n", + "任务 20200430 完成\n", + "任务 20200429 完成\n", + "任务 20200428 完成\n", + "任务 20200427 完成\n", + "任务 20200424 完成\n", + "任务 20200423 完成\n", + "任务 20200422 完成\n", + "任务 20200421 完成\n", + "任务 20200420 完成\n", + "任务 20200417 完成\n", + "任务 20200416 完成\n", + "任务 20200415 完成\n", + "任务 20200413 完成\n", + "任务 20200414 完成\n", + "任务 20200410 完成\n", + "任务 20200409 完成\n", + "任务 20200407 完成\n", + "任务 20200408 完成\n", + "任务 20200403 完成\n", + "任务 20200402 完成\n", + "任务 20200401 完成\n", + "任务 20200331 完成\n", + "任务 20200327 完成\n", + "任务 20200330 完成\n", + "任务 20200326 完成\n", + "任务 20200325 完成\n", + "任务 20200324 完成\n", + "任务 20200323 完成\n", + "任务 20200320 完成\n", + "任务 20200319 完成\n", + "任务 20200318 完成\n", + "任务 20200317 完成\n", + "任务 20200316 完成\n", + "任务 20200313 完成\n", + "任务 20200312 完成\n", + "任务 20200311 完成\n", + "任务 20200310 完成\n", + "任务 20200309 完成\n", + "任务 20200305 完成\n", + "任务 20200306 完成\n", + "任务 20200304 完成\n", + "任务 20200303 完成\n", + "任务 20200302 完成\n", + "任务 20200228 完成\n", + "任务 20200227 完成\n", + "任务 20200226 完成\n", + "任务 20200225 完成\n", + "任务 20200224 完成\n", + "任务 20200221 完成\n", + "任务 20200220 完成\n", + "任务 20200219 完成\n", + "任务 20200218 完成\n", + "任务 20200217 完成\n", + "任务 20200214 完成\n", + "任务 20200213 完成\n", + "任务 20200212 完成\n", + "任务 20200211 完成\n", + "任务 20200210 完成\n", + "任务 20200207 完成\n", + "任务 20200206 完成\n", + "任务 20200205 完成\n", + "任务 20200204 完成\n", + "任务 20200203 完成\n", + "任务 20200123 完成\n", + "任务 20200122 完成\n", + "任务 20200121 完成\n", + "任务 20200120 完成\n", + "任务 20200117 完成\n", + "任务 20200116 完成\n", + "任务 20200115 完成\n", + "任务 20200113 完成\n", + "任务 20200114 完成\n", + "任务 20200109 完成\n", + "任务 20200110 完成\n", + "任务 20200108 完成\n", + "任务 20200107 完成\n", + "任务 20200106 完成\n", + "任务 20200103 完成\n", + "任务 20200102 完成\n", + "任务 20191231 完成\n", + "任务 20191230 完成\n", + "任务 20191227 完成\n", + "任务 20191225 完成\n", + "任务 20191226 完成\n", + "任务 20191223 完成\n", + "任务 20191224 完成\n", + "任务 20191220 完成\n", + "任务 20191219 完成\n", + "任务 20191218 完成\n", + "任务 20191217 完成\n", + "任务 20191216 完成\n", + "任务 20191213 完成\n", + "任务 20191212 完成\n", + "任务 20191211 完成\n", + "任务 20191210 完成\n", + "任务 20191209 完成\n", + "任务 20191206 完成\n", + "任务 20191205 完成\n", + "任务 20191204 完成\n", + "任务 20191203 完成\n", + "任务 20191202 完成\n", + "任务 20191129 完成\n", + "任务 20191128 完成\n", + "任务 20191127 完成\n", + "任务 20191126 完成\n", + "任务 20191125 完成\n", + "任务 20191122 完成\n", + "任务 20191121 完成\n", + "任务 20191120 完成\n", + "任务 20191119 完成\n", + "任务 20191118 完成\n", + "任务 20191115 完成\n", + "任务 20191114 完成\n", + "任务 20191113 完成\n", + "任务 20191112 完成\n", + "任务 20191111 完成\n", + "任务 20191108 完成\n", + "任务 20191107 完成\n", + "任务 20191106 完成\n", + "任务 20191105 完成\n", + "任务 20191104 完成\n", + "任务 20191101 完成\n", + "任务 20191031 完成\n", + "任务 20191030 完成\n", + "任务 20191029 完成\n", + "任务 20191028 完成\n", + "任务 20191025 完成\n", + "任务 20191024 完成\n", + "任务 20191023 完成\n", + "任务 20191022 完成\n", + "任务 20191021 完成\n", + "任务 20191018 完成\n", + "任务 20191017 完成\n", + "任务 20191016 完成\n", + "任务 20191015 完成\n", + "任务 20191014 完成\n", + "任务 20191011 完成\n", + "任务 20191010 完成\n", + "任务 20191009 完成\n", + "任务 20191008 完成\n", + "任务 20190930 完成\n", + "任务 20190927 完成\n", + "任务 20190926 完成\n", + "任务 20190925 完成\n", + "任务 20190924 完成\n", + "任务 20190923 完成\n", + "任务 20190920 完成\n", + "任务 20190919 完成\n", + "任务 20190918 完成\n", + "任务 20190917 完成\n", + "任务 20190916 完成\n", + "任务 20190912 完成\n", + "任务 20190911 完成\n", + "任务 20190910 完成\n", + "任务 20190909 完成\n", + "任务 20190906 完成\n", + "任务 20190905 完成\n", + "任务 20190904 完成\n", + "任务 20190903 完成\n", + "任务 20190902 完成\n", + "任务 20190830 完成\n", + "任务 20190829 完成\n", + "任务 20190828 完成\n", + "任务 20190827 完成\n", + "任务 20190826 完成\n", + "任务 20190823 完成\n", + "任务 20190822 完成\n", + "任务 20190821 完成\n", + "任务 20190820 完成\n", + "任务 20190819 完成\n", + "任务 20190816 完成\n", + "任务 20190815 完成\n", + "任务 20190814 完成\n", + "任务 20190813 完成\n", + "任务 20190812 完成\n", + "任务 20190809 完成\n", + "任务 20190808 完成\n", + "任务 20190807 完成\n", + "任务 20190806 完成\n", + "任务 20190805 完成\n", + "任务 20190802 完成\n", + "任务 20190801 完成\n", + "任务 20190731 完成\n", + "任务 20190730 完成\n", + "任务 20190729 完成\n", + "任务 20190726 完成\n", + "任务 20190725 完成\n", + "任务 20190724 完成\n", + "任务 20190723 完成\n", + "任务 20190722 完成\n", + "任务 20190719 完成\n", + "任务 20190718 完成\n", + "任务 20190717 完成\n", + "任务 20190716 完成\n", + "任务 20190715 完成\n", + "任务 20190712 完成\n", + "任务 20190711 完成\n", + "任务 20190710 完成\n", + "任务 20190709 完成\n", + "任务 20190708 完成\n", + "任务 20190705 完成\n", + "任务 20190704 完成\n", + "任务 20190703 完成\n", + "任务 20190702 完成\n", + "任务 20190701 完成\n", + "任务 20190628 完成\n", + "任务 20190627 完成\n", + "任务 20190626 完成\n", + "任务 20190625 完成\n", + "任务 20190624 完成\n", + "任务 20190621 完成\n", + "任务 20190620 完成\n", + "任务 20190619 完成\n", + "任务 20190618 完成\n", + "任务 20190617 完成\n", + "任务 20190614 完成\n", + "任务 20190613 完成\n", + "任务 20190612 完成\n", + "任务 20190611 完成\n", + "任务 20190610 完成\n", + "任务 20190606 完成\n", + "任务 20190605 完成\n", + "任务 20190604 完成\n", + "任务 20190603 完成\n", + "任务 20190531 完成\n", + "任务 20190530 完成\n", + "任务 20190529 完成\n", + "任务 20190528 完成\n", + "任务 20190527 完成\n", + "任务 20190524 完成\n", + "任务 20190523 完成\n", + "任务 20190522 完成\n", + "任务 20190521 完成\n", + "任务 20190520 完成\n", + "任务 20190517 完成\n", + "任务 20190516 完成\n", + "任务 20190515 完成\n", + "任务 20190514 完成\n", + "任务 20190513 完成\n", + "任务 20190510 完成\n", + "任务 20190509 完成\n", + "任务 20190508 完成\n", + "任务 20190507 完成\n", + "任务 20190506 完成\n", + "任务 20190430 完成\n", + "任务 20190429 完成\n", + "任务 20190426 完成\n", + "任务 20190425 完成\n", + "任务 20190424 完成\n", + "任务 20190423 完成\n", + "任务 20190422 完成\n", + "任务 20190419 完成\n", + "任务 20190418 完成\n", + "任务 20190417 完成\n", + "任务 20190416 完成\n", + "任务 20190415 完成\n", + "任务 20190412 完成\n", + "任务 20190411 完成\n", + "任务 20190409 完成\n", + "任务 20190410 完成\n", + "任务 20190404 完成\n", + "任务 20190408 完成\n", + "任务 20190402 完成\n", + "任务 20190403 完成\n", + "任务 20190401 完成\n", + "任务 20190329 完成\n", + "任务 20190328 完成\n", + "任务 20190327 完成\n", + "任务 20190326 完成\n", + "任务 20190325 完成\n", + "任务 20190322 完成\n", + "任务 20190321 完成\n", + "任务 20190319 完成\n", + "任务 20190320 完成\n", + "任务 20190318 完成\n", + "任务 20190315 完成\n", + "任务 20190314 完成\n", + "任务 20190313 完成\n", + "任务 20190311 完成\n", + "任务 20190312 完成\n", + "任务 20190308 完成\n", + "任务 20190307 完成\n", + "任务 20190306 完成\n", + "任务 20190305 完成\n", + "任务 20190304 完成\n", + "任务 20190301 完成\n", + "任务 20190227 完成\n", + "任务 20190228 完成\n", + "任务 20190226 完成\n", + "任务 20190225 完成\n", + "任务 20190222 完成\n", + "任务 20190221 完成\n", + "任务 20190220 完成\n", + "任务 20190219 完成\n", + "任务 20190218 完成\n", + "任务 20190215 完成\n", + "任务 20190214 完成\n", + "任务 20190213 完成\n", + "任务 20190212 完成\n", + "任务 20190211 完成\n", + "任务 20190201 完成\n", + "任务 20190131 完成\n", + "任务 20190130 完成\n", + "任务 20190129 完成\n", + "任务 20190128 完成\n", + "任务 20190125 完成\n", + "任务 20190123 完成\n", + "任务 20190124 完成\n", + "任务 20190121 完成\n", + "任务 20190122 完成\n", + "任务 20190118 完成\n", + "任务 20190117 完成\n", + "任务 20190115 完成\n", + "任务 20190116 完成\n", + "任务 20190114 完成\n", + "任务 20190111 完成\n", + "任务 20190110 完成\n", + "任务 20190109 完成\n", + "任务 20190108 完成\n", + "任务 20190107 完成\n", + "任务 20190104 完成\n", + "任务 20190103 完成\n", + "任务 20190102 完成\n", + "任务 20181228 完成\n", + "任务 20181227 完成\n", + "任务 20181226 完成\n", + "任务 20181225 完成\n", + "任务 20181224 完成\n", + "任务 20181221 完成\n", + "任务 20181220 完成\n", + "任务 20181219 完成\n", + "任务 20181218 完成\n", + "任务 20181217 完成\n", + "任务 20181214 完成\n", + "任务 20181213 完成\n", + "任务 20181212 完成\n", + "任务 20181211 完成\n", + "任务 20181210 完成\n", + "任务 20181207 完成\n", + "任务 20181206 完成\n", + "任务 20181205 完成\n", + "任务 20181204 完成\n", + "任务 20181203 完成\n", + "任务 20181130 完成\n", + "任务 20181129 完成\n", + "任务 20181128 完成\n", + "任务 20181127 完成\n", + "任务 20181126 完成\n", + "任务 20181123 完成\n", + "任务 20181122 完成\n", + "任务 20181121 完成\n", + "任务 20181119 完成\n", + "任务 20181120 完成\n", + "任务 20181116 完成\n", + "任务 20181115 完成\n", + "任务 20181113 完成\n", + "任务 20181114 完成\n", + "任务 20181112 完成\n", + "任务 20181109 完成\n", + "任务 20181107 完成\n", + "任务 20181108 完成\n", + "任务 20181106 完成\n", + "任务 20181105 完成\n", + "任务 20181102 完成\n", + "任务 20181101 完成\n", + "任务 20181031 完成\n", + "任务 20181030 完成\n", + "任务 20181029 完成\n", + "任务 20181026 完成\n", + "任务 20181025 完成\n", + "任务 20181024 完成\n", + "任务 20181022 完成\n", + "任务 20181023 完成\n", + "任务 20181018 完成\n", + "任务 20181019 完成\n", + "任务 20181017 完成\n", + "任务 20181016 完成\n", + "任务 20181012 完成\n", + "任务 20181015 完成\n", + "任务 20181011 完成\n", + "任务 20181010 完成\n", + "任务 20181008 完成\n", + "任务 20181009 完成\n", + "任务 20180928 完成\n", + "任务 20180927 完成\n", + "任务 20180926 完成\n", + "任务 20180925 完成\n", + "任务 20180921 完成\n", + "任务 20180920 完成\n", + "任务 20180919 完成\n", + "任务 20180918 完成\n", + "任务 20180917 完成\n", + "任务 20180914 完成\n", + "任务 20180913 完成\n", + "任务 20180912 完成\n", + "任务 20180911 完成\n", + "任务 20180910 完成\n", + "任务 20180907 完成\n", + "任务 20180906 完成\n", + "任务 20180905 完成\n", + "任务 20180904 完成\n", + "任务 20180903 完成\n", + "任务 20180831 完成\n", + "任务 20180830 完成\n", + "任务 20180829 完成\n", + "任务 20180828 完成\n", + "任务 20180827 完成\n", + "任务 20180824 完成\n", + "任务 20180823 完成\n", + "任务 20180822 完成\n", + "任务 20180821 完成\n", + "任务 20180820 完成\n", + "任务 20180817 完成\n", + "任务 20180816 完成\n", + "任务 20180815 完成\n", + "任务 20180814 完成\n", + "任务 20180813 完成\n", + "任务 20180809 完成\n", + "任务 20180810 完成\n", + "任务 20180808 完成\n", + "任务 20180807 完成\n", + "任务 20180806 完成\n", + "任务 20180803 完成\n", + "任务 20180802 完成\n", + "任务 20180801 完成\n", + "任务 20180731 完成\n", + "任务 20180730 完成\n", + "任务 20180727 完成\n", + "任务 20180726 完成\n", + "任务 20180725 完成\n", + "任务 20180724 完成\n", + "任务 20180723 完成\n", + "任务 20180720 完成\n", + "任务 20180719 完成\n", + "任务 20180718 完成\n", + "任务 20180717 完成\n", + "任务 20180716 完成\n", + "任务 20180713 完成\n", + "任务 20180712 完成\n", + "任务 20180711 完成\n", + "任务 20180710 完成\n", + "任务 20180709 完成\n", + "任务 20180706 完成\n", + "任务 20180705 完成\n", + "任务 20180704 完成\n", + "任务 20180703 完成\n", + "任务 20180702 完成\n", + "任务 20180629 完成\n", + "任务 20180628 完成\n", + "任务 20180627 完成\n", + "任务 20180626 完成\n", + "任务 20180625 完成\n", + "任务 20180622 完成\n", + "任务 20180621 完成\n", + "任务 20180620 完成\n", + "任务 20180619 完成\n", + "任务 20180615 完成\n", + "任务 20180614 完成\n", + "任务 20180613 完成\n", + "任务 20180612 完成\n", + "任务 20180611 完成\n", + "任务 20180608 完成\n", + "任务 20180607 完成\n", + "任务 20180606 完成\n", + "任务 20180605 完成\n", + "任务 20180604 完成\n", + "任务 20180601 完成\n", + "任务 20180531 完成\n", + "任务 20180529 完成\n", + "任务 20180530 完成\n", + "任务 20180528 完成\n", + "任务 20180525 完成\n", + "任务 20180524 完成\n", + "任务 20180523 完成\n", + "任务 20180522 完成\n", + "任务 20180521 完成\n", + "任务 20180517 完成\n", + "任务 20180518 完成\n", + "任务 20180515 完成\n", + "任务 20180516 完成\n", + "任务 20180514 完成\n", + "任务 20180511 完成\n", + "任务 20180509 完成\n", + "任务 20180510 完成\n", + "任务 20180508 完成\n", + "任务 20180507 完成\n", + "任务 20180504 完成\n", + "任务 20180503 完成\n", + "任务 20180502 完成\n", + "任务 20180427 完成\n", + "任务 20180426 完成\n", + "任务 20180425 完成\n", + "任务 20180424 完成\n", + "任务 20180423 完成\n", + "任务 20180420 完成\n", + "任务 20180419 完成\n", + "任务 20180418 完成\n", + "任务 20180417 完成\n", + "任务 20180416 完成\n", + "任务 20180413 完成\n", + "任务 20180412 完成\n", + "任务 20180411 完成\n", + "任务 20180410 完成\n", + "任务 20180409 完成\n", + "任务 20180404 完成\n", + "任务 20180403 完成\n", + "任务 20180402 完成\n", + "任务 20180330 完成\n", + "任务 20180329 完成\n", + "任务 20180328 完成\n", + "任务 20180327 完成\n", + "任务 20180326 完成\n", + "任务 20180323 完成\n", + "任务 20180322 完成\n", + "任务 20180321 完成\n", + "任务 20180320 完成\n", + "任务 20180319 完成\n", + "任务 20180316 完成\n", + "任务 20180315 完成\n", + "任务 20180314 完成\n", + "任务 20180313 完成\n", + "任务 20180312 完成\n", + "任务 20180309 完成\n", + "任务 20180308 完成\n", + "任务 20180307 完成\n", + "任务 20180306 完成\n", + "任务 20180305 完成\n", + "任务 20180302 完成\n", + "任务 20180301 完成\n", + "任务 20180228 完成\n", + "任务 20180227 完成\n", + "任务 20180226 完成\n", + "任务 20180223 完成\n", + "任务 20180222 完成\n", + "任务 20180214 完成\n", + "任务 20180213 完成\n", + "任务 20180212 完成\n", + "任务 20180209 完成\n", + "任务 20180208 完成\n", + "任务 20180207 完成\n", + "任务 20180206 完成\n", + "任务 20180205 完成\n", + "任务 20180202 完成\n", + "任务 20180201 完成\n", + "任务 20180131 完成\n", + "任务 20180130 完成\n", + "任务 20180129 完成\n", + "任务 20180126 完成\n", + "任务 20180125 完成\n", + "任务 20180124 完成\n", + "任务 20180123 完成\n", + "任务 20180122 完成\n", + "任务 20180119 完成\n", + "任务 20180118 完成\n", + "任务 20180117 完成\n", + "任务 20180116 完成\n", + "任务 20180115 完成\n", + "任务 20180111 完成\n", + "任务 20180112 完成\n", + "任务 20180110 完成\n", + "任务 20180109 完成\n", + "任务 20180108 完成\n", + "任务 20180105 完成\n", + "任务 20180104 完成\n", + "任务 20180103 完成\n", + "任务 20180102 完成\n", + "任务 20171229 完成\n", + "任务 20171228 完成\n", + "任务 20171227 完成\n", + "任务 20171226 完成\n", + "任务 20171225 完成\n", + "任务 20171222 完成\n", + "任务 20171221 完成\n", + "任务 20171220 完成\n", + "任务 20171219 完成\n", + "任务 20171218 完成\n", + "任务 20171215 完成\n", + "任务 20171214 完成\n", + "任务 20171213 完成\n", + "任务 20171212 完成\n", + "任务 20171211 完成\n", + "任务 20171208 完成\n", + "任务 20171207 完成\n", + "任务 20171206 完成\n", + "任务 20171205 完成\n", + "任务 20171204 完成\n", + "任务 20171201 完成\n", + "任务 20171130 完成\n", + "任务 20171129 完成\n", + "任务 20171128 完成\n", + "任务 20171127 完成\n", + "任务 20171124 完成\n", + "任务 20171123 完成\n", + "任务 20171122 完成\n", + "任务 20171121 完成\n", + "任务 20171120 完成\n", + "任务 20171117 完成\n", + "任务 20171116 完成\n", + "任务 20171115 完成\n", + "任务 20171114 完成\n", + "任务 20171113 完成\n", + "任务 20171110 完成\n", + "任务 20171109 完成\n", + "任务 20171108 完成\n", + "任务 20171107 完成\n", + "任务 20171106 完成\n", + "任务 20171103 完成\n", + "任务 20171102 完成\n", + "任务 20171101 完成\n", + "任务 20171031 完成\n", + "任务 20171030 完成\n", + "任务 20171027 完成\n", + "任务 20171026 完成\n", + "任务 20171025 完成\n", + "任务 20171024 完成\n", + "任务 20171023 完成\n", + "任务 20171020 完成\n", + "任务 20171019 完成\n", + "任务 20171018 完成\n", + "任务 20171017 完成\n", + "任务 20171016 完成\n", + "任务 20171013 完成\n", + "任务 20171012 完成\n", + "任务 20171011 完成\n", + "任务 20171010 完成\n", + "任务 20171009 完成\n", + "任务 20170928 完成\n", + "任务 20170929 完成\n", + "任务 20170927 完成\n", + "任务 20170926 完成\n", + "任务 20170925 完成\n", + "任务 20170922 完成\n", + "任务 20170920 完成\n", + "任务 20170921 完成\n", + "任务 20170919 完成\n", + "任务 20170918 完成\n", + "任务 20170915 完成\n", + "任务 20170914 完成\n", + "任务 20170913 完成\n", + "任务 20170912 完成\n", + "任务 20170911 完成\n", + "任务 20170908 完成\n", + "任务 20170907 完成\n", + "任务 20170906 完成\n", + "任务 20170904 完成\n", + "任务 20170905 完成\n", + "任务 20170901 完成\n", + "任务 20170831 完成\n", + "任务 20170830 完成\n", + "任务 20170829 完成\n", + "任务 20170825 完成\n", + "任务 20170828 完成\n", + "任务 20170823 完成\n", + "任务 20170824 完成\n", + "任务 20170821 完成\n", + "任务 20170822 完成\n", + "任务 20170818 完成\n", + "任务 20170817 完成\n", + "任务 20170816 完成\n", + "任务 20170815 完成\n", + "任务 20170814 完成\n", + "任务 20170811 完成\n", + "任务 20170810 完成\n", + "任务 20170809 完成\n", + "任务 20170808 完成\n", + "任务 20170807 完成\n", + "任务 20170804 完成\n", + "任务 20170803 完成\n", + "任务 20170802 完成\n", + "任务 20170801 完成\n", + "任务 20170731 完成\n", + "任务 20170728 完成\n", + "任务 20170727 完成\n", + "任务 20170726 完成\n", + "任务 20170725 完成\n", + "任务 20170724 完成\n", + "任务 20170721 完成\n", + "任务 20170720 完成\n", + "任务 20170719 完成\n", + "任务 20170718 完成\n", + "任务 20170717 完成\n", + "任务 20170714 完成\n", + "任务 20170713 完成\n", + "任务 20170712 完成\n", + "任务 20170711 完成\n", + "任务 20170710 完成\n", + "任务 20170707 完成\n", + "任务 20170706 完成\n", + "任务 20170705 完成\n", + "任务 20170704 完成\n", + "任务 20170703 完成\n", + "任务 20170630 完成\n", + "任务 20170629 完成\n", + "任务 20170628 完成\n", + "任务 20170627 完成\n", + "任务 20170626 完成\n", + "任务 20170623 完成\n", + "任务 20170622 完成\n", + "任务 20170620 完成\n", + "任务 20170621 完成\n", + "任务 20170619 完成\n", + "任务 20170616 完成\n", + "任务 20170614 完成\n", + "任务 20170615 完成\n", + "任务 20170613 完成\n", + "任务 20170612 完成\n", + "任务 20170609 完成\n", + "任务 20170608 完成\n", + "任务 20170606 完成\n", + "任务 20170607 完成\n", + "任务 20170602 完成\n", + "任务 20170605 完成\n", + "任务 20170601 完成\n", + "任务 20170531 完成\n", + "任务 20170526 完成\n", + "任务 20170525 完成\n", + "任务 20170524 完成\n", + "任务 20170523 完成\n", + "任务 20170519 完成\n", + "任务 20170522 完成\n", + "任务 20170517 完成\n", + "任务 20170518 完成\n", + "任务 20170516 完成\n", + "任务 20170515 完成\n", + "任务 20170512 完成\n", + "任务 20170511 完成\n", + "任务 20170510 完成\n", + "任务 20170509 完成\n", + "任务 20170508 完成\n", + "任务 20170505 完成\n", + "任务 20170503 完成\n", + "任务 20170504 完成\n", + "任务 20170428 完成\n", + "任务 20170502 完成\n", + "任务 20170426 完成\n", + "任务 20170427 完成\n", + "任务 20170424 完成\n", + "任务 20170425 完成\n", + "任务 20170421 完成\n", + "任务 20170420 完成\n", + "任务 20170419 完成\n", + "任务 20170418 完成\n", + "任务 20170417 完成\n", + "任务 20170414 完成\n", + "任务 20170413 完成\n", + "任务 20170412 完成\n", + "任务 20170411 完成\n", + "任务 20170410 完成\n", + "任务 20170407 完成\n", + "任务 20170406 完成\n", + "任务 20170405 完成\n", + "任务 20170331 完成\n", + "任务 20170330 完成\n", + "任务 20170329 完成\n", + "任务 20170328 完成\n", + "任务 20170327 完成\n", + "任务 20170324 完成\n", + "任务 20170323 完成\n", + "任务 20170322 完成\n", + "任务 20170321 完成\n", + "任务 20170320 完成\n", + "任务 20170317 完成\n", + "任务 20170316 完成\n", + "任务 20170315 完成\n", + "任务 20170314 完成\n", + "任务 20170313 完成\n", + "任务 20170310 完成\n", + "任务 20170309 完成\n", + "任务 20170308 完成\n", + "任务 20170307 完成\n", + "任务 20170306 完成\n", + "任务 20170303 完成\n", + "任务 20170302 完成\n", + "任务 20170301 完成\n", + "任务 20170227 完成\n", + "任务 20170228 完成\n", + "任务 20170223 完成\n", + "任务 20170224 完成\n", + "任务 20170221 完成\n", + "任务 20170222 完成\n", + "任务 20170217 完成\n", + "任务 20170220 完成\n", + "任务 20170216 完成\n", + "任务 20170215 完成\n", + "任务 20170213 完成\n", + "任务 20170214 完成\n", + "任务 20170210 完成\n", + "任务 20170209 完成\n", + "任务 20170208 完成\n", + "任务 20170207 完成\n", + "任务 20170206 完成\n", + "任务 20170203 完成\n", + "任务 20170125 完成\n", + "任务 20170126 完成\n", + "任务 20170124 完成\n", + "任务 20170123 完成\n", + "任务 20170120 完成\n", + "任务 20170119 完成\n", + "任务 20170118 完成\n", + "任务 20170117 完成\n", + "任务 20170116 完成\n", + "任务 20170113 完成\n", + "任务 20170111 完成\n", + "任务 20170112 完成\n", + "任务 20170110 完成\n", + "任务 20170109 完成\n", + "任务 20170105 完成\n", + "任务 20170106 完成\n", + "任务 20170104 完成\n", + "任务 20170103 完成\n" + ] + } + ], + "source": [ + "from concurrent.futures import ThreadPoolExecutor, as_completed\n", + "\n", + "all_daily_data = []\n", + "\n", + "# API 调用计数和时间控制变量\n", + "api_call_count = 0\n", + "batch_start_time = time.time()\n", + "\n", + "\n", + "def get_data(trade_date):\n", + " time.sleep(0.1)\n", + " data = pro.top_list(trade_date=trade_date)\n", + " if data is not None and not data.empty:\n", + " return data\n", + "\n", + "\n", + "with ThreadPoolExecutor(max_workers=2) as executor:\n", + " future_to_date = {executor.submit(get_data, td): td for td in trade_dates}\n", + "\n", + " for future in as_completed(future_to_date):\n", + " trade_date = future_to_date[future] # 获取对应的交易日期\n", + " try:\n", + " result = future.result() # 获取任务执行的结果\n", + " all_daily_data.append(result)\n", + " print(f\"任务 {trade_date} 完成\")\n", + " except Exception as e:\n", + " print(f\"获取 {trade_date} 数据时出错: {e}\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "907f732d3c397bf", + "metadata": { + "ExecuteTime": { + "end_time": "2025-03-12T15:31:10.381348500Z", + "start_time": "2025-03-12T15:23:41.345460Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\liaozhaorun\\AppData\\Local\\Temp\\ipykernel_12440\\3671378986.py:2: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation.\n", + " all_daily_data_df = pd.concat(all_daily_data, ignore_index=True)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "所有每日基础数据获取并保存完毕!\n" + ] + } + ], + "source": [ + "\n", + "# 将所有数据合并为一个 DataFrame\n", + "all_daily_data_df = pd.concat(all_daily_data, ignore_index=True)\n", + "\n", + "# 将数据保存为 HDF5 文件(table 格式)\n", + "all_daily_data_df.to_hdf(h5_filename, key='top_list', mode='w', format='table', data_columns=True)\n", + "\n", + "print(\"所有每日基础数据获取并保存完毕!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "73e829ac-ff3d-408e-beb3-0b87f5b00b19", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ts_code trade_date\n", + "0 000565.SZ 20250520\n", + "1 000609.SZ 20250520\n", + "2 000677.SZ 20250520\n", + "3 000722.SZ 20250520\n", + "4 001222.SZ 20250520\n", + "... ... ...\n", + "143695 603577.SH 20170103\n", + "143696 603823.SH 20170103\n", + "143697 603823.SH 20170103\n", + "143698 603878.SH 20170103\n", + "143699 603886.SH 20170103\n", + "\n", + "[143700 rows x 2 columns]\n" + ] + } + ], + "source": [ + "key = '/top_list'\n", + "max_date = None\n", + "with pd.HDFStore(h5_filename, mode='r') as store:\n", + " df = store[key][['ts_code', 'trade_date']]\n", + " print(df)\n", + " max_date = df['trade_date'].min()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "3ac8120e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "该列所有不同的数据为:\n", + "['日跌幅偏离值达到7%的前5只证券' '连续三个交易日内,涨幅偏离值累计达到12%的ST证券、*ST证券和未完成股改证券'\n", + " '连续三个交易日内,涨幅偏离值累计达到20%的证券' '日涨幅偏离值达到7%的前5只证券' '日振幅值达到15%的前5只证券'\n", + " '日换手率达到20%的前5只证券' '日涨幅达到15%的前5只可转债' '退市整理期' '连续三个交易日内,涨幅偏离值累计达到30%的证券'\n", + " '日涨幅达到15%的前5只证券' '日换手率达到30%的前5只证券'\n", + " '非ST、*ST和S证券连续三个交易日内收盘价格涨幅偏离值累计达到20%的证券' '有价格涨跌幅限制的日收盘价格涨幅偏离值达到7%的前五只证券'\n", + " '有价格涨跌幅限制的日换手率达到20%的前五只证券' '有价格涨跌幅限制的日收盘价格跌幅偏离值达到7%的前五只证券'\n", + " '有价格涨跌幅限制的日价格振幅达到15%的前五只证券' '有价格涨跌幅限制的日收盘价格涨幅达到15%的前五只证券'\n", + " '有价格涨跌幅限制的连续3个交易日内收盘价格涨幅偏离值累计达到30%的证券' '当日价格振幅达到30%的前5只股票'\n", + " '当日换手率达到20%的前5只股票' '当日收盘价涨幅达到20%的前5只股票'\n", + " '北交所股票最近3个有成交的交易日以内收盘价涨跌幅偏离值累计达到+40%(-40%)'\n", + " '非ST、*ST和S证券连续三个交易日内收盘价格跌幅偏离值累计达到20%的证券'\n", + " 'ST、*ST证券连续三个交易日内收盘价格跌幅偏离值累计达到12%的证券' '日振幅值达到30%的前5只证券' '无价格涨跌幅限制的证券'\n", + " 'ST、*ST证券连续三个交易日内收盘价格涨幅偏离值累计达到12%的证券' '严重异常期间日收盘价格涨幅偏离值累计达到100%的证券'\n", + " '严重异常期间4次出现正向异常波动的证券' '有价格涨跌幅限制的日换手率达到30%的前五只证券'\n", + " '连续10个交易日内4次出现同负向异常波动的证券' '连续三个交易日内,跌幅偏离值累计达到12%的ST证券、*ST证券和未完成股改证券'\n", + " '连续三个交易日内,跌幅偏离值累计达到20%的证券'\n", + " '连续三个交易日内,日均换手率与前五个交易日的日均换手率的比值达到30倍,且换手率累计达20%的证券'\n", + " '严重异常期间日收盘价格跌幅偏离值累计达到50%的证券' '非上市首日,当日收盘价涨幅达15%的前五只可转债'\n", + " '有价格涨跌幅限制的连续10个交易日内收盘价格涨幅偏离值累计达到100%的证券' '日跌幅达到15%的前5只证券'\n", + " '连续三个交易日内,跌幅偏离值累计达到30%的证券' '有价格涨跌幅限制的日收盘价格跌幅达到15%的前五只证券'\n", + " '当日收盘价跌幅达到-20%的前5只股票' '向不特定对象发行的可转债上市首日交易公开信息' '上市首日可转债'\n", + " '有价格涨跌幅限制的连续30个交易日内收盘价格涨幅偏离值累计达到200%的证券' '日跌幅达到15%的前5只可转债'\n", + " '有价格涨跌幅限制的日价格振幅达到30%的前五只证券' '非上市首日,当日收盘价跌幅达15%的前五只可转债'\n", + " '连续三个交易日内,涨幅偏离值累计达到30%的可转债' '连续10个交易日内4次出现同正向异常波动的证券'\n", + " '连续3个交易日内日收盘价格涨幅偏离值达到30%的可转债' '有价格涨跌幅限制的连续10个交易日内收盘价格跌幅偏离值累计达到-50%的证券'\n", + " '非上市首日,当日价格振幅达30%的前五只可转债' '严重异常期间日收盘价格涨幅偏离值累计达到200%的证券' '退市整理的证券'\n", + " '连续10个交易日内3次出现同正向异常波动的证券' '单只标的证券的当日融资买入数量达到当日该证券总交易量的50%以上'\n", + " '连续三个交易日内,跌幅偏离值累计达到30%的可转债' '日振幅值达到30%的前5只可转债' '日价格涨幅偏离值达到12.66%'\n", + " '有价格涨跌幅限制的连续30个交易日内收盘价格跌幅偏离值累计达到-70%的证券' 'S股连续三个交易日内收盘价格涨幅偏离值累计达到15%的证券'\n", + " '单只标的证券的当日融资买入数量达到当日该证券总交易量的50%以上' '连续3个交易日内日收盘价格跌幅偏离值达到30%的可转债'\n", + " '连续10个交易日内收盘价格涨幅偏离值累计达100%的可转债' '严重异常期间日收盘价格涨幅偏离值累计达到100%的可转债'\n", + " '有价格涨跌幅限制的连续3个交易日内收盘价格跌幅偏离值累计达到30%的证券' '严重异常期间4次出现负向异常波动的证券'\n", + " '严重异常期间日收盘价格跌幅偏离值累计达到70%的证券' '异常期间价格跌幅偏离值累计达到-21.46%'\n", + " '异常期间价格跌幅偏离值累计达到-21.48%' '连续三个交易日内,跌幅偏离值累计达到12%的ST证券、*ST证券'\n", + " '严重异常期间日收盘价格跌幅偏离值累计达到50%的可转债' '连续10个交易日内收盘价格跌幅偏离值累计达到-50%的可转债'\n", + " '日换手率达到30.08%' '单只标的证券的当日融券卖出数量达到当日该证券总交易量的50%以上' '退市整理期的可转债'\n", + " '连续三个交易日内,涨幅偏离值累计达到30%的可转债' '单只标的证券的当日融券卖出数量达到当日该证券总交易量的50%以上' '上市首日的可转债'\n", + " '日价格涨幅偏离值达到9.42%' '异常期间价格跌幅偏离值累计达到-14.01%' '日价格跌幅偏离值达到-8.95%'\n", + " '日价格跌幅偏离值达到-7.02%' '连续三个交易日内,涨幅偏离值累计达到12%的ST证券、*ST证券'\n", + " 'ST、*ST和S证券连续三个交易日内收盘价格跌幅偏离值累计达到15%的证券' '当日无价格涨跌幅限制的A股,出现异常波动停牌的'\n", + " 'ST、*ST和S证券连续三个交易日内收盘价格涨幅偏离值累计达到15%的证券' '日价格振幅达到33.72%' '日价格振幅达到35.76%'\n", + " '连续三个交易日内的日均换手率与前五个交易日日均换手率的比值到达30倍,并且该股票封闭式基金连续三个交易日内累计换手率达到20%'\n", + " '连续三个交易日内,涨幅偏离值累计达到20%的证券' '连续三个交易日内,跌幅偏离值累计达到20%的证券'\n", + " '连续三个交易日内,涨幅偏离值累计达到12%的ST证券、*ST证券和未完成股改证券'\n", + " '连续三个交易日内,跌幅偏离值累计达到12%的ST证券、*ST证券和未完成股改证券' '连续三个交易日内,涨幅偏离值累计达到30%的证券'\n", + " '异常期间价格涨幅偏离值累计达到30.72%' '异常期间价格涨幅偏离值累计达到32.42%' '异常期间价格涨幅偏离值累计达到31.45%'\n", + " '异常期间价格涨幅偏离值累计达到31.48%' '异常期间价格涨幅偏离值累计达到32.31%' '异常期间价格涨幅偏离值累计达到32.38%'\n", + " '异常期间价格涨幅偏离值累计达到32.28%' '异常期间价格涨幅偏离值累计达到32.27%' '异常期间价格涨幅偏离值累计达到30.49%'\n", + " '异常期间价格涨幅偏离值累计达到30.08%' '异常期间价格涨幅偏离值累计达到30.30%' '异常期间价格涨幅偏离值累计达到30.03%'\n", + " '当日无价格涨跌幅限制的B股,出现异常波动停牌的' '异常期间价格涨幅偏离值累计达到31.19%' '异常期间价格涨幅偏离值累计达到14.20%'\n", + " '异常期间价格涨幅偏离值累计达到29.20%' '日价格跌幅偏离值达到-9.52%' '日价格振幅达到18.73%'\n", + " '异常期间价格跌幅偏离值累计达到-20.19%' '异常期间价格涨幅偏离值累计达到21.50%' '日价格涨幅偏离值达到10.24%'\n", + " '日价格振幅达到21.77%' '日换手率达到47.05%' '异常期间价格涨幅偏离值累计达到21.77%'\n", + " '异常期间价格涨幅偏离值累计达到24.71%' '日价格跌幅偏离值达到-9.76%' '异常期间价格跌幅偏离值累计达到-20.80%'\n", + " '日价格跌幅偏离值达到-9.44%' '日价格振幅达到19.66%' '日换手率达到34.80%' '异常期间价格涨幅偏离值累计达到13.30%'\n", + " '日价格振幅达到17.86%' '日换手率达到33.98%' '异常期间价格涨幅偏离值累计达到20.45%' '日换手率达到47.96%'\n", + " '异常期间价格涨幅偏离值累计达到20.36%' '异常期间价格涨幅偏离值累计达到21.08%' '异常期间价格涨幅偏离值累计达到21.75%'\n", + " '异常期间价格涨幅偏离值累计达到20.62%' '异常期间价格涨幅偏离值累计达到22.14%' '日换手率达到40.73%'\n", + " '日价格涨幅偏离值达到7.14%' '异常期间价格涨幅偏离值累计达到32.18%' '日价格涨幅达到20.00%' '日换手率达到34.93%'\n", + " '日价格跌幅达到-17.66%' '异常期间价格跌幅偏离值累计达到-36.58%' '日换手率达到35.52%'\n", + " '异常期间价格涨幅偏离值累计达到34.10%' '异常期间价格跌幅偏离值累计达到-35.17%' '异常期间价格涨幅偏离值累计达到30.98%'\n", + " '异常期间价格涨幅偏离值累计达到41.08%' '日换手率达到57.97%' '日换手率达到44.08%' '日价格涨幅偏离值达到11.22%'\n", + " '异常期间价格涨幅偏离值累计达到12.29%' '日换手率达到32.12%' '异常期间价格涨幅偏离值累计达到16.13%'\n", + " '日换手率达到37.02%' '日换手率达到23.35%' '异常期间价格涨幅偏离值累计达到20.51%' '日价格跌幅偏离值达到-8.78%'\n", + " '异常期间价格涨幅偏离值累计达到20.25%' '日价格跌幅偏离值达到-8.13%' '日换手率达到26.60%'\n", + " '异常期间价格涨幅偏离值累计达到12.57%' '日价格跌幅偏离值达到-7.99%' '异常期间价格涨幅偏离值累计达到14.32%'\n", + " '日价格跌幅偏离值达到-7.68%' '日价格振幅达到17.57%' '异常期间价格涨幅偏离值累计达到25.27%'\n", + " '异常期间价格涨幅偏离值累计达到30.90%' '日换手率达到44.24%' '日换手率达到43.96%' '日换手率达到39.89%'\n", + " '日换手率达到45.45%' '异常期间价格涨幅偏离值累计达到33.64%' '日换手率达到39.99%' '无价格涨跌幅限制'\n", + " '严重异常期间3次出现正向异常波动的证券' '精选层股票最近3个有成交的交易日以内收盘价涨跌幅偏离值累计达到+40%(-40%)'\n", + " '日价格涨幅偏离值达到9.94%' '异常期间价格涨幅偏离值累计达到20.53%' '异常期间价格跌幅偏离值累计达到-12.31%'\n", + " '异常期间价格涨幅偏离值累计达到20.37%' '日价格振幅达到17.91%' '日价格跌幅偏离值达到-10.06%'\n", + " '日价格振幅达到19.94%' '日价格振幅达到17.82%' '日换手率达到23.94%' '日换手率达到21.95%'\n", + " '日换手率达到23.39%' '异常期间价格涨幅偏离值累计达到27.38%' '异常期间价格涨幅偏离值累计达到23.55%'\n", + " '日换手率达到23.02%' '异常期间价格跌幅偏离值累计达到-20.12%' '日换手率达到26.07%' '日价格跌幅达到-17.89%'\n", + " '日价格涨幅达到15.85%' '日价格涨幅达到16.00%' '日换手率达到41.01%' '日换手率达到55.53%'\n", + " '日换手率达到53.64%' '异常期间价格涨幅偏离值累计达到38.36%' '日换手率达到43.66%' '日换手率达到41.19%'\n", + " '有价格涨跌幅限制的日换手率达到20%的前三只证券' '有价格涨跌幅限制的日收盘价格跌幅偏离值达到7%的前三只证券'\n", + " '有价格涨跌幅限制的日收盘价格涨幅偏离值达到7%的前三只证券' '有价格涨跌幅限制的日价格振幅达到15%的前三只证券'\n", + " '日价格涨幅偏离值达到10.48%' '异常期间价格涨幅偏离值累计达到15.21%' '日换手率达到25.43%'\n", + " '异常期间价格跌幅偏离值累计达到-21.76%' '异常期间价格涨幅偏离值累计达到20.52%' '日换手率达到26.11%'\n", + " '日价格振幅达到15.08%' '日换手率达到29.60%' '日价格振幅达到16.58%' '日价格振幅达到15.71%'\n", + " '异常期间价格涨幅偏离值累计达到20.03%' '日换手率达到29.03%' '异常期间价格涨幅偏离值累计达到28.18%'\n", + " '异常期间价格涨幅偏离值累计达到21.60%' '日价格振幅达到15.51%' '异常期间价格涨幅偏离值累计达到24.15%'\n", + " '异常期间价格涨幅偏离值累计达到22.17%' '日换手率达到39.46%' '异常期间价格涨幅偏离值累计达到39.67%'\n", + " '异常期间价格涨幅偏离值累计达到31.06%' '日换手率达到52.63%' '日换手率达到47.81%' '日换手率达到47.75%'\n", + " '日换手率达到40.76%' '异常期间价格涨幅偏离值累计达到16.11%' '连续三个交易日内,涨幅偏离值累计达20%的证券'\n", + " '跌幅偏离值达7%的证券' '振幅值达15%的证券' '涨幅偏离值达7%的证券' '换手率达20%的证券'\n", + " '连续三个交易日内,跌幅偏离值累计达20%的证券' '连续三个交易日内,涨幅偏离值累计达到15%的ST证券、*ST证券和未完成股改证券'\n", + " '日价格涨幅偏离值达到11.43%' '日价格跌幅偏离值达到-8.45%' '异常期间价格涨幅偏离值累计达到20.86%'\n", + " '日换手率达到23.37%' '日价格跌幅偏离值达到-8.57%' '异常期间价格涨幅偏离值累计达到23.24%'\n", + " '异常期间价格涨幅偏离值累计达到20.97%' '日换手率达到21.93%' '日换手率达到22.54%' '日价格跌幅偏离值达到-7.45%'\n", + " '日价格振幅达到15.85%' '日换手率达到39.81%' '日换手率达到29.22%' '日换手率达到35.22%'\n", + " '异常期间价格涨幅偏离值累计达到33.04%' '日换手率达到32.99%' '异常期间价格涨幅偏离值累计达到32.93%'\n", + " '日换手率达到43.84%' '日换手率达到39.98%' '日换手率达到32.97%' '异常期间价格跌幅偏离值累计达到-15.62%'\n", + " '异常期间价格跌幅偏离值累计达到-16.87%' '异常期间价格涨幅偏离值累计达到16.08%' '日价格涨幅偏离值达到10.97%'\n", + " '日价格跌幅偏离值达到-9.03%' '日价格振幅达到19.42%' '异常期间价格涨幅偏离值累计达到16.06%' '日换手率达到34.95%'\n", + " '日价格振幅达到15.47%' '异常期间价格涨幅偏离值累计达到22.40%' '日换手率达到30.04%'\n", + " '异常期间价格跌幅偏离值累计达到-28.92%' '异常期间价格涨幅偏离值累计达到21.26%' '异常期间价格跌幅偏离值累计达到-22.22%'\n", + " '异常期间价格涨幅偏离值累计达到22.04%' '异常期间价格跌幅偏离值累计达到-13.94%' '日价格振幅达到16.22%'\n", + " '日价格振幅达到15.22%' '日价格振幅达到16.15%' '日换手率达到29.49%' '日换手率达到51.16%'\n", + " '日价格跌幅偏离值达到-9.69%' '日价格涨幅偏离值达到7.62%' '异常期间价格涨幅偏离值累计达到12.08%'\n", + " '日价格跌幅偏离值达到-9.71%' '异常期间价格涨幅偏离值累计达到20.09%' '日价格涨幅偏离值达到10.29%'\n", + " '日换手率达到29.42%' '异常期间价格跌幅偏离值累计达到-12.09%' '异常期间价格涨幅偏离值累计达到14.25%'\n", + " '异常期间价格跌幅偏离值累计达到-12.68%' '日价格振幅达到17.55%' '日换手率达到38.63%'\n", + " '异常期间价格跌幅偏离值累计达到-22.60%' '日换手率达到37.81%' '日换手率达到53.51%' '日价格跌幅达到-20.00%'\n", + " '异常期间价格跌幅偏离值累计达到-35.82%' '日价格涨幅达到16.10%' '日价格涨幅达到15.71%' '日换手率达到36.79%'\n", + " '日换手率达到60.06%' '异常期间价格涨幅偏离值累计达到32.14%' '日价格涨幅偏离值达到9.80%'\n", + " '异常期间价格涨幅偏离值累计达到22.56%' '日价格振幅达到15.93%' '异常期间价格涨幅偏离值累计达到13.93%'\n", + " '日价格振幅达到15.52%' '日换手率达到36.60%' '日价格跌幅偏离值达到-10.21%'\n", + " '异常期间价格跌幅偏离值累计达到-13.02%' '异常期间价格涨幅偏离值累计达到28.93%' '异常期间价格跌幅偏离值累计达到-14.22%'\n", + " '日价格振幅达到15.35%' '异常期间价格跌幅偏离值累计达到-12.10%' '日换手率达到45.16%'\n", + " '异常期间价格跌幅偏离值累计达到-12.82%' '异常期间价格涨幅偏离值累计达到24.12%' '日换手率达到34.34%'\n", + " '异常期间价格跌幅偏离值累计达到-21.04%' '日换手率达到49.77%' '日换手率达到33.85%'\n", + " '异常期间价格跌幅偏离值累计达到-31.38%' '异常期间价格跌幅偏离值累计达到-40.94%' '日换手率达到40.03%'\n", + " '异常期间价格跌幅偏离值累计达到-33.32%' '日换手率达到41.65%' '日换手率达到44.48%' '日换手率达到70.29%'\n", + " '日换手率达到35.39%' '异常期间价格涨幅偏离值累计达到24.43%' '日价格涨幅偏离值达到9.17%' '日价格振幅达到16.41%'\n", + " '日价格振幅达到18.23%' '异常期间价格跌幅偏离值累计达到-12.99%' '日价格振幅达到19.07%'\n", + " '日价格跌幅偏离值达到-10.83%' '异常期间价格涨幅偏离值累计达到22.98%' '异常期间价格涨幅偏离值累计达到21.18%'\n", + " '异常期间价格跌幅偏离值累计达到-20.86%' '日价格振幅达到16.40%' '日换手率达到37.89%'\n", + " '异常期间价格跌幅偏离值累计达到-20.47%' '日换手率达到33.15%' '日价格振幅达到20.69%' '日换手率达到38.30%'\n", + " '日换手率达到35.26%' '日价格振幅达到16.94%' '日价格涨幅偏离值达到10.75%' '异常期间价格涨幅偏离值累计达到20.30%'\n", + " '日价格跌幅偏离值达到-9.15%' '日价格跌幅偏离值达到-9.25%' '异常期间价格跌幅偏离值累计达到-22.02%'\n", + " '日价格振幅达到16.57%' '异常期间价格涨幅偏离值累计达到14.81%' '日价格振幅达到15.07%'\n", + " '异常期间价格涨幅偏离值累计达到24.40%' '日价格跌幅偏离值达到-9.16%' '日换手率达到44.86%' '日价格振幅达到15.33%'\n", + " '日换手率达到33.80%' '日换手率达到42.02%' '日价格振幅达到20.35%' '异常期间价格跌幅偏离值累计达到-12.70%'\n", + " '日价格涨幅偏离值达到9.97%' '异常期间价格涨幅偏离值累计达到12.19%' '异常期间价格涨幅偏离值累计达到15.27%'\n", + " '异常期间价格涨幅偏离值累计达到20.72%' '异常期间价格跌幅偏离值累计达到-20.53%' '日价格振幅达到15.95%'\n", + " '日价格跌幅偏离值达到-10.03%' '异常期间价格跌幅偏离值累计达到-22.33%' '异常期间价格跌幅偏离值累计达到-22.82%'\n", + " '日价格振幅达到22.19%' '异常期间价格跌幅偏离值累计达到-14.73%' '日价格振幅达到16.42%' '日价格振幅达到16.20%'\n", + " '日换手率达到36.69%' '日换手率达到35.23%' '日换手率达到44.23%' '异常期间价格跌幅偏离值累计达到-29.73%'\n", + " '日换手率达到39.75%' '日价格跌幅达到-16.93%' '日换手率达到40.71%' '日换手率达到36.04%'\n", + " '异常期间价格涨幅偏离值累计达到40.44%' '日价格跌幅偏离值达到-10.45%' '日价格涨幅偏离值达到9.55%'\n", + " '异常期间价格涨幅偏离值累计达到13.86%' '异常期间价格跌幅偏离值累计达到-20.94%' '异常期间价格涨幅偏离值累计达到21.34%'\n", + " '异常期间价格跌幅偏离值累计达到-23.98%' '日换手率达到51.98%' '日换手率达到45.44%' '日换手率达到36.40%'\n", + " '日价格振幅达到22.23%' '日换手率达到36.61%' '日换手率达到30.47%' '日价格跌幅达到-15.97%'\n", + " '异常期间价格涨幅偏离值累计达到14.39%' '异常期间价格跌幅偏离值累计达到-21.18%' '日价格涨幅偏离值达到9.52%'\n", + " '异常期间价格涨幅偏离值累计达到22.90%' '异常期间价格跌幅偏离值累计达到-26.48%' '异常期间价格涨幅偏离值累计达到29.39%'\n", + " '日价格振幅达到16.24%' '日价格跌幅偏离值达到-10.48%' '异常期间价格涨幅偏离值累计达到21.70%'\n", + " '异常期间价格涨幅偏离值累计达到20.64%' '日价格跌幅偏离值达到-8.62%' '日换手率达到43.36%'\n", + " '日价格跌幅偏离值达到-10.20%' '异常期间价格跌幅偏离值累计达到-20.40%' '日换手率达到52.28%'\n", + " '异常期间价格涨幅偏离值累计达到20.59%' '日换手率达到44.01%' '日价格涨幅偏离值达到8.37%'\n", + " '异常期间价格涨幅偏离值累计达到38.81%' '异常期间价格跌幅偏离值累计达到-41.19%' '日价格涨幅达到19.96%'\n", + " '异常期间价格涨幅偏离值累计达到34.07%' '日换手率达到31.59%' '日换手率达到30.68%' '日价格涨幅达到17.85%'\n", + " '日换手率达到30.75%' '日换手率达到30.87%' '日价格振幅达到17.07%' '日价格振幅达到15.24%'\n", + " '异常期间价格涨幅偏离值累计达到12.43%' '日价格振幅达到15.43%' '日价格振幅达到21.34%' '日换手率达到47.10%'\n", + " '日换手率达到56.87%' '日换手率达到54.95%' '严重异常期间日收盘价格跌幅偏离值累计达到-50.81%'\n", + " '严重异常期间日收盘价格跌幅偏离值累计达到-70.49%' '日价格涨幅达到15.30%' '日换手率达到30.09%'\n", + " '日换手率达到34.63%' '异常期间价格涨幅偏离值累计达到20.58%' '异常期间价格跌幅偏离值累计达到-25.68%'\n", + " '日价格振幅达到15.97%' '日价格振幅达到18.35%' '日价格涨幅偏离值达到10.07%'\n", + " '异常期间价格跌幅偏离值累计达到-20.25%' '日价格跌幅偏离值达到-9.93%' '异常期间价格涨幅偏离值累计达到27.02%'\n", + " '日价格跌幅偏离值达到-9.81%' '日换手率达到38.35%' '异常期间价格涨幅偏离值累计达到20.38%' '日换手率达到63.15%'\n", + " '异常期间价格涨幅偏离值累计达到20.34%' '日换手率达到39.94%' '异常期间价格跌幅偏离值累计达到-21.08%'\n", + " '日价格涨幅达到19.91%' '异常期间价格跌幅偏离值累计达到-30.43%' '日换手率达到42.95%' '日换手率达到41.73%'\n", + " '日换手率达到35.11%' '日换手率达到45.39%' '日换手率达到32.27%' '日价格涨幅偏离值达到7.56%'\n", + " '异常期间价格跌幅偏离值累计达到-13.89%' '日价格跌幅偏离值达到-12.44%' '日换手率达到37.30%'\n", + " '日价格振幅达到16.28%' '日价格振幅达到19.34%' '异常期间价格涨幅偏离值累计达到27.48%'\n", + " '异常期间价格涨幅偏离值累计达到12.48%' '异常期间价格涨幅偏离值累计达到20.18%' '异常期间价格涨幅偏离值累计达到20.26%'\n", + " '异常期间价格涨幅偏离值累计达到22.02%' '日价格跌幅偏离值达到-9.38%' '日价格跌幅偏离值达到-10.08%'\n", + " '日换手率达到58.15%' '日换手率达到43.57%' '日价格涨幅偏离值达到8.31%' '日换手率达到46.67%'\n", + " '日换手率达到32.90%' '日换手率达到33.19%' '日换手率达到41.68%' '异常期间价格涨幅偏离值累计达到20.05%'\n", + " '日价格涨幅偏离值达到10.36%' '日价格振幅达到15.29%' '日价格跌幅偏离值达到-8.96%' '日价格跌幅偏离值达到-9.64%'\n", + " '异常期间价格跌幅偏离值累计达到-22.28%' '日价格跌幅偏离值达到-7.65%' '日价格振幅达到16.34%'\n", + " '日价格振幅达到17.95%' '日换手率达到37.24%' '日换手率达到68.18%' '日换手率达到58.53%'\n", + " '日换手率达到47.28%' '异常期间价格涨幅偏离值累计达到40.35%' '异常期间价格涨幅偏离值累计达到30.70%'\n", + " '日换手率达到45.96%' '日换手率达到45.12%' '日换手率达到55.20%' '日换手率达到50.27%'\n", + " '异常期间价格涨幅偏离值累计达到15.59%' '异常期间价格涨幅偏离值累计达到15.15%' '异常期间价格跌幅偏离值累计达到-15.48%'\n", + " '连续三个交易日内,跌幅偏离值累计达到12%的ST证券、*ST证券' '严重异常期间日收盘价格涨幅偏离值累计达到108.96%'\n", + " '异常期间价格涨幅偏离值累计达到30.35%' '异常期间价格涨幅偏离值累计达到36.44%' '异常期间价格涨幅偏离值累计达到32.70%'\n", + " '日换手率达到20%的前五只证券' '日涨幅偏离值达到7%的前五只证券' '日振幅值达到15%的前五只证券' '日跌幅偏离值达到7%的前五只证券'\n", + " '异常期间价格涨幅偏离值累计达到16.78%' '异常期间价格涨幅偏离值累计达到15.39%' '异常期间价格跌幅偏离值累计达到-16.58%'\n", + " '异常期间价格涨幅偏离值累计达到16.84%' '异常期间价格跌幅偏离值累计达到-16.82%' '日价格跌幅偏离值达到-9.54%'\n", + " '日价格涨幅偏离值达到9.22%' '日价格涨幅偏离值达到10.46%' '日价格涨幅偏离值达到7.68%' '日价格涨幅偏离值达到10.62%'\n", + " '异常期间价格涨幅偏离值累计达到20.08%' '日价格振幅达到16.95%' '日换手率达到24.07%' '日换手率达到28.11%'\n", + " '日价格跌幅偏离值达到-9.14%' '异常期间价格涨幅偏离值累计达到20.78%' '日换手率达到27.40%' '日换手率达到25.58%'\n", + " '日换手率达到43.03%' '日价格涨幅偏离值达到11.19%' '日价格振幅达到18.21%' '异常期间价格涨幅偏离值累计达到21.46%'\n", + " '日价格跌幅偏离值达到-8.81%' '异常期间价格涨幅偏离值累计达到22.01%' '日价格振幅达到16.54%'\n", + " '日价格跌幅偏离值达到-8.05%' '日价格振幅达到16.56%' '异常期间价格跌幅偏离值累计达到-20.16%'\n", + " '日价格跌幅偏离值达到-7.92%' '异常期间价格跌幅偏离值累计达到-20.93%' '异常期间价格涨幅偏离值累计达到24.46%'\n", + " '日换手率达到32.82%' '日换手率达到31.87%' '日价格振幅达到22.24%'\n", + " '异常期间日均换手率放大196.25倍,并且累计换手率达到47.45%' '异常期间价格涨幅偏离值累计达到16.41%'\n", + " '异常期间价格跌幅偏离值累计达到-17.57%' '异常期间价格跌幅偏离值累计达到-16.00%'\n", + " '异常期间价格跌幅偏离值累计达到-15.90%' '异常期间价格涨幅偏离值累计达到15.50%' '异常期间价格涨幅偏离值累计达到15.47%'\n", + " '连续三个交易日内,涨幅偏离值累计达到12%的ST证券、*ST证券' '异常期间价格涨幅偏离值累计达到15.12%'\n", + " '异常期间价格涨幅偏离值累计达到17.33%' '异常期间价格跌幅偏离值累计达到-15.08%' '异常期间价格涨幅偏离值累计达到17.56%'\n", + " '异常期间价格跌幅偏离值累计达到-15.38%' '异常期间价格跌幅偏离值累计达到-15.11%'\n", + " '异常期间价格跌幅偏离值累计达到-15.41%' '异常期间价格跌幅偏离值累计达到-15.24%' '异常期间价格涨幅偏离值累计达到15.01%'\n", + " '异常期间价格跌幅偏离值累计达到-15.87%' '异常期间价格涨幅偏离值累计达到15.72%' '异常期间价格涨幅偏离值累计达到15.00%'\n", + " '异常期间价格跌幅偏离值累计达到-17.44%' '异常期间价格跌幅偏离值累计达到-15.04%'\n", + " '异常期间价格跌幅偏离值累计达到-15.36%' '异常期间价格跌幅偏离值累计达到-15.44%'\n", + " '异常期间价格跌幅偏离值累计达到-16.85%' '异常期间价格跌幅偏离值累计达到-15.66%' '新股首日交易信息'\n", + " '当日无价格涨跌幅限制的A股,出现异常波动停牌的' '日价格跌幅偏离值达到-8.51%' '日价格振幅达到18.39%'\n", + " '日价格涨幅偏离值达到11.49%' '异常期间价格涨幅偏离值累计达到20.41%' '日换手率达到33.69%' '日换手率达到30.27%'\n", + " '日价格振幅达到20.61%' '日换手率达到56.43%' '日换手率达到66.76%' '日换手率达到43.51%'\n", + " '日价格跌幅偏离值达到-10.00%' '日价格涨幅偏离值达到10.00%' '日价格涨幅偏离值达到9.00%'\n", + " '日价格涨幅偏离值达到7.79%' '日价格涨幅偏离值达到9.84%' '日价格振幅达到19.28%' '日价格跌幅偏离值达到-10.16%'\n", + " '异常期间价格涨幅偏离值累计达到12.13%' '异常期间价格涨幅偏离值累计达到21.01%' '日价格跌幅偏离值达到-8.47%'\n", + " '日换手率达到32.60%' '异常期间价格跌幅偏离值累计达到-22.11%' '日换手率达到27.97%' '日换手率达到28.78%'\n", + " '日换手率达到31.46%' '异常期间价格跌幅偏离值累计达到-15.40%' '日价格涨幅偏离值达到8.46%'\n", + " '异常期间价格涨幅偏离值累计达到23.98%' '异常期间价格跌幅偏离值累计达到-12.04%' '异常期间价格跌幅偏离值累计达到-15.46%'\n", + " '异常期间价格跌幅偏离值累计达到-15.18%' '异常期间价格涨幅偏离值累计达到21.10%' '异常期间价格跌幅偏离值累计达到-12.24%'\n", + " '日换手率达到48.90%' '异常期间价格涨幅偏离值累计达到20.71%' '日换手率达到42.14%' '日换手率达到32.49%'\n", + " '日换手率达到37.56%' '日换手率达到32.46%' '异常期间价格涨幅偏离值累计达到16.43%' '日价格振幅达到19.70%'\n", + " '日价格涨幅偏离值达到10.21%' '异常期间价格涨幅偏离值累计达到21.66%' '日价格跌幅偏离值达到-9.79%'\n", + " '日价格跌幅偏离值达到-9.33%' '日价格振幅达到16.90%' '日换手率达到69.01%' '日换手率达到46.87%'\n", + " '日换手率达到37.50%' '日换手率达到64.44%' '日换手率达到55.92%' '日价格振幅达到18.18%'\n", + " '日价格涨幅偏离值达到10.03%' '日价格振幅达到21.56%' '日价格跌幅偏离值达到-9.97%'\n", + " '异常期间价格跌幅偏离值累计达到-21.94%' '日价格振幅达到17.35%' '异常期间价格涨幅偏离值累计达到21.37%'\n", + " '日价格振幅达到18.88%' '异常期间价格跌幅偏离值累计达到-23.75%' '日换手率达到38.43%' '日换手率达到66.89%'\n", + " '日换手率达到37.97%' '异常期间价格跌幅偏离值累计达到-22.71%' '日换手率达到67.79%' '日换手率达到72.22%'\n", + " '连续三个交易日内的日均换手率与前五个交易日日均换手率的比值到达30倍,并且该股票封闭式']\n", + "\n", + "不同的数据共有:638 个\n" + ] + } + ], + "source": [ + "\n", + "# 假设您的 DataFrame 叫做 df,要查询的列名是 'column_name'\n", + "unique_values = all_daily_data_df['reason'].unique()\n", + "number_of_unique_values = len(unique_values)\n", + "\n", + "print(f\"该列所有不同的数据为:\\n{unique_values}\")\n", + "print(f\"\\n不同的数据共有:{number_of_unique_values} 个\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "new_trader", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/main/data/update/cyq-perf.ipynb b/main/data/update/cyq-perf.ipynb index caf1ca7..6a8ad5a 100644 --- a/main/data/update/cyq-perf.ipynb +++ b/main/data/update/cyq-perf.ipynb @@ -32,22 +32,22 @@ "name": "stdout", "output_type": "stream", "text": [ - " ts_code trade_date\n", - "0 000001.SZ 20250312\n", - "1 000002.SZ 20250312\n", - "2 000004.SZ 20250312\n", - "3 000006.SZ 20250312\n", - "4 000007.SZ 20250312\n", - "... ... ...\n", - "5384 920445.BJ 20250508\n", - "5385 920489.BJ 20250508\n", - "5386 920682.BJ 20250508\n", - "5387 920799.BJ 20250508\n", - "5388 920819.BJ 20250508\n", + " ts_code trade_date\n", + "0 000001.SZ 20250312\n", + "1 000002.SZ 20250312\n", + "2 000004.SZ 20250312\n", + "3 000006.SZ 20250312\n", + "4 000007.SZ 20250312\n", + "... ... ...\n", + "26947 920445.BJ 20250512\n", + "26948 920489.BJ 20250512\n", + "26949 920682.BJ 20250512\n", + "26950 920799.BJ 20250512\n", + "26951 920819.BJ 20250512\n", "\n", - "[7665071 rows x 2 columns]\n", - "20250508\n", - "start_date: 20250509\n" + "[7697412 rows x 2 columns]\n", + "20250516\n", + "start_date: 20250519\n" ] } ], @@ -86,36 +86,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "任务 20250619 完成\n", "任务 20250620 完成\n", + "任务 20250619 完成\n", "任务 20250618 完成\n", "任务 20250617 完成\n", - "任务 20250616 完成\n", "任务 20250613 完成\n", - "任务 20250612 完成\n", + "任务 20250616 完成\n", "任务 20250611 完成\n", + "任务 20250612 完成\n", "任务 20250610 完成\n", "任务 20250609 完成\n", "任务 20250606 完成\n", "任务 20250605 完成\n", "任务 20250604 完成\n", "任务 20250603 完成\n", - "任务 20250530 完成\n", "任务 20250529 完成\n", - "任务 20250528 完成\n", + "任务 20250530 完成\n", "任务 20250527 完成\n", - "任务 20250523 完成\n", + "任务 20250528 完成\n", "任务 20250526 完成\n", - "任务 20250521 完成\n", + "任务 20250523 完成\n", "任务 20250522 完成\n", - "任务 20250519 完成\n", + "任务 20250521 完成\n", "任务 20250520 完成\n", - "任务 20250516 完成\n", - "任务 20250515 完成\n", - "任务 20250514 完成\n", - "任务 20250513 完成\n", - "任务 20250512 完成\n", - "任务 20250509 完成\n" + "任务 20250519 完成\n" ] } ], diff --git a/main/data/update/sw_daily.ipynb b/main/data/update/sw_daily.ipynb index 6d3954e..4cca328 100644 --- a/main/data/update/sw_daily.ipynb +++ b/main/data/update/sw_daily.ipynb @@ -32,22 +32,22 @@ "name": "stdout", "output_type": "stream", "text": [ - " ts_code trade_date\n", - "0 801001.SI 20250221\n", - "1 801002.SI 20250221\n", - "2 801003.SI 20250221\n", - "3 801005.SI 20250221\n", - "4 801010.SI 20250221\n", - ".. ... ...\n", - "434 859811.SI 20250508\n", - "435 859821.SI 20250508\n", - "436 859822.SI 20250508\n", - "437 859852.SI 20250508\n", - "438 859951.SI 20250508\n", + " ts_code trade_date\n", + "0 801001.SI 20250221\n", + "1 801002.SI 20250221\n", + "2 801003.SI 20250221\n", + "3 801005.SI 20250221\n", + "4 801010.SI 20250221\n", + "... ... ...\n", + "2190 859811.SI 20250512\n", + "2191 859821.SI 20250512\n", + "2192 859822.SI 20250512\n", + "2193 859852.SI 20250512\n", + "2194 859951.SI 20250512\n", "\n", - "[1066343 rows x 2 columns]\n", - "20250508\n", - "start_date: 20250509\n" + "[1068977 rows x 2 columns]\n", + "20250516\n", + "start_date: 20250519\n" ] } ], @@ -90,16 +90,16 @@ "任务 20250620 完成\n", "任务 20250617 完成\n", "任务 20250618 完成\n", - "任务 20250616 完成\n", "任务 20250613 完成\n", + "任务 20250616 完成\n", "任务 20250612 完成\n", "任务 20250611 完成\n", "任务 20250610 完成\n", "任务 20250609 完成\n", - "任务 20250606 完成\n", "任务 20250605 完成\n", - "任务 20250604 完成\n", + "任务 20250606 完成\n", "任务 20250603 完成\n", + "任务 20250604 完成\n", "任务 20250530 完成\n", "任务 20250529 完成\n", "任务 20250528 完成\n", @@ -109,13 +109,7 @@ "任务 20250522 完成\n", "任务 20250521 完成\n", "任务 20250520 完成\n", - "任务 20250519 完成\n", - "任务 20250515 完成\n", - "任务 20250516 完成\n", - "任务 20250514 完成\n", - "任务 20250513 完成\n", - "任务 20250512 完成\n", - "任务 20250509 完成\n" + "任务 20250519 完成\n" ] } ], diff --git a/main/data/update/update_daily_basic.ipynb b/main/data/update/update_daily_basic.ipynb index 94332df..6a11381 100644 --- a/main/data/update/update_daily_basic.ipynb +++ b/main/data/update/update_daily_basic.ipynb @@ -94,17 +94,17 @@ "output_type": "stream", "text": [ "\n", - "Index: 8615301 entries, 0 to 5388\n", + "Index: 8647642 entries, 0 to 26951\n", "Data columns (total 2 columns):\n", " # Column Dtype \n", "--- ------ ----- \n", " 0 ts_code object\n", " 1 trade_date object\n", "dtypes: object(2)\n", - "memory usage: 197.2+ MB\n", + "memory usage: 197.9+ MB\n", "None\n", - "20250508\n", - "20250509\n" + "20250516\n", + "20250519\n" ] } ], @@ -144,14 +144,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "任务 20250718 完成\n", "任务 20250717 完成\n", - "任务 20250716 完成\n", + "任务 20250718 完成\n", "任务 20250715 完成\n", - "任务 20250711 完成\n", + "任务 20250716 完成\n", "任务 20250714 完成\n", - "任务 20250710 完成\n", + "任务 20250711 完成\n", "任务 20250709 完成\n", + "任务 20250710 完成\n", "任务 20250708 完成\n", "任务 20250707 完成\n", "任务 20250704 完成\n", @@ -160,12 +160,12 @@ "任务 20250701 完成\n", "任务 20250630 完成\n", "任务 20250627 完成\n", - "任务 20250626 完成\n", "任务 20250625 完成\n", + "任务 20250626 完成\n", "任务 20250624 完成\n", "任务 20250623 完成\n", - "任务 20250620 完成\n", "任务 20250619 完成\n", + "任务 20250620 完成\n", "任务 20250618 完成\n", "任务 20250617 完成\n", "任务 20250616 完成\n", @@ -178,22 +178,16 @@ "任务 20250605 完成\n", "任务 20250604 完成\n", "任务 20250603 完成\n", - "任务 20250530 完成\n", "任务 20250529 完成\n", - "任务 20250528 完成\n", + "任务 20250530 完成\n", "任务 20250527 完成\n", + "任务 20250528 完成\n", "任务 20250526 完成\n", "任务 20250523 完成\n", "任务 20250522 完成\n", "任务 20250521 完成\n", "任务 20250520 完成\n", - "任务 20250519 完成\n", - "任务 20250516 完成\n", - "任务 20250515 完成\n", - "任务 20250514 完成\n", - "任务 20250513 完成\n", - "任务 20250512 完成\n", - "任务 20250509 完成\n" + "任务 20250519 完成\n" ] } ], @@ -263,59 +257,59 @@ "name": "stdout", "output_type": "stream", "text": [ - " ts_code trade_date close turnover_rate turnover_rate_f \\\n", - "0 300575.SZ 20250509 6.05 1.9284 2.1880 \n", - "1 300247.SZ 20250509 3.77 2.1735 2.5437 \n", - "2 603038.SH 20250509 15.80 17.5702 32.3972 \n", - "3 002030.SZ 20250509 5.82 0.8252 1.2070 \n", - "4 600157.SH 20250509 1.36 0.8369 1.0222 \n", - "... ... ... ... ... ... \n", - "5384 600841.SH 20250509 5.57 1.0271 3.2670 \n", - "5385 300968.SZ 20250509 14.76 1.2857 2.7636 \n", - "5386 300634.SZ 20250509 25.79 5.2551 9.4581 \n", - "5387 300295.SZ 20250509 15.73 3.0347 3.2458 \n", - "5388 688370.SH 20250509 19.15 1.2008 1.2008 \n", + " ts_code trade_date close turnover_rate turnover_rate_f \\\n", + "0 000839.SZ 20250523 2.67 0.8124 1.2782 \n", + "1 300274.SZ 20250523 60.60 3.2852 3.7071 \n", + "2 301356.SZ 20250523 17.59 5.0050 5.0698 \n", + "3 600152.SH 20250523 5.73 1.3359 2.0988 \n", + "4 300049.SZ 20250523 29.91 1.6066 1.7292 \n", + "... ... ... ... ... ... \n", + "26941 002458.SZ 20250519 8.36 2.1950 2.5416 \n", + "26942 600882.SH 20250519 27.18 2.2244 4.6853 \n", + "26943 001283.SZ 20250519 54.51 3.0453 3.0453 \n", + "26944 000718.SZ 20250519 2.20 1.4790 2.2404 \n", + "26945 002141.SZ 20250519 3.09 4.9267 7.1872 \n", "\n", - " volume_ratio pe pe_ttm pb ps ps_ttm dv_ratio \\\n", - "0 0.71 239.8914 NaN 1.3451 1.1608 1.1259 1.9835 \n", - "1 0.96 64.6952 53.1680 2.7649 4.4008 3.9673 0.0000 \n", - "2 4.47 183.7603 154.4297 3.1047 4.0259 3.7692 0.2434 \n", - "3 0.62 NaN NaN 1.0296 9.5754 9.9145 0.2577 \n", - "4 0.55 19.3625 26.3896 0.6394 1.0656 1.1327 0.4044 \n", - "... ... ... ... ... ... ... ... \n", - "5384 0.77 NaN NaN 2.3362 1.1952 1.2860 0.0000 \n", - "5385 0.71 115.0812 181.8721 3.2254 4.9990 5.1146 0.3388 \n", - "5386 1.01 50.5639 52.9222 4.1166 7.0433 6.7806 0.8063 \n", - "5387 0.65 NaN NaN 2.6398 24.2982 28.1758 0.0000 \n", - "5388 1.25 29.1668 36.1111 0.9812 4.4106 4.4983 NaN \n", + " volume_ratio pe pe_ttm pb ps ps_ttm dv_ratio \\\n", + "0 0.62 NaN NaN 7.4695 3.0824 3.1095 0.0000 \n", + "1 1.82 11.3840 9.8414 3.0807 1.6137 1.4907 1.1292 \n", + "2 1.43 NaN 18055.4366 1.2789 4.2618 3.3028 0.0000 \n", + "3 1.11 NaN NaN 1.7367 1.9844 2.0758 0.0000 \n", + "4 1.05 70.3242 80.3071 4.4707 5.9056 5.8725 0.0000 \n", + "... ... ... ... ... ... ... ... \n", + "26941 1.47 18.3588 24.2570 2.1403 2.9497 3.0116 2.3923 \n", + "26942 0.89 122.4919 89.9537 3.0986 2.8733 2.7144 0.0000 \n", + "26943 0.92 48.1520 36.6481 2.1043 0.8602 0.8229 0.8691 \n", + "26944 1.76 40.4178 55.0402 0.7058 3.1476 3.2425 3.6364 \n", + "26945 1.51 NaN NaN 3.8214 7.2461 4.4422 0.0000 \n", "\n", - " dv_ttm total_share float_share free_share total_mv \\\n", - "0 1.9835 4.647564e+04 3.427082e+04 3.020469e+04 2.811776e+05 \n", - "1 NaN 8.040403e+04 8.032753e+04 6.863630e+04 3.031232e+05 \n", - "2 0.2434 2.686771e+04 2.686771e+04 1.457134e+04 4.245098e+05 \n", - "3 0.2577 1.403446e+05 1.403446e+05 9.595371e+04 8.168056e+05 \n", - "4 0.4044 2.221776e+06 2.221776e+06 1.819047e+06 3.021616e+06 \n", - "... ... ... ... ... ... \n", - "5384 NaN 1.387822e+05 1.043024e+05 3.279094e+04 7.730167e+05 \n", - "5385 0.3388 4.133800e+04 4.133800e+04 1.923185e+04 6.101489e+05 \n", - "5386 0.8063 4.512109e+04 4.346809e+04 2.415175e+04 1.163673e+06 \n", - "5387 NaN 1.896137e+04 1.675486e+04 1.566518e+04 2.982624e+05 \n", - "5388 NaN 1.371079e+04 4.374912e+03 4.374912e+03 2.625616e+05 \n", + " dv_ttm total_share float_share free_share total_mv \\\n", + "0 NaN 391982.6352 391982.6352 249133.8007 1.046594e+06 \n", + "1 1.1292 207321.1424 158970.9449 140880.3307 1.256366e+07 \n", + "2 NaN 21600.0000 5481.0000 5410.9920 3.799440e+05 \n", + "3 NaN 52907.9375 52907.9375 33676.4965 3.031625e+05 \n", + "4 NaN 26635.6100 23351.5217 21696.0562 7.966711e+05 \n", + "... ... ... ... ... ... \n", + "26941 2.3577 110641.2915 74886.8285 64675.1303 9.249612e+05 \n", + "26942 NaN 51205.3647 51205.3647 24310.0793 1.391762e+06 \n", + "26943 0.8691 8061.0011 5785.5721 5785.5721 4.394052e+05 \n", + "26944 3.6364 303463.6384 228209.3122 150654.2061 6.676200e+05 \n", + "26945 NaN 103293.5798 103159.2875 70714.2228 3.191772e+05 \n", "\n", - " circ_mv is_st \n", - "0 2.073385e+05 False \n", - "1 3.028348e+05 False \n", - "2 4.245098e+05 False \n", - "3 8.168056e+05 False \n", - "4 3.021616e+06 False \n", - "... ... ... \n", - "5384 5.809646e+05 False \n", - "5385 6.101489e+05 False \n", - "5386 1.121042e+06 False \n", - "5387 2.635540e+05 False \n", - "5388 8.377956e+04 False \n", + " circ_mv is_st \n", + "0 1.046594e+06 False \n", + "1 9.633639e+06 False \n", + "2 9.641079e+04 False \n", + "3 3.031625e+05 False \n", + "4 6.984440e+05 False \n", + "... ... ... \n", + "26941 6.260539e+05 False \n", + "26942 1.391762e+06 False \n", + "26943 3.153715e+05 False \n", + "26944 5.020605e+05 False \n", + "26945 3.187622e+05 True \n", "\n", - "[5389 rows x 19 columns]\n" + "[26946 rows x 19 columns]\n" ] } ], @@ -339,59 +333,46 @@ "name": "stdout", "output_type": "stream", "text": [ - " ts_code trade_date close turnover_rate turnover_rate_f \\\n", - "54 002496.SZ 20250509 1.43 3.1262 3.2341 \n", - "148 603828.SH 20250509 5.04 3.5674 7.1692 \n", - "166 600599.SH 20250509 7.70 10.8623 27.2882 \n", - "193 000820.SZ 20250509 2.16 5.5698 5.7239 \n", - "203 300506.SZ 20250509 3.28 0.6710 0.9449 \n", - "... ... ... ... ... ... \n", - "5204 002602.SZ 20250509 8.00 1.3867 1.7044 \n", - "5253 300147.SZ 20250509 7.37 7.2159 9.3379 \n", - "5264 002501.SZ 20250509 2.08 2.4301 3.1371 \n", - "5317 600421.SH 20250509 5.27 2.7391 5.8971 \n", - "5345 600289.SH 20250509 5.78 1.3847 2.0115 \n", + " ts_code trade_date close turnover_rate turnover_rate_f \\\n", + "23 002898.SZ 20250523 10.20 22.8874 36.4442 \n", + "35 000889.SZ 20250523 2.76 1.6609 2.2443 \n", + "53 300379.SZ 20250523 6.12 9.3935 9.5800 \n", + "58 300268.SZ 20250523 10.27 1.8178 2.5956 \n", + "155 000615.SZ 20250523 3.15 1.1640 1.7189 \n", + "... ... ... ... ... ... \n", + "26880 300147.SZ 20250519 8.80 6.8409 8.8527 \n", + "26891 002501.SZ 20250519 2.17 4.4260 5.7136 \n", + "26910 600421.SH 20250519 6.39 3.4329 7.3909 \n", + "26938 600289.SH 20250519 5.90 1.1380 1.6532 \n", + "26945 002141.SZ 20250519 3.09 4.9267 7.1872 \n", "\n", - " volume_ratio pe pe_ttm pb ps ps_ttm dv_ratio \\\n", - "54 0.73 NaN NaN 1.6044 7.6992 7.2633 0.0 \n", - "148 1.65 349.9490 1691.0271 3.9734 1.2211 1.3170 0.0 \n", - "166 4.51 NaN NaN 11.5933 3.9468 4.0472 0.0 \n", - "193 1.00 NaN NaN 9.5443 11.2714 14.3393 0.0 \n", - "203 0.87 NaN NaN 28.5909 19.5183 19.3088 0.0 \n", - "... ... ... ... ... ... ... ... \n", - "5204 0.78 49.1432 31.1887 2.2169 2.6358 2.2496 0.0 \n", - "5253 1.74 NaN NaN 5.0393 2.6221 2.8487 0.0 \n", - "5264 0.87 NaN NaN 22.5816 22.1370 26.0255 0.0 \n", - "5317 0.74 NaN NaN 143.1934 8.7976 8.9449 0.0 \n", - "5345 0.55 NaN NaN 2.9752 11.3890 11.6628 0.0 \n", + " volume_ratio pe pe_ttm pb ps ps_ttm dv_ratio dv_ttm \\\n", + "23 10.43 NaN NaN 3.6011 6.8112 7.2338 0.1961 0.1961 \n", + "35 0.52 NaN NaN 27.2957 1.7661 1.7554 0.0000 NaN \n", + "53 0.89 NaN NaN 1.0993 4.5062 4.1828 0.0000 NaN \n", + "58 0.99 NaN NaN NaN 0.5235 0.5833 0.0000 NaN \n", + "155 0.99 NaN NaN NaN 2.1957 2.2727 0.0000 NaN \n", + "... ... .. ... ... ... ... ... ... \n", + "26880 1.55 NaN NaN 6.0171 3.1309 3.4015 0.0000 NaN \n", + "26891 1.83 NaN NaN 23.5587 23.0948 27.1516 0.0000 NaN \n", + "26910 0.92 NaN NaN 173.6254 10.6672 10.8459 0.0000 NaN \n", + "26938 0.46 NaN NaN 3.0370 11.6255 11.9049 0.0000 NaN \n", + "26945 1.51 NaN NaN 3.8214 7.2461 4.4422 0.0000 NaN \n", "\n", - " dv_ttm total_share float_share free_share total_mv \\\n", - "54 NaN 150758.9677 118138.6559 114196.4999 2.155853e+05 \n", - "148 NaN 59596.0158 59593.9625 29654.2988 3.003639e+05 \n", - "166 NaN 16600.0000 16600.0000 6607.7948 1.278200e+05 \n", - "193 NaN 64362.0201 29403.1899 28611.4718 1.390220e+05 \n", - "203 NaN 69559.6569 57572.5450 40880.9749 2.281557e+05 \n", - "... ... ... ... ... ... \n", - "5204 NaN 745255.6968 687870.8273 559649.7754 5.962046e+06 \n", - "5253 NaN 66127.9045 65745.9042 50804.9121 4.873627e+05 \n", - "5264 NaN 355000.0000 354999.9006 274999.9006 7.384000e+05 \n", - "5317 NaN 19560.0000 19560.0000 9085.2748 1.030812e+05 \n", - "5345 NaN 63105.2069 56592.2684 38956.2787 3.647481e+05 \n", + " total_share float_share free_share total_mv circ_mv is_st \n", + "23 17600.0000 10126.2561 6359.4096 179520.0000 103287.8122 True \n", + "35 93629.1116 86984.9676 64375.7658 258416.3480 240078.5106 True \n", + "53 55792.2828 52663.7564 51638.5483 341448.7707 322302.1892 True \n", + "58 17420.0000 13370.7500 9364.1581 178903.4000 137317.6025 True \n", + "155 76297.9719 76250.0287 51632.2709 240338.6115 240187.5904 True \n", + "... ... ... ... ... ... ... \n", + "26880 66127.9045 65745.9042 50804.9121 581925.5596 578563.9570 True \n", + "26891 355000.0000 354999.9006 274999.9006 770350.0000 770349.7843 True \n", + "26910 19560.0000 19560.0000 9085.2748 124988.4000 124988.4000 True \n", + "26938 63105.2069 56592.2684 38956.2787 372320.7207 333894.3836 True \n", + "26945 103293.5798 103159.2875 70714.2228 319177.1616 318762.1984 True \n", "\n", - " circ_mv is_st \n", - "54 1.689383e+05 True \n", - "148 3.003536e+05 True \n", - "166 1.278200e+05 True \n", - "193 6.351089e+04 True \n", - "203 1.888379e+05 True \n", - "... ... ... \n", - "5204 5.502967e+06 True \n", - "5253 4.845473e+05 True \n", - "5264 7.383998e+05 True \n", - "5317 1.030812e+05 True \n", - "5345 3.271033e+05 True \n", - "\n", - "[197 rows x 19 columns]\n" + "[944 rows x 19 columns]\n" ] } ], @@ -441,7 +422,7 @@ "output_type": "stream", "text": [ "\n", - "Index: 8620690 entries, 0 to 5388\n", + "Index: 8674588 entries, 0 to 26945\n", "Data columns (total 3 columns):\n", " # Column Dtype \n", "--- ------ ----- \n", @@ -449,7 +430,7 @@ " 1 trade_date object\n", " 2 is_st bool \n", "dtypes: bool(1), object(2)\n", - "memory usage: 205.5+ MB\n", + "memory usage: 206.8+ MB\n", "None\n" ] } diff --git a/main/data/update/update_daily_data.ipynb b/main/data/update/update_daily_data.ipynb index 37f7158..53739cb 100644 --- a/main/data/update/update_daily_data.ipynb +++ b/main/data/update/update_daily_data.ipynb @@ -38,17 +38,17 @@ "output_type": "stream", "text": [ "\n", - "Index: 8686674 entries, 0 to 5357\n", + "Index: 8718823 entries, 0 to 26790\n", "Data columns (total 2 columns):\n", " # Column Dtype \n", "--- ------ ----- \n", " 0 ts_code object\n", " 1 trade_date object\n", "dtypes: object(2)\n", - "memory usage: 198.8+ MB\n", + "memory usage: 199.6+ MB\n", "None\n", - "20250508\n", - "20250509\n" + "20250516\n", + "20250519\n" ] } ], @@ -87,12 +87,12 @@ "text": [ "任务 000001.SZ 完成\n", "任务 000002.SZ 完成\n", - "任务 000004.SZ 完成\n", "任务 000006.SZ 完成\n", + "任务 000004.SZ 完成\n", "任务 000007.SZ 完成\n", "任务 000008.SZ 完成\n", - "任务 000009.SZ 完成\n", "任务 000010.SZ 完成\n", + "任务 000009.SZ 完成\n", "任务 000011.SZ 完成\n", "任务 000012.SZ 完成\n", "任务 000014.SZ 完成\n", @@ -101,20 +101,20 @@ "任务 000019.SZ 完成\n", "任务 000020.SZ 完成\n", "任务 000021.SZ 完成\n", - "任务 000025.SZ 完成\n", "任务 000026.SZ 完成\n", - "任务 000027.SZ 完成\n", + "任务 000025.SZ 完成\n", "任务 000028.SZ 完成\n", + "任务 000027.SZ 完成\n", "任务 000029.SZ 完成\n", "任务 000030.SZ 完成\n", "任务 000031.SZ 完成\n", "任务 000032.SZ 完成\n", - "任务 000034.SZ 完成\n", "任务 000035.SZ 完成\n", - "任务 000036.SZ 完成\n", + "任务 000034.SZ 完成\n", "任务 000037.SZ 完成\n", - "任务 000039.SZ 完成\n", + "任务 000036.SZ 完成\n", "任务 000040.SZ 完成\n", + "任务 000039.SZ 完成\n", "任务 000042.SZ 完成\n", "任务 000045.SZ 完成\n", "任务 000048.SZ 完成\n", @@ -131,14 +131,14 @@ "任务 000065.SZ 完成\n", "任务 000066.SZ 完成\n", "任务 000068.SZ 完成\n", - "任务 000069.SZ 完成\n", "任务 000070.SZ 完成\n", + "任务 000069.SZ 完成\n", "任务 000078.SZ 完成\n", "任务 000088.SZ 完成\n", - "任务 000089.SZ 完成\n", "任务 000090.SZ 完成\n", - "任务 000096.SZ 完成\n", + "任务 000089.SZ 完成\n", "任务 000099.SZ 完成\n", + "任务 000096.SZ 完成\n", "任务 000100.SZ 完成\n", "任务 000151.SZ 完成\n", "任务 000153.SZ 完成\n", @@ -197,16 +197,16 @@ "任务 000526.SZ 完成\n", "任务 000528.SZ 完成\n", "任务 000529.SZ 完成\n", - "任务 000530.SZ 完成\n", "任务 000531.SZ 完成\n", + "任务 000530.SZ 完成\n", "任务 000532.SZ 完成\n", "任务 000533.SZ 完成\n", "任务 000534.SZ 完成\n", "任务 000536.SZ 完成\n", - "任务 000537.SZ 完成\n", "任务 000538.SZ 完成\n", - "任务 000539.SZ 完成\n", + "任务 000537.SZ 完成\n", "任务 000541.SZ 完成\n", + "任务 000539.SZ 完成\n", "任务 000543.SZ 完成\n", "任务 000544.SZ 完成\n", "任务 000545.SZ 完成\n", @@ -225,26 +225,26 @@ "任务 000560.SZ 完成\n", "任务 000561.SZ 完成\n", "任务 000563.SZ 完成\n", - "任务 000565.SZ 完成\n", "任务 000564.SZ 完成\n", + "任务 000565.SZ 完成\n", "任务 000566.SZ 完成\n", "任务 000567.SZ 完成\n", - "任务 000570.SZ 完成\n", "任务 000568.SZ 完成\n", - "任务 000572.SZ 完成\n", + "任务 000570.SZ 完成\n", "任务 000571.SZ 完成\n", + "任务 000572.SZ 完成\n", "任务 000573.SZ 完成\n", "任务 000576.SZ 完成\n", - "任务 000582.SZ 完成\n", "任务 000581.SZ 完成\n", - "任务 000586.SZ 完成\n", + "任务 000582.SZ 完成\n", "任务 000584.SZ 完成\n", + "任务 000586.SZ 完成\n", "任务 000589.SZ 完成\n", "任务 000590.SZ 完成\n", - "任务 000592.SZ 完成\n", "任务 000591.SZ 完成\n", - "任务 000595.SZ 完成\n", + "任务 000592.SZ 完成\n", "任务 000593.SZ 完成\n", + "任务 000595.SZ 完成\n", "任务 000596.SZ 完成\n", "任务 000597.SZ 完成\n", "任务 000598.SZ 完成\n", @@ -283,17 +283,17 @@ "任务 000652.SZ 完成\n", "任务 000655.SZ 完成\n", "任务 000656.SZ 完成\n", - "任务 000657.SZ 完成\n", "任务 000659.SZ 完成\n", "任务 000661.SZ 完成\n", + "任务 000657.SZ 完成\n", "任务 000663.SZ 完成\n", "任务 000665.SZ 完成\n", "任务 000668.SZ 完成\n", "任务 000669.SZ 完成\n", "任务 000670.SZ 完成\n", "任务 000672.SZ 完成\n", - "任务 000676.SZ 完成\n", "任务 000677.SZ 完成\n", + "任务 000676.SZ 完成\n", "任务 000678.SZ 完成\n", "任务 000679.SZ 完成\n", "任务 000680.SZ 完成\n", @@ -351,12 +351,12 @@ "任务 000757.SZ 完成\n", "任务 000758.SZ 完成\n", "任务 000759.SZ 完成\n", - "任务 000762.SZ 完成\n", "任务 000761.SZ 完成\n", + "任务 000762.SZ 完成\n", "任务 000766.SZ 完成\n", "任务 000767.SZ 完成\n", - "任务 000776.SZ 完成\n", "任务 000768.SZ 完成\n", + "任务 000776.SZ 完成\n", "任务 000777.SZ 完成\n", "任务 000778.SZ 完成\n", "任务 000779.SZ 完成\n", @@ -367,10 +367,10 @@ "任务 000788.SZ 完成\n", "任务 000789.SZ 完成\n", "任务 000790.SZ 完成\n", - "任务 000792.SZ 完成\n", "任务 000791.SZ 完成\n", - "任务 000795.SZ 完成\n", + "任务 000792.SZ 完成\n", "任务 000793.SZ 完成\n", + "任务 000795.SZ 完成\n", "任务 000796.SZ 完成\n", "任务 000797.SZ 完成\n", "任务 000798.SZ 完成\n", @@ -379,32 +379,32 @@ "任务 000801.SZ 完成\n", "任务 000802.SZ 完成\n", "任务 000803.SZ 完成\n", - "任务 000809.SZ 完成\n", "任务 000807.SZ 完成\n", - "任务 000811.SZ 完成\n", + "任务 000809.SZ 完成\n", "任务 000810.SZ 完成\n", - "任务 000813.SZ 完成\n", + "任务 000811.SZ 完成\n", "任务 000812.SZ 完成\n", - "任务 000816.SZ 完成\n", + "任务 000813.SZ 完成\n", "任务 000815.SZ 完成\n", + "任务 000816.SZ 完成\n", "任务 000818.SZ 完成\n", "任务 000819.SZ 完成\n", - "任务 000821.SZ 完成\n", "任务 000820.SZ 完成\n", - "任务 000823.SZ 完成\n", + "任务 000821.SZ 完成\n", "任务 000822.SZ 完成\n", + "任务 000823.SZ 完成\n", "任务 000825.SZ 完成\n", "任务 000826.SZ 完成\n", "任务 000828.SZ 完成\n", "任务 000829.SZ 完成\n", "任务 000830.SZ 完成\n", "任务 000831.SZ 完成\n", - "任务 000837.SZ 完成\n", "任务 000833.SZ 完成\n", - "任务 000839.SZ 完成\n", + "任务 000837.SZ 完成\n", "任务 000838.SZ 完成\n", - "任务 000848.SZ 完成\n", + "任务 000839.SZ 完成\n", "任务 000850.SZ 完成\n", + "任务 000848.SZ 完成\n", "任务 000851.SZ 完成\n", "任务 000852.SZ 完成\n", "任务 000856.SZ 完成\n", @@ -423,34 +423,34 @@ "任务 000881.SZ 完成\n", "任务 000882.SZ 完成\n", "任务 000883.SZ 完成\n", - "任务 000885.SZ 完成\n", "任务 000886.SZ 完成\n", - "任务 000887.SZ 完成\n", + "任务 000885.SZ 完成\n", "任务 000888.SZ 完成\n", + "任务 000887.SZ 完成\n", "任务 000889.SZ 完成\n", "任务 000890.SZ 完成\n", "任务 000892.SZ 完成\n", "任务 000893.SZ 完成\n", - "任务 000895.SZ 完成\n", "任务 000897.SZ 完成\n", + "任务 000895.SZ 完成\n", "任务 000898.SZ 完成\n", "任务 000899.SZ 完成\n", - "任务 000900.SZ 完成\n", "任务 000901.SZ 完成\n", + "任务 000900.SZ 完成\n", "任务 000902.SZ 完成\n", "任务 000903.SZ 完成\n", "任务 000905.SZ 完成\n", "任务 000906.SZ 完成\n", "任务 000908.SZ 完成\n", "任务 000909.SZ 完成\n", - "任务 000910.SZ 完成\n", "任务 000911.SZ 完成\n", - "任务 000912.SZ 完成\n", + "任务 000910.SZ 完成\n", "任务 000913.SZ 完成\n", - "任务 000915.SZ 完成\n", + "任务 000912.SZ 完成\n", "任务 000917.SZ 完成\n", - "任务 000919.SZ 完成\n", + "任务 000915.SZ 完成\n", "任务 000920.SZ 完成\n", + "任务 000919.SZ 完成\n", "任务 000921.SZ 完成\n", "任务 000922.SZ 完成\n", "任务 000923.SZ 完成\n", @@ -559,34 +559,34 @@ "任务 001300.SZ 完成\n", "任务 001301.SZ 完成\n", "任务 001306.SZ 完成\n", - "任务 001308.SZ 完成\n", "任务 001309.SZ 完成\n", + "任务 001308.SZ 完成\n", "任务 001311.SZ 完成\n", "任务 001313.SZ 完成\n", - "任务 001314.SZ 完成\n", "任务 001316.SZ 完成\n", - "任务 001317.SZ 完成\n", + "任务 001314.SZ 完成\n", "任务 001318.SZ 完成\n", - "任务 001319.SZ 完成\n", + "任务 001317.SZ 完成\n", "任务 001322.SZ 完成\n", + "任务 001319.SZ 完成\n", "任务 001323.SZ 完成\n", "任务 001324.SZ 完成\n", "任务 001326.SZ 完成\n", "任务 001328.SZ 完成\n", "任务 001330.SZ 完成\n", "任务 001331.SZ 完成\n", - "任务 001332.SZ 完成\n", "任务 001333.SZ 完成\n", - "任务 001336.SZ 完成\n", + "任务 001332.SZ 完成\n", "任务 001337.SZ 完成\n", + "任务 001336.SZ 完成\n", "任务 001338.SZ 完成\n", "任务 001339.SZ 完成\n", - "任务 001356.SZ 完成\n", "任务 001358.SZ 完成\n", + "任务 001356.SZ 完成\n", "任务 001359.SZ 完成\n", "任务 001360.SZ 完成\n", - "任务 001366.SZ 完成\n", "任务 001367.SZ 完成\n", + "任务 001366.SZ 完成\n", "任务 001368.SZ 完成\n", "任务 001373.SZ 完成\n", "任务 001376.SZ 完成\n", @@ -597,22 +597,22 @@ "任务 001389.SZ 完成\n", "任务 001391.SZ 完成\n", "任务 001395.SZ 完成\n", - "任务 001696.SZ 完成\n", "任务 001872.SZ 完成\n", + "任务 001696.SZ 完成\n", "任务 001896.SZ 完成\n", "任务 001914.SZ 完成\n", "任务 001965.SZ 完成\n", "任务 001979.SZ 完成\n", "任务 002001.SZ 完成\n", "任务 002003.SZ 完成\n", - "任务 002004.SZ 完成\n", "任务 002005.SZ 完成\n", + "任务 002004.SZ 完成\n", "任务 002006.SZ 完成\n", "任务 002007.SZ 完成\n", "任务 002008.SZ 完成\n", "任务 002009.SZ 完成\n", - "任务 002010.SZ 完成\n", "任务 002011.SZ 完成\n", + "任务 002010.SZ 完成\n", "任务 002012.SZ 完成\n", "任务 002014.SZ 完成\n", "任务 002015.SZ 完成\n", @@ -621,22 +621,22 @@ "任务 002019.SZ 完成\n", "任务 002020.SZ 完成\n", "任务 002021.SZ 完成\n", - "任务 002022.SZ 完成\n", "任务 002023.SZ 完成\n", - "任务 002024.SZ 完成\n", + "任务 002022.SZ 完成\n", "任务 002025.SZ 完成\n", + "任务 002024.SZ 完成\n", "任务 002026.SZ 完成\n", "任务 002027.SZ 完成\n", - "任务 002028.SZ 完成\n", "任务 002029.SZ 完成\n", + "任务 002028.SZ 完成\n", "任务 002030.SZ 完成\n", "任务 002031.SZ 完成\n", - "任务 002032.SZ 完成\n", "任务 002033.SZ 完成\n", + "任务 002032.SZ 完成\n", "任务 002034.SZ 完成\n", "任务 002035.SZ 完成\n", - "任务 002036.SZ 完成\n", "任务 002037.SZ 完成\n", + "任务 002036.SZ 完成\n", "任务 002038.SZ 完成\n", "任务 002039.SZ 完成\n", "任务 002040.SZ 完成\n", @@ -686,8 +686,8 @@ "任务 002086.SZ 完成\n", "任务 002088.SZ 完成\n", "任务 002090.SZ 完成\n", - "任务 002091.SZ 完成\n", "任务 002092.SZ 完成\n", + "任务 002091.SZ 完成\n", "任务 002093.SZ 完成\n", "任务 002094.SZ 完成\n", "任务 002095.SZ 完成\n", @@ -704,12 +704,12 @@ "任务 002106.SZ 完成\n", "任务 002107.SZ 完成\n", "任务 002108.SZ 完成\n", - "任务 002109.SZ 完成\n", "任务 002110.SZ 完成\n", + "任务 002109.SZ 完成\n", "任务 002111.SZ 完成\n", "任务 002112.SZ 完成\n", - "任务 002114.SZ 完成\n", "任务 002115.SZ 完成\n", + "任务 002114.SZ 完成\n", "任务 002116.SZ 完成\n", "任务 002117.SZ 完成\n", "任务 002119.SZ 完成\n", @@ -746,8 +746,8 @@ "任务 002152.SZ 完成\n", "任务 002153.SZ 完成\n", "任务 002154.SZ 完成\n", - "任务 002156.SZ 完成\n", "任务 002155.SZ 完成\n", + "任务 002156.SZ 完成\n", "任务 002157.SZ 完成\n", "任务 002158.SZ 完成\n", "任务 002159.SZ 完成\n", @@ -874,8 +874,8 @@ "任务 002284.SZ 完成\n", "任务 002285.SZ 完成\n", "任务 002286.SZ 完成\n", - "任务 002289.SZ 完成\n", "任务 002287.SZ 完成\n", + "任务 002289.SZ 完成\n", "任务 002290.SZ 完成\n", "任务 002291.SZ 完成\n", "任务 002292.SZ 完成\n", @@ -965,38 +965,38 @@ "任务 002380.SZ 完成\n", "任务 002381.SZ 完成\n", "任务 002382.SZ 完成\n", - "任务 002384.SZ 完成\n", "任务 002383.SZ 完成\n", + "任务 002384.SZ 完成\n", "任务 002385.SZ 完成\n", "任务 002386.SZ 完成\n", "任务 002387.SZ 完成\n", "任务 002388.SZ 完成\n", "任务 002389.SZ 完成\n", "任务 002390.SZ 完成\n", - "任务 002392.SZ 完成\n", "任务 002391.SZ 完成\n", + "任务 002392.SZ 完成\n", "任务 002393.SZ 完成\n", "任务 002394.SZ 完成\n", - "任务 002396.SZ 完成\n", "任务 002395.SZ 完成\n", + "任务 002396.SZ 完成\n", "任务 002397.SZ 完成\n", "任务 002398.SZ 完成\n", "任务 002399.SZ 完成\n", "任务 002400.SZ 完成\n", "任务 002401.SZ 完成\n", "任务 002402.SZ 完成\n", - "任务 002404.SZ 完成\n", "任务 002403.SZ 完成\n", + "任务 002404.SZ 完成\n", "任务 002405.SZ 完成\n", "任务 002406.SZ 完成\n", - "任务 002408.SZ 完成\n", "任务 002407.SZ 完成\n", + "任务 002408.SZ 完成\n", "任务 002409.SZ 完成\n", "任务 002410.SZ 完成\n", "任务 002412.SZ 完成\n", "任务 002413.SZ 完成\n", - "任务 002415.SZ 完成\n", "任务 002414.SZ 完成\n", + "任务 002415.SZ 完成\n", "任务 002416.SZ 完成\n", "任务 002418.SZ 完成\n", "任务 002419.SZ 完成\n", @@ -1054,18 +1054,18 @@ "任务 002478.SZ 完成\n", "任务 002479.SZ 完成\n", "任务 002480.SZ 完成\n", - "任务 002482.SZ 完成\n", "任务 002481.SZ 完成\n", + "任务 002482.SZ 完成\n", "任务 002483.SZ 完成\n", "任务 002484.SZ 完成\n", "任务 002485.SZ 完成\n", "任务 002486.SZ 完成\n", "任务 002487.SZ 完成\n", "任务 002488.SZ 完成\n", - "任务 002490.SZ 完成\n", "任务 002489.SZ 完成\n", - "任务 002492.SZ 完成\n", + "任务 002490.SZ 完成\n", "任务 002491.SZ 完成\n", + "任务 002492.SZ 完成\n", "任务 002493.SZ 完成\n", "任务 002494.SZ 完成\n", "任务 002495.SZ 完成\n", @@ -1161,12 +1161,12 @@ "任务 002592.SZ 完成\n", "任务 002593.SZ 完成\n", "任务 002594.SZ 完成\n", - "任务 002595.SZ 完成\n", "任务 002596.SZ 完成\n", + "任务 002595.SZ 完成\n", "任务 002597.SZ 完成\n", "任务 002598.SZ 完成\n", - "任务 002599.SZ 完成\n", "任务 002600.SZ 完成\n", + "任务 002599.SZ 完成\n", "任务 002601.SZ 完成\n", "任务 002602.SZ 完成\n", "任务 002603.SZ 完成\n", @@ -1183,20 +1183,20 @@ "任务 002616.SZ 完成\n", "任务 002617.SZ 完成\n", "任务 002620.SZ 完成\n", - "任务 002622.SZ 完成\n", "任务 002623.SZ 完成\n", + "任务 002622.SZ 完成\n", "任务 002624.SZ 完成\n", "任务 002625.SZ 完成\n", - "任务 002626.SZ 完成\n", "任务 002627.SZ 完成\n", + "任务 002626.SZ 完成\n", "任务 002628.SZ 完成\n", "任务 002629.SZ 完成\n", "任务 002630.SZ 完成\n", "任务 002631.SZ 完成\n", "任务 002632.SZ 完成\n", "任务 002633.SZ 完成\n", - "任务 002634.SZ 完成\n", "任务 002635.SZ 完成\n", + "任务 002634.SZ 完成\n", "任务 002636.SZ 完成\n", "任务 002637.SZ 完成\n", "任务 002638.SZ 完成\n", @@ -1207,8 +1207,8 @@ "任务 002643.SZ 完成\n", "任务 002644.SZ 完成\n", "任务 002645.SZ 完成\n", - "任务 002646.SZ 完成\n", "任务 002647.SZ 完成\n", + "任务 002646.SZ 完成\n", "任务 002648.SZ 完成\n", "任务 002649.SZ 完成\n", "任务 002650.SZ 完成\n", @@ -1247,10 +1247,10 @@ "任务 002686.SZ 完成\n", "任务 002687.SZ 完成\n", "任务 002688.SZ 完成\n", - "任务 002690.SZ 完成\n", "任务 002689.SZ 完成\n", - "任务 002691.SZ 完成\n", + "任务 002690.SZ 完成\n", "任务 002692.SZ 完成\n", + "任务 002691.SZ 完成\n", "任务 002693.SZ 完成\n", "任务 002694.SZ 完成\n", "任务 002695.SZ 完成\n", @@ -1263,20 +1263,20 @@ "任务 002703.SZ 完成\n", "任务 002705.SZ 完成\n", "任务 002706.SZ 完成\n", - "任务 002707.SZ 完成\n", "任务 002708.SZ 完成\n", + "任务 002707.SZ 完成\n", "任务 002709.SZ 完成\n", "任务 002712.SZ 完成\n", "任务 002713.SZ 完成\n", "任务 002714.SZ 完成\n", "任务 002715.SZ 完成\n", "任务 002716.SZ 完成\n", - "任务 002717.SZ 完成\n", "任务 002718.SZ 完成\n", - "任务 002719.SZ 完成\n", + "任务 002717.SZ 完成\n", "任务 002721.SZ 完成\n", - "任务 002722.SZ 完成\n", + "任务 002719.SZ 完成\n", "任务 002723.SZ 完成\n", + "任务 002722.SZ 完成\n", "任务 002724.SZ 完成\n", "任务 002725.SZ 完成\n", "任务 002726.SZ 完成\n", @@ -1305,8 +1305,8 @@ "任务 002752.SZ 完成\n", "任务 002753.SZ 完成\n", "任务 002755.SZ 完成\n", - "任务 002756.SZ 完成\n", "任务 002757.SZ 完成\n", + "任务 002756.SZ 完成\n", "任务 002758.SZ 完成\n", "任务 002759.SZ 完成\n", "任务 002760.SZ 完成\n", @@ -1586,14 +1586,14 @@ "任务 300015.SZ 完成\n", "任务 300016.SZ 完成\n", "任务 300017.SZ 完成\n", - "任务 300019.SZ 完成\n", "任务 300018.SZ 完成\n", + "任务 300019.SZ 完成\n", "任务 300020.SZ 完成\n", "任务 300021.SZ 完成\n", - "任务 300024.SZ 完成\n", "任务 300022.SZ 完成\n", - "任务 300026.SZ 完成\n", + "任务 300024.SZ 完成\n", "任务 300025.SZ 完成\n", + "任务 300026.SZ 完成\n", "任务 300027.SZ 完成\n", "任务 300029.SZ 完成\n", "任务 300030.SZ 完成\n", @@ -1602,14 +1602,14 @@ "任务 300033.SZ 完成\n", "任务 300034.SZ 完成\n", "任务 300035.SZ 完成\n", - "任务 300037.SZ 完成\n", "任务 300036.SZ 完成\n", + "任务 300037.SZ 完成\n", "任务 300039.SZ 完成\n", "任务 300040.SZ 完成\n", - "任务 300042.SZ 完成\n", "任务 300041.SZ 完成\n", - "任务 300044.SZ 完成\n", + "任务 300042.SZ 完成\n", "任务 300043.SZ 完成\n", + "任务 300044.SZ 完成\n", "任务 300045.SZ 完成\n", "任务 300046.SZ 完成\n", "任务 300047.SZ 完成\n", @@ -1618,8 +1618,8 @@ "任务 300050.SZ 完成\n", "任务 300051.SZ 完成\n", "任务 300052.SZ 完成\n", - "任务 300053.SZ 完成\n", "任务 300054.SZ 完成\n", + "任务 300053.SZ 完成\n", "任务 300055.SZ 完成\n", "任务 300056.SZ 完成\n", "任务 300057.SZ 完成\n", @@ -1630,8 +1630,8 @@ "任务 300063.SZ 完成\n", "任务 300065.SZ 完成\n", "任务 300066.SZ 完成\n", - "任务 300067.SZ 完成\n", "任务 300068.SZ 完成\n", + "任务 300067.SZ 完成\n", "任务 300069.SZ 完成\n", "任务 300070.SZ 完成\n", "任务 300071.SZ 完成\n", @@ -1650,8 +1650,8 @@ "任务 300084.SZ 完成\n", "任务 300085.SZ 完成\n", "任务 300086.SZ 完成\n", - "任务 300088.SZ 完成\n", "任务 300087.SZ 完成\n", + "任务 300088.SZ 完成\n", "任务 300091.SZ 完成\n", "任务 300092.SZ 完成\n", "任务 300093.SZ 完成\n", @@ -1668,8 +1668,8 @@ "任务 300105.SZ 完成\n", "任务 300106.SZ 完成\n", "任务 300107.SZ 完成\n", - "任务 300109.SZ 完成\n", "任务 300108.SZ 完成\n", + "任务 300109.SZ 完成\n", "任务 300110.SZ 完成\n", "任务 300111.SZ 完成\n", "任务 300112.SZ 完成\n", @@ -1708,8 +1708,8 @@ "任务 300146.SZ 完成\n", "任务 300147.SZ 完成\n", "任务 300148.SZ 完成\n", - "任务 300149.SZ 完成\n", "任务 300150.SZ 完成\n", + "任务 300149.SZ 完成\n", "任务 300151.SZ 完成\n", "任务 300152.SZ 完成\n", "任务 300153.SZ 完成\n", @@ -1896,20 +1896,20 @@ "任务 300348.SZ 完成\n", "任务 300349.SZ 完成\n", "任务 300350.SZ 完成\n", - "任务 300352.SZ 完成\n", "任务 300351.SZ 完成\n", - "任务 300354.SZ 完成\n", + "任务 300352.SZ 完成\n", "任务 300353.SZ 完成\n", - "任务 300357.SZ 完成\n", + "任务 300354.SZ 完成\n", "任务 300355.SZ 完成\n", - "任务 300359.SZ 完成\n", + "任务 300357.SZ 完成\n", "任务 300358.SZ 完成\n", + "任务 300359.SZ 完成\n", "任务 300360.SZ 完成\n", "任务 300363.SZ 完成\n", "任务 300364.SZ 完成\n", "任务 300365.SZ 完成\n", - "任务 300368.SZ 完成\n", "任务 300366.SZ 完成\n", + "任务 300368.SZ 完成\n", "任务 300369.SZ 完成\n", "任务 300370.SZ 完成\n", "任务 300371.SZ 完成\n", @@ -1922,8 +1922,8 @@ "任务 300379.SZ 完成\n", "任务 300380.SZ 完成\n", "任务 300381.SZ 完成\n", - "任务 300383.SZ 完成\n", "任务 300382.SZ 完成\n", + "任务 300383.SZ 完成\n", "任务 300384.SZ 完成\n", "任务 300385.SZ 完成\n", "任务 300386.SZ 完成\n", @@ -1934,8 +1934,8 @@ "任务 300391.SZ 完成\n", "任务 300393.SZ 完成\n", "任务 300394.SZ 完成\n", - "任务 300396.SZ 完成\n", "任务 300395.SZ 完成\n", + "任务 300396.SZ 完成\n", "任务 300397.SZ 完成\n", "任务 300398.SZ 完成\n", "任务 300399.SZ 完成\n", @@ -1964,24 +1964,24 @@ "任务 300422.SZ 完成\n", "任务 300423.SZ 完成\n", "任务 300424.SZ 完成\n", - "任务 300425.SZ 完成\n", "任务 300426.SZ 完成\n", + "任务 300425.SZ 完成\n", "任务 300427.SZ 完成\n", "任务 300428.SZ 完成\n", - "任务 300429.SZ 完成\n", "任务 300430.SZ 完成\n", - "任务 300432.SZ 完成\n", + "任务 300429.SZ 完成\n", "任务 300433.SZ 完成\n", + "任务 300432.SZ 完成\n", "任务 300434.SZ 完成\n", "任务 300435.SZ 完成\n", "任务 300436.SZ 完成\n", "任务 300437.SZ 完成\n", "任务 300438.SZ 完成\n", "任务 300439.SZ 完成\n", - "任务 300440.SZ 完成\n", "任务 300441.SZ 完成\n", - "任务 300442.SZ 完成\n", + "任务 300440.SZ 完成\n", "任务 300443.SZ 完成\n", + "任务 300442.SZ 完成\n", "任务 300444.SZ 完成\n", "任务 300445.SZ 完成\n", "任务 300446.SZ 完成\n", @@ -1998,24 +1998,24 @@ "任务 300457.SZ 完成\n", "任务 300458.SZ 完成\n", "任务 300459.SZ 完成\n", - "任务 300460.SZ 完成\n", "任务 300461.SZ 完成\n", + "任务 300460.SZ 完成\n", "任务 300462.SZ 完成\n", "任务 300463.SZ 完成\n", - "任务 300464.SZ 完成\n", "任务 300465.SZ 完成\n", + "任务 300464.SZ 完成\n", "任务 300466.SZ 完成\n", "任务 300467.SZ 完成\n", - "任务 300468.SZ 完成\n", "任务 300469.SZ 完成\n", + "任务 300468.SZ 完成\n", "任务 300470.SZ 完成\n", "任务 300471.SZ 完成\n", "任务 300472.SZ 完成\n", "任务 300473.SZ 完成\n", - "任务 300474.SZ 完成\n", "任务 300475.SZ 完成\n", - "任务 300476.SZ 完成\n", + "任务 300474.SZ 完成\n", "任务 300477.SZ 完成\n", + "任务 300476.SZ 完成\n", "任务 300478.SZ 完成\n", "任务 300479.SZ 完成\n", "任务 300480.SZ 完成\n", @@ -2026,12 +2026,12 @@ "任务 300485.SZ 完成\n", "任务 300486.SZ 完成\n", "任务 300487.SZ 完成\n", - "任务 300488.SZ 完成\n", "任务 300489.SZ 完成\n", - "任务 300490.SZ 完成\n", + "任务 300488.SZ 完成\n", "任务 300491.SZ 完成\n", - "任务 300492.SZ 完成\n", + "任务 300490.SZ 完成\n", "任务 300493.SZ 完成\n", + "任务 300492.SZ 完成\n", "任务 300494.SZ 完成\n", "任务 300496.SZ 完成\n", "任务 300497.SZ 完成\n", @@ -2058,34 +2058,34 @@ "任务 300518.SZ 完成\n", "任务 300519.SZ 完成\n", "任务 300520.SZ 完成\n", - "任务 300521.SZ 完成\n", "任务 300522.SZ 完成\n", + "任务 300521.SZ 完成\n", "任务 300523.SZ 完成\n", "任务 300525.SZ 完成\n", - "任务 300527.SZ 完成\n", "任务 300528.SZ 完成\n", - "任务 300529.SZ 完成\n", + "任务 300527.SZ 完成\n", "任务 300530.SZ 完成\n", + "任务 300529.SZ 完成\n", "任务 300531.SZ 完成\n", "任务 300532.SZ 完成\n", "任务 300533.SZ 完成\n", "任务 300534.SZ 完成\n", - "任务 300535.SZ 完成\n", "任务 300536.SZ 完成\n", + "任务 300535.SZ 完成\n", "任务 300537.SZ 完成\n", "任务 300538.SZ 完成\n", "任务 300539.SZ 完成\n", "任务 300540.SZ 完成\n", "任务 300541.SZ 完成\n", "任务 300542.SZ 完成\n", - "任务 300543.SZ 完成\n", "任务 300545.SZ 完成\n", + "任务 300543.SZ 完成\n", "任务 300546.SZ 完成\n", "任务 300547.SZ 完成\n", "任务 300548.SZ 完成\n", "任务 300549.SZ 完成\n", - "任务 300550.SZ 完成\n", "任务 300551.SZ 完成\n", + "任务 300550.SZ 完成\n", "任务 300552.SZ 完成\n", "任务 300553.SZ 完成\n", "任务 300554.SZ 完成\n", @@ -2094,10 +2094,10 @@ "任务 300557.SZ 完成\n", "任务 300558.SZ 完成\n", "任务 300559.SZ 完成\n", - "任务 300560.SZ 完成\n", "任务 300561.SZ 完成\n", - "任务 300562.SZ 完成\n", + "任务 300560.SZ 完成\n", "任务 300563.SZ 完成\n", + "任务 300562.SZ 完成\n", "任务 300564.SZ 完成\n", "任务 300565.SZ 完成\n", "任务 300566.SZ 完成\n", @@ -2148,26 +2148,26 @@ "任务 300612.SZ 完成\n", "任务 300613.SZ 完成\n", "任务 300614.SZ 完成\n", - "任务 300615.SZ 完成\n", "任务 300616.SZ 完成\n", - "任务 300617.SZ 完成\n", + "任务 300615.SZ 完成\n", "任务 300618.SZ 完成\n", + "任务 300617.SZ 完成\n", "任务 300619.SZ 完成\n", "任务 300620.SZ 完成\n", "任务 300621.SZ 完成\n", "任务 300622.SZ 完成\n", "任务 300623.SZ 完成\n", "任务 300624.SZ 完成\n", - "任务 300625.SZ 完成\n", "任务 300626.SZ 完成\n", + "任务 300625.SZ 完成\n", "任务 300627.SZ 完成\n", "任务 300628.SZ 完成\n", "任务 300629.SZ 完成\n", "任务 300630.SZ 完成\n", "任务 300631.SZ 完成\n", "任务 300632.SZ 完成\n", - "任务 300633.SZ 完成\n", "任务 300634.SZ 完成\n", + "任务 300633.SZ 完成\n", "任务 300635.SZ 完成\n", "任务 300636.SZ 完成\n", "任务 300637.SZ 完成\n", @@ -2209,8 +2209,8 @@ "任务 300674.SZ 完成\n", "任务 300675.SZ 完成\n", "任务 300676.SZ 完成\n", - "任务 300678.SZ 完成\n", "任务 300677.SZ 完成\n", + "任务 300678.SZ 完成\n", "任务 300679.SZ 完成\n", "任务 300680.SZ 完成\n", "任务 300681.SZ 完成\n", @@ -2239,8 +2239,8 @@ "任务 300705.SZ 完成\n", "任务 300706.SZ 完成\n", "任务 300707.SZ 完成\n", - "任务 300708.SZ 完成\n", "任务 300709.SZ 完成\n", + "任务 300708.SZ 完成\n", "任务 300710.SZ 完成\n", "任务 300711.SZ 完成\n", "任务 300712.SZ 完成\n", @@ -2392,16 +2392,16 @@ "任务 300867.SZ 完成\n", "任务 300868.SZ 完成\n", "任务 300869.SZ 完成\n", - "任务 300870.SZ 完成\n", "任务 300871.SZ 完成\n", - "任务 300872.SZ 完成\n", + "任务 300870.SZ 完成\n", "任务 300873.SZ 完成\n", - "任务 300875.SZ 完成\n", + "任务 300872.SZ 完成\n", "任务 300876.SZ 完成\n", + "任务 300875.SZ 完成\n", "任务 300877.SZ 完成\n", "任务 300878.SZ 完成\n", - "任务 300879.SZ 完成\n", "任务 300880.SZ 完成\n", + "任务 300879.SZ 完成\n", "任务 300881.SZ 完成\n", "任务 300882.SZ 完成\n", "任务 300883.SZ 完成\n", @@ -2442,16 +2442,16 @@ "任务 300919.SZ 完成\n", "任务 300920.SZ 完成\n", "任务 300921.SZ 完成\n", - "任务 300923.SZ 完成\n", "任务 300922.SZ 完成\n", - "任务 300926.SZ 完成\n", + "任务 300923.SZ 完成\n", "任务 300925.SZ 完成\n", + "任务 300926.SZ 完成\n", "任务 300927.SZ 完成\n", "任务 300928.SZ 完成\n", "任务 300929.SZ 完成\n", "任务 300930.SZ 完成\n", - "任务 300932.SZ 完成\n", "任务 300931.SZ 完成\n", + "任务 300932.SZ 完成\n", "任务 300933.SZ 完成\n", "任务 300935.SZ 完成\n", "任务 300936.SZ 完成\n", @@ -2497,14 +2497,14 @@ "任务 300979.SZ 完成\n", "任务 300980.SZ 完成\n", "任务 300981.SZ 完成\n", - "任务 300982.SZ 完成\n", "任务 300983.SZ 完成\n", - "任务 300984.SZ 完成\n", + "任务 300982.SZ 完成\n", "任务 300985.SZ 完成\n", + "任务 300984.SZ 完成\n", "任务 300987.SZ 完成\n", "任务 300986.SZ 完成\n", - "任务 300988.SZ 完成\n", "任务 300989.SZ 完成\n", + "任务 300988.SZ 完成\n", "任务 300990.SZ 完成\n", "任务 300991.SZ 完成\n", "任务 300992.SZ 完成\n", @@ -2519,10 +2519,10 @@ "任务 301001.SZ 完成\n", "任务 301002.SZ 完成\n", "任务 301003.SZ 完成\n", - "任务 301005.SZ 完成\n", "任务 301004.SZ 完成\n", - "任务 301007.SZ 完成\n", + "任务 301005.SZ 完成\n", "任务 301006.SZ 完成\n", + "任务 301007.SZ 完成\n", "任务 301008.SZ 完成\n", "任务 301009.SZ 完成\n", "任务 301010.SZ 完成\n", @@ -2551,14 +2551,14 @@ "任务 301035.SZ 完成\n", "任务 301036.SZ 完成\n", "任务 301037.SZ 完成\n", - "任务 301038.SZ 完成\n", "任务 301039.SZ 完成\n", + "任务 301038.SZ 完成\n", "任务 301040.SZ 完成\n", "任务 301041.SZ 完成\n", "任务 301042.SZ 完成\n", "任务 301043.SZ 完成\n", - "任务 301045.SZ 完成\n", "任务 301046.SZ 完成\n", + "任务 301045.SZ 完成\n", "任务 301047.SZ 完成\n", "任务 301048.SZ 完成\n", "任务 301049.SZ 完成\n", @@ -2567,18 +2567,18 @@ "任务 301052.SZ 完成\n", "任务 301053.SZ 完成\n", "任务 301055.SZ 完成\n", - "任务 301056.SZ 完成\n", "任务 301057.SZ 完成\n", - "任务 301058.SZ 完成\n", + "任务 301056.SZ 完成\n", "任务 301059.SZ 完成\n", + "任务 301058.SZ 完成\n", "任务 301060.SZ 完成\n", "任务 301061.SZ 完成\n", - "任务 301062.SZ 完成\n", "任务 301063.SZ 完成\n", + "任务 301062.SZ 完成\n", "任务 301065.SZ 完成\n", "任务 301066.SZ 完成\n", - "任务 301067.SZ 完成\n", "任务 301068.SZ 完成\n", + "任务 301067.SZ 完成\n", "任务 301069.SZ 完成\n", "任务 301070.SZ 完成\n", "任务 301071.SZ 完成\n", @@ -2618,13 +2618,13 @@ "任务 301109.SZ 完成\n", "任务 301110.SZ 完成\n", "任务 301111.SZ 完成\n", - "任务 301113.SZ 完成\n", "任务 301112.SZ 完成\n", - "任务 301116.SZ 完成\n", + "任务 301113.SZ 完成\n", "任务 301115.SZ 完成\n", + "任务 301116.SZ 完成\n", "任务 301117.SZ 完成\n", - "任务 301118.SZ 完成\n", "任务 301119.SZ 完成\n", + "任务 301118.SZ 完成\n", "任务 301120.SZ 完成\n", "任务 301121.SZ 完成\n", "任务 301122.SZ 完成\n", @@ -2633,8 +2633,8 @@ "任务 301126.SZ 完成\n", "任务 301127.SZ 完成\n", "任务 301128.SZ 完成\n", - "任务 301129.SZ 完成\n", "任务 301130.SZ 完成\n", + "任务 301129.SZ 完成\n", "任务 301131.SZ 完成\n", "任务 301132.SZ 完成\n", "任务 301133.SZ 完成\n", @@ -2727,18 +2727,18 @@ "任务 301237.SZ 完成\n", "任务 301238.SZ 完成\n", "任务 301239.SZ 完成\n", - "任务 301246.SZ 完成\n", "任务 301248.SZ 完成\n", - "任务 301251.SZ 完成\n", + "任务 301246.SZ 完成\n", "任务 301252.SZ 完成\n", - "任务 301255.SZ 完成\n", + "任务 301251.SZ 完成\n", "任务 301256.SZ 完成\n", + "任务 301255.SZ 完成\n", + "任务 301258.SZ 完成\n", "任务 301257.SZ 完成\n", "任务 301259.SZ 完成\n", - "任务 301258.SZ 完成\n", "任务 301260.SZ 完成\n", - "任务 301261.SZ 完成\n", "任务 301262.SZ 完成\n", + "任务 301261.SZ 完成\n", "任务 301263.SZ 完成\n", "任务 301265.SZ 完成\n", "任务 301266.SZ 完成\n", @@ -2753,8 +2753,8 @@ "任务 301278.SZ 完成\n", "任务 301279.SZ 完成\n", "任务 301280.SZ 完成\n", - "任务 301281.SZ 完成\n", "任务 301282.SZ 完成\n", + "任务 301281.SZ 完成\n", "任务 301283.SZ 完成\n", "任务 301285.SZ 完成\n", "任务 301286.SZ 完成\n", @@ -2767,42 +2767,42 @@ "任务 301293.SZ 完成\n", "任务 301295.SZ 完成\n", "任务 301296.SZ 完成\n", - "任务 301297.SZ 完成\n", "任务 301298.SZ 完成\n", + "任务 301297.SZ 完成\n", "任务 301299.SZ 完成\n", "任务 301300.SZ 完成\n", "任务 301301.SZ 完成\n", - "任务 301303.SZ 完成\n", "任务 301302.SZ 完成\n", + "任务 301303.SZ 完成\n", "任务 301305.SZ 完成\n", "任务 301306.SZ 完成\n", - "任务 301308.SZ 完成\n", "任务 301307.SZ 完成\n", + "任务 301308.SZ 完成\n", "任务 301309.SZ 完成\n", "任务 301310.SZ 完成\n", "任务 301311.SZ 完成\n", "任务 301312.SZ 完成\n", "任务 301313.SZ 完成\n", - "任务 301314.SZ 完成\n", "任务 301315.SZ 完成\n", + "任务 301314.SZ 完成\n", "任务 301316.SZ 完成\n", "任务 301317.SZ 完成\n", - "任务 301318.SZ 完成\n", "任务 301319.SZ 完成\n", + "任务 301318.SZ 完成\n", "任务 301320.SZ 完成\n", "任务 301321.SZ 完成\n", "任务 301322.SZ 完成\n", "任务 301323.SZ 完成\n", "任务 301325.SZ 完成\n", "任务 301326.SZ 完成\n", - "任务 301327.SZ 完成\n", "任务 301328.SZ 完成\n", + "任务 301327.SZ 完成\n", "任务 301329.SZ 完成\n", "任务 301330.SZ 完成\n", "任务 301331.SZ 完成\n", "任务 301332.SZ 完成\n", - "任务 301333.SZ 完成\n", "任务 301335.SZ 完成\n", + "任务 301333.SZ 完成\n", "任务 301336.SZ 完成\n", "任务 301337.SZ 完成\n", "任务 301338.SZ 完成\n", @@ -2821,30 +2821,30 @@ "任务 301362.SZ 完成\n", "任务 301363.SZ 完成\n", "任务 301365.SZ 完成\n", - "任务 301366.SZ 完成\n", "任务 301367.SZ 完成\n", + "任务 301366.SZ 完成\n", "任务 301368.SZ 完成\n", "任务 301369.SZ 完成\n", - "任务 301370.SZ 完成\n", "任务 301371.SZ 完成\n", + "任务 301370.SZ 完成\n", "任务 301372.SZ 完成\n", "任务 301373.SZ 完成\n", "任务 301376.SZ 完成\n", "任务 301377.SZ 完成\n", - "任务 301378.SZ 完成\n", "任务 301379.SZ 完成\n", + "任务 301378.SZ 完成\n", "任务 301380.SZ 完成\n", "任务 301381.SZ 完成\n", "任务 301382.SZ 完成\n", "任务 301383.SZ 完成\n", - "任务 301386.SZ 完成\n", "任务 301387.SZ 完成\n", - "任务 301388.SZ 完成\n", + "任务 301386.SZ 完成\n", "任务 301389.SZ 完成\n", + "任务 301388.SZ 完成\n", "任务 301390.SZ 完成\n", "任务 301391.SZ 完成\n", - "任务 301392.SZ 完成\n", "任务 301393.SZ 完成\n", + "任务 301392.SZ 完成\n", "任务 301395.SZ 完成\n", "任务 301396.SZ 完成\n", "任务 301397.SZ 完成\n", @@ -2859,19 +2859,19 @@ "任务 301429.SZ 完成\n", "任务 301439.SZ 完成\n", "任务 301446.SZ 完成\n", - "任务 301456.SZ 完成\n", "任务 301448.SZ 完成\n", + "任务 301456.SZ 完成\n", "任务 301458.SZ 完成\n", "任务 301459.SZ 完成\n", "任务 301468.SZ 完成\n", "任务 301469.SZ 完成\n", - "任务 301487.SZ 完成\n", "任务 301486.SZ 完成\n", + "任务 301487.SZ 完成\n", "任务 301488.SZ 完成\n", "任务 301489.SZ 完成\n", + "任务 301498.SZ 完成\n", "任务 301499.SZ 完成\n", "任务 301500.SZ 完成\n", - "任务 301498.SZ 完成\n", "任务 301502.SZ 完成\n", "任务 301503.SZ 完成\n", "任务 301505.SZ 完成\n", @@ -2954,28 +2954,28 @@ "任务 430564.BJ 完成\n", "任务 430685.BJ 完成\n", "任务 430718.BJ 完成\n", - "任务 600000.SH 完成\n", "任务 600004.SH 完成\n", - "任务 600006.SH 完成\n", + "任务 600000.SH 完成\n", "任务 600007.SH 完成\n", - "任务 600008.SH 完成\n", + "任务 600006.SH 完成\n", "任务 600009.SH 完成\n", + "任务 600008.SH 完成\n", "任务 600010.SH 完成\n", "任务 600011.SH 完成\n", - "任务 600015.SH 完成\n", "任务 600012.SH 完成\n", - "任务 600016.SH 完成\n", + "任务 600015.SH 完成\n", "任务 600017.SH 完成\n", + "任务 600016.SH 完成\n", "任务 600018.SH 完成\n", "任务 600019.SH 完成\n", "任务 600020.SH 完成\n", "任务 600021.SH 完成\n", - "任务 600022.SH 完成\n", "任务 600023.SH 完成\n", + "任务 600022.SH 完成\n", "任务 600025.SH 完成\n", "任务 600026.SH 完成\n", - "任务 600027.SH 完成\n", "任务 600028.SH 完成\n", + "任务 600027.SH 完成\n", "任务 600029.SH 完成\n", "任务 600030.SH 完成\n", "任务 600031.SH 完成\n", @@ -2986,20 +2986,20 @@ "任务 600037.SH 完成\n", "任务 600038.SH 完成\n", "任务 600039.SH 完成\n", - "任务 600050.SH 完成\n", "任务 600048.SH 完成\n", + "任务 600050.SH 完成\n", "任务 600051.SH 完成\n", "任务 600052.SH 完成\n", "任务 600053.SH 完成\n", "任务 600054.SH 完成\n", "任务 600055.SH 完成\n", "任务 600056.SH 完成\n", - "任务 600058.SH 完成\n", "任务 600057.SH 完成\n", + "任务 600058.SH 完成\n", "任务 600059.SH 完成\n", "任务 600060.SH 完成\n", - "任务 600062.SH 完成\n", "任务 600061.SH 完成\n", + "任务 600062.SH 完成\n", "任务 600063.SH 完成\n", "任务 600064.SH 完成\n", "任务 600066.SH 完成\n", @@ -3016,12 +3016,12 @@ "任务 600081.SH 完成\n", "任务 600082.SH 完成\n", "任务 600083.SH 完成\n", - "任务 600085.SH 完成\n", "任务 600084.SH 完成\n", - "任务 600089.SH 完成\n", + "任务 600085.SH 完成\n", "任务 600088.SH 完成\n", - "任务 600095.SH 完成\n", + "任务 600089.SH 完成\n", "任务 600094.SH 完成\n", + "任务 600095.SH 完成\n", "任务 600096.SH 完成\n", "任务 600097.SH 完成\n", "任务 600098.SH 完成\n", @@ -3034,8 +3034,8 @@ "任务 600106.SH 完成\n", "任务 600107.SH 完成\n", "任务 600108.SH 完成\n", - "任务 600110.SH 完成\n", "任务 600109.SH 完成\n", + "任务 600110.SH 完成\n", "任务 600111.SH 完成\n", "任务 600113.SH 完成\n", "任务 600114.SH 完成\n", @@ -3048,20 +3048,20 @@ "任务 600121.SH 完成\n", "任务 600123.SH 完成\n", "任务 600125.SH 完成\n", - "任务 600127.SH 完成\n", "任务 600126.SH 完成\n", + "任务 600127.SH 完成\n", "任务 600128.SH 完成\n", "任务 600129.SH 完成\n", "任务 600130.SH 完成\n", "任务 600131.SH 完成\n", - "任务 600133.SH 完成\n", "任务 600132.SH 完成\n", + "任务 600133.SH 完成\n", "任务 600135.SH 完成\n", "任务 600136.SH 完成\n", "任务 600137.SH 完成\n", "任务 600138.SH 完成\n", - "任务 600143.SH 完成\n", "任务 600141.SH 完成\n", + "任务 600143.SH 完成\n", "任务 600148.SH 完成\n", "任务 600149.SH 完成\n", "任务 600150.SH 完成\n", @@ -3114,8 +3114,8 @@ "任务 600203.SH 完成\n", "任务 600206.SH 完成\n", "任务 600207.SH 完成\n", - "任务 600210.SH 完成\n", "任务 600208.SH 完成\n", + "任务 600210.SH 完成\n", "任务 600211.SH 完成\n", "任务 600212.SH 完成\n", "任务 600215.SH 完成\n", @@ -3134,8 +3134,8 @@ "任务 600230.SH 完成\n", "任务 600231.SH 完成\n", "任务 600232.SH 完成\n", - "任务 600234.SH 完成\n", "任务 600233.SH 完成\n", + "任务 600234.SH 完成\n", "任务 600235.SH 完成\n", "任务 600236.SH 完成\n", "任务 600237.SH 完成\n", @@ -3162,11 +3162,11 @@ "任务 600268.SH 完成\n", "任务 600269.SH 完成\n", "任务 600271.SH 完成\n", - "任务 600273.SH 完成\n", "任务 600272.SH 完成\n", - "任务 600278.SH 完成\n", "任务 600276.SH 完成\n", + "任务 600273.SH 完成\n", "任务 600279.SH 完成\n", + "任务 600278.SH 完成\n", "任务 600280.SH 完成\n", "任务 600281.SH 完成\n", "任务 600282.SH 完成\n", @@ -3188,14 +3188,14 @@ "任务 600305.SH 完成\n", "任务 600307.SH 完成\n", "任务 600308.SH 完成\n", - "任务 600310.SH 完成\n", "任务 600309.SH 完成\n", + "任务 600310.SH 完成\n", "任务 600312.SH 完成\n", "任务 600313.SH 完成\n", "任务 600315.SH 完成\n", "任务 600316.SH 完成\n", - "任务 600319.SH 完成\n", "任务 600318.SH 完成\n", + "任务 600319.SH 完成\n", "任务 600320.SH 完成\n", "任务 600322.SH 完成\n", "任务 600323.SH 完成\n", @@ -3221,24 +3221,24 @@ "任务 600350.SH 完成\n", "任务 600351.SH 完成\n", "任务 600352.SH 完成\n", - "任务 600353.SH 完成\n", "任务 600354.SH 完成\n", + "任务 600353.SH 完成\n", "任务 600355.SH 完成\n", "任务 600356.SH 完成\n", "任务 600358.SH 完成\n", "任务 600359.SH 完成\n", "任务 600360.SH 完成\n", "任务 600361.SH 完成\n", - "任务 600362.SH 完成\n", "任务 600363.SH 完成\n", + "任务 600362.SH 完成\n", "任务 600365.SH 完成\n", - "任务 600367.SH 完成\n", "任务 600366.SH 完成\n", "任务 600368.SH 完成\n", + "任务 600367.SH 完成\n", "任务 600369.SH 完成\n", "任务 600370.SH 完成\n", - "任务 600371.SH 完成\n", "任务 600372.SH 完成\n", + "任务 600371.SH 完成\n", "任务 600373.SH 完成\n", "任务 600375.SH 完成\n", "任务 600376.SH 完成\n", @@ -3248,16 +3248,16 @@ "任务 600380.SH 完成\n", "任务 600381.SH 完成\n", "任务 600382.SH 完成\n", - "任务 600386.SH 完成\n", "任务 600383.SH 完成\n", - "任务 600388.SH 完成\n", + "任务 600386.SH 完成\n", "任务 600387.SH 完成\n", + "任务 600388.SH 完成\n", "任务 600389.SH 完成\n", "任务 600390.SH 完成\n", "任务 600391.SH 完成\n", "任务 600392.SH 完成\n", - "任务 600396.SH 完成\n", "任务 600395.SH 完成\n", + "任务 600396.SH 完成\n", "任务 600397.SH 完成\n", "任务 600398.SH 完成\n", "任务 600399.SH 完成\n", @@ -3314,14 +3314,14 @@ "任务 600486.SH 完成\n", "任务 600487.SH 完成\n", "任务 600488.SH 完成\n", - "任务 600490.SH 完成\n", "任务 600489.SH 完成\n", + "任务 600490.SH 完成\n", "任务 600491.SH 完成\n", "任务 600493.SH 完成\n", "任务 600495.SH 完成\n", "任务 600496.SH 完成\n", - "任务 600498.SH 完成\n", "任务 600497.SH 完成\n", + "任务 600498.SH 完成\n", "任务 600499.SH 完成\n", "任务 600500.SH 完成\n", "任务 600501.SH 完成\n", @@ -3348,14 +3348,14 @@ "任务 600525.SH 完成\n", "任务 600526.SH 完成\n", "任务 600527.SH 完成\n", - "任务 600528.SH 完成\n", "任务 600529.SH 完成\n", + "任务 600528.SH 完成\n", "任务 600530.SH 完成\n", "任务 600531.SH 完成\n", "任务 600533.SH 完成\n", "任务 600535.SH 完成\n", - "任务 600536.SH 完成\n", "任务 600537.SH 完成\n", + "任务 600536.SH 完成\n", "任务 600538.SH 完成\n", "任务 600539.SH 完成\n", "任务 600540.SH 完成\n", @@ -3366,30 +3366,30 @@ "任务 600548.SH 完成\n", "任务 600549.SH 完成\n", "任务 600550.SH 完成\n", - "任务 600551.SH 完成\n", "任务 600552.SH 完成\n", + "任务 600551.SH 完成\n", "任务 600556.SH 完成\n", "任务 600557.SH 完成\n", "任务 600558.SH 完成\n", "任务 600559.SH 完成\n", "任务 600560.SH 完成\n", "任务 600561.SH 完成\n", - "任务 600562.SH 完成\n", "任务 600563.SH 完成\n", + "任务 600562.SH 完成\n", "任务 600566.SH 完成\n", "任务 600567.SH 完成\n", "任务 600568.SH 完成\n", "任务 600569.SH 完成\n", "任务 600570.SH 完成\n", "任务 600571.SH 完成\n", - "任务 600572.SH 完成\n", "任务 600573.SH 完成\n", + "任务 600572.SH 完成\n", "任务 600575.SH 完成\n", "任务 600576.SH 完成\n", - "任务 600577.SH 完成\n", "任务 600578.SH 完成\n", - "任务 600579.SH 完成\n", + "任务 600577.SH 完成\n", "任务 600580.SH 完成\n", + "任务 600579.SH 完成\n", "任务 600581.SH 完成\n", "任务 600582.SH 完成\n", "任务 600583.SH 完成\n", @@ -3465,18 +3465,18 @@ "任务 600666.SH 完成\n", "任务 600667.SH 完成\n", "任务 600668.SH 完成\n", - "任务 600673.SH 完成\n", "任务 600671.SH 完成\n", + "任务 600673.SH 完成\n", "任务 600674.SH 完成\n", "任务 600675.SH 完成\n", - "任务 600678.SH 完成\n", "任务 600676.SH 完成\n", + "任务 600678.SH 完成\n", "任务 600679.SH 完成\n", "任务 600681.SH 完成\n", - "任务 600683.SH 完成\n", "任务 600682.SH 完成\n", - "任务 600685.SH 完成\n", + "任务 600683.SH 完成\n", "任务 600684.SH 完成\n", + "任务 600685.SH 完成\n", "任务 600686.SH 完成\n", "任务 600688.SH 完成\n", "任务 600689.SH 完成\n", @@ -3493,14 +3493,14 @@ "任务 600703.SH 完成\n", "任务 600704.SH 完成\n", "任务 600705.SH 完成\n", - "任务 600707.SH 完成\n", "任务 600706.SH 完成\n", - "任务 600710.SH 完成\n", + "任务 600707.SH 完成\n", "任务 600708.SH 完成\n", - "任务 600712.SH 完成\n", + "任务 600710.SH 完成\n", "任务 600711.SH 完成\n", - "任务 600714.SH 完成\n", + "任务 600712.SH 完成\n", "任务 600713.SH 完成\n", + "任务 600714.SH 完成\n", "任务 600715.SH 完成\n", "任务 600716.SH 完成\n", "任务 600717.SH 完成\n", @@ -3535,8 +3535,8 @@ "任务 600748.SH 完成\n", "任务 600749.SH 完成\n", "任务 600750.SH 完成\n", - "任务 600753.SH 完成\n", "任务 600751.SH 完成\n", + "任务 600753.SH 完成\n", "任务 600754.SH 完成\n", "任务 600755.SH 完成\n", "任务 600756.SH 完成\n", @@ -3561,8 +3561,8 @@ "任务 600779.SH 完成\n", "任务 600780.SH 完成\n", "任务 600782.SH 完成\n", - "任务 600784.SH 完成\n", "任务 600783.SH 完成\n", + "任务 600784.SH 完成\n", "任务 600785.SH 完成\n", "任务 600787.SH 完成\n", "任务 600789.SH 完成\n", @@ -3606,18 +3606,18 @@ "任务 600831.SH 完成\n", "任务 600833.SH 完成\n", "任务 600834.SH 完成\n", - "任务 600835.SH 完成\n", "任务 600837.SH 完成\n", + "任务 600835.SH 完成\n", "任务 600838.SH 完成\n", "任务 600839.SH 完成\n", - "任务 600841.SH 完成\n", "任务 600843.SH 完成\n", + "任务 600841.SH 完成\n", "任务 600844.SH 完成\n", "任务 600845.SH 完成\n", "任务 600846.SH 完成\n", "任务 600847.SH 完成\n", - "任务 600848.SH 完成\n", "任务 600850.SH 完成\n", + "任务 600848.SH 完成\n", "任务 600851.SH 完成\n", "任务 600853.SH 完成\n", "任务 600854.SH 完成\n", @@ -3668,14 +3668,14 @@ "任务 600909.SH 完成\n", "任务 600916.SH 完成\n", "任务 600917.SH 完成\n", - "任务 600918.SH 完成\n", "任务 600919.SH 完成\n", + "任务 600918.SH 完成\n", "任务 600925.SH 完成\n", "任务 600926.SH 完成\n", - "任务 600927.SH 完成\n", "任务 600928.SH 完成\n", - "任务 600929.SH 完成\n", + "任务 600927.SH 完成\n", "任务 600933.SH 完成\n", + "任务 600929.SH 完成\n", "任务 600935.SH 完成\n", "任务 600936.SH 完成\n", "任务 600938.SH 完成\n", @@ -3717,22 +3717,22 @@ "任务 600995.SH 完成\n", "任务 600996.SH 完成\n", "任务 600997.SH 完成\n", - "任务 600999.SH 完成\n", "任务 600998.SH 完成\n", + "任务 600999.SH 完成\n", "任务 601000.SH 完成\n", "任务 601001.SH 完成\n", "任务 601002.SH 完成\n", "任务 601003.SH 完成\n", - "任务 601006.SH 完成\n", "任务 601005.SH 完成\n", + "任务 601006.SH 完成\n", "任务 601007.SH 完成\n", "任务 601008.SH 完成\n", - "任务 601010.SH 完成\n", "任务 601009.SH 完成\n", + "任务 601010.SH 完成\n", "任务 601011.SH 完成\n", "任务 601012.SH 完成\n", - "任务 601016.SH 完成\n", "任务 601015.SH 完成\n", + "任务 601016.SH 完成\n", "任务 601018.SH 完成\n", "任务 601019.SH 完成\n", "任务 601020.SH 完成\n", @@ -3889,12 +3889,12 @@ "任务 601808.SH 完成\n", "任务 601811.SH 完成\n", "任务 601816.SH 完成\n", - "任务 601825.SH 完成\n", "任务 601818.SH 完成\n", - "任务 601828.SH 完成\n", + "任务 601825.SH 完成\n", "任务 601827.SH 完成\n", - "任务 601857.SH 完成\n", + "任务 601828.SH 完成\n", "任务 601838.SH 完成\n", + "任务 601857.SH 完成\n", "任务 601858.SH 完成\n", "任务 601860.SH 完成\n", "任务 601865.SH 完成\n", @@ -3973,36 +3973,36 @@ "任务 603028.SH 完成\n", "任务 603029.SH 完成\n", "任务 603030.SH 完成\n", - "任务 603031.SH 完成\n", "任务 603032.SH 完成\n", + "任务 603031.SH 完成\n", "任务 603033.SH 完成\n", "任务 603035.SH 完成\n", "任务 603036.SH 完成\n", "任务 603037.SH 完成\n", - "任务 603038.SH 完成\n", "任务 603039.SH 完成\n", + "任务 603038.SH 完成\n", "任务 603040.SH 完成\n", "任务 603041.SH 完成\n", - "任务 603042.SH 完成\n", "任务 603043.SH 完成\n", + "任务 603042.SH 完成\n", "任务 603045.SH 完成\n", "任务 603048.SH 完成\n", - "任务 603050.SH 完成\n", "任务 603051.SH 完成\n", - "任务 603052.SH 完成\n", + "任务 603050.SH 完成\n", "任务 603053.SH 完成\n", + "任务 603052.SH 完成\n", "任务 603055.SH 完成\n", "任务 603056.SH 完成\n", "任务 603057.SH 完成\n", "任务 603058.SH 完成\n", "任务 603059.SH 完成\n", "任务 603060.SH 完成\n", - "任务 603061.SH 完成\n", "任务 603062.SH 完成\n", + "任务 603061.SH 完成\n", "任务 603063.SH 完成\n", "任务 603065.SH 完成\n", - "任务 603066.SH 完成\n", "任务 603067.SH 完成\n", + "任务 603066.SH 完成\n", "任务 603068.SH 完成\n", "任务 603069.SH 完成\n", "任务 603070.SH 完成\n", @@ -4033,8 +4033,8 @@ "任务 603099.SH 完成\n", "任务 603100.SH 完成\n", "任务 603101.SH 完成\n", - "任务 603102.SH 完成\n", "任务 603103.SH 完成\n", + "任务 603102.SH 完成\n", "任务 603105.SH 完成\n", "任务 603106.SH 完成\n", "任务 603107.SH 完成\n", @@ -4104,10 +4104,10 @@ "任务 603193.SH 完成\n", "任务 603194.SH 完成\n", "任务 603195.SH 完成\n", - "任务 603196.SH 完成\n", "任务 603197.SH 完成\n", - "任务 603198.SH 完成\n", + "任务 603196.SH 完成\n", "任务 603199.SH 完成\n", + "任务 603198.SH 完成\n", "任务 603200.SH 完成\n", "任务 603201.SH 完成\n", "任务 603203.SH 完成\n", @@ -4144,12 +4144,12 @@ "任务 603238.SH 完成\n", "任务 603239.SH 完成\n", "任务 603255.SH 完成\n", - "任务 603256.SH 完成\n", "任务 603258.SH 完成\n", + "任务 603256.SH 完成\n", "任务 603259.SH 完成\n", "任务 603260.SH 完成\n", - "任务 603261.SH 完成\n", "任务 603266.SH 完成\n", + "任务 603261.SH 完成\n", "任务 603267.SH 完成\n", "任务 603268.SH 完成\n", "任务 603269.SH 完成\n", @@ -4174,10 +4174,10 @@ "任务 603296.SH 完成\n", "任务 603297.SH 完成\n", "任务 603298.SH 完成\n", - "任务 603300.SH 完成\n", "任务 603299.SH 完成\n", - "任务 603303.SH 完成\n", + "任务 603300.SH 完成\n", "任务 603301.SH 完成\n", + "任务 603303.SH 完成\n", "任务 603305.SH 完成\n", "任务 603306.SH 完成\n", "任务 603307.SH 完成\n", @@ -4190,31 +4190,31 @@ "任务 603315.SH 完成\n", "任务 603316.SH 完成\n", "任务 603317.SH 完成\n", - "任务 603319.SH 完成\n", "任务 603318.SH 完成\n", + "任务 603319.SH 完成\n", "任务 603320.SH 完成\n", "任务 603321.SH 完成\n", "任务 603322.SH 完成\n", - "任务 603323.SH 完成\n", "任务 603324.SH 完成\n", - "任务 603325.SH 完成\n", + "任务 603323.SH 完成\n", "任务 603326.SH 完成\n", + "任务 603325.SH 完成\n", "任务 603327.SH 完成\n", "任务 603328.SH 完成\n", - "任务 603329.SH 完成\n", "任务 603330.SH 完成\n", + "任务 603329.SH 完成\n", "任务 603331.SH 完成\n", "任务 603332.SH 完成\n", - "任务 603333.SH 完成\n", "任务 603335.SH 完成\n", + "任务 603333.SH 完成\n", "任务 603336.SH 完成\n", "任务 603337.SH 完成\n", - "任务 603338.SH 完成\n", "任务 603339.SH 完成\n", - "任务 603341.SH 完成\n", + "任务 603338.SH 完成\n", "任务 603344.SH 完成\n", - "任务 603345.SH 完成\n", + "任务 603341.SH 完成\n", "任务 603348.SH 完成\n", + "任务 603345.SH 完成\n", "任务 603350.SH 完成\n", "任务 603351.SH 完成\n", "任务 603353.SH 完成\n", @@ -4298,10 +4298,10 @@ "任务 603568.SH 完成\n", "任务 603569.SH 完成\n", "任务 603577.SH 完成\n", - "任务 603578.SH 完成\n", "任务 603579.SH 完成\n", - "任务 603580.SH 完成\n", + "任务 603578.SH 完成\n", "任务 603583.SH 完成\n", + "任务 603580.SH 完成\n", "任务 603585.SH 完成\n", "任务 603586.SH 完成\n", "任务 603587.SH 完成\n", @@ -4330,16 +4330,16 @@ "任务 603618.SH 完成\n", "任务 603619.SH 完成\n", "任务 603626.SH 完成\n", - "任务 603628.SH 完成\n", "任务 603629.SH 完成\n", + "任务 603628.SH 完成\n", "任务 603630.SH 完成\n", "任务 603633.SH 完成\n", "任务 603636.SH 完成\n", "任务 603637.SH 完成\n", - "任务 603638.SH 完成\n", "任务 603639.SH 完成\n", - "任务 603648.SH 完成\n", + "任务 603638.SH 完成\n", "任务 603650.SH 完成\n", + "任务 603648.SH 完成\n", "任务 603655.SH 完成\n", "任务 603656.SH 完成\n", "任务 603657.SH 完成\n", @@ -4372,12 +4372,12 @@ "任务 603696.SH 完成\n", "任务 603697.SH 完成\n", "任务 603698.SH 完成\n", - "任务 603700.SH 完成\n", "任务 603699.SH 完成\n", + "任务 603700.SH 完成\n", "任务 603701.SH 完成\n", "任务 603703.SH 完成\n", - "任务 603707.SH 完成\n", "任务 603706.SH 完成\n", + "任务 603707.SH 完成\n", "任务 603708.SH 完成\n", "任务 603709.SH 完成\n", "任务 603711.SH 完成\n", @@ -4572,10 +4572,10 @@ "任务 605117.SH 完成\n", "任务 605118.SH 完成\n", "任务 605122.SH 完成\n", - "任务 605128.SH 完成\n", "任务 605123.SH 完成\n", - "任务 605136.SH 完成\n", + "任务 605128.SH 完成\n", "任务 605133.SH 完成\n", + "任务 605136.SH 完成\n", "任务 605138.SH 完成\n", "任务 605151.SH 完成\n", "任务 605155.SH 完成\n", @@ -4588,8 +4588,8 @@ "任务 605177.SH 完成\n", "任务 605178.SH 完成\n", "任务 605179.SH 完成\n", - "任务 605183.SH 完成\n", "任务 605180.SH 完成\n", + "任务 605183.SH 完成\n", "任务 605186.SH 完成\n", "任务 605188.SH 完成\n", "任务 605189.SH 完成\n", @@ -4654,14 +4654,14 @@ "任务 688004.SH 完成\n", "任务 688005.SH 完成\n", "任务 688006.SH 完成\n", - "任务 688007.SH 完成\n", "任务 688008.SH 完成\n", - "任务 688009.SH 完成\n", + "任务 688007.SH 完成\n", "任务 688010.SH 完成\n", - "任务 688011.SH 完成\n", + "任务 688009.SH 完成\n", "任务 688012.SH 完成\n", - "任务 688013.SH 完成\n", + "任务 688011.SH 完成\n", "任务 688015.SH 完成\n", + "任务 688013.SH 完成\n", "任务 688016.SH 完成\n", "任务 688017.SH 完成\n", "任务 688018.SH 完成\n", @@ -4765,12 +4765,12 @@ "任务 688129.SH 完成\n", "任务 688130.SH 完成\n", "任务 688131.SH 完成\n", - "任务 688132.SH 完成\n", "任务 688133.SH 完成\n", + "任务 688132.SH 完成\n", "任务 688135.SH 完成\n", "任务 688136.SH 完成\n", - "任务 688137.SH 完成\n", "任务 688138.SH 完成\n", + "任务 688137.SH 完成\n", "任务 688139.SH 完成\n", "任务 688141.SH 完成\n", "任务 688143.SH 完成\n", @@ -4818,8 +4818,8 @@ "任务 688191.SH 完成\n", "任务 688192.SH 完成\n", "任务 688193.SH 完成\n", - "任务 688195.SH 完成\n", "任务 688196.SH 完成\n", + "任务 688195.SH 完成\n", "任务 688197.SH 完成\n", "任务 688198.SH 完成\n", "任务 688199.SH 完成\n", @@ -4910,34 +4910,34 @@ "任务 688299.SH 完成\n", "任务 688300.SH 完成\n", "任务 688301.SH 完成\n", - "任务 688303.SH 完成\n", "任务 688302.SH 完成\n", + "任务 688303.SH 完成\n", "任务 688305.SH 完成\n", "任务 688306.SH 完成\n", "任务 688307.SH 完成\n", "任务 688308.SH 完成\n", "任务 688309.SH 完成\n", "任务 688310.SH 完成\n", - "任务 688312.SH 完成\n", "任务 688311.SH 完成\n", + "任务 688312.SH 完成\n", "任务 688313.SH 完成\n", "任务 688314.SH 完成\n", - "任务 688315.SH 完成\n", "任务 688316.SH 完成\n", - "任务 688318.SH 完成\n", + "任务 688315.SH 完成\n", "任务 688317.SH 完成\n", - "任务 688319.SH 完成\n", + "任务 688318.SH 完成\n", "任务 688320.SH 完成\n", - "任务 688321.SH 完成\n", + "任务 688319.SH 完成\n", "任务 688322.SH 完成\n", - "任务 688323.SH 完成\n", + "任务 688321.SH 完成\n", "任务 688325.SH 完成\n", - "任务 688326.SH 完成\n", + "任务 688323.SH 完成\n", "任务 688327.SH 完成\n", + "任务 688326.SH 完成\n", "任务 688328.SH 完成\n", "任务 688329.SH 完成\n", - "任务 688330.SH 完成\n", "任务 688331.SH 完成\n", + "任务 688330.SH 完成\n", "任务 688332.SH 完成\n", "任务 688333.SH 完成\n", "任务 688334.SH 完成\n", @@ -4950,10 +4950,10 @@ "任务 688345.SH 完成\n", "任务 688347.SH 完成\n", "任务 688348.SH 完成\n", - "任务 688349.SH 完成\n", "任务 688350.SH 完成\n", - "任务 688351.SH 完成\n", + "任务 688349.SH 完成\n", "任务 688352.SH 完成\n", + "任务 688351.SH 完成\n", "任务 688353.SH 完成\n", "任务 688355.SH 完成\n", "任务 688356.SH 完成\n", @@ -4997,8 +4997,8 @@ "任务 688399.SH 完成\n", "任务 688400.SH 完成\n", "任务 688401.SH 完成\n", - "任务 688403.SH 完成\n", "任务 688408.SH 完成\n", + "任务 688403.SH 完成\n", "任务 688409.SH 完成\n", "任务 688410.SH 完成\n", "任务 688411.SH 完成\n", @@ -5027,8 +5027,8 @@ "任务 688469.SH 完成\n", "任务 688472.SH 完成\n", "任务 688475.SH 完成\n", - "任务 688479.SH 完成\n", "任务 688478.SH 完成\n", + "任务 688479.SH 完成\n", "任务 688480.SH 完成\n", "任务 688484.SH 完成\n", "任务 688485.SH 完成\n", @@ -5039,10 +5039,10 @@ "任务 688498.SH 完成\n", "任务 688499.SH 完成\n", "任务 688500.SH 完成\n", - "任务 688502.SH 完成\n", "任务 688501.SH 完成\n", - "任务 688505.SH 完成\n", + "任务 688502.SH 完成\n", "任务 688503.SH 完成\n", + "任务 688505.SH 完成\n", "任务 688506.SH 完成\n", "任务 688507.SH 完成\n", "任务 688508.SH 完成\n", @@ -5071,16 +5071,16 @@ "任务 688536.SH 完成\n", "任务 688538.SH 完成\n", "任务 688539.SH 完成\n", - "任务 688543.SH 完成\n", "任务 688545.SH 完成\n", + "任务 688543.SH 完成\n", "任务 688548.SH 完成\n", "任务 688549.SH 完成\n", - "任务 688550.SH 完成\n", "任务 688551.SH 完成\n", + "任务 688550.SH 完成\n", "任务 688552.SH 完成\n", "任务 688553.SH 完成\n", - "任务 688557.SH 完成\n", "任务 688556.SH 完成\n", + "任务 688557.SH 完成\n", "任务 688558.SH 完成\n", "任务 688559.SH 完成\n", "任务 688560.SH 完成\n", @@ -5095,8 +5095,8 @@ "任务 688570.SH 完成\n", "任务 688571.SH 完成\n", "任务 688573.SH 完成\n", - "任务 688575.SH 完成\n", "任务 688576.SH 完成\n", + "任务 688575.SH 完成\n", "任务 688577.SH 完成\n", "任务 688578.SH 完成\n", "任务 688579.SH 完成\n", @@ -5107,22 +5107,22 @@ "任务 688583.SH 完成\n", "任务 688585.SH 完成\n", "任务 688586.SH 完成\n", - "任务 688588.SH 完成\n", "任务 688589.SH 完成\n", - "任务 688590.SH 完成\n", + "任务 688588.SH 完成\n", "任务 688591.SH 完成\n", + "任务 688590.SH 完成\n", "任务 688592.SH 完成\n", "任务 688593.SH 完成\n", - "任务 688596.SH 完成\n", "任务 688595.SH 完成\n", + "任务 688596.SH 完成\n", "任务 688597.SH 完成\n", "任务 688598.SH 完成\n", - "任务 688600.SH 完成\n", "任务 688599.SH 完成\n", + "任务 688600.SH 完成\n", "任务 688601.SH 完成\n", "任务 688602.SH 完成\n", - "任务 688605.SH 完成\n", "任务 688603.SH 完成\n", + "任务 688605.SH 完成\n", "任务 688606.SH 完成\n", "任务 688607.SH 完成\n", "任务 688608.SH 完成\n", @@ -5131,8 +5131,8 @@ "任务 688611.SH 完成\n", "任务 688612.SH 完成\n", "任务 688613.SH 完成\n", - "任务 688615.SH 完成\n", "任务 688616.SH 完成\n", + "任务 688615.SH 完成\n", "任务 688618.SH 完成\n", "任务 688617.SH 完成\n", "任务 688619.SH 完成\n", @@ -5155,24 +5155,24 @@ "任务 688648.SH 完成\n", "任务 688651.SH 完成\n", "任务 688652.SH 完成\n", - "任务 688653.SH 完成\n", "任务 688655.SH 完成\n", - "任务 688656.SH 完成\n", + "任务 688653.SH 完成\n", "任务 688657.SH 完成\n", + "任务 688656.SH 完成\n", "任务 688658.SH 完成\n", "任务 688659.SH 完成\n", - "任务 688660.SH 完成\n", "任务 688661.SH 完成\n", - "任务 688662.SH 完成\n", + "任务 688660.SH 完成\n", "任务 688663.SH 完成\n", - "任务 688665.SH 完成\n", + "任务 688662.SH 完成\n", "任务 688667.SH 完成\n", + "任务 688665.SH 完成\n", "任务 688668.SH 完成\n", "任务 688669.SH 完成\n", "任务 688670.SH 完成\n", "任务 688671.SH 完成\n", - "任务 688676.SH 完成\n", "任务 688677.SH 完成\n", + "任务 688676.SH 完成\n", "任务 688678.SH 完成\n", "任务 688679.SH 完成\n", "任务 688680.SH 完成\n", @@ -5185,8 +5185,8 @@ "任务 688689.SH 完成\n", "任务 688690.SH 完成\n", "任务 688691.SH 完成\n", - "任务 688692.SH 完成\n", "任务 688693.SH 完成\n", + "任务 688692.SH 完成\n", "任务 688695.SH 完成\n", "任务 688696.SH 完成\n", "任务 688697.SH 完成\n", @@ -5215,18 +5215,18 @@ "任务 688750.SH 完成\n", "任务 688758.SH 完成\n", "任务 688766.SH 完成\n", - "任务 688768.SH 完成\n", "任务 688767.SH 完成\n", + "任务 688768.SH 完成\n", "任务 688772.SH 完成\n", "任务 688776.SH 完成\n", "任务 688777.SH 完成\n", "任务 688778.SH 完成\n", - "任务 688779.SH 完成\n", "任务 688786.SH 完成\n", + "任务 688779.SH 完成\n", "任务 688787.SH 完成\n", "任务 688788.SH 完成\n", - "任务 688789.SH 完成\n", "任务 688793.SH 完成\n", + "任务 688789.SH 完成\n", "任务 688798.SH 完成\n", "任务 688799.SH 完成\n", "任务 688800.SH 完成\n", @@ -5245,28 +5245,28 @@ "任务 831010.BJ 完成\n", "任务 831039.BJ 完成\n", "任务 831087.BJ 完成\n", - "任务 831167.BJ 完成\n", "任务 831152.BJ 完成\n", + "任务 831167.BJ 完成\n", "任务 831175.BJ 完成\n", "任务 831195.BJ 完成\n", "任务 831278.BJ 完成\n", "任务 831304.BJ 完成\n", - "任务 831370.BJ 完成\n", "任务 831305.BJ 完成\n", - "任务 831445.BJ 完成\n", + "任务 831370.BJ 完成\n", "任务 831396.BJ 完成\n", + "任务 831445.BJ 完成\n", "任务 831526.BJ 完成\n", "任务 831627.BJ 完成\n", "任务 831641.BJ 完成\n", "任务 831689.BJ 完成\n", "任务 831726.BJ 完成\n", "任务 831768.BJ 完成\n", - "任务 831834.BJ 完成\n", "任务 831832.BJ 完成\n", - "任务 831856.BJ 完成\n", + "任务 831834.BJ 完成\n", "任务 831855.BJ 完成\n", - "任务 831961.BJ 完成\n", + "任务 831856.BJ 完成\n", "任务 831906.BJ 完成\n", + "任务 831961.BJ 完成\n", "任务 832000.BJ 完成\n", "任务 832023.BJ 完成\n", "任务 832089.BJ 完成\n", @@ -5287,8 +5287,8 @@ "任务 832662.BJ 完成\n", "任务 832735.BJ 完成\n", "任务 832786.BJ 完成\n", - "任务 832876.BJ 完成\n", "任务 832802.BJ 完成\n", + "任务 832876.BJ 完成\n", "任务 832885.BJ 完成\n", "任务 832978.BJ 完成\n", "任务 832982.BJ 完成\n", @@ -5479,8 +5479,8 @@ "任务 920111.BJ 完成\n", "任务 920116.BJ 完成\n", "任务 920118.BJ 完成\n", - "任务 689009.SH 完成\n", "任务 920128.BJ 完成\n", + "任务 689009.SH 完成\n", "任务 000003.SZ 完成\n", "任务 000005.SZ 完成\n", "任务 000013.SZ 完成\n", @@ -5492,12 +5492,12 @@ "任务 000038.SZ 完成\n", "任务 000046.SZ 完成\n", "任务 000047.SZ 完成\n", - "任务 000150.SZ 完成\n", "任务 000405.SZ 完成\n", + "任务 000150.SZ 完成\n", "任务 000406.SZ 完成\n", "任务 000412.SZ 完成\n", - "任务 000413.SZ 完成\n", "任务 000416.SZ 完成\n", + "任务 000413.SZ 完成\n", "任务 000418.SZ 完成\n", "任务 000502.SZ 完成\n", "任务 000508.SZ 完成\n", @@ -5516,8 +5516,8 @@ "任务 000583.SZ 完成\n", "任务 000585.SZ 完成\n", "任务 000587.SZ 完成\n", - "任务 000588.SZ 完成\n", "任务 000594.SZ 完成\n", + "任务 000588.SZ 完成\n", "任务 000602.SZ 完成\n", "任务 000606.SZ 完成\n", "任务 000611.SZ 完成\n", @@ -5742,10 +5742,10 @@ "任务 600813.SH 完成\n", "任务 600823.SH 完成\n", "任务 600832.SH 完成\n", - "任务 600836.SH 完成\n", "任务 600840.SH 完成\n", - "任务 600842.SH 完成\n", + "任务 600836.SH 完成\n", "任务 600852.SH 完成\n", + "任务 600842.SH 完成\n", "任务 600856.SH 完成\n", "任务 600870.SH 完成\n", "任务 600878.SH 完成\n", @@ -5835,33 +5835,33 @@ "name": "stdout", "output_type": "stream", "text": [ - " ts_code trade_date open high low close pre_close \\\n", - "0 000001.SZ 20250509 1414.57 1427.35 1413.29 1424.79 1415.85 \n", - "1 000002.SZ 20250509 1250.12 1251.94 1231.95 1231.95 1250.12 \n", - "2 000004.SZ 20250509 30.76 31.94 30.72 31.41 30.44 \n", - "3 000006.SZ 20250509 264.67 266.26 254.34 255.93 264.67 \n", - "4 000007.SZ 20250509 57.74 59.23 56.99 58.82 57.66 \n", - "... ... ... ... ... ... ... ... \n", - "5353 920111.BJ 20250509 29.35 29.35 28.60 28.96 29.30 \n", - "5354 920116.BJ 20250509 111.30 115.50 110.07 110.20 110.94 \n", - "5355 920118.BJ 20250509 27.88 28.30 27.51 27.94 27.84 \n", - "5356 689009.SH 20250509 63.54 64.81 62.70 62.93 63.57 \n", - "5357 920128.BJ 20250509 31.50 32.58 31.08 31.72 31.60 \n", + " ts_code trade_date open high low close pre_close \\\n", + "0 000001.SZ 20250523 1475.91 1482.30 1460.57 1464.41 1475.91 \n", + "1 000001.SZ 20250522 1463.13 1477.18 1461.85 1475.91 1466.96 \n", + "2 000001.SZ 20250521 1456.74 1481.02 1455.46 1466.96 1455.46 \n", + "3 000001.SZ 20250520 1456.74 1465.68 1452.91 1455.46 1452.91 \n", + "4 000001.SZ 20250519 1456.74 1465.68 1451.63 1452.91 1454.18 \n", + "... ... ... ... ... ... ... ... \n", + "26761 689009.SH 20250523 68.37 70.32 66.62 66.63 68.32 \n", + "26762 689009.SH 20250522 67.16 68.66 66.74 68.32 67.32 \n", + "26763 689009.SH 20250521 65.45 67.75 64.73 67.32 65.45 \n", + "26764 689009.SH 20250520 65.56 66.73 64.75 65.45 65.44 \n", + "26765 689009.SH 20250519 64.05 65.95 63.99 65.44 63.94 \n", "\n", - " change pct_chg vol amount \n", - "0 8.94 0.63 999897.47 1113688.153 \n", - "1 -18.17 -1.45 733417.84 499181.206 \n", - "2 0.97 3.19 158549.20 122842.337 \n", - "3 -8.74 -3.30 251217.00 162768.216 \n", - "4 1.16 2.01 98993.00 69539.895 \n", - "... ... ... ... ... \n", - "5353 -0.34 -1.16 21254.87 61411.666 \n", - "5354 -0.74 -0.67 46877.34 376432.396 \n", - "5355 0.10 0.36 8515.96 23741.902 \n", - "5356 -0.64 -1.01 45658.87 287802.257 \n", - "5357 0.12 0.38 13476.08 42753.432 \n", + " change pct_chg vol amount \n", + "0 -11.50 -0.78 962643.11 1108636.101 \n", + "1 8.95 0.61 1002968.06 1155265.064 \n", + "2 11.50 0.79 1328278.10 1528350.368 \n", + "3 2.55 0.18 643634.80 734455.266 \n", + "4 -1.27 -0.09 831390.60 949883.545 \n", + "... ... ... ... ... \n", + "26761 -1.69 -2.47 88999.73 599644.428 \n", + "26762 1.00 1.49 61685.15 417079.978 \n", + "26763 1.87 2.86 63715.11 420469.740 \n", + "26764 0.01 0.02 64488.23 421060.706 \n", + "26765 1.50 2.35 95078.93 615893.951 \n", "\n", - "[5358 rows x 11 columns]\n" + "[26766 rows x 11 columns]\n" ] } ], diff --git a/main/data/update/update_money_flow.ipynb b/main/data/update/update_money_flow.ipynb index 49a9058..ea6f435 100644 --- a/main/data/update/update_money_flow.ipynb +++ b/main/data/update/update_money_flow.ipynb @@ -34,17 +34,17 @@ "output_type": "stream", "text": [ "\n", - "Index: 8451068 entries, 0 to 5123\n", + "Index: 8481815 entries, 0 to 25622\n", "Data columns (total 2 columns):\n", " # Column Dtype \n", "--- ------ ----- \n", " 0 ts_code object\n", " 1 trade_date object\n", "dtypes: object(2)\n", - "memory usage: 193.4+ MB\n", + "memory usage: 194.1+ MB\n", "None\n", - "20250508\n", - "start_date: 20250509\n" + "20250516\n", + "start_date: 20250519\n" ] } ], @@ -84,8 +84,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "任务 20250717 完成\n", "任务 20250718 完成\n", + "任务 20250717 完成\n", "任务 20250715 完成\n", "任务 20250716 完成\n", "任务 20250714 完成\n", @@ -100,18 +100,18 @@ "任务 20250701 完成\n", "任务 20250630 完成\n", "任务 20250627 完成\n", - "任务 20250625 完成\n", "任务 20250626 完成\n", + "任务 20250625 完成\n", "任务 20250624 完成\n", "任务 20250623 完成\n", "任务 20250620 完成\n", "任务 20250619 完成\n", - "任务 20250618 完成\n", "任务 20250617 完成\n", + "任务 20250618 完成\n", "任务 20250616 完成\n", "任务 20250613 完成\n", - "任务 20250612 完成\n", "任务 20250611 完成\n", + "任务 20250612 完成\n", "任务 20250610 完成\n", "任务 20250609 完成\n", "任务 20250606 完成\n", @@ -127,13 +127,7 @@ "任务 20250522 完成\n", "任务 20250521 完成\n", "任务 20250520 完成\n", - "任务 20250519 完成\n", - "任务 20250516 完成\n", - "任务 20250515 完成\n", - "任务 20250514 完成\n", - "任务 20250513 完成\n", - "任务 20250512 完成\n", - "任务 20250509 完成\n" + "任务 20250519 完成\n" ] } ], diff --git a/main/factor/__pycache__/factor.cpython-311.pyc b/main/factor/__pycache__/factor.cpython-311.pyc index ba0ec93..c489e50 100644 Binary files a/main/factor/__pycache__/factor.cpython-311.pyc and b/main/factor/__pycache__/factor.cpython-311.pyc differ diff --git a/main/factor/__pycache__/index_factor.cpython-311.pyc b/main/factor/__pycache__/index_factor.cpython-311.pyc new file mode 100644 index 0000000..d12996a Binary files /dev/null and b/main/factor/__pycache__/index_factor.cpython-311.pyc differ diff --git a/main/factor/factor.py b/main/factor/factor.py index cabacb2..7d56f5a 100644 --- a/main/factor/factor.py +++ b/main/factor/factor.py @@ -2,6 +2,9 @@ import numpy as np import pandas as pd import talib +from pandarallel import pandarallel + +pandarallel.initialize() def get_rolling_factor(df): old_columns = df.columns.tolist()[:] @@ -2747,7 +2750,7 @@ def sentiment_panic_greed_index(df: pd.DataFrame, window_atr: int = 14, window_s print(f"Error: DataFrame 缺少必需的 OHLCV 列。将为 {factor_name} 填充 NaN。") df[factor_name] = np.nan return - + try: df['_prev_close'] = df['close'].shift(1) @@ -2848,4 +2851,186 @@ def sentiment_reversal_indicator(df: pd.DataFrame, window_ret: int = 5, window_v if cols_to_drop: df.drop(columns=cols_to_drop, inplace=True) print(f"Finished {factor_name}.") - return df \ No newline at end of file + return df + + +def price_minus_deduction_price(df, n=10): + """ + 因子 1 (定量): 计算当前收盘价与N周期前收盘价(均线抵扣价)的差值。 + + 该因子衡量当前价格相对于即将移出均线计算窗口的价格的差异。 + 正值表示当前价格高于抵扣价,下一周期均线倾向于上涨(如果价格不变)。 + + 参数: + df (pd.DataFrame): 包含股票日线数据的DataFrame。必须包含 'ts_code', 'close' 列。 + n (int): 均线计算的周期数。抵扣价是 n-1 周期前的数据点。 + + 返回: + pd.DataFrame: 增加了 'price_minus_deduction_price_n' 列的DataFrame。 + """ + if 'close' not in df.columns: + print("错误: DataFrame中没有'close'列,无法计算抵扣价相关因子。") + return df + + if n <= 1: + print("错误: 均线周期 n 必须大于 1。") + df[f'price_minus_deduction_price_{n}'] = np.nan + return df + + grouped = df.groupby('ts_code', group_keys=False) + + # 抵扣价是当前窗口移除的最早的价格,即当前价格的 n-1 周期前的价格 + # 例如计算 SMA(10) for P_t, 窗口是 P_{t-9}, ..., P_t. 移除的是 P_{t-9}. + # P_{t-9} 是 P_t 的 shift(9). So shift(n-1). + deduction_price = grouped['close'].shift(n - 1) + + # 计算差值 + df[f'price_minus_deduction_price_{n}'] = df['close'] - deduction_price + + print(f"因子 price_minus_deduction_price_{n} 计算完成。") + return df + +def price_deduction_price_diff_ratio_to_sma(df, n=10): + """ + 因子 2 (定量): 计算当前收盘价与抵扣价的差值占N周期均线的比例。 + + 该因子衡量当前价格高于抵扣价的程度相对于均线水平的大小。 + + 参数: + df (pd.DataFrame): 包含股票日线数据的DataFrame。必须包含 'ts_code', 'close' 列。 + n (int): 均线计算的周期数。抵扣价是 n-1 周期前的数据点。 + + 返回: + pd.DataFrame: 增加了 'price_deduction_price_diff_ratio_to_sma_n' 列的DataFrame。 + """ + if 'close' not in df.columns: + print("错误: DataFrame中没有'close'列,无法计算抵扣价相关因子。") + return df + if n <= 1: + print("错误: 均线周期 n 必须大于 1。") + df[f'price_deduction_price_diff_ratio_to_sma_{n}'] = np.nan + return df + + grouped = df.groupby('ts_code', group_keys=False) + + # 计算N周期SMA + # 使用 transform 可以保持与原始 df 的索引对齐 + sma = grouped['close'].transform(lambda x: x.rolling(window=n).mean()) + + # 抵扣价 + deduction_price = grouped['close'].shift(n - 1) + + # 计算比例,处理均线为零的情况 + diff = df['close'] - deduction_price + # 使用 np.divide 并指定 where 条件和 fill_value 来避免除以零警告和 NaN 结果 + # 如果 sma 为 0,则结果设为 NaN + df[f'price_deduction_price_diff_ratio_to_sma_{n}'] = np.divide( + diff, + sma, + out=np.full_like(diff, np.nan), # 输出数组形状与 diff 相同,NaN 填充 + where=(sma != 0) # 仅在 sma 不为 0 时执行除法 + ) + + # np.divide with where handles Inf/-Inf and 0/0 (as NaN), but explicitly replace might be slightly safer depending on numpy version + # df[f'price_deduction_price_diff_ratio_to_sma_{n}'].replace([np.inf, -np.inf], np.nan, inplace=True) # This is often redundant with np.divide(..., where=...) + + print(f"因子 price_deduction_price_diff_ratio_to_sma_{n} 计算完成。") + return df + + +def cat_price_vs_sma_vs_deduction_price(df, n=10): + """ + 因子 3 (分类): 基于当前收盘价、N周期均线和抵扣价的位置关系构建分类因子。 + + 捕捉当前价格和抵扣价相对于均线的位置,指示可能的趋势状态或变化。 + + 分类定义: + 0: 数据不足 (SMA 或抵扣价为 NaN) 或 均线为 NaN + 1: 当前价 > SMA 且 抵扣价 > SMA (两者都在均线之上) + 2: 当前价 < SMA 且 抵扣价 < SMA (两者都在均线之下) + 3: 当前价 > SMA 且 抵扣价 <= SMA (当前价上穿或位于均线上方,抵扣价在均线下方或正好在均线) + 4: 当前价 <= SMA 且 抵扣价 > SMA (当前价下穿或位于均线下方,抵扣价在均线上方) + + 参数: + df (pd.DataFrame): 包含股票日线数据的DataFrame。必须包含 'ts_code', 'close' 列。 + n (int): 均线计算的周期数。抵扣价是 n-1 周期前的数据点。 + + 返回: + pd.DataFrame: 增加了 'cat_price_vs_sma_vs_deduction_price_n' 列的DataFrame。 + """ + if 'close' not in df.columns: + print("错误: DataFrame中没有'close'列,无法计算抵扣价相关因子。") + return df + if n <= 1: + print("错误: 均线周期 n 必须大于 1。") + df[f'cat_price_vs_sma_vs_deduction_price_{n}'] = np.nan + return df + + grouped = df.groupby('ts_code', group_keys=False) + + # 计算N周期SMA + sma = grouped['close'].transform(lambda x: x.rolling(window=n).mean()) + + # 抵扣价 + deduction_price = grouped['close'].shift(n - 1) + + # 定义条件和分类值 + conditions = [ + (df['close'] > sma) & (deduction_price > sma), + (df['close'] < sma) & (deduction_price < sma), + (df['close'] > sma) & (deduction_price <= sma), # 包含等于的情况 + (df['close'] <= sma) & (deduction_price > sma) # 包含等于的情况 + # 注意:sma 或 deduction_price 为 NaN 的行,其条件结果为 False,会落入 default=0 + ] + choices = [1, 2, 3, 4] + + # 使用 np.select 进行分类 + # 默认值为 0,用于处理条件不满足或输入为 NaN 的情况 + df[f'cat_price_vs_sma_vs_deduction_price_{n}'] = np.select(conditions, choices, default=0) + + print(f"因子 cat_price_vs_sma_vs_deduction_price_{n} 计算完成。") + return df + +def cat_is_on_top_list(df: pd.DataFrame, top_list: pd.DataFrame) -> pd.DataFrame: + if 'cat_reason' not in df.columns: + print('计算因子cat_is_on_top_list失败,缺少cat_reason列') + return df + + df['cat_is_on_top_list'] = df['cat_reason'] + df['cat_is_on_top_list'] = df['cat_is_on_top_list'] * (df['pct_chg'] > 0).astype(int) + + return df + + +def cat_reason(df: pd.DataFrame, top_list: pd.DataFrame) -> pd.DataFrame: + """ + 高效地将龙虎榜的 reason 列转化为单一数值类型的因子列,并仅返回必要的列。 + + Args: + df (pd.DataFrame): 包含所有股票数据的 DataFrame,需包含 'ts_code' 和 'trade_date' 列。 + top_list (pd.DataFrame): 每日龙虎榜数据的 DataFrame,需包含 'ts_code', 'trade_date' 和 'reason' 列。 + + Returns: + pd.DataFrame: 包含 'ts_code', 'trade_date' 和 'cat_reason' 列。 + """ + # 提取所有唯一的 reason 并进行数值编码 + unique_reasons = top_list['reason'].unique() + reason_mapping = {reason: i + 1 for i, reason in enumerate(unique_reasons)} + + # 在 top_list 中创建数值型的 reason 列 + top_list['cat_reason'] = top_list['reason'].map(reason_mapping).astype('Int64') + + # 转换 trade_date 类型以进行合并 + df['trade_date'] = pd.to_datetime(df['trade_date']) + top_list['trade_date'] = pd.to_datetime(top_list['trade_date']) + + # 仅保留 top_list 中需要的列进行合并 + top_list_slim = top_list[['ts_code', 'trade_date', 'cat_reason']] + + # 合并 DataFrame + merged_df = df.merge(top_list_slim, on=['ts_code', 'trade_date'], how='left') + + # 填充 NaN 为 0 并转换为 int 类型 + merged_df['cat_reason'] = merged_df['cat_reason'].fillna(0).astype('int') + + return merged_df \ No newline at end of file diff --git a/main/factor/index_factor.py b/main/factor/index_factor.py new file mode 100644 index 0000000..66e3f60 --- /dev/null +++ b/main/factor/index_factor.py @@ -0,0 +1,193 @@ +import pandas as pd +import numpy as np +from scipy.stats import spearmanr # 用于因子3的原始思路,但实际简化了 + +epsilon = 1e-10 + +def _safe_divide(numerator, denominator, default_val=0.0): + """安全除法""" + with np.errstate(divide='ignore', invalid='ignore'): + result = numerator / denominator + result[~np.isfinite(result)] = default_val + return result + +# --- 修改后的因子计算函数 --- + +def calculate_size_style_strength_factor(df: pd.DataFrame, N: int = 5, factor_name_suffix: str = '') -> pd.DataFrame: + """ + 计算大小盘风格相对强度因子。 + 返回: 以 trade_date 为索引,因子值为列的 DataFrame。 + """ + factor_name = f'size_style_strength_{N}{factor_name_suffix}' + print(f"Calculating {factor_name}...") + + required_indices = ['399300.SZ', '000905.SH', '000852.SH'] + if not all(idx in df['ts_code'].unique() for idx in required_indices): + print(f"Error: DataFrame 中缺少部分必需的指数代码 ({required_indices})。返回空因子 Series。") + return pd.DataFrame(index=df['trade_date'].unique(), columns=[factor_name]).rename_axis('trade_date') + + # 1. 计算各指数N日收益率 + df_copy = df.copy() # 操作副本,避免修改原始传入df + df_copy['_ret_N'] = df_copy.groupby('ts_code')['close'].pct_change(periods=N) + + # 2. Pivot 以方便截面计算 + pivot_ret_N = df_copy.pivot_table(index='trade_date', columns='ts_code', values='_ret_N') + + # 确保列存在并获取 + large_ret = pivot_ret_N.get('399300.SZ', pd.Series(np.nan, index=pivot_ret_N.index)) + mid_ret = pivot_ret_N.get('000905.SH', pd.Series(np.nan, index=pivot_ret_N.index)) + small_ret = pivot_ret_N.get('000852.SH', pd.Series(np.nan, index=pivot_ret_N.index)) + + # 3. 计算因子 (结果是每日一个标量值) + large_small_diff = large_ret - small_ret + avg_large_small_ret = (large_ret + small_ret) / 2 + # 计算中盘偏离因子,处理NaN,如果中盘收益为NaN,则偏离因子不起调整作用(乘以1) + mid_deviation_raw = mid_ret - avg_large_small_ret + mid_deviation_factor = 1 + np.sign(mid_ret.fillna(0)) * np.abs(mid_deviation_raw.fillna(0)) + + daily_factor_values = large_small_diff * mid_deviation_factor + daily_factor_values.name = factor_name # 给 Series 命名 + + print(f"Finished {factor_name}.") + return daily_factor_values.to_frame() # 转换为 DataFrame 返回 + +def calculate_volatility_structure_factor(df: pd.DataFrame, N: int = 10, factor_name_suffix: str = '') -> pd.DataFrame: + """ + 计算市场波动结构因子。 + 返回: 以 trade_date 为索引,因子值为列的 DataFrame。 + """ + factor_name = f'vol_structure_idx_{N}{factor_name_suffix}' + print(f"Calculating {factor_name}...") + + required_indices = ['399300.SZ', '000905.SH', '000852.SH'] + if not all(idx in df['ts_code'].unique() for idx in required_indices): + print(f"Error: DataFrame 中缺少部分必需的指数代码 ({required_indices})。返回空因子 Series。") + return pd.DataFrame(index=df['trade_date'].unique(), columns=[factor_name]).rename_axis('trade_date') + + if 'pct_chg' not in df.columns: + print(f"Error: DataFrame 缺少 'pct_chg' 列。将为 {factor_name} 填充 NaN。") + return pd.DataFrame(index=df['trade_date'].unique(), columns=[factor_name]).rename_axis('trade_date') + + df_copy = df.copy() + # 1. 计算各指数N日波动率 + df_copy['_vol_N'] = df_copy.groupby('ts_code')['pct_chg'].rolling(N, min_periods=max(1, N//2)).std().reset_index(level=0, drop=True) + + # 2. Pivot + pivot_vol_N = df_copy.pivot_table(index='trade_date', columns='ts_code', values='_vol_N') + + large_vol = pivot_vol_N.get('399300.SZ', pd.Series(np.nan, index=pivot_vol_N.index)) + mid_vol = pivot_vol_N.get('000905.SH', pd.Series(np.nan, index=pivot_vol_N.index)) + small_vol = pivot_vol_N.get('000852.SH', pd.Series(np.nan, index=pivot_vol_N.index)) + + # 3. 计算因子 + daily_factor_values = _safe_divide((small_vol - mid_vol), large_vol) + daily_factor_values.name = factor_name + + print(f"Finished {factor_name}.") + return daily_factor_values.to_frame() + +def calculate_market_divergence_factor(df: pd.DataFrame, factor_name_suffix: str = '') -> pd.DataFrame: + """ + 计算市场分化度因子 (基于每日三个指数收益率符号的一致性)。 + 返回: 以 trade_date 为索引,因子值为列的 DataFrame。 + """ + factor_name = f'market_divergence_score{factor_name_suffix}' + print(f"Calculating {factor_name}...") + + required_indices = ['399300.SZ', '000905.SH', '000852.SH'] + if not all(idx in df['ts_code'].unique() for idx in required_indices): + print(f"Error: DataFrame 中缺少部分必需的指数代码 ({required_indices})。返回空因子 Series。") + return pd.DataFrame(index=df['trade_date'].unique(), columns=[factor_name]).rename_axis('trade_date') + + if 'pct_chg' not in df.columns: + print(f"Error: DataFrame 缺少 'pct_chg' 列。将为 {factor_name} 填充 NaN。") + return pd.DataFrame(index=df['trade_date'].unique(), columns=[factor_name]).rename_axis('trade_date') + + pivot_pct_chg = df.pivot_table(index='trade_date', columns='ts_code', values='pct_chg') + + # 确保列存在 + idx_large_col = '399300.SZ' + idx_mid_col = '000905.SH' + idx_small_col = '000852.SH' + + # 使用 reindex 确保所有期望的列都存在,缺失的填充NaN + pivot_pct_chg = pivot_pct_chg.reindex(columns=[idx_large_col, idx_mid_col, idx_small_col]) + + def daily_divergence_score_calc(row): + # 当天只有这三个指数的收益率 Series + valid_returns = row.dropna() # 获取非 NaN 的收益率 + if len(valid_returns) < 2: # 如果有效数据少于2个,无法判断分化 + return np.nan + + signs = np.sign(valid_returns) + unique_sign_count = len(signs.unique()) + + if unique_sign_count == 1: # 所有符号相同 (或都为0,sign后也是0) + return 0.0 # 分化度最低 (高度一致) + elif unique_sign_count == 2 and 0 in signs.unique(): # 一个方向,一个0 + return 0.25 # 较低分化 + elif unique_sign_count == 2: # 两个方向 (例如两正一负,或两负一正) + return 0.75 # 较高分化 + elif unique_sign_count == 3: # 三个不同方向 (+, -, 0) + return 1.0 # 分化度最高 + return np.nan # 其他未覆盖的情况 (理论上不应发生) + + daily_factor_values = pivot_pct_chg[[idx_large_col, idx_mid_col, idx_small_col]].apply(daily_divergence_score_calc, axis=1) + daily_factor_values.name = factor_name + + print(f"Finished {factor_name}.") + return daily_factor_values.to_frame() + +# --- 整合所有因子计算到一个主函数 --- +def generate_daily_index_relation_factors(df_input: pd.DataFrame) -> pd.DataFrame: + """ + 计算所有基于大中小盘指数关系的每日截面因子。 + + Args: + df_input (pd.DataFrame): 长格式的指数行情数据,包含 'ts_code', 'trade_date', 'close', 'pct_chg'。 + + Returns: + pd.DataFrame: 以 'trade_date' 为索引,各因子为列的 DataFrame。 + """ + # 确保输入 df 不被修改 + df = df_input.sort_values(['ts_code', 'trade_date']).reset_index(drop=True) + + # 计算各个因子 (每个函数返回一个单列或多列的 DataFrame,索引为 trade_date) + factor1_df = calculate_size_style_strength_factor(df, N=5) + factor2_df = calculate_volatility_structure_factor(df, N=10) + factor3_df = calculate_market_divergence_factor(df) + + # 还可以继续添加其他每日截面因子... + + # 合并所有因子 DataFrame + # 使用 functools.reduce 和 pd.merge 来优雅地合并多个 DataFrame + from functools import reduce + daily_factors_list = [factor1_df, factor2_df, factor3_df] + # 过滤掉可能因错误产生的完全为空或只有NaN的DataFrame + daily_factors_list = [f_df for f_df in daily_factors_list if not f_df.empty and not f_df.iloc[:,0].isna().all()] + + if not daily_factors_list: + print("警告: 未能成功计算任何因子。返回空 DataFrame。") + # 返回一个以日期为索引的空DataFrame,或者基于输入df的日期 + return pd.DataFrame(index=df['trade_date'].unique()).rename_axis('trade_date') + + # 使用 outer join 以保留所有日期,并确保索引是 trade_date + final_factors_df = reduce(lambda left, right: pd.merge(left, right, on='trade_date', how='outer'), + daily_factors_list) + + final_factors_df = final_factors_df.sort_index() # 按日期排序 + + return final_factors_df + +# --- 使用示例 --- +# 假设 all_indices_df 是你包含 '399300.SZ', '000905.SH', '000852.SH' 三个指数的长格式行情数据 +# 确保它有 'ts_code', 'trade_date', 'open', 'high', 'low', 'close', 'vol', 'pct_chg' 列 +# all_indices_df['trade_date'] = pd.to_datetime(all_indices_df['trade_date']) +# all_indices_df = all_indices_df.sort_values(['ts_code', 'trade_date']) + +# daily_market_factors = generate_daily_index_relation_factors(all_indices_df) +# print("\n每日市场风格/情绪因子:") +# print(daily_market_factors.tail()) + +# 后续,你可以将 daily_market_factors 与你的个股数据 pdf 按 'trade_date' 合并 +# pdf_with_market_factors = pd.merge(pdf, daily_market_factors, on='trade_date', how='left') \ No newline at end of file diff --git a/main/train/Classify2-HyperGBM.ipynb b/main/train/Classify2-HyperGBM.ipynb new file mode 100644 index 0000000..7b13ed3 --- /dev/null +++ b/main/train/Classify2-HyperGBM.ipynb @@ -0,0 +1,2550 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "79a7758178bafdd3", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:46:06.987506Z", + "start_time": "2025-04-03T12:46:06.259551Z" + }, + "jupyter": { + "source_hidden": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "e:\\PyProject\\NewStock\\main\\train\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "import gc\n", + "import os\n", + "import sys\n", + "sys.path.append('../../')\n", + "print(os.getcwd())\n", + "import pandas as pd\n", + "from main.factor.factor import get_rolling_factor, get_simple_factor\n", + "from main.utils.factor import read_industry_data\n", + "from main.utils.factor_processor import calculate_score\n", + "from main.utils.utils import read_and_merge_h5_data, merge_with_industry_data\n", + "\n", + "import warnings\n", + "\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a79cafb06a7e0e43", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:00.212859Z", + "start_time": "2025-04-03T12:46:06.998047Z" + }, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "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: 8638639 entries, 0 to 8638638\n", + "Data columns (total 32 columns):\n", + " # Column Dtype \n", + "--- ------ ----- \n", + " 0 ts_code object \n", + " 1 trade_date datetime64[ns]\n", + " 2 open float64 \n", + " 3 close float64 \n", + " 4 high float64 \n", + " 5 low float64 \n", + " 6 vol float64 \n", + " 7 pct_chg float64 \n", + " 8 turnover_rate float64 \n", + " 9 pe_ttm float64 \n", + " 10 circ_mv float64 \n", + " 11 total_mv float64 \n", + " 12 volume_ratio float64 \n", + " 13 is_st bool \n", + " 14 up_limit float64 \n", + " 15 down_limit float64 \n", + " 16 buy_sm_vol float64 \n", + " 17 sell_sm_vol float64 \n", + " 18 buy_lg_vol float64 \n", + " 19 sell_lg_vol float64 \n", + " 20 buy_elg_vol float64 \n", + " 21 sell_elg_vol float64 \n", + " 22 net_mf_vol float64 \n", + " 23 his_low float64 \n", + " 24 his_high float64 \n", + " 25 cost_5pct float64 \n", + " 26 cost_15pct float64 \n", + " 27 cost_50pct float64 \n", + " 28 cost_85pct float64 \n", + " 29 cost_95pct float64 \n", + " 30 weight_avg float64 \n", + " 31 winner_rate float64 \n", + "dtypes: bool(1), datetime64[ns](1), float64(29), object(1)\n", + "memory usage: 2.0+ GB\n", + "None\n" + ] + } + ], + "source": [ + "from main.utils.utils import read_and_merge_h5_data\n", + "\n", + "print('daily data')\n", + "df = read_and_merge_h5_data('../../data/daily_data.h5', key='daily_data',\n", + " columns=['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg'],\n", + " df=None)\n", + "\n", + "print('daily basic')\n", + "df = read_and_merge_h5_data('../../data/daily_basic.h5', key='daily_basic',\n", + " columns=['ts_code', 'trade_date', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio',\n", + " 'is_st'], df=df, join='inner')\n", + "\n", + "print('stk limit')\n", + "df = read_and_merge_h5_data('../../data/stk_limit.h5', key='stk_limit',\n", + " columns=['ts_code', 'trade_date', 'pre_close', 'up_limit', 'down_limit'],\n", + " df=df)\n", + "print('money flow')\n", + "df = read_and_merge_h5_data('../../data/money_flow.h5', key='money_flow',\n", + " columns=['ts_code', 'trade_date', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol',\n", + " 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol'],\n", + " df=df)\n", + "print('cyq perf')\n", + "df = read_and_merge_h5_data('../../data/cyq_perf.h5', key='cyq_perf',\n", + " columns=['ts_code', 'trade_date', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct',\n", + " 'cost_50pct',\n", + " 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate'],\n", + " df=df)\n", + "print(df.info())" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cac01788dac10678", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.527104Z", + "start_time": "2025-04-03T12:47:00.488715Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "industry\n" + ] + } + ], + "source": [ + "print('industry')\n", + "industry_df = read_and_merge_h5_data('../../data/industry_data.h5', key='industry_data',\n", + " columns=['ts_code', 'l2_code', 'in_date'],\n", + " df=None, on=['ts_code'], join='left')\n", + "\n", + "\n", + "def merge_with_industry_data(df, industry_df):\n", + " # 确保日期字段是 datetime 类型\n", + " df['trade_date'] = pd.to_datetime(df['trade_date'])\n", + " industry_df['in_date'] = pd.to_datetime(industry_df['in_date'])\n", + "\n", + " # 对 industry_df 按 ts_code 和 in_date 排序\n", + " industry_df_sorted = industry_df.sort_values(['in_date', 'ts_code'])\n", + "\n", + " # 对原始 df 按 ts_code 和 trade_date 排序\n", + " df_sorted = df.sort_values(['trade_date', 'ts_code'])\n", + "\n", + " # 使用 merge_asof 进行向后合并\n", + " merged = pd.merge_asof(\n", + " df_sorted,\n", + " industry_df_sorted,\n", + " by='ts_code', # 按 ts_code 分组\n", + " left_on='trade_date',\n", + " right_on='in_date',\n", + " direction='backward'\n", + " )\n", + "\n", + " # 获取每个 ts_code 的最早 in_date 记录\n", + " min_in_date_per_ts = (industry_df_sorted\n", + " .groupby('ts_code')\n", + " .first()\n", + " .reset_index()[['ts_code', 'l2_code']])\n", + "\n", + " # 填充未匹配到的记录(trade_date 早于所有 in_date 的情况)\n", + " merged['l2_code'] = merged['l2_code'].fillna(\n", + " merged['ts_code'].map(min_in_date_per_ts.set_index('ts_code')['l2_code'])\n", + " )\n", + "\n", + " # 保留需要的列并重置索引\n", + " result = merged.reset_index(drop=True)\n", + " return result\n", + "\n", + "\n", + "# 使用示例\n", + "df = merge_with_industry_data(df, industry_df)\n", + "# print(mdf[mdf['ts_code'] == '600751.SH'][['ts_code', 'trade_date', 'l2_code']])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c4e9e1d31da6dba6", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.719252Z", + "start_time": "2025-04-03T12:47:10.541247Z" + }, + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "from main.factor.factor import *\n", + "\n", + "def calculate_indicators(df):\n", + " \"\"\"\n", + " 计算四个指标:当日涨跌幅、5日移动平均、RSI、MACD。\n", + " \"\"\"\n", + " df = df.sort_values('trade_date')\n", + " df['daily_return'] = (df['close'] - df['pre_close']) / df['pre_close'] * 100\n", + " # df['5_day_ma'] = df['close'].rolling(window=5).mean()\n", + " delta = df['close'].diff()\n", + " gain = delta.where(delta > 0, 0)\n", + " loss = -delta.where(delta < 0, 0)\n", + " avg_gain = gain.rolling(window=14).mean()\n", + " avg_loss = loss.rolling(window=14).mean()\n", + " rs = avg_gain / avg_loss\n", + " df['RSI'] = 100 - (100 / (1 + rs))\n", + "\n", + " # 计算MACD\n", + " ema12 = df['close'].ewm(span=12, adjust=False).mean()\n", + " ema26 = df['close'].ewm(span=26, adjust=False).mean()\n", + " df['MACD'] = ema12 - ema26\n", + " df['Signal_line'] = df['MACD'].ewm(span=9, adjust=False).mean()\n", + " df['MACD_hist'] = df['MACD'] - df['Signal_line']\n", + "\n", + " # 4. 情绪因子1:市场上涨比例(Up Ratio)\n", + " df['up_ratio'] = df['daily_return'].apply(lambda x: 1 if x > 0 else 0)\n", + " df['up_ratio_20d'] = df['up_ratio'].rolling(window=20).mean() # 过去20天上涨比例\n", + "\n", + " # 5. 情绪因子2:成交量变化率(Volume Change Rate)\n", + " df['volume_mean'] = df['vol'].rolling(window=20).mean() # 过去20天的平均成交量\n", + " df['volume_change_rate'] = (df['vol'] - df['volume_mean']) / df['volume_mean'] * 100 # 成交量变化率\n", + "\n", + " # 6. 情绪因子3:波动率(Volatility)\n", + " df['volatility'] = df['daily_return'].rolling(window=20).std() # 过去20天的日收益率标准差\n", + "\n", + " # 7. 情绪因子4:成交额变化率(Amount Change Rate)\n", + " df['amount_mean'] = df['amount'].rolling(window=20).mean() # 过去20天的平均成交额\n", + " df['amount_change_rate'] = (df['amount'] - df['amount_mean']) / df['amount_mean'] * 100 # 成交额变化率\n", + "\n", + " # df = sentiment_panic_greed_index(df)\n", + " # df = sentiment_market_breadth_proxy(df)\n", + " # df = sentiment_reversal_indicator(df)\n", + "\n", + " return df\n", + "\n", + "\n", + "def generate_index_indicators(h5_filename):\n", + " df = pd.read_hdf(h5_filename, key='index_data')\n", + " df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')\n", + " df = df.sort_values('trade_date')\n", + "\n", + " # 计算每个ts_code的相关指标\n", + " df_indicators = []\n", + " for ts_code in df['ts_code'].unique():\n", + " df_index = df[df['ts_code'] == ts_code].copy()\n", + " df_index = calculate_indicators(df_index)\n", + " df_indicators.append(df_index)\n", + "\n", + " # 合并所有指数的结果\n", + " df_all_indicators = pd.concat(df_indicators, ignore_index=True)\n", + "\n", + " # 保留trade_date列,并将同一天的数据按ts_code合并成一行\n", + " df_final = df_all_indicators.pivot_table(\n", + " index='trade_date',\n", + " columns='ts_code',\n", + " values=['daily_return', \n", + " 'RSI', 'MACD', 'Signal_line', 'MACD_hist', \n", + " # 'sentiment_panic_greed_index',\n", + " 'up_ratio_20d', 'volume_change_rate', 'volatility',\n", + " 'amount_change_rate', 'amount_mean'],\n", + " aggfunc='last'\n", + " )\n", + "\n", + " df_final.columns = [f\"{col[1]}_{col[0]}\" for col in df_final.columns]\n", + " df_final = df_final.reset_index()\n", + "\n", + " return df_final\n", + "\n", + "\n", + "# 使用函数\n", + "h5_filename = '../../data/index_data.h5'\n", + "index_data = generate_index_indicators(h5_filename)\n", + "index_data = index_data.dropna()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a735bc02ceb4d872", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.821169Z", + "start_time": "2025-04-03T12:47:10.751831Z" + } + }, + "outputs": [], + "source": [ + "import talib\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "53f86ddc0677a6d7", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:15.944254Z", + "start_time": "2025-04-03T12:47:10.826179Z" + }, + "jupyter": { + "source_hidden": true + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "from main.utils.factor import get_act_factor\n", + "\n", + "\n", + "def read_industry_data(h5_filename):\n", + " # 读取 H5 文件中所有的行业数据\n", + " industry_data = pd.read_hdf(h5_filename, key='sw_daily', columns=[\n", + " 'ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'pe', 'pb', 'vol'\n", + " ]) # 假设 H5 文件的键是 'industry_data'\n", + " industry_data = industry_data.sort_values(by=['ts_code', 'trade_date'])\n", + " industry_data = industry_data.reindex()\n", + " industry_data['trade_date'] = pd.to_datetime(industry_data['trade_date'], format='%Y%m%d')\n", + "\n", + " grouped = industry_data.groupby('ts_code', group_keys=False)\n", + " industry_data['obv'] = grouped.apply(\n", + " lambda x: pd.Series(talib.OBV(x['close'].values, x['vol'].values), index=x.index)\n", + " )\n", + " industry_data['return_5'] = grouped['close'].apply(lambda x: x / x.shift(5) - 1)\n", + " industry_data['return_20'] = grouped['close'].apply(lambda x: x / x.shift(20) - 1)\n", + "\n", + " industry_data = get_act_factor(industry_data, cat=False)\n", + " industry_data = industry_data.sort_values(by=['trade_date', 'ts_code'])\n", + "\n", + " # # 计算每天每个 ts_code 的因子和当天所有 ts_code 的中位数的偏差\n", + " # factor_columns = ['obv', 'return_5', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4'] # 因子列\n", + " # \n", + " # for factor in factor_columns:\n", + " # if factor in industry_data.columns:\n", + " # # 计算每天每个 ts_code 的因子值与当天所有 ts_code 的中位数的偏差\n", + " # industry_data[f'{factor}_deviation'] = industry_data.groupby('trade_date')[factor].transform(\n", + " # lambda x: x - x.mean())\n", + "\n", + " industry_data['return_5_percentile'] = industry_data.groupby('trade_date')['return_5'].transform(\n", + " lambda x: x.rank(pct=True))\n", + " industry_data['return_20_percentile'] = industry_data.groupby('trade_date')['return_20'].transform(\n", + " lambda x: x.rank(pct=True))\n", + "\n", + " # cs_rank_intraday_range(industry_data)\n", + " # cs_rank_close_pos_in_range(industry_data)\n", + "\n", + " industry_data = industry_data.drop(columns=['open', 'close', 'high', 'low', 'pe', 'pb', 'vol'])\n", + "\n", + " industry_data = industry_data.rename(\n", + " columns={col: f'industry_{col}' for col in industry_data.columns if col not in ['ts_code', 'trade_date']})\n", + "\n", + " industry_data = industry_data.rename(columns={'ts_code': 'cat_l2_code'})\n", + " return industry_data\n", + "\n", + "\n", + "industry_df = read_industry_data('../../data/sw_daily.h5')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "dbe2fd8021b9417f", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:15.969344Z", + "start_time": "2025-04-03T12:47:15.963327Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['ts_code', 'open', 'close', 'high', 'low', 'circ_mv', 'total_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" + ] + } + ], + "source": [ + "origin_columns = df.columns.tolist()\n", + "origin_columns = [col for col in origin_columns if\n", + " col not in ['turnover_rate', 'pe_ttm', 'volume_ratio', 'vol', 'pct_chg', 'l2_code', 'winner_rate']]\n", + "origin_columns = [col for col in origin_columns if col not in index_data.columns]\n", + "origin_columns = [col for col in origin_columns if 'cyq' not in col]\n", + "print(origin_columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "85c3e3d0235ffffa", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:16.089879Z", + "start_time": "2025-04-03T12:47:15.990101Z" + } + }, + "outputs": [], + "source": [ + "fina_indicator_df = read_and_merge_h5_data('../../data/fina_indicator.h5', key='fina_indicator',\n", + " columns=['ts_code', 'ann_date', 'undist_profit_ps', 'ocfps', 'bps'],\n", + " df=None)\n", + "cashflow_df = read_and_merge_h5_data('../../data/cashflow.h5', key='cashflow',\n", + " columns=['ts_code', 'ann_date', 'n_cashflow_act'],\n", + " df=None)\n", + "balancesheet_df = read_and_merge_h5_data('../../data/balancesheet.h5', key='balancesheet',\n", + " columns=['ts_code', 'ann_date', 'money_cap', 'total_liab'],\n", + " df=None)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "92d84ce15a562ec6", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:01.612695Z", + "start_time": "2025-04-03T12:47:16.121802Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "开始计算因子: AR, BR (原地修改)...\n", + "因子 AR, BR 计算成功。\n", + "因子 AR, BR 计算流程结束。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "计算 BBI...\n", + "--- 计算日级别偏离度 (使用 pct_chg) ---\n", + "--- 计算日级别动量基准 (使用 pct_chg) ---\n", + "日级别动量基准计算完成 (使用 pct_chg)。\n", + "日级别偏离度计算完成 (使用 pct_chg)。\n", + "--- 计算日级别行业偏离度 (使用 pct_chg 和行业基准) ---\n", + "--- 计算日级别行业动量基准 (使用 pct_chg 和 cat_l2_code) ---\n", + "错误: 计算日级别行业动量基准需要以下列: ['pct_chg', 'cat_l2_code', 'trade_date', 'ts_code']。\n", + "错误: 计算日级别行业偏离度需要以下列: ['pct_chg', 'daily_industry_positive_benchmark', 'daily_industry_negative_benchmark']。请先运行 daily_industry_momentum_benchmark(df)。\n", + "Index(['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol',\n", + " 'pct_chg', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv',\n", + " 'volume_ratio', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol',\n", + " 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol',\n", + " 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct',\n", + " 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg',\n", + " 'winner_rate', 'l2_code', 'undist_profit_ps', 'ocfps', 'AR', 'BR',\n", + " 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio',\n", + " 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor',\n", + " 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity',\n", + " 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio',\n", + " 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change',\n", + " 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel',\n", + " 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy',\n", + " 'cost_support_15pct_change', 'cat_winner_price_zone',\n", + " 'flow_chip_consistency', 'profit_taking_vs_absorb', '_is_positive',\n", + " '_is_negative', 'cat_is_positive', '_pos_returns', '_neg_returns',\n", + " '_pos_returns_sq', '_neg_returns_sq', 'upside_vol', 'downside_vol',\n", + " 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate',\n", + " 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike',\n", + " 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike',\n", + " 'vol_std_5', 'atr_14', 'atr_6', 'obv'],\n", + " dtype='object')\n", + "Calculating lg_flow_mom_corr_20_60...\n", + "Finished lg_flow_mom_corr_20_60.\n", + "Calculating lg_flow_accel...\n", + "Finished lg_flow_accel.\n", + "Calculating profit_pressure...\n", + "Finished profit_pressure.\n", + "Calculating underwater_resistance...\n", + "Finished underwater_resistance.\n", + "Calculating cost_conc_std_20...\n", + "Finished cost_conc_std_20.\n", + "Calculating profit_decay_20...\n", + "Finished profit_decay_20.\n", + "Calculating vol_amp_loss_20...\n", + "Finished vol_amp_loss_20.\n", + "Calculating vol_drop_profit_cnt_5...\n", + "Finished vol_drop_profit_cnt_5.\n", + "Calculating lg_flow_vol_interact_20...\n", + "Finished lg_flow_vol_interact_20.\n", + "Calculating cost_break_confirm_cnt_5...\n", + "Finished cost_break_confirm_cnt_5.\n", + "Calculating atr_norm_channel_pos_14...\n", + "Finished atr_norm_channel_pos_14.\n", + "Calculating turnover_diff_skew_20...\n", + "Finished turnover_diff_skew_20.\n", + "Calculating lg_sm_flow_diverge_20...\n", + "Finished lg_sm_flow_diverge_20.\n", + "Calculating pullback_strong_20_20...\n", + "Finished pullback_strong_20_20.\n", + "Calculating vol_wgt_hist_pos_20...\n", + "Finished vol_wgt_hist_pos_20.\n", + "Calculating vol_adj_roc_20...\n", + "Finished vol_adj_roc_20.\n", + "Calculating cs_rank_net_lg_flow_val...\n", + "Finished cs_rank_net_lg_flow_val.\n", + "Calculating cs_rank_flow_divergence...\n", + "Finished cs_rank_flow_divergence.\n", + "Calculating cs_rank_ind_adj_lg_flow...\n", + "Finished cs_rank_ind_adj_lg_flow.\n", + "Calculating cs_rank_elg_buy_ratio...\n", + "Finished cs_rank_elg_buy_ratio.\n", + "Calculating cs_rank_rel_profit_margin...\n", + "Finished cs_rank_rel_profit_margin.\n", + "Calculating cs_rank_cost_breadth...\n", + "Finished cs_rank_cost_breadth.\n", + "Calculating cs_rank_dist_to_upper_cost...\n", + "Finished cs_rank_dist_to_upper_cost.\n", + "Calculating cs_rank_winner_rate...\n", + "Finished cs_rank_winner_rate.\n", + "Calculating cs_rank_intraday_range...\n", + "Finished cs_rank_intraday_range.\n", + "Calculating cs_rank_close_pos_in_range...\n", + "Finished cs_rank_close_pos_in_range.\n", + "Calculating cs_rank_opening_gap...\n", + "Error calculating cs_rank_opening_gap: Missing 'pre_close' column. Assigning NaN.\n", + "Calculating cs_rank_pos_in_hist_range...\n", + "Finished cs_rank_pos_in_hist_range.\n", + "Calculating cs_rank_vol_x_profit_margin...\n", + "Finished cs_rank_vol_x_profit_margin.\n", + "Calculating cs_rank_lg_flow_price_concordance...\n", + "Finished cs_rank_lg_flow_price_concordance.\n", + "Calculating cs_rank_turnover_per_winner...\n", + "Finished cs_rank_turnover_per_winner.\n", + "Calculating cs_rank_ind_cap_neutral_pe (Placeholder - requires statsmodels)...\n", + "Finished cs_rank_ind_cap_neutral_pe (Placeholder).\n", + "Calculating cs_rank_volume_ratio...\n", + "Finished cs_rank_volume_ratio.\n", + "Calculating cs_rank_elg_buy_sell_sm_ratio...\n", + "Finished cs_rank_elg_buy_sell_sm_ratio.\n", + "Calculating cs_rank_cost_dist_vol_ratio...\n", + "Finished cs_rank_cost_dist_vol_ratio.\n", + "Calculating cs_rank_size...\n", + "Finished cs_rank_size.\n", + "\n", + "RangeIndex: 4524625 entries, 0 to 4524624\n", + "Columns: 178 entries, ts_code to cs_rank_size\n", + "dtypes: bool(10), datetime64[ns](1), float64(162), int32(3), object(2)\n", + "memory usage: 5.7+ GB\n", + "None\n", + "['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio', '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', 'winner_rate', 'cat_l2_code', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'price_cost_divergence', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_flow_divergence', 'cs_rank_ind_adj_lg_flow', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_opening_gap', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_ind_cap_neutral_pe', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size']\n" + ] + } + ], + "source": [ + "\n", + "import numpy as np\n", + "from main.factor.factor import *\n", + "\n", + "def filter_data(df):\n", + " # df = df.groupby('trade_date').apply(lambda x: x.nlargest(1000, 'act_factor1'))\n", + " df = df[~df['is_st']]\n", + " df = df[~df['ts_code'].str.endswith('BJ')]\n", + " df = df[~df['ts_code'].str.startswith('30')]\n", + " df = df[~df['ts_code'].str.startswith('68')]\n", + " df = df[~df['ts_code'].str.startswith('8')]\n", + " df = df[df['trade_date'] >= '2019-01-01']\n", + " if 'in_date' in df.columns:\n", + " df = df.drop(columns=['in_date'])\n", + " df = df.reset_index(drop=True)\n", + " return df\n", + "\n", + "gc.collect()\n", + "\n", + "df = filter_data(df)\n", + "df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col='undist_profit_ps')\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col='ocfps')\n", + "calculate_arbr(df, N=26)\n", + "df['log_circ_mv'] = np.log(df['circ_mv'])\n", + "df = calculate_cashflow_to_ev_factor(df, cashflow_df, balancesheet_df)\n", + "df = caculate_book_to_price_ratio(df, fina_indicator_df)\n", + "df = turnover_rate_n(df, n=5)\n", + "df = variance_n(df, n=20)\n", + "df = bbi_ratio_factor(df)\n", + "df = daily_deviation(df)\n", + "df = daily_industry_deviation(df)\n", + "df, _ = get_rolling_factor(df)\n", + "df, _ = get_simple_factor(df)\n", + "\n", + "df = df.rename(columns={'l1_code': 'cat_l1_code'})\n", + "df = df.rename(columns={'l2_code': 'cat_l2_code'})\n", + "\n", + "lg_flow_mom_corr(df, N=20, M=60)\n", + "lg_flow_accel(df)\n", + "profit_pressure(df)\n", + "underwater_resistance(df)\n", + "cost_conc_std(df, N=20)\n", + "profit_decay(df, N=20)\n", + "vol_amp_loss(df, N=20)\n", + "vol_drop_profit_cnt(df, N=20, M=5)\n", + "lg_flow_vol_interact(df, N=20)\n", + "cost_break_confirm_cnt(df, M=5)\n", + "atr_norm_channel_pos(df, N=14)\n", + "turnover_diff_skew(df, N=20)\n", + "lg_sm_flow_diverge(df, N=20)\n", + "pullback_strong(df, N=20, M=20)\n", + "vol_wgt_hist_pos(df, N=20)\n", + "vol_adj_roc(df, N=20)\n", + "\n", + "cs_rank_net_lg_flow_val(df)\n", + "cs_rank_flow_divergence(df)\n", + "cs_rank_industry_adj_lg_flow(df) # Needs cat_l2_code\n", + "cs_rank_elg_buy_ratio(df)\n", + "cs_rank_rel_profit_margin(df)\n", + "cs_rank_cost_breadth(df)\n", + "cs_rank_dist_to_upper_cost(df)\n", + "cs_rank_winner_rate(df)\n", + "cs_rank_intraday_range(df)\n", + "cs_rank_close_pos_in_range(df)\n", + "cs_rank_opening_gap(df) # Needs pre_close\n", + "cs_rank_pos_in_hist_range(df) # Needs his_low, his_high\n", + "cs_rank_vol_x_profit_margin(df)\n", + "cs_rank_lg_flow_price_concordance(df)\n", + "cs_rank_turnover_per_winner(df)\n", + "cs_rank_ind_cap_neutral_pe(df) # Placeholder - needs external libraries\n", + "cs_rank_volume_ratio(df) # Needs volume_ratio\n", + "cs_rank_elg_buy_sell_sm_ratio(df)\n", + "cs_rank_cost_dist_vol_ratio(df) # Needs volume_ratio\n", + "cs_rank_size(df) # Needs circ_mv\n", + "\n", + "\n", + "# df = df.merge(index_data, on='trade_date', how='left')\n", + "\n", + "print(df.info())\n", + "print(df.columns.tolist())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b87b938028afa206", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:03.658725Z", + "start_time": "2025-04-03T13:08:02.469611Z" + } + }, + "outputs": [], + "source": [ + "from scipy.stats import ks_2samp, wasserstein_distance\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 or 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" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f4f16d63ad18d1bc", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:03.670700Z", + "start_time": "2025-04-03T13:08:03.665739Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import statsmodels.api as sm # 用于中性化回归\n", + "from tqdm import tqdm # 可选,用于显示进度条\n", + "\n", + "# --- 常量 ---\n", + "epsilon = 1e-10 # 防止除零\n", + "\n", + "# --- 1. 中位数去极值 (MAD) ---\n", + "\n", + "def cs_mad_filter(df: pd.DataFrame,\n", + " features: list,\n", + " k: float = 3.0,\n", + " scale_factor: float = 1.4826):\n", + " \"\"\"\n", + " 对指定特征列进行截面 MAD 去极值处理 (原地修改)。\n", + "\n", + " 方法: 对每日截面数据,计算 median 和 MAD,\n", + " 将超出 [median - k * scale * MAD, median + k * scale * MAD] 范围的值\n", + " 替换为边界值 (Winsorization)。\n", + " scale_factor=1.4826 使得 MAD 约等于正态分布的标准差。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。\n", + " features (list): 需要处理的特征列名列表。\n", + " k (float): MAD 的倍数,用于确定边界。默认为 3.0。\n", + " scale_factor (float): MAD 的缩放因子。默认为 1.4826。\n", + "\n", + " WARNING: 此函数会原地修改输入的 DataFrame 'df'。\n", + " \"\"\"\n", + " print(f\"开始截面 MAD 去极值处理 (k={k})...\")\n", + " if not all(col in df.columns for col in features):\n", + " missing = [col for col in features if col not in df.columns]\n", + " print(f\"错误: DataFrame 中缺少以下特征列: {missing}。跳过去极值处理。\")\n", + " return\n", + "\n", + " grouped = df.groupby('trade_date')\n", + "\n", + " for col in tqdm(features, desc=\"MAD Filtering\"):\n", + " try:\n", + " # 计算截面中位数\n", + " median = grouped[col].transform('median')\n", + " # 计算截面 MAD (Median Absolute Deviation from Median)\n", + " mad = (df[col] - median).abs().groupby(df['trade_date']).transform('median')\n", + "\n", + " # 计算上下边界\n", + " lower_bound = median - k * scale_factor * mad\n", + " upper_bound = median + k * scale_factor * mad\n", + "\n", + " # 原地应用 clip\n", + " df[col] = np.clip(df[col], lower_bound, upper_bound)\n", + "\n", + " except KeyError:\n", + " print(f\"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的 MAD 处理。\")\n", + " except Exception as e:\n", + " print(f\"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的 MAD 处理。\")\n", + "\n", + " print(\"截面 MAD 去极值处理完成。\")\n", + "\n", + "\n", + "# --- 2. 行业市值中性化 ---\n", + "\n", + "def cs_neutralize_industry_cap(df: pd.DataFrame,\n", + " features: list,\n", + " industry_col: str = 'cat_l2_code',\n", + " market_cap_col: str = 'circ_mv'):\n", + " \"\"\"\n", + " 对指定特征列进行截面行业和对数市值中性化 (原地修改)。\n", + " 使用 OLS 回归: feature ~ 1 + log(market_cap) + C(industry)\n", + " 将回归残差写回原特征列。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date', features 列,\n", + " industry_col, market_cap_col。\n", + " features (list): 需要处理的特征列名列表。\n", + " industry_col (str): 行业分类列名。\n", + " market_cap_col (str): 流通市值列名。\n", + "\n", + " WARNING: 此函数会原地修改输入的 DataFrame 'df' 的 features 列。\n", + " 计算量较大,可能耗时较长。\n", + " 需要安装 statsmodels 库 (pip install statsmodels)。\n", + " \"\"\"\n", + " print(\"开始截面行业市值中性化...\")\n", + " required_cols = features + ['trade_date', industry_col, market_cap_col]\n", + " if not all(col in df.columns for col in required_cols):\n", + " missing = [col for col in required_cols if col not in df.columns]\n", + " print(f\"错误: DataFrame 中缺少必需列: {missing}。无法进行中性化。\")\n", + " return\n", + "\n", + " # 预处理:计算 log 市值,处理 industry code 可能的 NaN\n", + " log_cap_col = '_log_market_cap'\n", + " df[log_cap_col] = np.log1p(df[market_cap_col]) # log1p 处理 0 值\n", + " # df[industry_col] = df[industry_col].cat.add_categories('UnknownIndustry')\n", + " # df[industry_col] = df[industry_col].fillna('UnknownIndustry') # 填充行业 NaN\n", + " # df[industry_col] = df[industry_col].astype('category') # 转为类别,ols 会自动处理\n", + "\n", + " dates = df['trade_date'].unique()\n", + " all_residuals = [] # 用于收集所有日期的残差\n", + "\n", + " for date in tqdm(dates, desc=\"Neutralizing\"):\n", + " daily_data = df.loc[df['trade_date'] == date, features + [log_cap_col, industry_col]].copy() # 使用 .loc 获取副本\n", + "\n", + " # 准备自变量 X (常数项 + log市值 + 行业哑变量)\n", + " X = daily_data[[log_cap_col]]\n", + " X = sm.add_constant(X, prepend=True) # 添加常数项\n", + " # 创建行业哑变量 (drop_first=True 避免共线性)\n", + " industry_dummies = pd.get_dummies(daily_data[industry_col], prefix=industry_col, drop_first=True)\n", + " industry_dummies = industry_dummies.astype(int)\n", + " X = pd.concat([X, industry_dummies], axis=1)\n", + "\n", + " daily_residuals = daily_data[[col for col in features]].copy() # 创建用于存储残差的df\n", + "\n", + " for col in features:\n", + " Y = daily_data[col]\n", + "\n", + " # 处理 NaN 值,确保 X 和 Y 在相同位置有有效值\n", + " valid_mask = Y.notna() & X.notna().all(axis=1)\n", + " if valid_mask.sum() < (X.shape[1] + 1): # 数据点不足以估计模型\n", + " print(f\"警告: 日期 {date}, 特征 {col} 有效数据不足 ({valid_mask.sum()}个),无法中性化,填充 NaN。\")\n", + " daily_residuals[col] = np.nan\n", + " continue\n", + "\n", + " Y_valid = Y[valid_mask]\n", + " X_valid = X[valid_mask]\n", + "\n", + " # 执行 OLS 回归\n", + " try:\n", + " model = sm.OLS(Y_valid.to_numpy(), X_valid.to_numpy())\n", + " results = model.fit()\n", + " # 将残差填回对应位置\n", + " daily_residuals.loc[valid_mask, col] = results.resid\n", + " daily_residuals.loc[~valid_mask, col] = np.nan # 原本无效的位置填充 NaN\n", + " except Exception as e:\n", + " print(f\"警告: 日期 {date}, 特征 {col} 回归失败: {e},填充 NaN。\")\n", + " daily_residuals[col] = np.nan\n", + " break\n", + "\n", + " all_residuals.append(daily_residuals)\n", + "\n", + " # 合并所有日期的残差结果\n", + " if all_residuals:\n", + " residuals_df = pd.concat(all_residuals)\n", + " # 将残差结果更新回原始 df (原地修改)\n", + " # 使用 update 比 merge 更适合基于索引的原地更新\n", + " # 确保 residuals_df 的索引与 df 中对应部分一致\n", + " df.update(residuals_df)\n", + " else:\n", + " print(\"没有有效的残差结果可以合并。\")\n", + "\n", + "\n", + " # 清理临时列\n", + " df.drop(columns=[log_cap_col], inplace=True)\n", + " print(\"截面行业市值中性化完成。\")\n", + "\n", + "\n", + "# --- 3. Z-Score 标准化 ---\n", + "\n", + "def cs_zscore_standardize(df: pd.DataFrame, features: list, epsilon: float = 1e-10):\n", + " \"\"\"\n", + " 对指定特征列进行截面 Z-Score 标准化 (原地修改)。\n", + " 方法: Z = (value - cross_sectional_mean) / (cross_sectional_std + epsilon)\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。\n", + " features (list): 需要处理的特征列名列表。\n", + " epsilon (float): 防止除以零的小常数。\n", + "\n", + " WARNING: 此函数会原地修改输入的 DataFrame 'df'。\n", + " \"\"\"\n", + " print(\"开始截面 Z-Score 标准化...\")\n", + " if not all(col in df.columns for col in features):\n", + " missing = [col for col in features if col not in df.columns]\n", + " print(f\"错误: DataFrame 中缺少以下特征列: {missing}。跳过标准化处理。\")\n", + " return\n", + "\n", + " grouped = df.groupby('trade_date')\n", + "\n", + " for col in tqdm(features, desc=\"Standardizing\"):\n", + " try:\n", + " # 使用 transform 计算截面均值和标准差\n", + " mean = grouped[col].transform('mean')\n", + " std = grouped[col].transform('std')\n", + "\n", + " # 计算 Z-Score 并原地赋值\n", + " df[col] = (df[col] - mean) / (std + epsilon)\n", + "\n", + " except KeyError:\n", + " print(f\"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的标准化处理。\")\n", + " except Exception as e:\n", + " print(f\"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的标准化处理。\")\n", + "\n", + " print(\"截面 Z-Score 标准化完成。\")\n", + "\n", + "def fill_nan_with_daily_median(df: pd.DataFrame, feature_columns: list[str]) -> pd.DataFrame:\n", + " \"\"\"\n", + " 对指定特征列进行每日截面中位数填充缺失值 (NaN)。\n", + "\n", + " 参数:\n", + " df (pd.DataFrame): 包含多日数据的DataFrame,需要包含 'trade_date' 和 feature_columns 中的列。\n", + " feature_columns (list[str]): 需要进行缺失值填充的特征列名称列表。\n", + "\n", + " 返回:\n", + " pd.DataFrame: 包含缺失值填充后特征列的DataFrame。在输入DataFrame的副本上操作。\n", + " \"\"\"\n", + " processed_df = df.copy() # 在副本上操作,保留原始数据\n", + "\n", + " # 确保 trade_date 是 datetime 类型以便正确分组\n", + " processed_df['trade_date'] = pd.to_datetime(processed_df['trade_date'])\n", + "\n", + " def _fill_daily_nan(group):\n", + " # group 是某一个交易日的 DataFrame\n", + "\n", + " # 遍历指定的特征列\n", + " for feature_col in feature_columns:\n", + " # 检查列是否存在于当前分组中\n", + " if feature_col in group.columns:\n", + " # 计算当日该特征的中位数\n", + " median_val = group[feature_col].median()\n", + "\n", + " # 使用当日中位数填充该特征列的 NaN 值\n", + " # inplace=True 会直接修改 group DataFrame\n", + " group[feature_col].fillna(median_val, inplace=True)\n", + " # else:\n", + " # print(f\"Warning: Feature column '{feature_col}' not found in daily group for {group['trade_date'].iloc[0]}. Skipping.\")\n", + "\n", + " return group\n", + "\n", + " # 按交易日期分组,并应用每日填充函数\n", + " # group_keys=False 避免将分组键添加到结果索引中\n", + " filled_df = processed_df.groupby('trade_date', group_keys=False).apply(_fill_daily_nan)\n", + "\n", + " return filled_df" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "40e6b68a91b30c79", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:04.694262Z", + "start_time": "2025-04-03T13:08:03.694904Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\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", + " if not (0 <= lower_percentile < upper_percentile <= 1):\n", + " raise ValueError(\"Percentile values must satisfy 0 <= lower_percentile < upper_percentile <= 1.\")\n", + "\n", + " # Calculate lower and upper bounds based on percentiles\n", + " lower_bound = label.quantile(lower_percentile)\n", + " upper_bound = label.quantile(upper_percentile)\n", + "\n", + " # Filter out values outside the bounds\n", + " filtered_label = label[(label >= lower_bound) & (label <= upper_bound)]\n", + "\n", + " # Print the number of removed outliers\n", + " if log:\n", + " print(f\"Removed {len(label) - len(filtered_label)} outliers.\")\n", + " return filtered_label\n", + "\n", + "\n", + "def calculate_risk_adjusted_target(df, days=5):\n", + " df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\n", + " df['future_close'] = df.groupby('ts_code')['close'].shift(-days)\n", + " df['future_open'] = df.groupby('ts_code')['open'].shift(-1)\n", + " df['future_return'] = (df['future_close'] - df['future_open']) / df['future_open']\n", + "\n", + " df['future_volatility'] = df.groupby('ts_code')['future_return'].rolling(days, min_periods=1).std().reset_index(\n", + " level=0, drop=True)\n", + " sharpe_ratio = df['future_return'] * df['future_volatility']\n", + " sharpe_ratio.replace([np.inf, -np.inf], np.nan, inplace=True)\n", + "\n", + " return sharpe_ratio\n", + "\n", + "\n", + "def calculate_score(df, days=5, lambda_param=1.0):\n", + " def calculate_max_drawdown(prices):\n", + " peak = prices.iloc[0] # 初始化峰值\n", + " max_drawdown = 0 # 初始化最大回撤\n", + "\n", + " for price in prices:\n", + " if price > peak:\n", + " peak = price # 更新峰值\n", + " else:\n", + " drawdown = (peak - price) / peak # 计算当前回撤\n", + " max_drawdown = max(max_drawdown, drawdown) # 更新最大回撤\n", + "\n", + " return max_drawdown\n", + "\n", + " def compute_stock_score(stock_df):\n", + " stock_df = stock_df.sort_values(by=['trade_date'])\n", + " future_return = stock_df['future_return']\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", + " return score\n", + "\n", + " # # 确保 DataFrame 按照股票代码和交易日期排序\n", + " # df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\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", + " numeric_features = df[feature_columns].select_dtypes(include=[np.number]).columns.tolist()\n", + " if not numeric_features:\n", + " raise ValueError(\"No numeric features found in the provided data.\")\n", + "\n", + " corr_matrix = df[numeric_features].corr().abs()\n", + " upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))\n", + " to_drop = [column for column in upper.columns if any(upper[column] > threshold)]\n", + " remaining_features = [col for col in feature_columns if col not in to_drop\n", + " or 'act' in col or 'af' in col]\n", + " return remaining_features\n", + "\n", + "\n", + "def cross_sectional_standardization(df, features):\n", + " df_sorted = df.sort_values(by='trade_date') # 按时间排序\n", + " df_standardized = df_sorted.copy()\n", + "\n", + " for date in df_sorted['trade_date'].unique():\n", + " # 获取当前时间点的数据\n", + " current_data = df_standardized[df_standardized['trade_date'] == date]\n", + "\n", + " # 只对指定特征进行标准化\n", + " scaler = StandardScaler()\n", + " standardized_values = scaler.fit_transform(current_data[features])\n", + "\n", + " # 将标准化结果重新赋值回去\n", + " df_standardized.loc[df_standardized['trade_date'] == date, features] = standardized_values\n", + "\n", + " return df_standardized\n", + "\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "\n", + "def neutralize_manual_revised(df: pd.DataFrame, features: list, industry_col: str, mkt_cap_col: str) -> pd.DataFrame:\n", + " \"\"\"\n", + " 手动实现简单回归以提升速度,通过构建 Series 确保索引对齐。\n", + " 对特征在行业内部进行市值中性化。\n", + "\n", + " Args:\n", + " df: 输入的 DataFrame,包含特征、行业分类和市值列。\n", + " features: 需要进行中性化的特征列名列表。\n", + " industry_col: 行业分类列的列名。\n", + " mkt_cap_col: 市值列的列名。\n", + "\n", + " Returns:\n", + " 中性化后的 DataFrame。\n", + " \"\"\"\n", + "\n", + " df[mkt_cap_col] = pd.to_numeric(df[mkt_cap_col], errors='coerce')\n", + " df_cleaned = df.dropna(subset=[mkt_cap_col]).copy()\n", + " df_cleaned = df_cleaned[df_cleaned[mkt_cap_col] > 0].copy()\n", + "\n", + " if df_cleaned.empty:\n", + " print(\"警告: 清理市值异常值后 DataFrame 为空。\")\n", + " return df # 返回原始或空df,取决于清理前的状态\n", + "\n", + " processed_df = df\n", + "\n", + " for col in features:\n", + " if col not in df_cleaned.columns:\n", + " print(f\"警告: 特征列 '{col}' 不存在于清理后的 DataFrame 中,已跳过。\")\n", + " # 对于原始 df 中该列不存在的,在结果 df 中也保持原样(可能全是NaN)\n", + " processed_df[col] = df[col] if col in df.columns else np.nan\n", + " continue\n", + "\n", + " # 跳过对控制变量本身进行中性化\n", + " if col == mkt_cap_col or col == industry_col:\n", + " print(f\"警告: 特征列 '{col}' 是控制变量或内部使用的列,跳过中性化。\")\n", + " # 在结果 df 中也保持原样\n", + " processed_df[col] = df[col] if col in df.columns else np.nan\n", + " continue\n", + "\n", + " residual_series = pd.Series(index=df_cleaned.index, dtype=float)\n", + "\n", + " # 在分组前处理特征列的 NaN,只对有因子值的行进行回归计算\n", + " df_subset_factor = df_cleaned.dropna(subset=[col]).copy()\n", + "\n", + " if not df_subset_factor.empty:\n", + " for industry, group in df_subset_factor.groupby(industry_col):\n", + " x = group[mkt_cap_col] # 市值对数\n", + " y = group[col] # 因子值\n", + "\n", + " # 确保有足够的数据点 (>1) 且市值对数有方差 (>0) 进行回归计算\n", + " # 检查 np.var > 一个很小的正数,避免浮点数误差导致的零方差判断问题\n", + " if len(group) > 1 and np.var(x) > 1e-9:\n", + " try:\n", + " beta = np.cov(y, x)[0, 1] / np.var(x)\n", + " alpha = np.mean(y) - beta * np.mean(x)\n", + "\n", + " # 计算残差\n", + " resid = y - (alpha + beta * x)\n", + "\n", + " # 将计算出的残差存储到 residual_series 中,通过索引自动对齐\n", + " residual_series.loc[resid.index] = resid\n", + "\n", + " except Exception as e:\n", + " # 捕获可能的计算异常,例如np.cov或np.var因为极端数据报错\n", + " print(f\"警告: 在行业 {industry} 计算回归时发生错误: {e}。该组残差将设为原始值或 NaN。\")\n", + " # 此时该组的残差会保持 residual_series 初始化时的 NaN 或后续处理\n", + " # 也可以选择保留原始值:residual_series.loc[group.index] = group[col]\n", + "\n", + " else:\n", + " residual_series.loc[group.index] = group[col] # 保留原始因子值\n", + " processed_df.loc[residual_series.index, col] = residual_series\n", + "\n", + "\n", + " else:\n", + " processed_df[col] = np.nan # 或 df[col] if col in df.columns else np.nan\n", + "\n", + " return processed_df\n", + "\n", + "\n", + "import gc\n", + "\n", + "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(lambda x: x.rolling(window=min(len(x), window)).quantile(lower_quantile))\n", + " rolling_upper = df.groupby('trade_date')[col].transform(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", + "\n", + "def select_top_features_by_rankic(df: pd.DataFrame, feature_columns: list, n: int, target_column: str = 'future_return') -> list:\n", + " \"\"\"\n", + " 计算给定特征与目标列的 RankIC,并返回 RankIC 绝对值最高的 n 个特征。\n", + "\n", + " Args:\n", + " df: 包含特征列和目标列的 Pandas DataFrame。\n", + " feature_columns: 包含所有待评估特征列名的列表。\n", + " n: 希望选取的 RankIC 绝对值最高的特征数量。\n", + " target_column: 目标列的名称,用于计算 RankIC。默认为 'future_return'。\n", + "\n", + " Returns:\n", + " 包含 RankIC 绝对值最高的 n 个特征列名的列表。\n", + " \"\"\"\n", + " numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n", + " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", + " if target_column not in df.columns:\n", + " raise ValueError(f\"目标列 '{target_column}' 不存在于 DataFrame 中。\")\n", + "\n", + " rankic_scores = {}\n", + " for feature in numeric_columns:\n", + " if feature not in df.columns:\n", + " print(f\"警告: 特征列 '{feature}' 不存在于 DataFrame 中,已跳过。\")\n", + " continue\n", + "\n", + " # 计算特征与目标列的 RankIC (斯皮尔曼相关系数)\n", + " # dropna() 是为了处理缺失值,确保相关性计算不失败\n", + " valid_data = df[[feature, target_column]].dropna()\n", + " if len(valid_data) > 1: # 确保有足够的数据点进行相关性计算\n", + " # 计算斯皮尔曼相关性\n", + " correlation = valid_data[feature].corr(valid_data[target_column], method='spearman')\n", + " rankic_scores[feature] = abs(correlation) # 使用绝对值来衡量相关性强度\n", + " else:\n", + " rankic_scores[feature] = 0 # 数据不足,RankIC设为0或跳过\n", + "\n", + " # 将 RankIC 分数转换为 Series 便于排序\n", + " rankic_series = pd.Series(rankic_scores)\n", + "\n", + " # 按 RankIC 绝对值降序排序,选取前 n 个特征\n", + " # handle case where n might be larger than available features\n", + " n_actual = min(n, len(rankic_series))\n", + " top_features = rankic_series.sort_values(ascending=False).head(n_actual).index.tolist()\n", + " top_features = [col for col in feature_columns if col in top_features or col not in numeric_columns]\n", + " return top_features\n", + "\n", + "def create_deviation_within_dates(df, feature_columns):\n", + " groupby_col = 'cat_l2_code' # 使用 trade_date 进行分组\n", + " new_columns = {}\n", + " ret_feature_columns = feature_columns[:]\n", + "\n", + " # 自动选择所有数值型特征\n", + " num_features = [col for col in feature_columns if 'cat' not in col and 'index' not in col]\n", + "\n", + " # 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']\n", + " num_features = [col for col in num_features if 'cat' not in col and 'industry' not in col]\n", + " num_features = [col for col in num_features if 'limit' not in col]\n", + " num_features = [col for col in num_features if 'cyq' not in col]\n", + "\n", + " # 遍历所有数值型特征\n", + " for feature in num_features:\n", + " if feature == 'trade_date': # 不需要对 'trade_date' 计算偏差\n", + " continue\n", + "\n", + " # grouped_mean = df.groupby(['trade_date'])[feature].transform('mean')\n", + " # deviation_col_name = f'deviation_mean_{feature}'\n", + " # new_columns[deviation_col_name] = df[feature] - grouped_mean\n", + " # ret_feature_columns.append(deviation_col_name)\n", + "\n", + " grouped_mean = df.groupby(['trade_date', groupby_col])[feature].transform('mean')\n", + " deviation_col_name = f'deviation_mean_{feature}'\n", + " new_columns[deviation_col_name] = df[feature] - grouped_mean\n", + " ret_feature_columns.append(deviation_col_name)\n", + "\n", + " # 将新计算的偏差特征与原始 DataFrame 合并\n", + " df = pd.concat([df, pd.DataFrame(new_columns)], axis=1)\n", + "\n", + " # for feature in ['obv', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4']:\n", + " # df[f'deviation_industry_{feature}'] = df[feature] - df[f'industry_{feature}']\n", + "\n", + " return df, ret_feature_columns\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "47c12bb34062ae7a", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T14:57:50.841165Z", + "start_time": "2025-04-03T14:49:25.889057Z" + } + }, + "outputs": [], + "source": [ + "days = 5\n", + "validation_days = 120\n", + "\n", + "import gc\n", + "\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", + "\n", + "df['cat_up_limit'] = df['pct_chg'] > 5\n", + "# df['label'] = df.groupby('ts_code')['cat_up_limit'].rolling(window=5, min_periods=1).max().shift(-5).fillna(0).astype(int).reset_index(level=0, drop=True)\n", + "df['label'] = df['future_return']\n", + "\n", + "filter_index = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99))\n", + "\n", + "# for col in [col for col in df.columns]:\n", + "# train_data[col] = train_data[col].astype('str')\n", + "# test_data[col] = test_data[col].astype('str')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "29221dde", + "metadata": {}, + "outputs": [], + "source": [ + "feature_columns = [col for col in df.head(10).merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left').merge(index_data, on='trade_date', how='left').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 'is_st' 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 'circ_mv' not in col]\n", + "feature_columns = [col for col in feature_columns if '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", + "# feature_columns = [col for col in feature_columns if col not in ['ts_code', 'trade_date', 'vol_std_5', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_007', 'consecutive_up_limit', 'mv_volatility', 'volume_growth', 'mv_growth', 'arbr']]\n", + "feature_columns = [col for col in feature_columns if col not in ['intraday_lg_flow_corr_20', \n", + " 'cap_neutral_cost_metric', \n", + " 'hurst_net_mf_vol_60', \n", + " 'complex_factor_deap_1', \n", + " 'lg_buy_consolidation_20',\n", + " 'cs_rank_ind_cap_neutral_pe',\n", + " 'cs_rank_opening_gap',\n", + " 'cs_rank_ind_adj_lg_flow']]\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "03ee5daf", + "metadata": {}, + "outputs": [], + "source": [ + "# df = fill_nan_with_daily_median(df, feature_columns)\n", + "for feature_col in [col for col in feature_columns if col in df.columns]:\n", + " # median_val = df[feature_col].median()\n", + " df[feature_col].fillna(0, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b76ea08a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ts_code trade_date log_circ_mv\n", + "0 000001.SZ 2019-01-02 16.574219\n", + "1 000001.SZ 2019-01-03 16.583965\n", + "2 000001.SZ 2019-01-04 16.633371\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "去除极值\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 100%|██████████| 131/131 [00:28<00:00, 4.63it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 100%|██████████| 131/131 [00:23<00:00, 5.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 0it [00:00, ?it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 0it [00:00, ?it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "feature_columns: ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "df最小日期: 2019-01-02\n", + "df最大日期: 2025-05-16\n", + "2057777\n", + "train_data最小日期: 2020-01-02\n", + "train_data最大日期: 2022-12-30\n", + "1751669\n", + "test_data最小日期: 2023-01-03\n", + "test_data最大日期: 2025-05-16\n", + " ts_code trade_date log_circ_mv\n", + "0 000001.SZ 2019-01-02 16.574219\n", + "1 000001.SZ 2019-01-03 16.583965\n", + "2 000001.SZ 2019-01-04 16.633371\n" + ] + } + ], + "source": [ + "split_date = '2023-01-01'\n", + "train_data = df[filter_index & (df['trade_date'] <= split_date) & (df['trade_date'] >= '2020-01-01')]\n", + "test_data = df[(df['trade_date'] >= split_date)]\n", + "\n", + "print(df[['ts_code', 'trade_date', 'log_circ_mv']].head(3))\n", + "\n", + "industry_df = industry_df.sort_values(by=['trade_date'])\n", + "index_data = index_data.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_data, 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_data, 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], np.nan)\n", + "\n", + "# feature_columns_new = feature_columns[:]\n", + "# train_data, _ = create_deviation_within_dates(train_data, [col for col in feature_columns if col in train_data.columns])\n", + "# test_data, _ = create_deviation_within_dates(test_data, [col for col in feature_columns if col in train_data.columns])\n", + "\n", + "# feature_columns = [\n", + "# 'undist_profit_ps', \n", + "# 'AR_BR',\n", + "# 'pe_ttm',\n", + "# 'alpha_22_improved', \n", + "# 'alpha_003', \n", + "# 'alpha_007', \n", + "# 'alpha_013', \n", + "# 'cat_up_limit', \n", + "# 'cat_down_limit', \n", + "# 'up_limit_count_10d', \n", + "# 'down_limit_count_10d', \n", + "# 'consecutive_up_limit', \n", + "# 'vol_break', \n", + "# 'weight_roc5', \n", + "# 'price_cost_divergence', \n", + "# 'smallcap_concentration', \n", + "# 'cost_stability', \n", + "# 'high_cost_break_days', \n", + "# 'liquidity_risk', \n", + "# 'turnover_std', \n", + "# 'mv_volatility', \n", + "# 'volume_growth', \n", + "# 'mv_growth', \n", + "# 'lg_flow_mom_corr_20_60', \n", + "# 'lg_flow_accel', \n", + "# 'profit_pressure', \n", + "# 'underwater_resistance', \n", + "# 'cost_conc_std_20', \n", + "# 'profit_decay_20', \n", + "# 'vol_amp_loss_20', \n", + "# 'vol_drop_profit_cnt_5', \n", + "# 'lg_flow_vol_interact_20', \n", + "# 'cost_break_confirm_cnt_5', \n", + "# 'atr_norm_channel_pos_14', \n", + "# 'turnover_diff_skew_20', \n", + "# 'lg_sm_flow_diverge_20', \n", + "# 'pullback_strong_20_20', \n", + "# 'vol_wgt_hist_pos_20', \n", + "# 'vol_adj_roc_20',\n", + "# 'cashflow_to_ev_factor',\n", + "# 'ocfps',\n", + "# 'book_to_price_ratio',\n", + "# 'turnover_rate_mean_5',\n", + "# 'variance_20',\n", + "# 'bbi_ratio_factor'\n", + "# ]\n", + "# feature_columns = [col for col in feature_columns if col in train_data.columns]\n", + "# feature_columns = [col for col in feature_columns if not col.startswith('_')]\n", + "\n", + "numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n", + "numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", + "# feature_columns = select_top_features_by_rankic(df, numeric_columns, n=10)\n", + "print(feature_columns)\n", + "\n", + "# train_data = fill_nan_with_daily_median(train_data, feature_columns)\n", + "# test_data = fill_nan_with_daily_median(test_data, feature_columns)\n", + "\n", + "train_data = train_data.dropna(subset=[col for col in feature_columns if col in train_data.columns])\n", + "train_data = train_data.dropna(subset=['label'])\n", + "train_data = train_data.reset_index(drop=True)\n", + "# print(test_data.tail())\n", + "test_data = test_data.dropna(subset=[col for col in feature_columns if col in train_data.columns])\n", + "# test_data = test_data.dropna(subset=['label'])\n", + "test_data = test_data.reset_index(drop=True)\n", + "\n", + "transform_feature_columns = feature_columns\n", + "transform_feature_columns = [col for col in transform_feature_columns if col in feature_columns and not col.startswith('cat') and col in train_data.columns]\n", + "# transform_feature_columns.remove('undist_profit_ps')\n", + "print('去除极值')\n", + "cs_mad_filter(train_data, transform_feature_columns)\n", + "# print('中性化')\n", + "# cs_neutralize_industry_cap(train_data, transform_feature_columns)\n", + "# print('标准化')\n", + "# cs_zscore_standardize(train_data, transform_feature_columns)\n", + "\n", + "cs_mad_filter(test_data, transform_feature_columns)\n", + "# cs_neutralize_industry_cap(test_data, transform_feature_columns)\n", + "# cs_zscore_standardize(test_data, transform_feature_columns)\n", + "\n", + "mad_filter_feature_columns = [col for col in feature_columns if col not in transform_feature_columns and not col.startswith('cat') and col in train_data.columns]\n", + "cs_mad_filter(train_data, mad_filter_feature_columns)\n", + "cs_mad_filter(test_data, mad_filter_feature_columns)\n", + "\n", + "\n", + "print(f'feature_columns: {feature_columns}')\n", + "\n", + "\n", + "print(f\"df最小日期: {df['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"df最大日期: {df['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "print(len(train_data))\n", + "print(f\"train_data最小日期: {train_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"train_data最大日期: {train_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "print(len(test_data))\n", + "print(f\"test_data最小日期: {test_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"test_data最大日期: {test_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "\n", + "cat_columns = [col for col in feature_columns if col.startswith('cat')]\n", + "for col in cat_columns:\n", + " train_data[col] = train_data[col].astype('category')\n", + " test_data[col] = test_data[col].astype('category')\n", + "\n", + "print(df[['ts_code', 'trade_date', 'log_circ_mv']].head(3))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "3ff2d1c5", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LogisticRegression\n", + "import matplotlib.pyplot as plt # 保持 matplotlib 导入,尽管LightGBM的绘图功能已移除\n", + "from sklearn.decomposition import PCA\n", + "import pandas as pd\n", + "import numpy as np\n", + "import datetime # 用于日期计算\n", + "from catboost import CatBoostClassifier, CatBoostRegressor\n", + "from catboost import Pool\n", + "import lightgbm as lgb\n", + "from hypergbm import make_experiment\n", + "# from supervised.automl import AutoML\n", + "from flaml import AutoML, tune\n", + "from flaml.automl.model import LGBMEstimator, CatBoostEstimator\n", + "from lightgbm import LGBMClassifier, LGBMRegressor\n", + "from tabpfn import TabPFNClassifier, TabPFNRegressor\n", + "\n", + "class MyLGBM(LGBMEstimator):\n", + " def __init__(self, **config):\n", + " super().__init__(max_depth=-1, **config)\n", + "\n", + "class MyCat(CatBoostEstimator):\n", + " def __init__(self, **config):\n", + " config = {\n", + " 'depth': 10, # 控制模型复杂度\n", + " 'l2_leaf_reg': 50, # L2 正则化\n", + " # 'task_type': 'GPU',\n", + " }\n", + " super().__init__(**config)\n", + "\n", + "def train_model(train_data_df, feature_columns,\n", + " print_info=True, # 调整参数名,更通用\n", + " validation_days=180, use_pca=False, split_date=None,\n", + " target_column='label', type='light'): # 增加目标列参数\n", + "\n", + " print('train data size: ', len(train_data_df))\n", + " print(train_data_df[['ts_code', 'trade_date', 'log_circ_mv']])\n", + " # 确保数据按时间排序\n", + " train_data_df = train_data_df.sort_values(by='trade_date')\n", + "\n", + " # 去除标签为空的样本\n", + " initial_len = len(train_data_df)\n", + " train_data_df = train_data_df.dropna(subset=[target_column])\n", + "\n", + " if print_info:\n", + " print(f'原始样本数: {initial_len}, 去除标签为空后样本数: {len(train_data_df)}')\n", + "\n", + " # 提取特征和标签,只取数值型特征用于线性回归\n", + " \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", + " val_data_split = train_data_df[train_data_df['trade_date'] >= split_date] # 验证集\n", + " \n", + " X_train = train_data_split[feature_columns]\n", + " y_train = train_data_split[target_column]\n", + " train_data_split = pd.concat([X_train, y_train], axis=1)\n", + " \n", + " X_val = val_data_split[feature_columns]\n", + " y_val = val_data_split['label']\n", + " val_data_split = pd.concat([X_val, y_val], axis=1)\n", + "\n", + "\n", + " automl = AutoML()\n", + " automl.add_learner(learner_name=\"my_lgbm\", learner_class=MyLGBM)\n", + " automl.add_learner(learner_name=\"my_cat\", learner_class=MyCat)\n", + "\n", + " automl_settings = {\n", + " \"time_budget\": 600, # in seconds\n", + " \"metric\": \"r2\",\n", + " \"task\": \"regression\",\n", + " \"estimator_list\": [\n", + " \"catboost\",\n", + " \"lgbm\",\n", + " \"xgboost\"\n", + " ], \n", + " \"ensemble\": {\n", + " \"final_estimator\": LGBMRegressor(),\n", + " \"passthrough\": True,\n", + " },\n", + " }\n", + "\n", + " custom_hp = {\n", + " # \"lgbm\": {\n", + " # \"subsample\": {\n", + " # \"num_leaves\": tune.uniform(lower=10, upper=64),\n", + " # \"init_value\": 10,\n", + " # },\n", + " # },\n", + " }\n", + " # Train with labeled input data\n", + " automl.fit(X_train=X_train, y_train=y_train, X_val=X_val, y_val=y_val, custom_hp=custom_hp, **automl_settings)\n", + " # model = TabPFNRegressor(model_path=\"../../model/tabpfn-v2-regressor.ckpt\", ignore_pretraining_limits=True)\n", + "\n", + " return automl" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T15:03:18.426481Z", + "start_time": "2025-04-03T15:02:19.926352Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train data size: 364000\n", + " ts_code trade_date log_circ_mv\n", + "0 600306.SH 2020-01-02 11.552040\n", + "1 603269.SH 2020-01-02 11.324801\n", + "2 002633.SZ 2020-01-02 11.759023\n", + "3 603991.SH 2020-01-02 11.181150\n", + "4 000691.SZ 2020-01-02 11.677910\n", + "... ... ... ...\n", + "363995 603182.SH 2022-12-30 11.207510\n", + "363996 600749.SH 2022-12-30 12.594148\n", + "363997 605259.SH 2022-12-30 11.763909\n", + "363998 603600.SH 2022-12-30 12.594561\n", + "363999 603116.SH 2022-12-30 12.594781\n", + "\n", + "[364000 rows x 3 columns]\n", + "原始样本数: 364000, 去除标签为空后样本数: 364000\n", + "[flaml.automl.logger: 05-22 16:22:47] {1728} INFO - task = regression\n", + "[flaml.automl.logger: 05-22 16:22:47] {1736} INFO - Data split method: uniform\n", + "[flaml.automl.logger: 05-22 16:22:47] {1739} INFO - Evaluation method: holdout\n", + "[flaml.automl.logger: 05-22 16:22:47] {1838} INFO - Minimizing error metric: 1-r2\n", + "[flaml.automl.logger: 05-22 16:22:47] {1955} INFO - List of ML learners in AutoML Run: ['catboost', 'lgbm', 'xgboost']\n", + "[flaml.automl.logger: 05-22 16:22:47] {2258} INFO - iteration 0, current learner catboost\n", + "[flaml.automl.logger: 05-22 16:22:57] {2393} INFO - Estimated sufficient time budget=2563037s. Estimated necessary time budget=2563s.\n", + "[flaml.automl.logger: 05-22 16:22:57] {2442} INFO - at 21.3s,\testimator catboost's best error=1.1178,\tbest estimator catboost's best error=1.1178\n", + "[flaml.automl.logger: 05-22 16:22:57] {2258} INFO - iteration 1, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:22:57] {2442} INFO - at 21.5s,\testimator lgbm's best error=1.0006,\tbest estimator lgbm's best error=1.0006\n", + "[flaml.automl.logger: 05-22 16:22:57] {2258} INFO - iteration 2, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:22:57] {2442} INFO - at 21.8s,\testimator lgbm's best error=0.9969,\tbest estimator lgbm's best error=0.9969\n", + "[flaml.automl.logger: 05-22 16:22:57] {2258} INFO - iteration 3, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:22:57] {2442} INFO - at 22.1s,\testimator lgbm's best error=0.9969,\tbest estimator lgbm's best error=0.9969\n", + "[flaml.automl.logger: 05-22 16:22:57] {2258} INFO - iteration 4, current learner catboost\n", + "[flaml.automl.logger: 05-22 16:24:21] {2442} INFO - at 105.3s,\testimator catboost's best error=1.0733,\tbest estimator lgbm's best error=0.9969\n", + "[flaml.automl.logger: 05-22 16:24:21] {2258} INFO - iteration 5, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:21] {2442} INFO - at 105.6s,\testimator lgbm's best error=0.9969,\tbest estimator lgbm's best error=0.9969\n", + "[flaml.automl.logger: 05-22 16:24:21] {2258} INFO - iteration 6, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:21] {2442} INFO - at 105.8s,\testimator lgbm's best error=0.9969,\tbest estimator lgbm's best error=0.9969\n", + "[flaml.automl.logger: 05-22 16:24:21] {2258} INFO - iteration 7, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:21] {2442} INFO - at 106.0s,\testimator lgbm's best error=0.9917,\tbest estimator lgbm's best error=0.9917\n", + "[flaml.automl.logger: 05-22 16:24:21] {2258} INFO - iteration 8, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:22] {2442} INFO - at 106.3s,\testimator lgbm's best error=0.9917,\tbest estimator lgbm's best error=0.9917\n", + "[flaml.automl.logger: 05-22 16:24:22] {2258} INFO - iteration 9, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:22] {2442} INFO - at 106.5s,\testimator lgbm's best error=0.9917,\tbest estimator lgbm's best error=0.9917\n", + "[flaml.automl.logger: 05-22 16:24:22] {2258} INFO - iteration 10, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:22] {2442} INFO - at 106.8s,\testimator lgbm's best error=0.9917,\tbest estimator lgbm's best error=0.9917\n", + "[flaml.automl.logger: 05-22 16:24:22] {2258} INFO - iteration 11, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:22] {2442} INFO - at 107.0s,\testimator lgbm's best error=0.9917,\tbest estimator lgbm's best error=0.9917\n", + "[flaml.automl.logger: 05-22 16:24:22] {2258} INFO - iteration 12, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:23] {2442} INFO - at 107.6s,\testimator lgbm's best error=0.9828,\tbest estimator lgbm's best error=0.9828\n", + "[flaml.automl.logger: 05-22 16:24:23] {2258} INFO - iteration 13, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:23] {2442} INFO - at 108.0s,\testimator xgboost's best error=1.0014,\tbest estimator lgbm's best error=0.9828\n", + "[flaml.automl.logger: 05-22 16:24:23] {2258} INFO - iteration 14, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:24] {2442} INFO - at 108.4s,\testimator xgboost's best error=0.9876,\tbest estimator lgbm's best error=0.9828\n", + "[flaml.automl.logger: 05-22 16:24:24] {2258} INFO - iteration 15, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:24] {2442} INFO - at 108.7s,\testimator xgboost's best error=0.9876,\tbest estimator lgbm's best error=0.9828\n", + "[flaml.automl.logger: 05-22 16:24:24] {2258} INFO - iteration 16, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:24] {2442} INFO - at 109.1s,\testimator xgboost's best error=0.9876,\tbest estimator lgbm's best error=0.9828\n", + "[flaml.automl.logger: 05-22 16:24:24] {2258} INFO - iteration 17, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:25] {2442} INFO - at 109.7s,\testimator lgbm's best error=0.9828,\tbest estimator lgbm's best error=0.9828\n", + "[flaml.automl.logger: 05-22 16:24:25] {2258} INFO - iteration 18, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:25] {2442} INFO - at 110.1s,\testimator xgboost's best error=0.9876,\tbest estimator lgbm's best error=0.9828\n", + "[flaml.automl.logger: 05-22 16:24:25] {2258} INFO - iteration 19, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:26] {2442} INFO - at 110.5s,\testimator xgboost's best error=0.9876,\tbest estimator lgbm's best error=0.9828\n", + "[flaml.automl.logger: 05-22 16:24:26] {2258} INFO - iteration 20, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:26] {2442} INFO - at 111.2s,\testimator xgboost's best error=0.9802,\tbest estimator xgboost's best error=0.9802\n", + "[flaml.automl.logger: 05-22 16:24:26] {2258} INFO - iteration 21, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:27] {2442} INFO - at 111.8s,\testimator lgbm's best error=0.9828,\tbest estimator xgboost's best error=0.9802\n", + "[flaml.automl.logger: 05-22 16:24:27] {2258} INFO - iteration 22, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:28] {2442} INFO - at 112.4s,\testimator lgbm's best error=0.9828,\tbest estimator xgboost's best error=0.9802\n", + "[flaml.automl.logger: 05-22 16:24:28] {2258} INFO - iteration 23, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:28] {2442} INFO - at 113.1s,\testimator xgboost's best error=0.9802,\tbest estimator xgboost's best error=0.9802\n", + "[flaml.automl.logger: 05-22 16:24:28] {2258} INFO - iteration 24, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:29] {2442} INFO - at 113.9s,\testimator xgboost's best error=0.9802,\tbest estimator xgboost's best error=0.9802\n", + "[flaml.automl.logger: 05-22 16:24:29] {2258} INFO - iteration 25, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:30] {2442} INFO - at 114.4s,\testimator lgbm's best error=0.9828,\tbest estimator xgboost's best error=0.9802\n", + "[flaml.automl.logger: 05-22 16:24:30] {2258} INFO - iteration 26, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:30] {2442} INFO - at 115.1s,\testimator xgboost's best error=0.9750,\tbest estimator xgboost's best error=0.9750\n", + "[flaml.automl.logger: 05-22 16:24:30] {2258} INFO - iteration 27, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:31] {2442} INFO - at 115.8s,\testimator xgboost's best error=0.9750,\tbest estimator xgboost's best error=0.9750\n", + "[flaml.automl.logger: 05-22 16:24:31] {2258} INFO - iteration 28, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:32] {2442} INFO - at 116.6s,\testimator xgboost's best error=0.9750,\tbest estimator xgboost's best error=0.9750\n", + "[flaml.automl.logger: 05-22 16:24:32] {2258} INFO - iteration 29, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:33] {2442} INFO - at 117.3s,\testimator lgbm's best error=0.9806,\tbest estimator xgboost's best error=0.9750\n", + "[flaml.automl.logger: 05-22 16:24:33] {2258} INFO - iteration 30, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:33] {2442} INFO - at 117.8s,\testimator lgbm's best error=0.9806,\tbest estimator xgboost's best error=0.9750\n", + "[flaml.automl.logger: 05-22 16:24:33] {2258} INFO - iteration 31, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:34] {2442} INFO - at 118.9s,\testimator lgbm's best error=0.9806,\tbest estimator xgboost's best error=0.9750\n", + "[flaml.automl.logger: 05-22 16:24:34] {2258} INFO - iteration 32, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:35] {2442} INFO - at 119.9s,\testimator xgboost's best error=0.9750,\tbest estimator xgboost's best error=0.9750\n", + "[flaml.automl.logger: 05-22 16:24:35] {2258} INFO - iteration 33, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:36] {2442} INFO - at 120.5s,\testimator lgbm's best error=0.9806,\tbest estimator xgboost's best error=0.9750\n", + "[flaml.automl.logger: 05-22 16:24:36] {2258} INFO - iteration 34, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:36] {2442} INFO - at 121.1s,\testimator lgbm's best error=0.9806,\tbest estimator xgboost's best error=0.9750\n", + "[flaml.automl.logger: 05-22 16:24:36] {2258} INFO - iteration 35, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:37] {2442} INFO - at 122.0s,\testimator xgboost's best error=0.9750,\tbest estimator xgboost's best error=0.9750\n", + "[flaml.automl.logger: 05-22 16:24:37] {2258} INFO - iteration 36, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:40] {2442} INFO - at 124.6s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:24:40] {2258} INFO - iteration 37, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:42] {2442} INFO - at 127.2s,\testimator lgbm's best error=0.9766,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:24:42] {2258} INFO - iteration 38, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:24:46] {2442} INFO - at 130.6s,\testimator lgbm's best error=0.9766,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:24:46] {2258} INFO - iteration 39, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:48] {2442} INFO - at 133.1s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:24:48] {2258} INFO - iteration 40, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:24:52] {2442} INFO - at 136.4s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:24:52] {2258} INFO - iteration 41, current learner catboost\n", + "[flaml.automl.logger: 05-22 16:24:57] {2442} INFO - at 142.1s,\testimator catboost's best error=1.0733,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:24:57] {2258} INFO - iteration 42, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:25:00] {2442} INFO - at 144.7s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:00] {2258} INFO - iteration 43, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:25:05] {2442} INFO - at 149.7s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:05] {2258} INFO - iteration 44, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:25:07] {2442} INFO - at 152.0s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:07] {2258} INFO - iteration 45, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:25:10] {2442} INFO - at 154.7s,\testimator lgbm's best error=0.9766,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:10] {2258} INFO - iteration 46, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:25:16] {2442} INFO - at 161.0s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:16] {2258} INFO - iteration 47, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:25:19] {2442} INFO - at 163.5s,\testimator lgbm's best error=0.9766,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:19] {2258} INFO - iteration 48, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:25:22] {2442} INFO - at 166.5s,\testimator lgbm's best error=0.9766,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:22] {2258} INFO - iteration 49, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:25:24] {2442} INFO - at 168.9s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:24] {2258} INFO - iteration 50, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:25:28] {2442} INFO - at 172.4s,\testimator lgbm's best error=0.9766,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:28] {2258} INFO - iteration 51, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:25:30] {2442} INFO - at 175.0s,\testimator lgbm's best error=0.9766,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:30] {2258} INFO - iteration 52, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:25:33] {2442} INFO - at 178.1s,\testimator lgbm's best error=0.9766,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:25:33] {2258} INFO - iteration 53, current learner catboost\n", + "[flaml.automl.logger: 05-22 16:26:56] {2442} INFO - at 261.2s,\testimator catboost's best error=1.0733,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:26:56] {2258} INFO - iteration 54, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:26:59] {2442} INFO - at 263.9s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:26:59] {2258} INFO - iteration 55, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:27:02] {2442} INFO - at 266.7s,\testimator lgbm's best error=0.9765,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:27:02] {2258} INFO - iteration 56, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:27:05] {2442} INFO - at 269.5s,\testimator lgbm's best error=0.9765,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:27:05] {2258} INFO - iteration 57, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:27:08] {2442} INFO - at 273.1s,\testimator lgbm's best error=0.9765,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:27:08] {2258} INFO - iteration 58, current learner catboost\n", + "[flaml.automl.logger: 05-22 16:27:14] {2442} INFO - at 278.7s,\testimator catboost's best error=1.0733,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:27:14] {2258} INFO - iteration 59, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:27:17] {2442} INFO - at 281.8s,\testimator lgbm's best error=0.9765,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:27:17] {2258} INFO - iteration 60, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:27:20] {2442} INFO - at 285.1s,\testimator lgbm's best error=0.9765,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:27:20] {2258} INFO - iteration 61, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:27:24] {2442} INFO - at 288.5s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:27:24] {2258} INFO - iteration 62, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:27:27] {2442} INFO - at 291.5s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:27:27] {2258} INFO - iteration 63, current learner catboost\n", + "[flaml.automl.logger: 05-22 16:29:45] {2442} INFO - at 429.8s,\testimator catboost's best error=1.0733,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:29:45] {2258} INFO - iteration 64, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:29:48] {2442} INFO - at 432.5s,\testimator lgbm's best error=0.9765,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:29:48] {2258} INFO - iteration 65, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:29:50] {2442} INFO - at 434.7s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:29:50] {2258} INFO - iteration 66, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:29:53] {2442} INFO - at 437.6s,\testimator lgbm's best error=0.9765,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:29:53] {2258} INFO - iteration 67, current learner catboost\n", + "[flaml.automl.logger: 05-22 16:29:59] {2442} INFO - at 443.3s,\testimator catboost's best error=1.0733,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:29:59] {2258} INFO - iteration 68, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:30:04] {2442} INFO - at 449.0s,\testimator lgbm's best error=0.9765,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:04] {2258} INFO - iteration 69, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:30:10] {2442} INFO - at 454.8s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:10] {2258} INFO - iteration 70, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:30:13] {2442} INFO - at 457.7s,\testimator lgbm's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:13] {2258} INFO - iteration 71, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:30:15] {2442} INFO - at 460.0s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:15] {2258} INFO - iteration 72, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:30:18] {2442} INFO - at 463.1s,\testimator lgbm's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:18] {2258} INFO - iteration 73, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:30:21] {2442} INFO - at 466.0s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:21] {2258} INFO - iteration 74, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:30:24] {2442} INFO - at 468.6s,\testimator lgbm's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:24] {2258} INFO - iteration 75, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:30:28] {2442} INFO - at 473.0s,\testimator lgbm's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:28] {2258} INFO - iteration 76, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:30:31] {2442} INFO - at 475.7s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:31] {2258} INFO - iteration 77, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:30:34] {2442} INFO - at 478.3s,\testimator lgbm's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:34] {2258} INFO - iteration 78, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:30:36] {2442} INFO - at 480.8s,\testimator lgbm's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:36] {2258} INFO - iteration 79, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:30:41] {2442} INFO - at 485.5s,\testimator xgboost's best error=0.9734,\tbest estimator xgboost's best error=0.9734\n", + "[flaml.automl.logger: 05-22 16:30:41] {2258} INFO - iteration 80, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:30:45] {2442} INFO - at 489.4s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:30:45] {2258} INFO - iteration 81, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:30:51] {2442} INFO - at 495.4s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:30:51] {2258} INFO - iteration 82, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:30:54] {2442} INFO - at 498.4s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:30:54] {2258} INFO - iteration 83, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:30:58] {2442} INFO - at 502.7s,\testimator xgboost's best error=0.9734,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:30:58] {2258} INFO - iteration 84, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:31:01] {2442} INFO - at 505.3s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:31:01] {2258} INFO - iteration 85, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:31:12] {2442} INFO - at 517.1s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:31:12] {2258} INFO - iteration 86, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:31:15] {2442} INFO - at 519.9s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:31:15] {2258} INFO - iteration 87, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:31:27] {2442} INFO - at 531.4s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:31:27] {2258} INFO - iteration 88, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:31:29] {2442} INFO - at 533.8s,\testimator xgboost's best error=0.9734,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:31:29] {2258} INFO - iteration 89, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:31:32] {2442} INFO - at 536.6s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:31:32] {2258} INFO - iteration 90, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:31:35] {2442} INFO - at 539.6s,\testimator xgboost's best error=0.9734,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:31:35] {2258} INFO - iteration 91, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:31:37] {2442} INFO - at 542.2s,\testimator xgboost's best error=0.9734,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:31:37] {2258} INFO - iteration 92, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:31:43] {2442} INFO - at 547.9s,\testimator xgboost's best error=0.9734,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:31:43] {2258} INFO - iteration 93, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:32:01] {2442} INFO - at 565.6s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:32:01] {2258} INFO - iteration 94, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:32:03] {2442} INFO - at 568.0s,\testimator xgboost's best error=0.9734,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:32:03] {2258} INFO - iteration 95, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:32:12] {2442} INFO - at 577.0s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:32:12] {2258} INFO - iteration 96, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:32:15] {2442} INFO - at 580.2s,\testimator xgboost's best error=0.9734,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:32:15] {2258} INFO - iteration 97, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:32:18] {2442} INFO - at 583.0s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:32:18] {2258} INFO - iteration 98, current learner lgbm\n", + "[flaml.automl.logger: 05-22 16:32:28] {2442} INFO - at 592.6s,\testimator lgbm's best error=0.9731,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:32:28] {2258} INFO - iteration 99, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:32:30] {2442} INFO - at 595.1s,\testimator xgboost's best error=0.9734,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:32:30] {2258} INFO - iteration 100, current learner xgboost\n", + "[flaml.automl.logger: 05-22 16:32:33] {2442} INFO - at 598.0s,\testimator xgboost's best error=0.9734,\tbest estimator lgbm's best error=0.9731\n", + "[flaml.automl.logger: 05-22 16:32:33] {2550} INFO - selected model: LGBMRegressor(colsample_bytree=0.912038573841834,\n", + " learning_rate=0.02078849055957606, max_bin=1023,\n", + " min_child_samples=38, n_estimators=18, n_jobs=-1, num_leaves=11,\n", + " reg_alpha=0.061774595197632225, reg_lambda=0.003793636570300973,\n", + " verbose=-1)\n", + "[flaml.automl.logger: 05-22 16:32:33] {2582} INFO - [('lgbm', {'n_jobs': -1, 'n_estimators': 18, 'num_leaves': 11, 'min_child_samples': 38, 'learning_rate': 0.02078849055957606, 'colsample_bytree': 0.912038573841834, 'reg_alpha': 0.061774595197632225, 'reg_lambda': 0.003793636570300973, 'max_bin': 1023, 'verbose': -1}), ('xgboost', {'n_jobs': -1, 'n_estimators': 4, 'max_leaves': 12, 'min_child_weight': 5.4998639205908075, 'learning_rate': 0.04700136686803946, 'subsample': 1.0, 'colsample_bylevel': 0.8425853155117716, 'colsample_bytree': 0.9245352674213118, 'reg_alpha': 0.025118956715098555, 'reg_lambda': 27.89255832621344, 'max_depth': 0, 'grow_policy': 'lossguide', 'tree_method': 'hist', 'verbosity': 0}), ('catboost', {'early_stopping_rounds': 10, 'learning_rate': 0.005, 'n_estimators': 8192, 'thread_count': -1, 'verbose': False, 'random_seed': 10242048})]\n", + "[flaml.automl.logger: 05-22 16:32:33] {2625} INFO - Building ensemble with tuned estimators\n", + "[flaml.automl.logger: 05-22 16:33:39] {2631} INFO - ensemble: StackingRegressor(estimators=[('lgbm',\n", + " ),\n", + " ('xgboost',\n", + " ),\n", + " ('catboost',\n", + " )],\n", + " final_estimator=LGBMRegressor(), n_jobs=1, passthrough=True)\n", + "[flaml.automl.logger: 05-22 16:33:39] {1985} INFO - fit succeeded\n", + "[flaml.automl.logger: 05-22 16:33:39] {1986} INFO - Time taken to find the best model: 489.3946213722229\n", + "[flaml.automl.logger: 05-22 16:33:39] {1996} WARNING - Time taken to find the best model is 82% of the provided time budget and not all estimators' hyperparameter search converged. Consider increasing the time budget.\n" + ] + } + ], + "source": [ + "\n", + "gc.collect()\n", + "\n", + "use_pca = False\n", + "type = 'cat'\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 = train_model(train_data\n", + " .dropna(subset=['label']).groupby('trade_date', group_keys=False)\n", + " .apply(lambda x: x.nsmallest(500, 'total_mv'))\n", + " .merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + " .merge(index_data, on='trade_date', how='left'), feature_columns, type=type)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "59132b85", + "metadata": {}, + "outputs": [], + "source": [ + "# for e in model.model.estimators:\n", + "# print(e[1].estimator)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "5d1522a7538db91b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T15:04:39.656944Z", + "start_time": "2025-04-03T15:04:39.298483Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 6/6 [00:01<00:00, 3.22it/s]\n" + ] + } + ], + "source": [ + "score_df = test_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(500, 'total_mv'))\n", + "# score_df = fill_nan_with_daily_median(score_df, ['pe_ttm'])\n", + "# score_df = score_df[score_df['pe_ttm'] > 0]\n", + "score_df = score_df.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + "score_df = score_df.merge(index_data, on='trade_date', how='left')\n", + "# score_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(50, 'total_mv')).reset_index()\n", + "numeric_columns = score_df.select_dtypes(include=['float64', 'int64']).columns\n", + "numeric_columns = [col for col in feature_columns if col in numeric_columns]\n", + "# score_df.loc[:, numeric_columns] = scaler.transform(score_df[numeric_columns])\n", + "# score_df = cross_sectional_standardization(score_df, numeric_columns)\n", + "\n", + "# score_df['score'] = model.predict_proba(score_df[feature_columns])[:, -1]\n", + "# score_df['score'] = model.predict(score_df[feature_columns])\n", + "chunk_size = 5000 # 设置您的切块大小\n", + "predictions_list = []\n", + "num_rows = len(score_df)\n", + "\n", + "from tqdm import tqdm\n", + "for i in tqdm(range(0, num_rows, chunk_size)):\n", + " chunk_df = score_df.iloc[i : i + chunk_size].copy()\n", + " chunk_features = chunk_df[feature_columns]\n", + " chunk_predictions_np = model.predict(chunk_features)\n", + " chunk_predictions_series = pd.Series(chunk_predictions_np, index=chunk_df.index)\n", + " predictions_list.append(chunk_predictions_series)\n", + " del chunk_df, chunk_features, chunk_predictions_np, chunk_predictions_series\n", + " gc.collect()\n", + "\n", + "combined_predictions = pd.concat(predictions_list)\n", + "score_df['score'] = combined_predictions\n", + "\n", + "score_df['score_ranks'] = score_df.groupby('trade_date')['score'].rank(ascending=True)\n", + "\n", + "score_df = score_df.groupby('trade_date', group_keys=False).apply(\n", + " lambda x: x[x['score'] >= x['score'].quantile(0.90)] # 计算90%分位数作为阈值,筛选分数>=阈值的行\n", + ").reset_index(drop=True) # drop=True 避免添加旧索引列\n", + "save_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nlargest(2, 'score')).reset_index()\n", + "# save_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(2, 'total_mv')).reset_index(drop=True)\n", + "save_df = save_df.sort_values(['trade_date', 'score'])\n", + "save_df[['trade_date', 'score', 'ts_code']].to_csv('predictions_test.tsv', index=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "09b1799e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "191\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n" + ] + } + ], + "source": [ + "print(len(feature_columns))\n", + "print(feature_columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "7e9023cc", + "metadata": {}, + "outputs": [], + "source": [ + "def analyze_factors(\n", + " df: pd.DataFrame,\n", + " feature_columns: list[str],\n", + " target_column: str = 'target', # 假设目标列默认为 'target'\n", + " trade_date_col: str = 'trade_date', # 假设日期列默认为 'trade_date'\n", + " mcap_col: str = 'total_mv', # 新增: 市值列名称\n", + " mcap_bins: int = 5 # 新增: 市值分位数的数量 (例如 5 表示五分位数)\n", + ") -> pd.DataFrame:\n", + " \"\"\"\n", + " 分析DataFrame中指定特征列的各种指标,包括基本统计、相关性、日间IC、ICIR以及在不同市值分位数上的IC。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 包含日期、目标列、特征列和市值列的DataFrame。\n", + " 需要包含 trade_date_col, target_column, feature_columns 和 mcap_col 中的所有列。\n", + " feature_columns (list[str]): 需要分析的特征列名称列表。\n", + " target_column (str): 目标变量列的名称。\n", + " trade_date_col (str): 交易日期列的名称。\n", + " mcap_col (str): 市值列的名称。\n", + " mcap_bins (int): 市值分位数的数量 (例如 5 表示五分位数)。\n", + "\n", + " Returns:\n", + " pd.DataFrame: 包含各个因子分析指标的汇总DataFrame。\n", + " 同时打印因子在不同市值分位数上的平均IC表格。\n", + " 如果输入数据或列有问题,可能返回空或包含NaN的DataFrame。\n", + " \"\"\"\n", + "\n", + " # --- 数据校验 ---\n", + " required_cols = [trade_date_col, target_column, mcap_col] + feature_columns\n", + " if not all(col in df.columns for col in required_cols):\n", + " missing = [col for col in required_cols if col not in df.columns]\n", + " print(f\"错误: 输入DataFrame缺少必需的列: {missing}\")\n", + " return pd.DataFrame() # 返回空DataFrame\n", + "\n", + " # 确保日期列是 datetime 类型\n", + " df = df.copy() # 在副本上操作\n", + " df[trade_date_col] = pd.to_datetime(df[trade_date_col], errors='coerce')\n", + " df.dropna(subset=[trade_date_col], inplace=True) # 移除日期转换失败的行\n", + "\n", + " # 过滤掉那些在 feature_columns, target_column, mcap_col 上有 NaN 的行,以确保后续计算是在完整数据上\n", + " # 直接在 df 副本上进行清洗\n", + " initial_rows_before_clean = len(df)\n", + " df.dropna(subset=feature_columns + [target_column, mcap_col], inplace=True)\n", + " rows_dropped_clean = initial_rows_before_clean - len(df)\n", + " if rows_dropped_clean > 0:\n", + " print(f\"警告: 移除了 {rows_dropped_clean} 行,因为其特征、目标或市值列存在空值。\")\n", + "\n", + " if df.empty:\n", + " print(\"错误: 清理缺失值后数据为空,无法进行因子分析。\")\n", + " return pd.DataFrame() # 返回空DataFrame\n", + "\n", + "\n", + " print(f\"开始分析 {len(feature_columns)} 个因子指标...\")\n", + "\n", + " # --- 1. 基本因子统计量 ---\n", + " basic_stats = df[feature_columns].describe().T\n", + "\n", + " print(\"\\n--- 基本因子统计量 ---\")\n", + " print(basic_stats)\n", + "\n", + " # --- 2. 因子与目标变量的整体相关性 ---\n", + " overall_correlation = {}\n", + " for feature in feature_columns:\n", + " # 在清理后的 df 上计算相关性\n", + " if df[[feature, target_column]].dropna().shape[0] > 1: # 确保至少有两个有效数据点\n", + " overall_correlation[feature] = {\n", + " 'Pearson_Correlation_with_Target': df[feature].corr(df[target_column], method='pearson'),\n", + " 'Spearman_Correlation_with_Target': df[feature].corr(df[target_column], method='spearman')\n", + " }\n", + " else:\n", + " overall_correlation[feature] = {\n", + " 'Pearson_Correlation_with_Target': np.nan,\n", + " 'Spearman_Correlation_with_Target': np.nan\n", + " }\n", + " overall_corr_df = pd.DataFrame.from_dict(overall_correlation, orient='index')\n", + "\n", + " print(\"\\n--- 因子与目标变量的整体相关性 ---\")\n", + " print(overall_corr_df)\n", + "\n", + " # --- 3. 因子之间的相关性矩阵 ---\n", + " # 在清理后的 df 上计算相关性\n", + " factor_correlation_matrix = df[feature_columns].corr(method='spearman') # 改回 Spearman\n", + "\n", + " print(\"\\n--- 因子之间的相关性矩阵 (Spearman) ---\") # 修正打印信息\n", + " print(factor_correlation_matrix)\n", + "\n", + " # --- 4. 日间 IC 和 ICIR ---\n", + " print(\"\\n--- 计算日间 IC (Spearman 相关性) 和 ICIR ---\")\n", + "\n", + " # 直接在清理后的 df 上计算每日 IC\n", + " if df.empty: # 理论上上面已经检查过,这里再检查一次更安全\n", + " daily_ic_series = pd.Series(dtype=float) # 空 Series\n", + " ic_stats = pd.DataFrame({\n", + " 'Mean_IC (Spearman)': np.nan, 'Std_Dev_IC': np.nan, 'ICIR': np.nan\n", + " }, index=feature_columns)\n", + " else:\n", + " daily_ic_series = df.groupby(trade_date_col).apply(\n", + " lambda day_group: {\n", + " feature: day_group[feature].corr(day_group[target_column], method='spearman')\n", + " for feature in feature_columns if day_group.shape[0] > 1 # 确保每日数据点多于1才能计算相关性\n", + " }\n", + " ).apply(pd.Series) # 将字典结果转换为 DataFrame\n", + "\n", + " # 计算 IC 的统计量\n", + " if not daily_ic_series.empty:\n", + " ic_mean = daily_ic_series.mean()\n", + " ic_std = daily_ic_series.std()\n", + " # 避免除以零\n", + " ic_ir = ic_mean / ic_std.replace(0, np.nan) # 使用 replace 0 为 NaN\n", + "\n", + " ic_stats = pd.DataFrame({\n", + " 'Mean_IC (Spearman)': ic_mean,\n", + " 'Std_Dev_IC': ic_std,\n", + " 'ICIR': ic_ir\n", + " })\n", + " print(\"\\n--- 日间 IC 和 ICIR (Spearman) ---\")\n", + " print(ic_stats)\n", + " else:\n", + " ic_stats = pd.DataFrame({\n", + " 'Mean_IC (Spearman)': np.nan, 'Std_Dev_IC': np.nan, 'ICIR': np.nan\n", + " }, index=feature_columns)\n", + "\n", + "\n", + " # --- 5. 因子在不同市值分位数上的平均 IC ---\n", + " print(f\"\\n--- 计算因子在 {mcap_bins} 个市值分位数上的平均 IC (Spearman) ---\")\n", + "\n", + " # 在清理后的 df 上计算每日市值分位数,直接添加到 df 中\n", + " # 使用 transform() 和 qcut() 在每个日期分组内计算分位数\n", + " # labels=False 返回整数 0 to mcap_bins-1\n", + " # duplicates='drop' 处理在某些日期股票数量少于 bins 导致分位数边缘重复的情况,会返回 NaN\n", + " # 添加一个临时列来存储分位数\n", + " mcap_bin_col_name = f'_mcap_bin_{mcap_bins}'\n", + " df[mcap_bin_col_name] = df.groupby(trade_date_col)[mcap_col].transform(\n", + " lambda x: pd.qcut(x, q=mcap_bins, labels=False, duplicates='drop') if len(x) >= mcap_bins else np.nan # 确保股票数量足够进行分位数划分\n", + " )\n", + "\n", + " # 过滤掉无法划分分位数 (NaN) 的行,进行分位数 IC 计算\n", + " # 创建一个临时 DataFrame df_binned_analysis\n", + " df_binned_analysis = df.dropna(subset=[mcap_bin_col_name]).copy()\n", + "\n", + " if df_binned_analysis.empty:\n", + " print(\"错误: 划分市值分位数后数据为空,无法计算分位数上的 IC。\")\n", + " avg_ic_by_bin = pd.DataFrame(index=range(mcap_bins), columns=feature_columns) # Placeholder\n", + " else:\n", + " # 按日期和市值分位数分组,计算每个分组内的因子与目标变量的截面相关性 (分位数IC)\n", + " binned_ic_by_day = df_binned_analysis.groupby([trade_date_col, mcap_bin_col_name]).apply(\n", + " lambda group: {\n", + " feature: group[feature].corr(group[target_column], method='spearman')\n", + " for feature in feature_columns if group.shape[0] > 1 # 确保分位数组内数据点多于1\n", + " }\n", + " ).apply(pd.Series) # 将嵌套结果转为 DataFrame\n", + "\n", + " # 对每个分位数组的每日 IC 求平均\n", + " # unstack(level=mcap_bin_col_name) 将 mcap_bin 作为列\n", + " # mean(axis=0) 对日期索引求平均\n", + " avg_ic_by_bin = binned_ic_by_day.unstack(level=mcap_bin_col_name).mean(axis=0).unstack()\n", + "\n", + " # 重命名索引和列,使表格更清晰\n", + " if not avg_ic_by_bin.empty:\n", + " # Index name will be the original column name used for grouping ('_mcap_bin_X')\n", + " # Rename the index name explicitly\n", + " avg_ic_by_bin.index.name = 'MarketCap_Bin'\n", + " avg_ic_by_bin.columns.name = 'Feature'\n", + " # 可以根据需要对分位数 bin 索引进行排序 (虽然 pd.qcut labels=False usually sorts)\n", + " avg_ic_by_bin = avg_ic_by_bin.sort_index()\n", + "\n", + " print(avg_ic_by_bin)\n", + "\n", + "\n", + " # --- 6. 汇总所有指标 ---\n", + " # 将基本统计、整体相关性、IC/ICIR 合并到一个 DataFrame\n", + " # 注意:合并时需要根据索引进行对齐 (因子名称)\n", + " summary_df = basic_stats\n", + " summary_df = summary_df.merge(overall_corr_df, left_index=True, right_index=True, how='left')\n", + " summary_df = summary_df.merge(ic_stats, left_index=True, right_index=True, how='left')\n", + "\n", + " # print(\"\\n--- 因子分析汇总报告 ---\")\n", + " # print(summary_df)\n", + "\n", + " # --- 清理临时列 'mcap_bin' ---\n", + " # 修正:在函数结束时从我们一直在操作的 df 副本中删除临时列\n", + " if mcap_bin_col_name in df.columns:\n", + " df.drop(columns=[mcap_bin_col_name], inplace=True)\n", + "\n", + "\n", + " return summary_df # 主要返回汇总报告,分位数IC单独打印\n", + "\n", + "# # 运行分析函数\n", + "# factor_analysis_report = analyze_factors(test_data.copy(), feature_columns, 'future_return')\n", + "\n", + "# print(\"\\n--- 最终汇总报告 DataFrame ---\")\n", + "# print(factor_analysis_report)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "a0000d75", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "开始分析 'score' 在 'circ_mv' 和 'future_return' 下的表现...\n", + "准备数据,处理 NaN 值...\n", + "原始数据 28550 行,移除 NaN 后剩余 28175 行用于分析。\n", + "对 'circ_mv' 和 'future_return' 进行 100 分位数分箱...\n", + "按二维分箱分组计算 Spearman Rank IC...\n", + "整理结果用于绘图...\n", + "circ_mv_bin 0 1 2 3 4 5 6 7 8 9 ... 90 91 92 \\\n", + "future_return_bin ... \n", + "0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n", + "1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n", + "2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n", + "3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n", + "4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n", + "... .. .. .. .. .. .. .. .. .. .. ... .. .. .. \n", + "94 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n", + "95 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n", + "96 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n", + "97 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n", + "98 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN \n", + "\n", + "circ_mv_bin 93 94 95 96 97 98 99 \n", + "future_return_bin \n", + "0 NaN NaN NaN NaN NaN NaN NaN \n", + "1 NaN NaN NaN NaN NaN NaN NaN \n", + "2 NaN NaN NaN NaN NaN NaN NaN \n", + "3 NaN NaN NaN NaN NaN NaN NaN \n", + "4 NaN NaN NaN NaN NaN NaN NaN \n", + "... .. .. .. .. .. .. .. \n", + "94 NaN NaN NaN NaN NaN NaN NaN \n", + "95 NaN NaN NaN NaN NaN NaN NaN \n", + "96 NaN NaN NaN NaN NaN NaN NaN \n", + "97 NaN NaN NaN NaN NaN NaN NaN \n", + "98 NaN NaN NaN NaN NaN NaN NaN \n", + "\n", + "[99 rows x 100 columns]\n", + "生成热力图...\n", + "分析完成。\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAASgCAYAAAAXXAHaAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xd0VFX79vErvdCRokgvQiQiSBUFpRcFFAVUDIKidCk2uoIFUUAERBFEFORHk6YiIEVUQLqQgVAEVJoUQwmTkITJef/gzTyEZEIyTObMZL6ftbKeH2euPfs+ueO8693Z2cfPMAxDAAAAAAAAAAAgHX+zCwAAAAAAAAAAwFOxiA4AAAAAAAAAgAMsogMAAAAAAAAA4ACL6AAAAAAAAAAAOMAiOgAAAAAAAAAADrCIDgAAAAAAAACAAyyiAwAAAAAAAADgAIvoAAAAAAAAAAA4wCI6AADwKu3bt1eLFi2UkpJidikOXbx4UStWrJBhGPZre/bsUffu3fXzzz9n+/3Wrl2rwYMHa8eOHVkeYxiG9u3bl+25AAAAAABpBZpdAAAAQHb8999/Sk5Olr9/1vcCJCYmKjk5WeHh4WnGXb16VVeuXFHevHk1cOBAWSyWm77XokWLVKBAgUwzCxYs0Lhx47Rv3z69+uqrkqQCBQpo06ZNunz5sh5++OEs1y5JR48e1ZIlS9S6desMX09OTtbZs2f1999/68iRI9q9e7e2bNmif//9Vx9//LFatmyZrfmy4t9//9X8+fP18ssvy8/Pz+XvD5hh5syZeuCBB1S5cmWzSwEAAIAHYREdAAB4lGPHjun7779XgQIFFBQUpICAgDSvJyUlKSUlRYsXL043NiUlRYmJiSpYsKAeeeQR+/Xly5dr+PDhGc5XpEgRbdy4UZcuXdL58+fVuXPnDHObNm3Snj17FBQUlGn98fHx+uqrrxQaGqqoqCj79TJlyujxxx/XokWLtGTJEj3++OOZvs/1wsLC0vxvqtjYWLVq1UoXL16073r39/dX8eLFVaZMGTVo0EDHjh2TzWZL9328FXFxcerWrZsCAgL0wgsvKG/evC57b8AsV69e1fr16zVz5kwtXLhQd9xxh9klAQAAwEOwiA4AADzKyZMnNXHixJvmhgwZ4vC1e++9N80ieuXKldWnTx8FBQXpp59+0p9//qmePXsqKSlJwcHBkqTAwEDlz59fAwcOzPA94+PjtWfPHoWEhGRa18yZM3X27Fm9+OKLKl68eJrXBgwYoJUrV+q9995TrVq1VKpUqZvepyT77vkbd3wHBATowoULqlOnjnr37q0777xTt99+u/2ecsprr72mpKQkzZ07176AfuPO3cDAQBUpUkT169dXjx49VLZs2RytSZK2bNmiLl26qG/fvurXr1+OzdO4cWOdOHFCa9euVcmSJR3mli1bpq+++kqHDx9W3rx51aRJEw0YMECFCxfOsdrcLSoqSlu3btWBAwdu+b0qV66se++9VwsWLHBBZRk7fvy4mjRposcff1zvv/9+mtcCAwP16aef2n+G5s2bd9NfmgEAAMA3sIgOAAA8SrVq1fTLL7+oQIECCg4OTndsS7NmzWSz2bRu3bp0Y1NSUhQfHy+r1ZruPatVqyZJ+vvvv/XPP/+od+/eaTI37tReuHChgoKC1KhRozTHt2S2o/vAgQP67LPPVLhwYfXo0SPd60WLFtXrr7+ukSNHqk+fPvrmm2+UL18+h++VlJSkoKAgnTt3TtK1XzAcPHhQiYmJKlOmjH2x/M4779T999/vsC5XWrp0qX755RctWLAg3S8JJKlnz56SpPPnz2vnzp1avHixVq1apblz56pKlSpuqdETTJgwQdOmTVOJEiXUsWNHnThxQgsWLNDWrVu1cOFCh32HufLmzatPPvlEjzzyiGbMmKFevXqZXRIAAAA8AIvoAADAo4SFhSkuLk4LFy5UaGhoukVrq9Uqm82W7jgXm82mpKQkhYWFqX379rdcx5w5c7R//35t3rw5S/nk5GS98cYbSk5O1oABAxwuknbq1EkbN27UqlWr1L17d3366acZ7kweMmSI9u7dm+baa6+9Zv+/p0+frnr16mXjjm5dUlKSxo8fr65duyoyMjLDzPU7+VNSUjR8+HB9++23mjhxoj777DN3lWqqbdu2adq0aSpXrpwWLFig/PnzS7rWs3HjxumTTz7R4MGDTa4Sjtxxxx165ZVXNG7cOD311FMqVKiQ2SUBAADAZCyiAwAAj3Py5Em98847mWYcHedSqVIllyyi22w2FS5cOMtHb0ycOFExMTF68MEH1bFjx0yzY8eO1fnz57V161Z16NBBEyZM0L333psmM3ToUCUkJCgkJETjx4/XH3/8obfeekuVKlVSQkKC7r77brcfNbFmzRqdP39eL774Ypby/v7+6tWrl7799lvt2rUrh6vzHNOnT5ck9e/f376ALknPPPOMJk+erB9++IFFdA/XqVMnTZkyRYsXL9YLL7xgdjkAAAAwGYvoAADA40RGRuqPP/5QcHBwup3ojo5zMQxDycnJSk5OdkkNNptNRYsWzVJ2wYIFmjFjhooUKaKxY8emO7v8RmFhYZo+fboGDBig9evX6+mnn9Zzzz2nXr162Rdda9WqJUm6fPmyYmJiJF37BUHq9VT+/v46ePCgPv/88wznunr1qq5cuaJBgwZl6V4ys27dOj344IPZ2pl72223SZKuXLlyy/N7g8TERG3atEn+/v5q0KBBmtfy5Mmj4sWL659//tHFixfTHBMEzxIYGKjWrVtr7dq1LKIDAACARXQAADzBv//+q8mTJ2vz5s06d+6cihQpooYNG6pfv372RchUNptNs2fP1qJFi/T333/rtttuU7Vq1dS/f39VqFAh3XsvX75cX331lQ4dOqSwsDDdf//9evnll1W+fPk0uRsfyrhixQrNmzdPBw4c0FdffZXuPOt9+/Zp6tSp2rZtm6xWq8qVK6cuXbqoQ4cOTn8fDh8+rODgYAUGBjpciLbZbLLZbPr3338dvn769GklJSXZa963b5/mzZun4OBgWSwWJSYm6t1331VSUpLq1q2r1q1bp3uflJSULC2iL1iwQG+++aaCgoLUoUMHjRo1SiEhIQoICLjpYnqVKlVUsWJFTZ8+XTNnzlRISIgGDBiQJrN06VIlJiba//3PP/+oVKlS9vc2DEOHDx/WV199Zc9cvHhRNptN+fPnV2JiopKSklyyiG6xWG66y/5G+/btk6R0D1G1Wq2aOXOmfvjhB506dUoFCxZUjRo1NHDgQJUpU8aeW7x4sYYMGaIxY8aoWrVq+vDDD7Vjxw4FBgbqgQce0LBhwzL9a4GUlBQNGTJES5cuVa9evdJ9f13t8OHDSk5OVokSJewPXb3e8OHDdeHChWw//NVms+mhhx6Sn5+fNmzYkO5ZAY0bN1Z8fLx+/fVX+18oXLlyRTNnztT333+vkydPKk+ePLrnnnvUv39/RUREOH+T2bR//35NnTpVu3btUlxcnEqUKKF27dqpW7duGX4fNm7cqHHjxunPP//Ubbfdpscee0y9e/dOl01OTtaXX36p5cuX6++//1Z4eLgefPBBDRo0SHfeeect1127dm0tXrxYhmHc9L9lAAAA5G4sogMAYLK4uDh17txZJ06cUOPGjVW2bFkdP35c8+fP1549e7Ro0SL7gpnNZlOfPn20fv16lS1bVp06dVJsbKxWr16tn3/+WbNnz05zLMh7772nr776SsWKFdPjjz+u2NhYrVq1Shs2bNCMGTNUs2bNDGsaPny4Fi5cqJIlS6pMmTIKDQ1N8/qGDRvUt29fhYeHq1mzZgoNDdXPP/+s4cOH699//1W/fv2c+l506dLF/hDNm3nooYdumjlw4ICka8fDLF68WEFBQUpOTtbVq1e1ePFiJSUlKU+ePBkuosfGxqp69eqZvn98fLzmzZsnPz8/ffDBB7p48aI+/fTTLNUvSQ8//LCmTZum++67TwsWLNDLL7+c5nXDMDR79mz7v3/88Uf93//9n0aNGqUOHTrIZrPJMAy1bdtWb7/9tj3XsWNHnTt3LsOHr96K06dPZ/gw0YwkJSVp9+7dGj58uL2mVFevXlXPnj21detW1a5dW40aNdK5c+f0448/ateuXfruu+/SHIMiSYcOHdK7776rChUq6IknntBvv/2m77//Xlar1eFZ64ZhaOTIkW5bQJekU6dOSVK6X36lysrPbUYCAgLUpk0bzZw5U9u3b1edOnXsr/3xxx86ceKEnn322TRH/Lz66qv66aefdO+99+rpp59WXFycVq5cqS5dumjp0qUuWWi+mX379qlz585KSUlRy5YtVahQIe3evVsTJkzQmTNnNGLEiDT5Y8eOqUePHrrvvvvUoUMHbdq0SZ9++qn279+vTz/91L6YnZycrBdffFGbN29W7dq11aBBAx0/flw//vijtmzZoiVLlmT5L0kcKV68uOLj43XhwgXORQcAAPBxLKIDAGCyLVu26Pjx43ryySf17rvv2q9/8MEHWrlypY4fP67SpUtLuvawy/Xr1+uhhx7SlClT7Dszv//+e73yyiuaMmWK/TzmDRs26KuvvlLlypU1e/Zs+9ERv/zyi1566SW9+uqrWrVqVbrdncuWLVNcXJxmzJiR7jgKSUpISNDgwYOVJ08eLVmyRHfccYckacCAAXr00Uf1+eefKyoqSgULFsz29+KVV16Rv7+/8ubNq/DwcPv1+Ph4jRgxQrGxsXr11VdVtmxZJSUlZbiwZbPZlJiYqPPnz9uvNW3aVBaLRZI0ePBgrVmzRtu3b083LtWlS5d06dKldLunpWs7m1N/qREeHq65c+dq+/btevDBB5WYmKg2bdooNDRU27ZtU9euXdWtW7d0519HR0frySeftC9IN27cWI0bN04313fffae//vpLhQoV0vnz51WvXj0tWbJE48ePV4sWLXT16lVJ146HcYfExMSbHkFSuXLlNP/28/PTs88+q86dO9uv/f7779q6dav9lwipqlevrtGjR2vDhg1q06ZNmvf58ssv9eyzz2rYsGHy8/NTfHy8mjdvrg0bNujKlSvpftEjSaNHj9bChQvdtoAuXftZlaSQkBCXv3e7du3su/evX0T/4Ycf7K+nunTpkn766SeVLVtW8+bNs//MNmzYUO+//7527NjhlkX0L774QvHx8Zo4caJatWplv/7EE09o4cKFGjZsWJpd9bGxsYqKirL/8iU+Pl7PPvus1q9fr7Vr16pp06aSpK+//lqbN2/Wiy++qFdffdU+ftasWRozZoxmzpypN95445ZqT/1Zv/4vQQAAAOCbWEQHAMBkqbsljxw5ori4OOXLl0+S9Prrr+v1119Pk126dKmkawvB1y9+N2vWTBMmTEhzfMS3334rSRo0aFCahc+GDRuqWbNmWr16tTZt2qSHH344zRzHjh3TrFmzdP/992dY78aNGxUbG6uIiAjNmzcvzWv58uXTqVOntHPnzgwXhW8moweCJiQkqE+fPoqNjVW/fv3UuXNnNWrUSK1bt9abb75pz12+fFnvvvuuXnvttSw/DPR615+lnnoG+Y1H3kjXdlhfv2AbGhqqBx98UNK1hdPUxdPjx49LksqWLZvuPc6ePStJme7qTkpK0sSJExUUFKSOHTtq2rRpKlSokJ577jlNnTpVU6dO1ZNPPilJKlKkSHZu1WmhoaH677//Ms307NlT0rXz0w8ePKixY8emWdyVpAcffND+VwKp/v77b+3Zs0fStSNrblSiRAm9/vrr9p3I4eHhqlmzplauXKn//vsv3YLwe++9p7lz56pKlSpuW0CXZK/v+l/KuEqVKlVUuXJlrV69WiNHjlRAQIBSUlK0cuVKlS9fXtWqVbNn8+TJo/DwcJ0/f15///23ypUrJ0lq3ry5mjdv7vLaHBk/frzGjx9v/3dSUpJ27NihixcvKjExUadPn7b/Ik6SgoOD0/xFRnh4uLp166ZXX31V69atsy+iL1++XNK1I2s++ugjez4uLk7StV9O3qrY2FhJ7vslFQAAADwXi+gAAJjs3nvvVdu2bbV8+XI98MADqly5siIiIlS3bl01a9YszWL5kSNHFBISYl8QSxUSEqJHHnkkzbU///xTkjI8+7hq1apavXq1/vzzz3SL6I0bN3a4gC5JR48elXRtoTl1sflGp0+fdnzD2XDs2DH16dNHBw4cUP369dW3b19J184qXrJkiXr27KnixYvLZrPplVde0c8//6z9+/dr7ty52V74uueee+w7/n/++WdJ13a1fvXVV5o/f75q1aolm82mlJSULL1fdHS0pPQ7s6WsLaJPnjxZJ06cUOfOndMsMnbp0kV//fWXOnToYO/F7bffnqWabtWdd955094OHDhQklSzZk29+OKLWrJkSbpFdOna92D+/Pnatm2b9u/frwsXLth3JGf0PW7RokW6v5pI7bFhGGmuL1y4UKdPn1aFChW0f/9+/fzzz+l+znNK6i/BUhdzb9SpUyft27dP69atc+q4kccee0xjx47V5s2b9eCDD2r79u06c+ZMmp3+0rXjX9544w2NHj1arVu3Vrly5RQREaEaNWqodevWTv2iyVlbtmzRihUrtGvXLh05ckTJyclpjqi6XokSJdId5VOxYkVJ//vFlCT99ddfkpTmuKPrueIz6PTp08qXLx8PgAUAAID8bx4BAAA57cMPP9SiRYvUt29flSlTRr/99psGDRqktm3b6uLFi1l6jytXrshqtaZbUMzuA/HuvvvuTF9Pff+hQ4fqwIEDGX49/fTT2ZozI99++62eeOIJHTp0SJLSHA/Tp08fXblyRSNHjlRiYqL69++vn3/+Wc2aNdPXX3/t1M7RgQMH6q233pLNZtOqVatUrVo1BQQE6MSJE5KuLeKOHDkyzTEzjqSkpOi3335TWFiYIiMj072euoherFixDMdv2LBB06dPV8GCBdOdL1+oUCF99NFHqlChgv2hnamLjDntnnvu0aZNm7KUbdiwoapWrarNmzdr165daV6Ljo5WixYt9Pnnn6tQoUJ68cUXNX36dIdnm0sZ7+h35PTp03rppZe0YMECFS1aVO+8847bjuRI/euFEydOZLgb/ezZs0pOTk63UJxVbdq0UUBAgP0Ilx9++EF+fn5q27ZtuuxTTz2ln376ScOHD1etWrV09OhRvf3222ratKl2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zdSyZUsVLVpUc+fO1TPPPKPo6Gi9/vrrqlOnjlq3bq2+ffvaF+hatmypevXq6cMPP9SmTZs0efJkPfnkk/YF9H///Vfdu3fXL7/8otdee0116tSxz3/9Ltd9+/Zp3rx59oe2Xu/vv//W008/rS1btqh+/foZLuIZhqGtW7fqwIEDaXZL30xycrKk/z1wc8eOHZo3b57Cw8Ptx85cz2azZXo0yq1o0qSJOnbsqEGDBmn//v03zbdt21Z33nmn1q9fbz9GaMCAAerVq5eSkpI0Z84c7d27V88++6xmz54tf39/rVu3zqVnmNeqVUutWrXSr7/+qtWrV7vsfR3x9/fXxIkTNXz4cAUHB+ubb77R33//rWeffVZz58695YXZsLAw+4Jy06ZNM3y/4OBgzZkzR3379rU/xHX58uUqXry43n77bfXu3fuWasiK4OBgzZw5U02bNtX27ds1b948BQQE6KOPPrL/lcaKFSvSjClbtqw+/vhje82XL19W9+7d7TvDr3/vL774QoMGDZLNZtP8+fP1+++/q1mzZlqyZInuvfdep2o+efKkevbsqXr16umZZ55x/uYBAACQq/gZOfX/wwIAAHCBNWvWqE+fPpKku+66SyNHjlTt2rXT5Q4fPqxvvvlG3333nS5duqTHH39c77//vqRri88ZnW0eGxur2bNna9asWUpOTtbIkSPVsWNH++vdunXT5s2bNWLECIWEhOjDDz9UUlKSfvnlF/vZ66dOndJXX32lb775RklJSWrRokWGu/yjoqK0Y8cO+6L866+/rhdeeCFL34MZM2boww8/1MyZM3XnnXfq6aefVmxsrHr37q3+/funy7dp00bnz5/Xb7/9lqX3z66kpCR1795df/75p1auXOn0QzIBT3L16lW1bdtWAQEBmjt3bpafrwAAAIDcj+NcAACAR2vYsKHuvfde1a5dW/3793d4BE2FChU0cuRIDR06VH/88Ueao1IcPRz0559/1owZM1S5cmW98847aY5QkaTOnTvr0KFDGj16tKRrfzUwcODANItrKSkp+uWXXxQYGKg33nhDzz77bIZzde7cWUePHlVkZKTatm2r1q1bZ/l7kHr+fWJiosqUKaPRo0fr888/tz+4M6N8QkJClt8/u4KDg/XZZ59p06ZNLKAj1wgMDNSwYcNUpUoVFtABAACQBjvRAQCAx0tKSsqxh2cePXpUZcuWdfhQ0qw4fvy4goODVaxYMRdW9j+xsbE6d+6cSpQoYT+6wzCMW6oZAAAAAJA1LKIDAAAAAAAAAOAADxYFAAAAAAAAAMABFtEBAAAAAAAAAHCARXQAAAAA8DKJiYk3zXByJwAAgGuwiA4AyFV+/PFHffvttw5fX7p0qb7//vssvZfValVSUpJSUlKyPP/Vq1dltVp14cKFLI+B50pOTtaVK1fMLgNALvD999/r4sWL9n9fuXJFo0eP1rBhw7L9XhcuXNADDzygbt266dixYxlmbDabHnnkEfXs2VP//fef03UDAABACjS7AAAAXOnTTz/VsWPH9MQTT2T4+pgxY1SgQAE9+uijN32v4cOHa8WKFU7VUaRIEW3cuNGpsTBHSkqKzp49qyNHjujAgQPavXu3fvnlF/Xv319dunQxuzwAXuz06dMaPHiwbrvtNq1Zs0ZBQUEKDQ3VwYMHtXPnTj3//POqUKFClt9vypQpiouLk81mU1JSkg4fPizp2i/+goODVb58ef3www86fPiw7r33Xt122232sYZhKCEhQaGhofL3Z08VAABAVrCIDgDwaufPn9dff/2lkJAQhYSEKCAgQEFBQfYFhRsFBgbaXzcMQ4mJiSpYsKDuvPPOdNk6deqoUKFCCgwMVEBAQJrXfvrpJx07dkwdO3ZU3rx57devXr2qpKQkhYaGuvZGkSPOnj2rXr16KTY2VmfOnFFycrL9tdDQUN155506dOiQiRUCyA2mT5+u5ORkdevWTUFBQfbrAwYMUOfOnTV69Gh99dVXWXqv7du3a+7cuZKkLVu2qHXr1mleb9GihcaNG6eJEydKuvYXWMuWLbO/brPZJElr165VyZIlb+W2AAAAfIafwUF5AAAvtmbNGg0YMMC+gG61WmWz2VSgQIEM83FxcfLz81PevHllGIaSkpLUrVs39e/fP1vz9ujRQz///LNHLkJERUVp69atOnDggNmleIWXX35ZNptNd9xxh0JCQjRjxgy9/vrrev755+Xn52fP7dy5U3v27MnwPQICAhQVFXXLtSQnJ+vzzz/X0qVLderUKeXJk0f16tXTxx9/fMvvDdzo8OHDeuqppzRkyBC1b98+w0xcXJymTp2qVatW6dy5c7rnnns0ZMgQRUZGpssmJSXpiy++sP/8VqhQQa+++qoeeOABl9U8cuRI/fbbb1q3bp3DzKZNmzRlyhTt379f4eHheuKJJ9SvXz8FBqbfP2SxWDRx4kTt2bNHfn5+atWqlV577TXlyZPHZTX/9ddfevTRR1W0aFGtWrVKwcHBaV7v37+/Vq5cqSFDhqhr166Zvtfx48fVoUMHXbp0SdOnT9fOnTs1efJkjR8/XhEREUpKSlJ4eLgWLlyo6dOnq0ePHqpRo4ZmzpypvXv36oMPPlBycrISExPVrFkzl94nAABAbsZOdACAV2vatKksFov931FRUTpy5IjDo1QeffRRhYeHa8GCBe4qER5u0qRJ9v/78OHDmjFjhsLDw9MsoEvXFuYmT56c4XuEh4e7ZBF94sSJmjFjhu6//341b95c58+f1x9//HHL7wvcKDY2Vj179tSlS5ccZqxWq7p166bo6GhVq1ZNLVq00C+//KKoqCgtWrQozfEjNptNL7/8stavX68KFSqoc+fO2rFjh1588UXNnDlT9erVu+WaZ82apfnz52f4l0Opvv/+e7322msKDQ3Vo48+qqSkJM2YMUNnz57Ve++9lya7detWde/eXTabTa1bt1ZYWJiWLl2qv/76S19++WW6zwBnpKSkaOjQoUpOTtagQYPSLaBL144O27x5s8aNG6eKFSvqwQcfzPC9oqOj1adPH8XGxqp///6qX7++QkJCNHnyZB0+fNh+TNnGjRs1c+ZMVa1aVQMGDJC/v7/++ecfbd26VQUKFFDt2rVv+b4AAAB8DYvoAIBc59y5c6pcubLD1++99143VuN+Y8eOVUJCgtll5DqpR/T89NNPKlGihP16165d9eeff7pkju+++06lS5dOs4CXnQfbZuT48eNq0qSJHn/8cb3//vuuKNMnbNmyRV26dFHfvn3Vr18/s8txqUOHDql37976559/Ms1NnTpV0dHReuSRRzRu3Dj5+/urX79+euyxxzRs2DDNmzfPnp0/f77Wr1+vWrVq6csvv1RwcLBsNpuioqI0dOhQrVq1Ks0xJtmRkpKiiRMnatq0aZnmzp07p5EjRyooKEhz5sxR1apVJUk1atTQm2++qdatW9sXqBMTEzV48GAlJSXps88+08MPPyxJatasmbp3764FCxaoU6dOTtV7vZkzZ2rHjh2qUaOGw2dxFC1aVO+//7569+6tfv36adKkSWrQoEGajGEY+vTTT3X69Gk99thj6tWrlyTp7rvv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Z8+etX/GPPbYY9q5c6c2bNig06dPa8mSJU4d9ZPVo4cuX74sSQ4/v/Lly6fTp09nKZs/f357Vrr2M79u3TrNnj1b7du311133aWjR4/qiy++0F133aU+ffo4XXN4eHiGf3GU+vP+77//Kl++fPaab7vttnTZAgUKSLp2vJIzi+g//vij/aiYN954Q/fdd1+2xr/++uuqV6+ehgwZotdff93+39SyZcv04YcfKjg4WP7+/rp06ZJ2796tRo0aKSkpSVFRUfbPwkuXLuns2bPp3vv6XxoCAAAg61hEBwB4rX/++UcXL160H70iSQkJCbLZbDp8+HCGY5KTk5WYmJjm9eTkZNlsNvuOxAEDBtx07iNHjujYsWPq0aNHuh3BrnDmzBmNGDFCISEhWrRokf2M85dfflmtWrXS119/re7du6to0aJOzxEXF6dXXnlFnTt3Vq9evZQnT550mVGjRunYsWPq37+/evfubb8+cuRIzZ8/X/Pnz9eLL77o1PzVqlXTF198of3796tdu3aSpLlz59p/WXDq1ClJ184oLly4cLpF9F9++UVxcXFpFqFvxaJFi/Tvv/9KunbkxVNPPaWqVavm+MM4r99x+9lnn6lkyZJprjkjf/789vc4fvy45syZo7vvvvuW3/dGy5YtU1xcnGbMmJHuQYjStf8eBw8erDx58mjJkiW64447JF37b+zRRx/V559/rqioKKf+oiFVVn6OP/roIx08eFBvvfWWnn76afv1d999V19//bUWL16szp07q1SpUvbv0ZYtW7R8+XLVq1fP5Q8W/fzzz2UYhhYuXKhq1ao5zC1YsEDNmjXThAkTFBQUJJvNpieeeEIxMTH666+/0v1lhiulLrRmtANaurbD/MqVK1nOXrx40f7vwMBAvf/++2rfvr1Gjx6t2bNn6+2335ZhGBo7dqz9F1fZ5e/v7/DIrtT3TH3ocmrNGeVvzGbXSy+9pCpVqqhevXoKDg7W1q1bFRYWpsDAQDVp0kTx8fHasmVLunGPPvqo/v77b/vxOTNnzkzzeu3atfXuu+8qODhYP/zwgxYuXKiIiAgNHTpUV69eVfHixe07/l955RWH9XE0FQAAQPaxiA4A8FrTpk3TokWLMnwts+Nczpw5k+71zHavm2HlypW6cuWKXnrppTQPCc2fP78++ugjnT171v6LA2ddunRJ7dq106uvvprh6xcvXtS6detUvHjxdA8g7Nmzp+rWrasyZco4PX/qcSOpO/lr165t3y16/e7+wMBAPfLII5o9e7b2799vPypkxYoV8vf3V5s2bZyuIVVcXJwmTZqksLAwJSQkqHDhwipSpIiWLFmiSpUq6YUXXrjlOXKjY8eOadasWbr//vszfH3jxo2KjY1VRESE5s2bl+a1fPny6dSpU9q5c2eW/kLEkZv9HKekpOj7779XYGCgTp06pY8++sj+2vnz5yVJv//+uzp37ux0Ddl1+vRpLV269KYPAM6TJ49GjRpl/289ICBA9evXV0xMjM6dO5eji+jh4eGSrv3FR0aSk5OVnJyc7Wyqu+66S3379tVHH32kgQMHauPGjerTp4/Tf1UiXft+xcbGOqzh+v+9vuaQkJA02dT7uLHm7Lj+KJXUne1JSUn6999/Hf7i5OzZs5k+/LpEiRL2v0wZM2aMpGv/HcXExKhKlSoqW7asfRF90qRJGf532aNHjwyfAwEAAIDMsYgOAPBagwcP1muvvabQ0FCFhIQoOTlZ/fv314YNGzR9+nQ98MADWr58ueLi4vT000/LMAz17NlTf/zxh32BIfXMa2d3HOaUI0eOSEp/XrakLJ1nnBXBwcEOFx4l6e+//1ZKSooqVaqU7s//r1/McdaNx+Bk9gC/xx57TLNnz9aKFStUpUoVJSQkaP369br//vszXXTKqlGjRum///7TgAEDNHHiRPn7+2vChAlq27atPvroI/uDFD2ZzWbLkWMabDabw9caN27scAFdko4ePSrp2kMqY2JiMsxcf8yHM272c3z+/Hn7Luhp06blSA0Zyez71qlTp5suoEvXHnB540M9U3dOG4ZxawXexO233y7p2i9KbnT16lVduHDB/kuvzLKS9N9//6W7D+naA3t/+ukn/fjjj6pcubJ69ep1SzUXL15ce/fu1cWLF+0L19fXIP1vQTv1c+PYsWPpFu5vzLrK3r17lZKSkuHnelJSki5cuKCKFSve9H02btyoAwcOyM/PT2fPntXUqVOVnJysb775xp4JCwvL8MgmHnINAADgnOwfpAgAgIfIly+fChYsqNDQUEVHR+upp57Shg0bNGrUKPui5xdffGFfFA0ICNBHH32kChUqqHv37powYYKSkpIUGhpqf7CgN7h69aqsVust7ZKUpKJFi6pYsWJOj7darW775UNkZKQqVqyoFStWSJLWr1+v+Pj4NGeHO2vFihX67rvv1KxZMzVv3tx+vVChQhoyZIiSk5O1Zs2aW54nJyUlJWV4/rErnDhxwuFrN9s1nLrQO3ToUB04cCDDr+uPV3HGzX6OU2uIiIhwWMOCBQtuqYaM3Mr3LVXZsmVdVE32VahQQSEhIYqOjk73WnR0tGw2m/04qQIFCujOO++UxWJJt7h/5swZnThxIsOjp6xWq33BOjY21n5OubNSv6979uxJ99off/wh6X9HmWQleyvHZWVkw4YNkq791c2NUv/7vdlnss1m0wcffKC7775bt912m4oWLarp06fr6tWr6tWrl+Li4iRd+wVF5cqV031t3brVpfcEAADgK1hEBwB4rStXrmjNmjV64YUX1LFjRx0/flxPPfWUChcurI0bN2rTpk1KTExUQECANm3apE2bNmnr1q2KiopSkyZNNG3aND300EN65513tGHDBodHEZgh9ZiGAwcOpHvts88+03333Zdm12FOKFOmjPz9/XXo0KF0u2pPnjyp++67T506dcrRGq7Xrl07HTt2THv27NGKFSsUHh6eZtHbGXv27NGwYcNUtGhRjR49Ot3rrVu31pdffpnmLPY1a9Zo2bJl9q9z587dUg3Z4efnJyn9Ludt27Y53PmclYdPOnrfCxcuaP/+/c6UKul/P8cZPaNg3759mjNnToaLtK5UuHBhFShQQH///Xe6/8avXLmiOXPmaNmyZenG3cr37ejRoy7Z3X6rRzbdipCQEDVo0EB//PFHuofqLlmyRJJUv359+7WmTZvqzJkz+umnn26aTTVq1CidOnVK3bt319mzZ/Xmm2/eUs3NmjWTpHSfjSdOnNCWLVtUtWpV+/n7Dz30kIKCgjRv3jylpKTYs5cvX9bq1atVuHDhDHeMOyshIUELFy5UWFiYHn744XSvpy6i3+wva6ZOnar9+/eneRZF1apVNXToUEVFRdn/ouedd97RihUr0n3dc889LrsnAAAAX8IiOgDAaz3//PPq06ePNm7cqLZt2+rHH3/Ur7/+qt69e+v5559Xt27ddPToUZ0/f17dunVTt27d1KtXL7333nuaNGmSPvjgA/n7+2v27Nk5/vDI7GrZsqVCQkI0Z86cNAuQV65c0cqVKyVJdevWzdEaChQooEaNGun06dPpjsFYvHixW2q4Xtu2beXv76+5c+fql19+UfPmze3nGjvj6NGjeumll5SYmKjx48dneNyElH7xb8yYMXr99dftX6lH77hDao2HDh2yX0tKStK4ceMcjilWrJiCgoLSHbVx9erVdO978ODBNJmJEyfKarU6XW/qcSTff/99mve22WwaPXq03n77bV24cMHp988Kf39/PfLII4qPj9fnn3+e5rXFixfr7bfftu8Qvt6dd94pKf0RJTf7vhmGoffffz/Hj1txhxdeeEH+/v4aNGiQ/vzzT/vDUL/99lvdcccdevDBB+3ZqKgohYWF6c0339SOHTskSevWrdO0adOUN29etWzZMs17//DDD/r+++/Vrl07vfbaa+rQoYNWrVplX3R3RpUqVdSgQQOtX79ekydPVnJysk6fPq1XXnlFycnJeuKJJ+zZ2267zf6Q1jfffFPx8fG6dOmSXn/9dZ0/f16PP/64S49HGj9+vM6dO6f27dsrX7586V5P/WVcZovoGzZs0Keffqrq1aurVatWaV7r0KGDunbtav/FTvHixVWhQoV0X44evAoAAIDMcSgeAMBrDRo0SMuXL1fXrl3tO16nTZumoKAgBQYGys/PT7169VJsbKzmz58vm82mixcvKj4+XtK1nc1NmzbVN998ozvuuEPBwcFm3k4axYoV0+jRozV06FA98cQTat68ufLmzauff/5ZJ06cUFRUlCIiInK8jjfffFP79+/Xxx9/rE2bNqlq1ao6ePCgNm3apFKlSt3yGcbZcfvtt6tOnTr2RbZ27drd0vsVK1ZMtWrVUq1atbL0y4DU3cY//fRTmvPgu3btqj///POWasmq5s2b64svvtD777+voKAgBQcH65NPPlFAQID9mIobBQYGqk2bNlq8eLH69OmjcuXK6fTp0zp16pTmzJkjSapZs6aKFCmiBQsWqFKlSrrrrru0ePFirVq1SjVq1NCuXbucqjcsLEzvvfee+vXrpyeeeEJNmzZVsWLF9Pvvv2v//v1q0aKFGjRo4PT3I6sGDhyorVu3avLkyfr1119177336t9//9WaNWt02223aeDAgenGlChRQvXq1dN3330nwzBUrFgxHTt2TIGBgZowYYKka7uZQ0ND9dlnn6lYsWIqVqyYZs2apcOHD6tixYpu+7nIKffdd58GDx6ssWPH6pFHHrE/eDc8PFzjxo1L85lZqlQpjRkzRoMHD9Yz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o1OnTkanTp2MP//801i8eLHRqFEj4/Lly069X3R0dLprVqvV2L59u2G1WrM8JrtzkHdf3tGYzPrsafdA3rkx9Nhz866agx67L++OOeixa/PumIMeuzbvjjnosbl5d8xBj12bd8cc3pD3ph67Y47cmDezx+6Yw9fyyB7bqUq57stZ06ZNM1588cU01xYsWGB07do1y+8xadIk49lnn01zbcSIEcZbb72V5tpHH31kDBs2zDAMw4iMjDR2796d5vWGDRsa27dvz075buXxZ6Lfytk8AAAAAAAAAID0ChUqpHPnzqW5dvnyZQUHB+fo++bUvDnJ4xfRMzubBwAAAAAAAACQfdWrV9ehQ4d06dIl+7Xo6Gjdcccdt/S+NWrU0K5du2Sz2TJ83+rVq2vHjh32144cOaLLly/f8rw5yeMX0W92hg4AAAAAAAAAIHsqVaqk8uXLa8KECUpJSdHevXu1evVqNW7cWCkpKbp06VKahfCseuCBB3T16lV98cUXkqT169drz549aty4sSSpbdu2WrBggQ4fPiybzabJkyfr3nvvVZEiRVx6f67k8Q8WDQwMVEhISJproaGhio+Pd/o9bxybkJCQ5n+zMia7c5B3bz6jMTfrs6fdA/nsj6HHnp13xRz02L15d8xBj12bd8cc9Ni1eXfMQY/NzbtjDnrs2rw75vD0vLf12B1z5La82T12xxy+lA8PD8/We/u6FKWYXYLL3cou6TFjxqhHjx5auXKl4uLi1K5dOzVs2FDHjx9XkyZNtHTpUkVERGTrPYOCgjRu3DgNHDhQs2bN0oULF9SnTx9VqFBBktS0aVP99ttvateunfLmzStJmjlz5i3cRc7zMwzDMLuIzCxcuFD/93//p8WLF9uvffnll/r99981bdq0bL+fxWJRYmJitsaEhIRkawx5c/OeWBN51+Y9sSby5s9B3rV5T6yJvPlzkHdt3hNrIu/avCfWRN78Oci7Nu+JNZE3fw5fy9esWTPLWUhX/61485CXCbz9z1saHx8fr23btqlQoUKqVq2ai6qSLly4oB07dqh06dKqVKlSutcPHTqkf/75RzVr1lTBggVdNm9O8PhF9EOHDql9+/bauHGj8ufPL0kaNGiQ8ufPr7feeivb72exWFS+fPk01xISEvTXX3+pbNmyCgsLSzfmyJEj6cZkhry5eUdjMuuzp90DeefG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Yk302Pw5vCHvTT32xJq8IW9mj90xh6/lgSZNmmT6+tq1azO8HhcXp9KlS6e5VqBAAcXExGT6fnFxcQoICEiz6J0/f36dPn06w/zUqVNVokQJNWrUSJJ09OhRNWzYUM8//7ySk5P19ttva+DAgVq0aFGm82bFnj17tHLlSh04cEBnzpxRQECAihYtqsjISLVs2VKVK1d26n19chEdAAAAAAAAgO/hTPT/CQwMVEhISJproaGhio+Pv+m44ODgNNfCwsIyHLd582bNnj1bX375pQIDry1Fpx77kurtt99W06ZNdeTIEZUvX96ZW9GBAwf09ttv68KFC2rZsqW6d++uokWLymaz6ezZs9q6dav69OmjSpUqadiwYSpZsmS23p9FdAAAAAAAAADwUo52mt9MoUKFdO7cuTTXLl++nG6BPKNxCQkJunz5svLmzSvp2u70G8cdO3ZMgwYN0qBBg1S7dm2H71esWDFJ0vHjx51aRF+4cKEmTpyogQMH6sknn0z3euXKlfXggw+qf//++vLLL/XUU0/pvffeU8OGDbM8Bw8WBQAAAAAAAAAfU716dR06dEiXLl2yX4uOjtYdd9yR6bhSpUqpSJEi2rFjh8NxsbGx6tGjhxo1aqTnn3/efv2///5Tq1at0uxaT32fEiVKZPseDh06pC+//FJz587NcAH9egEBAerevbumTJmid999N8193wyL6AAAAAAAAADgYypVqqTy5ctrwoQJSklJ0d69e7V69Wo1btxYKSkpunTpkmw2W7px/v7+at26tSZNmqTLly/r/PnzmjVrlho3bixJSkxMVPfu3VW4cGENHjxYVqtVVqtVSUlJuu2225Q3b14NGzZMFotF69ev1/Dhw1W/fn1VrFjRqXv4/vvvVaZMmSyPqV69un788Uflz58/y2NYRAcAAAAAAADgE4xc+HUrxowZo7Vr16p+/frq2LGj2rZtq4YNG+rkyZOqXbu2Dh48mOG4l19+WUFBQWrYsKEaN26s0ND/x969x9lY7v8ff68ZDAvDyCnlGDWLNQ5pSEjRgSmlA+1yyI5SDhUp1IgQkUh0stMBWwfa0WHbhdS3k5JUbpZDSe0Q2W0MaxqM9fujR/PbY6wx95p71nWvWa/n4zGPvWet93Vdn7uPx/3H5Xbd5XX77bdLkj7++GNt3LhRa9euVXp6us4991yde+65evDB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O+/UoUOHJP3/k1Q8Ho9SUlL06aef2pqvyE+i5+Tk5Nu1/19du3ZVTk5O3lPpoVBIubm5Onr0qK1ifvnlF02aNEmVK1eWJP3f//2fHnjgAT300ENKT0/X6NGjtXDhQvXr18/WvCc68eYSDAYVCATk8/nk9XoL5C3LsnVDIm82H25MYX122zWQj2wMPXZv3qk16HH08qZqoseR591YEz02vwY9Npt3Y0302PwasZCPpR67saZYyJvscTTWiLc8gIKmTp2q7t27q0ePHrrpppv0f//3f/rvf/+rv/71rxo5cqTt+Yq8iV6vXj0tX778pN89/vjjthc+USgU0pgxY1S7dm0dPnxYkvTCCy/osssuy3vKffTo0brvvvuKvYkOAAAAAAAAACidduzYoQcffFDNmzdX/fr19dVXX+mSSy7R0KFD9fTTT+uqq66yNV+Rz0UpW7Zs3pnnJWHhwoXatWuX7rnnnrzPNm3apI4dO+b9npaWpl27dum3334rsToAAAAAAAAAlE6hUOn7QUHVq1dXIBCQJJ177rlav369JKlRo0batWuX7fkierGo03744Qc9/vjjeuGFF5SdnZ33eVZWlurXr5/3e2JioipWrKi9e/eqWrVqJkoFAAAAAAAAALhYnz59NHnyZNWsWVNdunTRiBEjVKFCBX388cc666yzbM9nfBM9NzdXo0aN0i233KLmzZvr888/z/suMTFR5cqVy5cvX7583nEvkQoGg/l+/3Pj/n838E81xu4a5KObP9mYU/XZbddA3v4YeuzuvBNr0OPo5qOxBj12Nh+NNeixs/lorEGPzeajsQY9djYfjTXcno+1HkdjjdKWN93jaKwRT/mTvd8PiHf9+/fXaaedpmrVqql169a64YYbNH/+fKWkpGjq1Km25/OEQmYf+n/yySf10Ucf6e9//7sSExP1+eefa8yYMXr//fd14YUXavz48ercuXNevnXr1nrxxReVlpYW0XqWZSknJ8fWmKSkJFtjyJvNu7Em8s7m3VgTefNrkHc278aayJtfg7yzeTfWRN7ZvBtrIm9+DfLO5t1YE3nza8RbvnXr1kXOQmr08mTTJThu+433my6h1DO+id65c2f95z//UdmyZSX98WR6dna2KlWqJJ/Pp+bNm+vee++VJG3fvl3dunXTJ598ourVq0e0nmVZatSoUb7PsrOztWPHDjVo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AAAAAAAAAAAojjZt2ujYsWPq0KGDhg0bps6dO5/0XZhFZWsTfcGCBXrqqac0cuRIXXLJJapSpUq+77///nu99NJLmjJliipVqqRrr7024sIAAAAAAAAAALBr7NixuuSSS1S5cmVH5rO1if7cc89p4sSJuuSSS076/VlnnaUJEybol19+0auvvsomOgAAAAAAAAD3CHlMV4AouOaaaxydz9bh5bm5udqzZ88pc7///ruSk5MjLgoAAAAAAAAAADew9ST69ddfr2nTpiknJ0dXXnmlatasme/7QCCguXPn6quvvtLf//53RwsFAAAAAAAAACDaPKFQKFTUcCgU0hNPPKHnn39eR44cUZUqVZScnKyEhATt2bNH2dnZatq0qUaNGqW2bduWZN0RsyzLdAkAAAAAAACAI/x+v+kSYkqDF6aZLsFxO/56n+kSSj1bT6J7PB7dddddGjBggL766ivt2bNHOTk5KleunKpVq6bU1FSdeeaZJVWrY068uQSDQQUCAfl8vpO+pdWyLFs3JPJm8+HGFNZnt10D+cjG0GP35p1agx5HL2+qJnoced6NNdFj82vQY7N5N9ZEj82vEQv5WOqxG2uKhbzJHkdjjXjLw56iP04M/H9F3kT/97//rbp160qSKlWqpAsvvNDWGAAAAAAAAAAAYk2RXiz63Xff6YYbbtCKFSuKPPGCBQvUt29fHTx4MOLiAAAAAAAAAAAwqUib6I0bN9a8efP0yCOPaNSoUfr111/DZv/973/r9ttv1+uvv65FixYpOTnZsWIBAAAAAAAAAIimIh/n4vP59M477+ipp55SRkaGmjVrplatWqlGjRoKhULau3evPv/8c/34448aMGCA+vfvrzJlbB25DgAAAAAAAAAlhzPREQFbu9zly5fXiBEjNHToUH388cfasmWLvvvuOyUkJKhGjRoaOnSozj//fDbPAQAAAAAAAADGHDhwQO+//7527NihPn36aN26dapTp46aN29ue66IdrvLlSunzp07q3PnzpEMBwAAAAAAAACgRAQCAfXv31+HDh3S8ePH1a1bN61du1avvvqqnnrqKV144YW25ivSmegAAAAAAAAAAMSCiRMnKj09XZ9++qlCoT/O8Bk7dqx69+6txx9/3PZ8bKIDAAAAAAAAiA8hT+n7QQF/PolepUqVfJ9feuml2r59u+352EQHAAAAAAAAAJQaNWrUUCAQKPD5N998o5o1a9qezxP683n2OGFZlukSAAAAAAAAAEf4/X7TJcSU+s89aroEx/048F7TJbjOokWLNGXKFN14441asGCBhg8frv/+979atGiR7rvvPvXu3dvWfBG9WDTWnXhzCQaDCgQC8vl88nq9BfKWZdm6IZE3mw83prA+u+0ayEc2hh67N+/UGvQ4enlTNdHjyPNurIkem1+DHpvNu7Ememx+jVjIx1KP3VhTLORN9jgaa8RbHkBBN910kypUqKA5c+YoFAppxowZqlOnjh588EFdd911tueLy010AAAAAAAAAEDpdc011+iaa67R4cOHFQqFVKlSpYjnYhMdAAAAAAAAQFzwxNXB1pCkihUrFnsOXiwKAAAAAAAAACg13nzzTf3www+OzccmOgAAAAAAAACg1Jg5c6Y++eQTx+ZjEx0AAAAAAAAAUGpcccUVevfddx2bj010AAAAAAAAAPEhVAp/UMCdd96pihUr6q677tKePXuKPV+Jvlj0yJEjKleuXEkuAQAAAAAAAABAnq5du0qSdu3apdWrV6tGjRr5vl+1apWt+Wxvou/bt08XXXSRvv76a5UpE374sWPH1KdPHw0fPlzt2rWzuwwAAAAAAAAAALYNGzbM0flsb6InJSXp2LFj6t69u0477TSdeeaZaty4sVq3bi2/36+yZctKkiZPnqwtW7aoevXqjhYMAAAAAAAAAEA411xzjaPzeUKhkK2Tc7KyspSenq7HHntMv/76q/bu3avt27fr66+/VigU0rXXXqujR4/qlVde0aOPPqpu3bo5WnBxWZZlugQAAAAAAADAEX6/33QJMaXBs9NNl+C4HYNGmi7B1fbv369QKKSUlJSI5yjSk+ihUEjbt2/XWWedJUnyeDy64oor8mWOHz+umTNn6m9/+5s8Ho/GjRvnug30P514cwkGgwoEAvL5fPJ6vQXylmXZuiGRN5sPN6awPrvtGshHNoYeuzfv1Br0OHp5UzXR48jzbqyJHptfgx6bzbuxJnpsfo1YyMdSj91YUyzkTfY4GmvEWx7Ayb311luaNWuWdu7cKUk644wzdNddd6l79+625yrSJvrnn3+u/v37q3HjxkpPT5f0x0tDf//9d23atElr167VihUrtHv3bv31r3/V8ePH9cwzz+jiiy9WrVq1bBcFAAAAAAAAAEAk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vPNO3X333Q6WAwAAAAAAAACAe3hCoVAokoFPPvmkZs+erRkzZigjI8PpukqMZVmmSwAAAAAAAAAc4ff7TZcQUxrOfsx0CY77Ydg9pkso9SI6zmX58uV68skn1bNnT3k8Hn399deqXbu2atasqYSEiB9uj5oTby7BYFCBQEA+n09er7dA3rIsWzck8mbz4cYU1me3XQP5yMbQY/fmnVqDHkcvb6omehx53o010WPza9Bjs3k31kSPza8RC/lY6rEba4qFvMkeR2ONeMvDHk9EjxOXXvv27dODDz6ozz77TA0bNtTkyZOVmpp6ynG5ubmaPn26/vGPf8jr9eree+/N96D1jh07NHbsWFmWpbS0ND3yyCOqU6dO3vdvvPGGZs+ercOHD6tXr14aPny4q/eVbW+iL1iwQI888oiuvvpq9e/fX1dccYU8Ho8kKSEhQTVq1FDt2rXVsmVLDR06VJUqVXK8aAAAAAAAAABA5EKhkIYOHSpJWrJkib799lsNHjxYb731lipWrFjo2Mcff1zLli3T7NmzVbZsWQ0bNkz169dXs2bNlJOTowEDBig1NVXLli3T8uXLNXToUC1ZskQJCQn6v//7Pz3wwAN66KGHlJ6ertGjR2vhwoXq169fNC47IkXe3t+xY4cGDBigKVOmaODAgZoyZUre5vnq1av18ssva+bMmRowYICaNm2qV199VTNmzCixwgEAAAAAAAAAkfnqq6+0fv16TZo0SWeddZauueYaNWzYUCtXrix03JEjR7Rw4UINHTpUbdq0UatWrdSvXz8tWrRIkvTuu+9q3759mjRpkurVq6dBgwYpOztbX331lSTphRde0GWXXaaePXuqQYMGeZvoblakJ9H/8Y9/KDMzU36/X6+88oqaN2+e953H41Ht2rVVu3btfGMSEhL0/vvv68EHH3S2YgAAAAAAAACAJKlLly6Ffr9q1aqTfr5p0ybVqVNHjRs3zvusVatW+uabb3T11VeHne+HH35QMBhUx44d841788038+ZNS0tTSkpK3vctW7bUN998o/POO0+bNm3Sfffdl/ddWlqadu3apd9++03VqlUr/GINKdImenp6up566ilddNFFRZ64Xr166tWrV6R1AQAAAAAAAICzQh7TFbhGVlaW6tWrl++zKlWqKBAInHJcYmKi6tatm/dZcnKy9uzZU+i8//t9/fr1875LTExUxYoVtXfv3tjeRK9bt26+/yhF4eYzbAAAAAAAAACgNAj3pPmplClTRklJSfk+K1++vILB4CnHlStXLt9nFSpUyBuXmJioxMTEAvPu27cv7/sTx5cvX16HDx+O6Dqiochnon///fcn/TwUCqlVq1bq1auXZsyYoR9++MGx4gAAAAAAAAAAzktJScnb2P7ToUOHCmxwn2xcdna2Dh06lPdZVlZW3rhTzRvpuiYVaRN97969uu6669SnTx+tX7++wPdjxoxR8+bN9c477+jKK6/U9OnTFQqFHC8WAAAAAAAAAFB8LVu21LZt23Tw4MG8zzZs2KDTTz+90HF169ZV9erVtW7dupOOa9WqldavX6/c3NyTft+yZct8Y7dv365Dhw6dcl2TirSJXrNmTc2YMUPHjh3TTTfdpHvuuUf79+9Xbm6uPB6PevbsqczMTK1YsUL333+/XnrpJY0ePbqkawcAAAAAAACAoguVwp8INWnSRI0aNdKMGTN0/Phxbdy4Ue+99546d+6s48eP6+DBg/k2wv+UkJCgjIwMPfHEEzp06JD++9//6sUXX1Tnzp0lSe3bt9exY8c0b948SdLq1av17bff5n1/1VVX6bXXXtP333+v3NxczZ49Wy1atFD16tUjv5gS5gnZfGR85cqVGj9+vDwej4YNG6bly5fr2Wefzfe4/ZtvvqlRo0Zp/PjxuuGGG04554IFCzRp0qR8n40ZM0b9+/fXt99+q4ceekjbt29X+/btNWnSJFWtWtVOyflYlhXxWAAAAAAAAMBN/H6/6RJiSqPHZ5guwXHb7x4R8dhNmzZp0KBBOnr0qLKysnT11Vdr8uTJ+vnnn9WlSxctXbpUPp+vwLisrCzdeuut2rp1q0KhkOrXr6+FCxeqUqVKkqSPP/5Yw4cPV9myZbV//34NHjxYQ4cOzRs/fvx4LVmyJC///PPPq2nTphFfx5++//57fffdd2rRooVq164t6Y/97CNHjqhZs2b5Xmhqh+1NdEk6cOCAxo4dq/fff1/jx4/X9ddfXyAzYcIEvfPOO1q+fPkp36o6YsQINWzYUDfffHPeZ+XLl9fBgwfVrVs3XXHFFRowYIBeeOEF7d27V3PmzLFbch7LsgrcXILBoAKBgHw+n7xeb5HG2F2DfPTy4cYU1me3XQP5yMbQY/fmnVqDHkcvb6omehx53o010WPza9Bjs3k31kSPza8RC/lY6rEba4qFvMkeR2ONeMvDHjbRCwoGg1q7dq1SUlLUvHnzIo87fvy41q1bpyNHjqhNmzYqW7Zsvu/379+vdevWqV69emrSpEmB8du2bdNPP/2k1q1bF+uhaUk6ePCgxowZo1WrVsnj8ehvf/ubOnToIEm66aab9NVXX8nj8ahTp0567LHHVLFiRVvzl4mkqCpVquiJJ57Q1KlTNW7cOLVp00b16tXLl7ntttu0c+fOAm94PZn169erd+/eSk5Ozvf54sWLVaFCBT3wwAMqW7asRo0apY4dO+qXX37J+5sEAAAAAAAAAEBkvF6vOnXqZHtcQkKC0tPTw35ftWpVdenSJez3TZo0OenmeiTGjx+v7du367nnnlNaWpqqVKmS993ChQu1f/9+ffnll5o4caImTZqkKVOm2Jq/SGeihzNq1Cg999xzBTbQJal27dp65plnTrmr/8svv2jXrl2aMGGC0tLS1KVLF82fP1/SH/+coF27dnl/i5GUlKTU1FR9/fXXxSkbAAAAAAAAQDwyfX65i85EL01Wr16tMWPGqEOHDvk20KU/NvurVaumyy67TJmZmXr33Xdtzx/Rk+j/q127dmG/83g8pxy/efNm1atXTyNGjJDP59Onn36qzMxM1a9fX1lZWUpNTc2Xr1Klivbs2VPcsgEAAAAAAAAApUDlypX166+/njKXlZV10uO8T6XYm+jFddFFF+miiy7K+71Hjx769NNPtWzZMiUmJhY4DqZ8+fIKBoPFWvPE8dnZ2fn+tyhj7K5BPrr5k405VZ/ddg3k7Y+hx+7OO7EGPY5uPhpr0GNn89FYgx47m4/GGvTYbD4aa9BjZ/PRWMPt+VjrcTTWKG150z2OxhrxlI9kQxAobfr06aNJkybp4MGD6tq1q04//fR83x86dEgrV67UlClT1KdPH9vzR/Ri0ZI2ffp0ffHFF6pXr56qV6+u0aNH5313++23Kz09XQMGDIhobsuylJOTY2tMUlKSrTHkzebdWBN5Z/NurIm8+TXIO5t3Y03kza9B3tm8G2si72zejTWRN78GeWfzbqyJvPk14i3funXrImchNZpZCl8sOrx4LxYtLZ599lk988wz+v3331W+fHklJycrMTFRhw8f1sGDBxUKhdSzZ0899NBDSkiwd8q58U302bNnKykpSbfddlve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vK6//npH5mMTHQAAAAAAAEB8CJkuANFQpUoVpaSkODZfiR7nkpiYqPnz56t+/foluQwAAAAAAAAAAJKkIUOG6NFHH9XevXsdma/YT6KvWbNGy5Yt048//qgpU6borbfeUuXKlXXzzTdLktq0aVPsIgEAAAAAAAAAKIrdu3erfPnyuvzyy9WlSxfVq1dPCQn//3nyoUOH2pqvWJvo77zzju655x41bdpUgUBA2dnZSklJ0bRp05Sbm6tbbrmlONMDAAAAAAAAAGDL559/rsqVK8vv92vPnj35XjDq8Xhsz1esTfQnn3xSgwcP1p133qnU1FRJUu/evZWYmKjnnnuOTXQAAAAAAAAA7sGZ6HFhwYIFjs7nCYVCEf/RadGihZ5//nm1bt1aqampWrp0qVJTU/XFF19o4MCB+vbbb52s1RGWZZkuAQAAAAAAAHCE3+83XUJMSR0303QJjtv80HDTJcSM48ePa926dUpPT7c1rlhPop9zzjl666231Lp1a0n//1H4t99+O+/JdDc68eYSDAYVCATk8/nk9XoL5C3LsnVDIm82H25MYX122zWQj2wMPXZv3qk16HH08qZqoseR591YEz02vwY9Npt3Y0302PwasZCPpR67saZYyJvscTTWiLc8gIL+/e9/68EHH9TXX3+t33//vcD3gUDA1nwJp46EN3LkSL3++uu65ppr5PF4NGfOHF133XV64403dM899xRnagAAAAAAAAAAbHvooYd05MgRDRkyRB6PR88884wefPBBlS1bVpMnT7Y9X7E20du0aaM333xTqamp8vl82rlzp5o0aaJly5apbdu2xZkaAAAAAAAAABzlCZW+HxT09ddf66677tLAgQNVo0YNlSlTRjfeeKMGDhyoJUuW2J6vWMe5SFLDhg01ZcqU4k4DAAAAAAAAAECxJSUlKSsrS5LUsmVLbdy4Ue3bt9cFF1ygefPm2Z6v2JvoAAAAAAAAAAC4RZcuXTRu3Diddtppat++vZ577jm1bNlSb7/9tk477TTb8xXrOJcHH3xQa9asKc4UAAAAAAAAAAA4ZsyYMbr44ov1yy+/qEePHqpatar69eunxYsXa/DgwbbnK9aT6OvXr9eZZ56p888/vzjTAAAAAAAAAEDJ4wzxuFChQgVNnDgx7/dXXnlFW7duVdWqVVW7dm3b8xVrE/3mm2/W3Llz9Ze//EXJycnFmQoAAAAAAAAAgGLbsGGDli5dqmAweNLv7b7js1ib6BdccIE2bdqknj17asSIEUpLS8v3fZ06dYozPQAAAAAAAAAAtgwePFhVq1ZVs2bN5PF4ij1fsTbRO3funPf/77rrrryCQqGQPB6PAoFA8aoDAAAAAAAAAMCGsmXLauTIkerUqZMj83lCoVDEJwHt3Lmz0O/POOOMSKcuMZZlmS4BAAAAAAAAcITf7zddQkxpmjnTdAmO2zRpuOkSXOfDDz/U2LFj1adPH9WsWbPA9z169LA1X7GeRHfjJnlRnHhzCQaDCgQC8vl88nq9BfKWZdm6IZE3mw83prA+u+0ayEc2hh67N+/UGvQ4enlTNdHjyPNurIkem1+DHpvNu7Ememx+jVjIx1KP3VhTLORN9jgaa8RbHkBBU6dO1W+//aZXXnmlwHcejye6m+i7du0q9HvORAcAAAAAAAAARNP+/fv1zDPPqEOHDo7MV+wz0Qs7mJ0z0QEAAAAAAAAA0XTbbbfp2WefVeXKlVWjRo0C39t9+LtYm+irVq3K+//Hjx/XL7/8on/+859atWqVZs2aVZypAQAAAAAAAMBZEb8dErHkkUcekSTdcMMNeZ95PB6FQiF5PB7bD387eiZ63bp1lZ6errS0NP3tb3/TU089VZzpAQAAAAAAAACw5X8f/nZCsTbRw7n66qs1ZcqUkpgaAAAAAAAAAICwTnz4u7gSHJ1NUk5OjhYtWlTg7c4AAAAAAAAAAJS02267TStXrnRsvmI9iZ6amnrSF4uWLVtWEyZMKM7UAAAAAAAAAOAszkSPC/v379fmzZt1ySWXODJfsTbR58+fX+CzxMRENWrUSCkpKcWZGgAAAAAAAAAA2wYNGqTx48erR48eOvPMM4s9X7E20du0aVPsAgAAAAAAAAAAcEpycrIuueQS9ezZU7feeqvS0tLyfZ+enm5rPk8oFIr4HzHs2rVLNWvWVJky+ffi33nnHe3YsUNDhgyJdOoSY1mW6RIAAAAAAAAAR/j9ftMlxJSm9880XYLjNk0ebroE10lNTQ37ncfjUSAQsDVfsZ5E79Kli5YsWaJmzZrl+7xKlSqaN2+eKzfRpYI3l2AwqEAgIJ/Pd9IXolqWZeuGRN5sPtyYwvrstmsgH9kYeuzevFNr0OPo5U3VRI8jz7uxJnpsfg16bDbvxprosfk1YiEfSz12Y02xkDfZ42isEW952OPhTPS4sHnzZkfnSyjO4HAPsZcrV04JCcWaGgAAAAAAAAAA42w/if7FF1/oiy++yPv91VdfVc2aNfN+z83N1YoVK3TxxRc7UyEAAAAAAAAAAA74+eefbb9s1PYm+s6dO/X555/n/W5ZlipWrJj3e1JSki6//HINHDjQ7tQAAAAAAAAAABTL/v37NX36dH399dfKzs7O+zw3N1e//vqrNm7caGs+25vo11xzja655hpJfxzQPnHixAJnogMAAAAAAAAAYML48eO1bds2nX/++XrllVc0btw4/fTTT3r++ec1evRo2/MV68WiAAAAAAAAABAzeLFoXPjss880Y8YMtW/fXsuXL1fDhg3Vq1cv/f777/roo4/Ur18/W/MV6+2fmzdv5il0AAAAAAAAAICrhEJ//I1JixYt8o5vufzyy/Xll1/anqtYT6LPmTOn0O+HDh1anOkBAAAAAAAAALDlggsu0OTJk/X444/r/PPP19KlS3XZZZdpzZo1+d7vWVTF2kT/3xeMhkIh7d69Wzt37lRKSoqaNGlSnKkBAAAAAAAAALAtMzNT9957rzZu3KjrrrtO8+fPV5cuXSRJd911l+35PKE/n2t3yLfffqv7779fw4cPzyvMjm3btqlnz5566aWX1KJFC0nShx9+qKlTp2rPnj3q1q2bxo4dq6SkpIjqsywronEAAAAAAACA2/j9ftMlxJRmo2aaLsFxG6cON12C6x0+fFhr1qxRSkqKzj33XNvjHd9El6Tt27frzjvv1Ntvv21r3NGjR3XDDTcoPT1dY8aMkSRt2bJF1113nQYPHqzu3btr2rRpqlOnTt73dlmWVeDmEgwGFQgE5PP55PV6izTG7hrko5cPN6awPrvtGshHNoYeuzfv1Br0OHp5UzXR48jzbqyJHptfgx6bzbuxJnpsfo1YyMdSj91YUyzkTfY4GmvEWx72sImOSBTrxaLhnH766dq9e7ftcU8//bQOHjyou+++O++zBQsWyOfzafDgwapbt64yMzO1ePFi5eTkOFgxAAAAAAAAAKC0eP3119W3b1916tRJ3333nSZOnKjJkyfr2LFjtucq1pnoS5cuLfBZdna23n77bZ199tm25rIsS88++6z69eun5cuX69xzz1WDBg20adMmXXTRRXm5WrVqKSUlRVu3blVaWlpx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l1/02GOP6bzzzlPNmjXVv39/7dy5U7/++qskaf369WrXrp2Sk5PzfsqXL1/k2nft2qVgMJjvsxUrVmjWrFlasmSJsrKybPyX+P94Eh0AAAAAAAAAYlSXLl0K/X7VqlW25tu0aZMuuuiivN9r1aqllJQUbd26VWlpaaccm5aWppSUlLzPWrZsqW+++UbnnXeeMjMz8+W3bdumqlWr6rTTTtPRo0e1YcMGHThwQGPHjlVycrKuu+463XnnnUpIKPxZ8D179ujee+/V2rVr9fe//13nnnuuQqGQ7rrrLq1YsUIVK1ZUTk6OZs2apfnz56thw4a2/puwiQ4AAAAAAAAgPpTQGeKxZvjw4froo49O+l2VKlVUr169Ap/t2bPnlJvoWVlZYceeKDs7W88++6z69eunxMREbdu2TcnJybr99tuVnp6ujRs36t5771WNGjXUu3fvQtfNzMzU7t27NWvWLPl8PknSvHnz9N577+nWW2/ViBEjdPjwYd19992aOnWqnnnmmULnOxGb6AAAAAAAAAAQo+w+aS79semcnZ190u9uueUWJSUl5fusfPnyBY5JOZnExEQlJiYWGLtv374C2YceekgVK1bUwIEDJUmpqan5NvZr1qypvn376s033zzlJvratWs1a9YsderUSZJ06NAhzZ07V+eee67uueceSVKlSpX017/+Ne93OzyhUCiu/v7FsizTJQAAAAAAAACO8Pv9pkuIKWkjZpouwXEbZgx3dL4bb7xRGRkZ6tu3b95n3bt315AhQ9S1a9dCx86cOVPbt2/X7Nmz8z6bNGmSjh8/rgcffDDvs4ULF+qJJ57Q4sWLVb9+/bDzvfzyy5ozZ44++eSTQte96KKL9MADD+jSSy+VJM2ePVtPPfWUXnzxRbVt2zYv995772nChAn6+OOPC53vRHH5JPqJN5dgMKhAICCfzyev11sgb1mWrRsSebP5cGMK67PbroF8ZGPosXvzTq1Bj6OXN1UTPY4878aa6LH5Neix2bwba6LH5teIhXws9diNNcVC3mSPo7FGvOUBp7Vs2VLr1q3L20Q/fPiwfvjhB9WpU+eUY1u1aqXXX39dubm5eU+kb9iwQZdcckleZuXKlZo2bZqeffbZfBvoixcvViAQyLfZvm7dOp1++umnXLdHjx56+OGHtWvXLv3nP//R888/rw4dOuRtoB86dEib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mw83prA+u+0ayEc2hh67N+/UGvQ4enlTNdHjyPNurIkem1+DHpvNu7Ememx+jVjIx1KP3VhTLORN9jgaa8RbHkDJ4zgXAAAAAAAAAPEhFCp9PyXgww8/VEZGhlq3bq3MzEzl5OQUeeyOHTvUt29ftWrVSv369dOuXbvyvuvcubPOOeecAj+zZ8+WJL3//vsFvnv44Ycdvz672EQHAAAAAAAAAEiStmzZoiFDhujKK6/U0qVLdeDAAc2YMaNIY3NycjRgwAAlJydr2bJlat++vYYOHarjx49Lkt58802tXbs272flypWqXLmyOnbsKElav369rr322nyZe+65p8SutajYRAcAAAAAAAAASJIWLFggn8+nwYMHq27dusrMzNTixYuL9DT6u+++q3379mnSpEmqV6+eBg0apOzsbH311VeSpEqVKik5OTnvZ+HCherUqZNatmwp6Y9N9Hbt2uXLlC9fviQvt0ji8kx0AAAAAAAAACgNunTpUuj3q1atsjXfpk2bdNFFF+X9XqtWLaWkpGjr1q1KS0s75di0tDSlpKTkfdayZUt98803Ou+88/Jld+/erVdffVXvvPOOJOno0aPasGGDDhw4oLFjxyo5OVnXXXed7rzzTiUkmH0WnE10AAAAAAAAAPGhhM4QjzXDhw/XRx99dNLvqlSponr16hX4bM+ePafcRM/Kygo79kQvvPCCLrnkEp1xxhmSpO+//17Jycm6/fbblZ6ero0bN+ree+9VjRo11Lt3bzuX5zg20QEAAAAAAAAgRtl90lySMjMzlZ2dfdLvbrnlFiUlJeX7rHz58goGg6ecNzExUYmJiQXG7tu3L99nWVlZWrx4sf7+97/nfZaamppvY79mzZrq27ev3nzzTTbRAQAAAAAAAADRc9pppxX63ck2vcuVK3fKeVNSUrR9+/Z8nx06dKjA2H/+858688wz1bRp00Lnq1mzpn7++edTrlvSeLEoAAAAAAAAAEDSH2eYr1u3Lu/3w4cP64cfflCdOnVOObZVq1Zav369cnNz8z7bsGGDTj/99Hy5N954Q927d8/32eLFizVhwoR8n61bt67AWBM8oVB8HQRkWZbpEgAAAAAAAABH+P1+0yXElK7NHjBdguP+tfFhR+fbtGmTevXqpRdeeEHp6emaOnWq3n77bX344YdKSEhQTk6Ojh49qkqVKhUYe/To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SkxMlMSLfWfyxx9/aOXKlfrhhx8kSY899pjWrVunixcv2mKeffZZtWzZUm+++aYSEhKYxepkrFarfv75Z40bN07Lly/XlStX1Lp1a61bt872MytRZ2d24cIFDRgwQOfPn1fjxo1VqVIl7dy50/bgSUl66aWX1KJFC40cOVIpKSlyd3c3MGPkVWRkpLp166a4uDhVr15d7dq105IlS3T69GlbTGhoqNq0aaPly5fr1KlTBmaL/Przzz915swZSVK1atXUuHFjrV27lnu1C4mOjlaPHj00btw4/f7779TYBSUkJGjHjh365ZdfVLp0abVo0eJvX3O5ublki8BlXbx4UUeOHNGePXtkMpkUEhKi9evX68KFC7YYagwAjuHSd8+uXbuqU6dOWrRokX766SdJ1xs4tWvXVoMGDbR27VplZGTwS8RJJCUl2V7wmUwmtWjRQlFRUdqzZ48txtfXV1OnTtWRI0cUERFhi0XhFx0drW7dumnx4sUaP368VqxYodKlS2vv3r368ccflZaWZosdNmyYKlSooM8//9zAjJEf69ev16uvvqoLFy5o+fLl2rFjh+rWratdu3Zp165dSk1NtcVSZ+eUlJSkn376SRMmTFDp0qXVvXt3zZ07V0eOHMkRN27cOPn4+GjdunUGZYr8iIqK0jPPPKPu3bvrkUcekZubm7p06aKkpCRt2LBBCQkJtthevXqpcuXK+vTTTw3MGPk1cuRIffbZZ5KkChUqqH379tqzZ4927dqV49MF3KudU1RUlHr16qXevXurc+fOKlWqlLp37277fczrLucXHR2tnj17aubMmRo6dKg2b96sxo0b85rLhcTExKh379564403NGzYMM2dO1dXrlzR4cOHtXv3bmoMAA7m0t3jUqVKadiwYbr//vs1e/Zsbdq0ydZQ9fb2VrFixZSZmWlwlvg7VqtVqampmjx5spYsWaLExES5u7vrmWeekSQtW7Ysx0fWSpcureeff14HDx7M8QcACq+kpCS9+OKLCg8P15o1azR58mRFRkaqQ4cO6ty5syIiIvTdd9/lmFHh7+/PEgFO5ty5c3rrrbc0duxYLViwQMOGDdN3332n/v37q2PHjlq4cKE2bdqkc+fO2Y6hzs6nevXquu+++3T48GH1799f/fv3V9euXTVq1Cj9/PPPtj/oSpQooRIlSuT4pAkKt9OnT6tHjx7q37+/XnnlFWVmZio6OlqNGjVSs2bNdOjQIX311Vc5lnapUKGCMjMz+VSYEwoODlaxYv99fFL79u11zz33aO3atbY172/gXu1cIiMj1bdvX73wwguaOHGi/P39tWTJEvXs2VOPPfaYFixYwOsuJ5eQkKCBAwfqySef1BdffKGxY8dq8eLF6t+/vzp06KCPP/5YmzZtyvHGJzV2LomJiRozZoy6d++uRYsW6f3331epUqVUs2ZN1apVSxEREdq0aRM/xwDgQC77YNEbAgICNHz4cC1btkyvvPKKVq1aJTc3N+3fv19Dhw6Vt7e30Snib5hMJnl5eSk2NlZHjx6Vp6enevTooYCAAE2fPl0vvvii5s6dq7CwMIWEhEi6/qLi4sWLLNXjJDIzM+Xj46MePXpIkjp27Kg9e/bo008/1ZIlS5SWlqavvvpKO3fu1KOPPqqUlBRFR0erb9++BmeOvLBYLKpWrZratm0r6XpD5uOPP9b27dvVunVrHT9+XJs3b9bOnTv1yCOPKDU1lTo7maysLJlMJpUtW1ZdunTRpUuX1L9/fy1atEgVKlTQ66+/rpCQEDVu3FgXLlzQmTNn1LBhQ6PTxm0ym82qV6+eevfuLYvFon79+ik5OVkXL15UmzZtlJaWpvj4eI0fP14hISHKyMjQ7t27NWHCBD4V5oRq166tJUuWKDg4WDt27NDOnTtltVp19uxZJSQkaOfOnWrevLnS0tK4VzuR8+fPq3///goPD9fw4cMlSY888ogWLVok6fqnhN577z1edzm5+Ph4BQYGatSoUZKuP6ti2bJl2rNnjx566CEdPnxYP/zwA6+5nNj58+dVunRphYeHy9vbW61atVJSUpLeeustrVmzRmvWrNGKFSv4OQYAB3L5Jrok25PmW7Vqpe+//15JSUl6++231bx5c6NTw22wWCxyc3NT1apVlZmZqR07dshkMqlHjx6qUqWKZs6cqXfeeUdLly7VnDlzFBgYqI0bN+rFF1/kTRInkZmZqYsXL+rKlSu2bU2bNrUtwzR69Ght3bpV+/bt07x582QymTRixAi1bNnSqJSRT+np6Tp16pRq1aqlpUuX6tdff1VycrIkqVKlSqpatap8fX0VEREhd3d36uxkbsxafeCBB5SYmKgXXnhBU6ZM0eDBgzVgwABZrVadOXNGa9askZubm4YMGaKmTZsanDVuV9OmTbVu3TotWrRIv//+u0qVKqV33nlHZrNZ+/btU2pqqmrUqKHAwECtXr1aJpNJL7/8stq3b2906siHqlWr6sqVKzpw4IBq1aqlvn37Kjk5WS+99JIsFovq16+vjz76iHu1kylRooRmzZqlhx9+2LatRYsWmjp1qhYuXKgBAwbYXnft379f8+bNo8ZOqESJEjp8+LC2bNmitm3b6t1339XRo0e1bt06JScnKyMjQ97e3qpatSqvuZxURkaGDh06pMjISNvPc/PmzZWUlKS1a9dq4MCBql69ug4ePMjPMQA4iMnK52vhBNLT0zVhwgSNGTNG69ev1+bNm9W2bVv16NFDFSpU0JUrV3Ty5EmtW7dOmZmZatWqlVq2bKnixYsbnTpu0+bNm9WgQQMFBARIks6cOaOnn35aCxYsUM2aNSVdXw6kQoUKunr1Km+QOKmTJ0/K399fvr6+OnjwoCwWi4KDg3X8+HF98sknqlSpkkaNGqXLly+rWLFi1NlJRUREaNu2bfr8889lsVj0/PPP6+eff9bQoUM1fPhwJSQkyNPTU2XKlDE6VeRRTEyM+vXrpzJlyujLL7+01fDw4cOaNGmSOnTooCFDhigtLU3u7u78HnZiV69eVUhIiOrXr6+ZM2fKx8dHkvTNN99oypQpWrFihby8vLhXO7ns7Gy5u7trwYIFio2N1b/+9S95eXnZ9icnJ8vNzY0aOxmr1aqIiAjNmzdPderU0cGDB7V27VrVrl1bZ86c0ezZs5WVlaVp06YpKSlJHh4e1NjJpKena+zYsfL29tZTTz2l+++/X1OmTNG3336rBx98UAsXLrTF8nMMAI5RJGaiw/mVKFFCEyZMULly5fTCCy8oIyNDW7ZskSQ98cQTKl++vBo2bMiyAE6sTZs2cnd3l3T90wcmk0lXr15VVlaWpOtNuY0bN2rJkiW2P+ThfO677z5J1/9ob9SokW17YGCgKlSooAMHDshiscjX19egDOEIjz32mLZt2yZJ2rt3ryIjI9WgQQOtWbNGPXv2tL1ZBudTp04djRkzRuvWrVOxYsVsDbjg4GD5+voqKipKklSyZEmDM8WdsFqt8vDwUJUqVeTp6SkfHx9brX18fOTt7S03Nzfu1S7gxmuvxo0ba/78+eratauaN29ue45BqVKljEwP+WQymTRw4EC1bt1au3btUtmyZVW7dm1J1z/55+bmpsjISF27do03tJ1UiRIlNGrUKE2bNk0jRoyQh4eHnnzySU2ZMkWzZs1SQkKCypUrJzc3N36OAcBBaKLDaZQrV05Wq1Umk8m2huOWLVvk5uamHj16qFy5cgZniDtx44846fof76VLl1bp0qXl4+OjTz75RDNnztTy5ctpoLuIG/XOyMiwzVR1c3NTtWrVeAChC/D19VVGRoY+/vhjzZ8/X8OGDVNoaKjmzJmjjIwMo9PDHQoLC1OnTp3k4+Nje6MzPT1dnp6eqlevnsHZwRFMJpOKFy+uZ555RhMmTNDq1avVvXt3Sdc/deDu7i4PDw9jk4RDPfDAA3ryySf14Ycfqnr16qpYsaLRKeEOubu7q27dujp79qxWrFih6Oho1a1bV3FxcTpz5owCAgKUlZUlT09Po1NFPt1///2aPn26Tp8+rfT0dDVu3FixsbE6f/684uLimLQAAA5GEx1OxWQy2dZIHz58uNzc3LRy5Up5eHgoPDxcbm5uRqcIB3B3d5e3t7fKlCmj0aNH6+jRo1q2bJmCgoKMTg0OdOnSJb3++utKS0uTm5ubfvnlF3366ac53lCBc/L391exYsX07rvv6tVXX1W/fv0kSRMnTrStmw7ndWOW+enTp/XNN9/Iw8ND8fHxOnDggF599VWDs4MjdezYUSdPntSECRO0cuVK+fj46MiRI4qIiJC/v7/R6cHB2rVrp23btumnn35S9+7deSCwi2jUqJFq1aqliRMnqnbt2rpw4YIiIyO1ZMkSlvdwAaVLl1b9+vVt39esWVPBwcEym81q1qyZgZkBgOthTXQ4pRsz0iXpo48+UqdOnVSlShWDs4KjWK1WXbt2Te3bt9fFixf19ddfq06dOkanBQfLysrSnj179O2336pKlSrq0KGDbf17OL9Dhw4pJiZGvXr1MjoV3CV//vmnFi9erF9//VXlypXTyJEjFRgYaHRacLDs7Gzt379fP/74o6pUqaJmzZqpWrVqRqeFu2Tq1Knq27ev7r33XqNTgQP98ccfmj9/vsxms6pXr65hw4bp/vvvNzot3CWzZs1SWFiYqlevbnQqAOBSaKLDad2YkQ7XtWnTJtWsWZPGKgAUYjeW6OEhooDz+t8JKnBNWVlZslgsslqtLOHiovg5BoC7iyY6AAAAAAAAAAB2MI0XAAAAAAAAAAA7aKIDAAAAAAAAAGAHTXQAAAAAAAAAAOygiQ4AAAAAAAAAgB000QEAAAAAAAAAsIMmOgAAAP5WVlZWnrYDAAAAgKugiQ4AAFBEJCQk2P7dYrFo/fr1io2Nva1jn3/+eb311ls5tn3zzTfq2LGjUlNTb3nstWvXJEmxsbFaunSpJOnq1au2/QcOHMiRmyNkZGQoLi7Ooec0yg8//KDBgwcrLS3tlnHnzp1TUlJSwSQFAAAAFCE00QEAAIqIIUOG6JVXXpEkubm5adGiRZozZ87fHpeYmKh9+/bJZDLl2N64cWNdvHhRERERdo9NSEjQ448/ruPHjysmJsY23qRJkzRr1ixJ0rvvvqspU6bk97Ju6rXXXtPChQsdes5bSUlJueNznD17VnFxcfrjjz9yfCUmJmrr1q367rvvcu37/fffdfr0aUnSqlWrNGLECGVmZt5xLgAAAAD+q5jRCQAAABhh7969Cg8PV0xMjNGpFIidO3cqMjJSY8aMsW0bNWqUBg8erN69e6tJkyZ2j924caMsFot69eql9PR0mUwmeXp6KiAgQIMGDVKZMmVssVarVdeuXVOJEiUkSQEBAfrHP/6h//znP+rXr588PDwUHx+vLVu2aMOGDcrOzlZUVJRef/11h13r0qVLFRcXpyVLlti2RUdHa/LkyYqOjlbDhg01depUVaxY0WFjjho1Si1btlT//v3zfY4ZM2bou+++k4eHR659pUqV0htvvJFre3Z2toKCgrRkyRK98MILOnTokN577z3bmyUAAAAA7pzJarVajU4CAACgoKWkpOjkyZNq0KCB0ancddnZ2erVq5dKlSqlTz75JMe+QYMG6cSJE1q1apV8fX1venznzp3l7u6utWvX6s0339TixYtvOV6ZMmW0d+9eSdKuXbt0/PhxZWRkKD4+Xhs3btSwYcMUGRmpwMBANWzYUH369NH3339vGz87O1seHh7y8fHJ87VevHhRXbp00WeffaaaNWvatnXu3Fl16tTRwIED9c0338hsNuvrr79WsWKOmVOSlJSkgQMHqk2bNho2bJhDzpkfiYmJ6tKli5YsWWK7fgAAAAB3hiY6AACAi5s/f75mzpyplStXqm7dujn2JSQkqHv37rrvvvsUERGRq3G9a9cuDRgwQM2bN9cnn3yixMREpaWlqXjx4jcdy2q1KisrS5UqVZIkLVq0SLt371ZKSooOHDigkiVLqmXLlrJYLMrIyFD9+vU1d+7cXOcZNWqUhg4dmudrnTt3ruLj4/Wf//zHtm3GjBlasWKFtmzZIi8vL2VnZ6t9+/YaO3asOnXqlOcx7ElJSdGQIUMUHByssWPH5vs8Fy5cUIsWLf427siRIzetQ0REhP78809Nnjw53zkAAAAA+C/WRAcAAHBhR44c0ezZszV06NBcDXTp+nIr8+fP14kTJ9S7d2+dOHHCts9qteqDDz7IsRa6v7+/PD09dfHiRZUvX972FRcXp7lz5yopKcnWQJeuP5B02rRpysjIUO3ateXn56caNWpoyJAh+uijj7RhwwYNGTJEMTExiomJUfXq1fXOO+/on//8Z76ud9OmTQoLC8uxbc+ePWrbtq28vLwkSe7u7goJCdGePXvyNYY9Pj4+WrBggY4fP67Jkycrv3NVbiyFs3r1att/l//9Wr16tUwmk903Mjp37qzNmzfLYrHk+1oAAAAA/BdNdAAA4FIyMjL09ttvq3nz5nrooYc0aNAgnTp1Klfc3r17VadOnZueY9y4cRo3bpzOnj2rl156Sc2aNdOff/6Z5zHsqVOnjubOnas2bdqoVatW2r59u7p06aKmTZvqhx9+0OnTp1WnTh0dOHDAdozValWLFi302Wef3fY4cXFxGjJkiOrXr6/WrVvrxIkTio2NzfXl7e2tKVOmKDU1VT169LA9KPTLL7/U0aNHFRoamuO8kyZNyvUg0H379mnp0qW5Grs7d+7UP/7xDwUGBmr48OHKyspSzZo1NWDAAH311Vc6depUjodynj9/XuXLl7/puuB/x2q16vjx42rUqFGO7QkJCblqXaVKFcXFxd3WeS0Wi7Kysm76lZ2dnSPW09NTH374oS5duqTx48fn2n87bjwYdMCAAWrVqlWurwEDBshqtdp9gGjlypXl7u6u8+fP53lsAAAAALnxYFEAAOBSxo0bp927d+uVV17RPffco9mzZ2vgwIHasGFDnhqzSUlJ6tOnj5o0aaIRI0bkWC/cEWOsX79er7/+ul555RW9+OKLevPNN7VixQotX75cERERCg4O1rZt2/TAAw9Iuj6j/NKlS+rYseNtnd9qtepf//qX/Pz8NGjQID355JO3jK9Ro4a++uorjR8/3jbm5s2b1bt3b5UpU0aJiYm22M6dO2vs2LFKSkqyPVT02LFjuu+++1S9enVbXFZWlrZt26bnnntO/fr100cffaQOHTqoa9euKlmypJYuXapy5crp6NGjkqTU1FRdvXpVVapUua1r/KtLly7Jx8cnVw2uXbumUqVK5djm7e2tS5cu3dZ5P/zwQ82ePfum+ypXrqwffvghxzYPDw/NmDFDEydO1OjRo/Xuu+/m6f89Pz8/RUZG/m3crdZzL1++vM6dO6eAgIDbHhcAAADAzdFEBwAALiMuLk4bNmzQtGnT1K1bN0nXlx+ZM2eOLl68qHvuuee2z7V161ZNmDBBzz777F0ZY/DgwXr00UdVo0YN3XfffQoNDdWJEye0b98+Sdcb1atWrdLo0aNt+TRp0kTlypW7rfObTCbNnTtX6enp8vPz0+HDh+Xh4aFWrVopPDxcL7zwgi12woQJOnv2rPz9/TV//nzb9smTJ9/0YaStWrWSyWTS1q1b1aNHD0nS0aNH9eijj+aIK1asmJ599llZLBb98ssvmj59ut5//32dPXtW9erVU9myZRUeHq6RI0cqPT1dsbGx8vLyyrEcTF6YTKabLqHi4eEhd3f3XNvT09Nv67y9e/dWu3btbrrPXnM8IyNDiYmJqly58m0/vDQ2NjbXrP/b8dprryk8PDzHNovFctNrBgAAAJB3NNEBAIDLuDGjuXHjxrZtdevW1cyZM/N8rlq1aqlfv353bYwKFSpIut74/d9/v6FTp056++23FR8fr4oVK2rbtm3q06dPnsbw8fGxPSjU3d1dly5d0vnz53MtbZKQkHDTGcv2mtk+Pj566KGHtHPnTvXo0UMpKSk6deqUmjVrlit29OjROnbsmLKzs+Xh4aEJEyZIuj7r/P3331dISIgqV66s7du36+zZs2rUqFG+m79+fn5KTU3VtWvX5OnpadtetmxZnT17NkdsUlKSSpYseVvnvbHu++1KTk7W4MGD1aRJE7344ou3fdyNhvz27dtv+82Yjh073vQ6biyLAwAAAODOsSY6AABwaVarVb/88kue14cOCgqSm9vtvVTK7xi3EhAQoAcffFBbt25VQkKCjh8/rvbt29/RObds2SIPD48cbwBI0rlz51SxYsU8natp06bau3evJOnQoUOyWq1q0qRJrriVK1dq//79Klu2rGbPnq0DBw5o3rx58vb2VuvWrSVJYWFhWrx4sTZu3KhHHnkkn1d3Xb169Wyz+W+oW7eu9u/fn2NbZGSk7c0LRzp//rz69eun9u3b56mBLuV8E0WSXn31VT3yyCPq2LGj7euxxx7LNeP/r286/Pbbb3J3d7/tTy0AAAAAuDWa6AAAwGXUrVtXkvTLL7/Ytv3xxx96+umndeTIEacZ44bQ0FBt27ZN27ZtU/PmzeXn55fvc129elVz587V448/bpudfkNCQkK+mugXLlxQXFycfv31V9WsWVP+/v43jV22bJkuXboks9msn3/+WTNnzlS/fv3k5eUlSerbt6+OHDmiyMjIv127/e88/vjjWrNmTa5tu3btUlRUlKTr9dqyZcsdN+z/6vTp03rmmWcUHh6u/v375/n4vzbRS5UqpWeeeUbffvut7WvSpEl/uzzM2rVr9fjjj+c6HwAAAID8YTkXAADgMmrUqKGOHTvqrbfeksVi0T333KO5c+eqWrVqevjhh51mjBs6duyo6dOnKy0tTU888US+z3P58mUNGTJEycnJGjNmTI59iYmJunz58m0tH2KxWJSVlaXixYsrODhY33//vapVq6Y9e/bkmN2enZ0tq9Vqa/b26dNHtWvX1u7duzVo0CClpqaqVKlSOnLkiBo0aKCrV6/Ky8tLVqtVSUlJdpvxt6Nnz54KDQ3V4cOHFRwcLElq06aNmjZtqmeffVYhISHatWuXypYtq169euV7nL+Kjo7W0KFDNX78+Hx/YuCv67knJSXpyy+/1KJFi2zbsrOzVaJECbvn+PPPP/XFF19o5cqV+coBAAAAQG400QEAgEuZNm2aZsyYoWnTpik7O1tNmjTRlClTbLOenWUM6fpa3g0bNtT+/fs1Z86cPB9vsVi0adMmvffee7p06ZIiIiJsM85jYmL0zTffaN++fSpWrJjq169v9zxZWVmSrs+07tChw01j9u/fry+//NL2/dSpU22N/+LFi6t27dpat26dSpcurffee08//vij9u/fr/Pnz2vChAnq2rWrYmNjFR4ervnz598yn1spVaqUxo8fr7Fjx2rZsmXy9/eXyWTSvHnz9OGHH2rHjh1q1qyZxowZk2tG/p344IMP9Oabb6p58+b5PofFYsnx/fTp0+3Gnj9/XseOHdO5c+dsy7mkp6fr5Zdf1vPPP5/vh7MCAAAAyM1k/euUFwAAAOSbxWLJ1Qz9X25ubre91vqd2rdvn5577jk9/PDDmjRpkqpWrWrbl56errZt26patWr65z//qZCQELvneeedd3T48GEtWLBAJ06ckKen5y2XCsnMzFT58uVVtmxZbd++XV9//bW2b9+uLl266OWXX1aZMmV0+vRpvfnmm9q9e7fGjBmj8PBwpaSkaPDgwTp48KCmTp2qsLCwfF/7jBkzdO7cOb311lv5PkdBO3HihDp37nxbDxb9/fffFRoaqpo1a2rOnDmqUqWKZs2apbi4OE2fPp2lXAAAAAAHookOAADgQOPGjdPXX39td394eLhee+21Asvn999/17333ntH5/j3v/+tY8eOafny5Xk+NiYmRuvXr9dTTz2lKlWq2LZnZmZq9uzZevLJJ1WtWjXb9uzsbC1fvly9evWSh4dHvnO2Wq26cuWKfH19832Owi4tLU0lS5bM8b27u7uKFy9uYFYAAACA66GJDgAA4EBnzpzR5cuX7e739/dXQEBAAWYEAAAAALgTNNEBAAAAAAAAALCjYBbkBAAAAAAAAADACdFEBwAAAAAAAADADproAAAAAAAAAADYQRMdAAAAAAAAAAA7aKIDAAAAAAAAAGAHTXQAAAAAAAAAAOygiQ4AAAAAAAAAgB000QEAAAAAAAAAsOP/AfQGabMFBGdIAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from scipy.stats import spearmanr\n", + "from tqdm import tqdm # 用于显示进度条 (可选)\n", + "\n", + "# 设置 Matplotlib/Seaborn 样式 (可选)\n", + "sns.set_theme(style=\"whitegrid\")\n", + "plt.rcParams['font.sans-serif'] = ['SimHei'] # 或者其他支持中文的字体\n", + "plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题\n", + "\n", + "def analyze_score_performance_2d(score_df: pd.DataFrame,\n", + " score_col: str = 'score',\n", + " label_col: str = 'label',\n", + " condition1_col: str = 'circ_mv',\n", + " condition2_col: str = 'future_return',\n", + " n_bins: int = 100,\n", + " min_samples_per_bin: int = 30): # 每个格子最少样本数\n", + " \"\"\"\n", + " 分析 score 在两个条件下 (如市值、未来收益) 的二维分箱表现。\n", + "\n", + " Args:\n", + " score_df (pd.DataFrame): 包含分数、标签和条件列的 DataFrame。\n", + " score_col (str): 预测分数所在的列名。\n", + " label_col (str): 目标标签所在的列名 (应为数值或可排序类别)。\n", + " condition1_col (str): 第一个条件列名 (例如 'circ_mv')。\n", + " condition2_col (str): 第二个条件列名 (例如 'future_return')。\n", + " n_bins (int): 每个条件划分的箱数 (分位数数量)。\n", + " min_samples_per_bin (int): 计算指标所需的最小样本数,小于此数目的格子结果将被屏蔽。\n", + "\n", + " Returns:\n", + " tuple: 包含 (performance_pivot, count_pivot, fig)\n", + " performance_pivot: 以二维分箱为索引/列的 Spearman 相关系数矩阵。\n", + " count_pivot: 每个二维分箱的样本数量矩阵。\n", + " fig: 生成的热力图 Matplotlib Figure 对象。\n", + " \"\"\"\n", + " print(f\"开始分析 '{score_col}' 在 '{condition1_col}' 和 '{condition2_col}' 下的表现...\")\n", + "\n", + " required_cols = [score_col, label_col, condition1_col, condition2_col]\n", + " if not all(col in score_df.columns for col in required_cols):\n", + " missing = [col for col in required_cols if col not in score_df.columns]\n", + " raise ValueError(f\"输入 DataFrame 缺少必需列: {missing}\")\n", + "\n", + " # --- 1. 数据准备和清洗 ---\n", + " print(\"准备数据,处理 NaN 值...\")\n", + " # 只保留需要的列,并移除包含 NaN 的行,避免影响分箱和计算\n", + " analysis_df = score_df[required_cols].dropna().copy()\n", + " n_original = len(score_df)\n", + " n_after_drop = len(analysis_df)\n", + " print(f\"原始数据 {n_original} 行,移除 NaN 后剩余 {n_after_drop} 行用于分析。\")\n", + "\n", + " if n_after_drop < min_samples_per_bin * n_bins: # 检查数据量是否过少\n", + " print(f\"警告: 清理 NaN 后数据量 ({n_after_drop}) 可能不足以支持 {n_bins}x{n_bins} 的精细分箱分析。\")\n", + " if n_after_drop < min_samples_per_bin:\n", + " print(\"错误: 有效数据过少,无法进行分析。\")\n", + " return None, None, None\n", + "\n", + " # --- 2. 二维分箱 ---\n", + " print(f\"对 '{condition1_col}' 和 '{condition2_col}' 进行 {n_bins} 分位数分箱...\")\n", + " bin1_col = f'{condition1_col}_bin'\n", + " bin2_col = f'{condition2_col}_bin'\n", + "\n", + " try:\n", + " # 使用 qcut 进行分位数分箱,labels=False 返回 0 到 n_bins-1 的整数标签\n", + " # duplicates='drop' 会丢弃导致边界不唯一的重复值所在的箱子,可能导致某些箱号缺失\n", + " # 对于可视化,这通常可以接受,但如果需要严格的等分,需先 rank\n", + " analysis_df[bin1_col] = pd.qcut(analysis_df[condition1_col], q=n_bins, labels=False, duplicates='drop')\n", + " analysis_df[bin2_col] = pd.qcut(analysis_df[condition2_col], q=n_bins, labels=False, duplicates='drop')\n", + " except Exception as e:\n", + " print(f\"错误: 分箱失败,请检查数据分布或减少 n_bins。错误信息: {e}\")\n", + " # 可以尝试先 rank 再 qcut\n", + " # analysis_df[bin1_col] = pd.qcut(analysis_df[condition1_col].rank(method='first'), q=n_bins, labels=False, duplicates='raise')\n", + " # analysis_df[bin2_col] = pd.qcut(analysis_df[condition2_col].rank(method='first'), q=n_bins, labels=False, duplicates='raise')\n", + " return None, None, None\n", + "\n", + " # --- 3. 分组计算表现指标 (Spearman Rank IC) ---\n", + " print(\"按二维分箱分组计算 Spearman Rank IC...\")\n", + "\n", + " def safe_spearmanr(x, y):\n", + " \"\"\"安全计算 Spearman 相关性,处理数据量过少的情况\"\"\"\n", + " if len(x) < max(2, min_samples_per_bin): # 要求至少有 min_samples_per_bin 个点才计算\n", + " return np.nan\n", + " corr, p_value = spearmanr(x, y)\n", + " return corr if not np.isnan(corr) else np.nan # 确保返回 NaN 而不是 None 或其他\n", + "\n", + " # 按两个分箱列分组\n", + " grouped = analysis_df.groupby([bin1_col, bin2_col])\n", + "\n", + " # 计算每个格子的 Spearman 相关系数\n", + " # apply 可能较慢,但计算相关性通常需要 apply\n", + " performance_series = grouped.apply(lambda sub: safe_spearmanr(sub[score_col], sub[label_col]))\n", + "\n", + " # 计算每个格子的样本数量\n", + " count_series = grouped.size()\n", + "\n", + " # --- 4. 结果整理成 Pivot Table (用于绘图) ---\n", + " print(\"整理结果用于绘图...\")\n", + " try:\n", + " # 将 performance_series 转换成二维矩阵\n", + " # index 为 condition1_bin, columns 为 condition2_bin\n", + " performance_pivot = performance_series.unstack(level=0) # level=0 对应第一个 groupby key (bin1_col)\n", + " count_pivot = count_series.unstack(level=0)\n", + "\n", + " # 可选:按列和索引排序,确保顺序正确\n", + " performance_pivot = performance_pivot.sort_index(axis=0).sort_index(axis=1)\n", + " count_pivot = count_pivot.sort_index(axis=0).sort_index(axis=1)\n", + " \n", + " print(performance_pivot)\n", + "\n", + " except Exception as e:\n", + " print(f\"错误: 无法将结果转换为二维矩阵,可能因为分箱不均匀或数据问题: {e}\")\n", + " return None, None, None\n", + "\n", + " # --- 5. 可视化:绘制热力图 ---\n", + " print(\"生成热力图...\")\n", + " fig, ax = plt.subplots(figsize=(16, 12)) # 调整图像大小\n", + "\n", + " # 使用 count_pivot 创建一个 mask,屏蔽掉样本量过小的格子\n", + " mask = count_pivot < min_samples_per_bin\n", + "\n", + " # 绘制热力图\n", + " sns.heatmap(performance_pivot,\n", + " annot=False, # 100x100 个格子加注释会太密集\n", + " fmt=\".2f\",\n", + " cmap=\"viridis\", # 选择颜色映射, 'viridis', 'coolwarm', 'RdYlGn' 等都不错\n", + " linewidths=.5,\n", + " linecolor='lightgray',\n", + " # mask=mask, # 应用 mask\n", + " ax=ax,\n", + " cbar_kws={'label': f'Spearman Rank IC ({score_col} vs {label_col})'}) # 颜色条标签\n", + "\n", + " # 设置标题和轴标签\n", + " ax.set_title(f'{score_col} 表现分析 (Rank IC vs {label_col})\\n基于 {condition1_col} 和 {condition2_col} {n_bins}x{n_bins} 分箱', fontsize=16)\n", + " ax.set_xlabel(f'{condition1_col} 分位数 (0 -> 高)', fontsize=12)\n", + " ax.set_ylabel(f'{condition2_col} 分位数 (0 -> 高)', fontsize=12)\n", + "\n", + " # 可选:调整刻度标签,避免显示所有 100 个刻度\n", + " if n_bins > 20:\n", + " tick_interval = n_bins // 10 # 大约显示 10 个刻度\n", + " ax.set_xticks(np.arange(0, n_bins, tick_interval) + 0.5)\n", + " ax.set_yticks(np.arange(0, n_bins, tick_interval) + 0.5)\n", + " ax.set_xticklabels(np.arange(0, n_bins, tick_interval))\n", + " ax.set_yticklabels(np.arange(0, n_bins, tick_interval))\n", + "\n", + " plt.xticks(rotation=45, ha='right')\n", + " plt.yticks(rotation=0)\n", + " plt.tight_layout() # 调整布局\n", + "\n", + " print(\"分析完成。\")\n", + " return performance_pivot, count_pivot, fig\n", + "\n", + "# --- 如何使用 ---\n", + "# 假设你的包含预测结果和所需列的 DataFrame 是 final_predictions_df\n", + "# 确保它包含 'score', 'label', 'circ_mv', 'future_return'\n", + "\n", + "# # 示例调用 (你需要有实际的 score_df)\n", + "try:\n", + " # 确保数据类型正确\n", + " cols_to_numeric = ['score', 'label', 'circ_mv', 'future_return']\n", + " for col in cols_to_numeric:\n", + " if col in score_df.columns:\n", + " score_df[col] = pd.to_numeric(score_df[col], errors='coerce')\n", + "\n", + " # 调用分析函数\n", + " performance_matrix, count_matrix, heatmap_figure = analyze_score_performance_2d(\n", + " score_df,\n", + " n_bins=100, # 你要求的100分箱\n", + " min_samples_per_bin=50 # 每个格子至少需要50个样本才显示IC,可以调整\n", + " )\n", + "\n", + " # 显示图像\n", + " if heatmap_figure:\n", + " plt.show()\n", + "\n", + " # 可以查看具体的 performance_matrix 和 count_matrix\n", + " # print(\"\\nPerformance Matrix (Spearman IC):\")\n", + " # print(performance_matrix)\n", + " # print(\"\\nCount Matrix:\")\n", + " # print(count_matrix)\n", + "\n", + "except ValueError as ve:\n", + " print(f\"数据错误: {ve}\")\n", + "except Exception as e:\n", + " print(f\"发生未知错误: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "a436dba4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Empty DataFrame\n", + "Columns: [ts_code, trade_date, is_st]\n", + "Index: []\n" + ] + } + ], + "source": [ + "print(df[(df['ts_code'] == '600242.SH') & (df['trade_date'] >= '2023-06-01')][['ts_code', 'trade_date', 'is_st']])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "new_trader", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/main/train/Classify2.ipynb b/main/train/Classify2.ipynb index dcc4c89..18c68ad 100644 --- a/main/train/Classify2.ipynb +++ b/main/train/Classify2.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "id": "79a7758178bafdd3", "metadata": { "ExecuteTime": { @@ -18,8 +18,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n", "e:\\PyProject\\NewStock\\main\\train\n" ] } @@ -46,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "id": "a79cafb06a7e0e43", "metadata": { "ExecuteTime": { @@ -60,7 +58,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "daily data\n", + "daily data\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "daily basic\n", "inner merge on ['ts_code', 'trade_date']\n", "stk limit\n", @@ -70,7 +74,7 @@ "cyq perf\n", "left merge on ['ts_code', 'trade_date']\n", "\n", - "RangeIndex: 8611848 entries, 0 to 8611847\n", + "RangeIndex: 8665405 entries, 0 to 8665404\n", "Data columns (total 32 columns):\n", " # Column Dtype \n", "--- ------ ----- \n", @@ -145,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 3, "id": "cac01788dac10678", "metadata": { "ExecuteTime": { @@ -213,7 +217,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 4, "id": "c4e9e1d31da6dba6", "metadata": { "ExecuteTime": { @@ -313,7 +317,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 5, "id": "a735bc02ceb4d872", "metadata": { "ExecuteTime": { @@ -329,7 +333,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 6, "id": "53f86ddc0677a6d7", "metadata": { "ExecuteTime": { @@ -396,7 +400,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "id": "dbe2fd8021b9417f", "metadata": { "ExecuteTime": { @@ -424,7 +428,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 8, "id": "85c3e3d0235ffffa", "metadata": { "ExecuteTime": { @@ -435,19 +439,24 @@ "outputs": [], "source": [ "fina_indicator_df = read_and_merge_h5_data('../../data/fina_indicator.h5', key='fina_indicator',\n", - " columns=['ts_code', 'ann_date', 'undist_profit_ps', 'ocfps', 'bps'],\n", + " columns=['ts_code', 'ann_date', 'undist_profit_ps', 'ocfps', 'bps', 'roa', 'roe'],\n", " df=None)\n", "cashflow_df = read_and_merge_h5_data('../../data/cashflow.h5', key='cashflow',\n", " columns=['ts_code', 'ann_date', 'n_cashflow_act'],\n", " df=None)\n", "balancesheet_df = read_and_merge_h5_data('../../data/balancesheet.h5', key='balancesheet',\n", " columns=['ts_code', 'ann_date', 'money_cap', 'total_liab'],\n", - " df=None)" + " df=None)\n", + "top_list_df = read_and_merge_h5_data('../../data/top_list.h5', key='top_list',\n", + " columns=['ts_code', 'trade_date', 'reason'],\n", + " df=None)\n", + "\n", + "top_list_df = top_list_df.sort_values(by='trade_date', ascending=False).drop_duplicates(subset=['ts_code', 'trade_date'], keep='first').sort_values(by='trade_date')\n" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 9, "id": "92d84ce15a562ec6", "metadata": { "ExecuteTime": { @@ -460,6 +469,10 @@ "name": "stdout", "output_type": "stream", "text": [ + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", "使用 'ann_date' 作为财务数据生效日期。\n", "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", "使用 'ann_date' 作为财务数据生效日期。\n", @@ -487,19 +500,20 @@ " 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol',\n", " 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct',\n", " 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg',\n", - " 'winner_rate', 'l2_code', 'undist_profit_ps', 'ocfps', 'AR', 'BR',\n", - " 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio',\n", - " 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor',\n", - " 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity',\n", - " 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio',\n", - " 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change',\n", - " 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel',\n", - " 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy',\n", - " 'cost_support_15pct_change', 'cat_winner_price_zone',\n", - " 'flow_chip_consistency', 'profit_taking_vs_absorb', '_is_positive',\n", - " '_is_negative', 'cat_is_positive', '_pos_returns', '_neg_returns',\n", - " '_pos_returns_sq', '_neg_returns_sq', 'upside_vol', 'downside_vol',\n", - " 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate',\n", + " 'winner_rate', 'l2_code', 'undist_profit_ps', 'ocfps', 'roa', 'roe',\n", + " 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor',\n", + " 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20',\n", + " 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol',\n", + " 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'flow_divergence_diff',\n", + " 'flow_divergence_ratio', 'total_buy_vol', 'lg_elg_buy_prop',\n", + " 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change',\n", + " 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness',\n", + " 'floating_chip_proxy', 'cost_support_15pct_change',\n", + " 'cat_winner_price_zone', 'flow_chip_consistency',\n", + " 'profit_taking_vs_absorb', '_is_positive', '_is_negative',\n", + " 'cat_is_positive', '_pos_returns', '_neg_returns', '_pos_returns_sq',\n", + " '_neg_returns_sq', 'upside_vol', 'downside_vol', 'vol_ratio',\n", + " 'return_skew', 'return_kurtosis', 'volume_change_rate',\n", " 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike',\n", " 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike',\n", " 'vol_std_5', 'atr_14', 'atr_6', 'obv'],\n", @@ -577,12 +591,12 @@ "Calculating cs_rank_size...\n", "Finished cs_rank_size.\n", "\n", - "RangeIndex: 4509585 entries, 0 to 4509584\n", - "Columns: 178 entries, ts_code to cs_rank_size\n", - "dtypes: bool(10), datetime64[ns](1), float64(162), int32(3), object(2)\n", - "memory usage: 5.6+ GB\n", + "RangeIndex: 4539678 entries, 0 to 4539677\n", + "Columns: 180 entries, ts_code to cs_rank_size\n", + "dtypes: bool(10), datetime64[ns](1), float64(164), int32(3), object(2)\n", + "memory usage: 5.7+ GB\n", "None\n", - "['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio', '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', 'winner_rate', 'cat_l2_code', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'price_cost_divergence', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_flow_divergence', 'cs_rank_ind_adj_lg_flow', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_opening_gap', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_ind_cap_neutral_pe', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size']\n" + "['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio', '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', 'winner_rate', 'cat_l2_code', 'undist_profit_ps', 'ocfps', 'roa', 'roe', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'price_cost_divergence', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_flow_divergence', 'cs_rank_ind_adj_lg_flow', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_opening_gap', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_ind_cap_neutral_pe', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size']\n" ] } ], @@ -608,12 +622,23 @@ "\n", "df = filter_data(df)\n", "df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\n", + "# df = price_minus_deduction_price(df, n=120)\n", + "# df = price_deduction_price_diff_ratio_to_sma(df, n=120)\n", + "# df = cat_price_vs_sma_vs_deduction_price(df, n=120)\n", + "# df = cat_reason(df, top_list_df)\n", + "# df = cat_is_on_top_list(df, top_list_df)\n", + "\n", "df = add_financial_factor(df, fina_indicator_df, factor_value_col='undist_profit_ps')\n", "df = add_financial_factor(df, fina_indicator_df, factor_value_col='ocfps')\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col='roa')\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col='roe')\n", + "\n", "calculate_arbr(df, N=26)\n", "df['log_circ_mv'] = np.log(df['circ_mv'])\n", "df = calculate_cashflow_to_ev_factor(df, cashflow_df, balancesheet_df)\n", "df = caculate_book_to_price_ratio(df, fina_indicator_df)\n", + "\n", "df = turnover_rate_n(df, n=5)\n", "df = variance_n(df, n=20)\n", "df = bbi_ratio_factor(df)\n", @@ -672,7 +697,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 10, "id": "b87b938028afa206", "metadata": { "ExecuteTime": { @@ -710,7 +735,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 11, "id": "f4f16d63ad18d1bc", "metadata": { "ExecuteTime": { @@ -782,98 +807,79 @@ "\n", "# --- 2. 行业市值中性化 ---\n", "\n", - "def cs_neutralize_industry_cap(df: pd.DataFrame,\n", - " features: list,\n", - " industry_col: str = 'cat_l2_code',\n", - " market_cap_col: str = 'circ_mv'):\n", + "from tqdm import tqdm\n", + "\n", + "def cs_neutralize_market_cap_numpy(df: pd.DataFrame,\n", + " features: list,\n", + " market_cap_col: str = 'circ_mv'):\n", " \"\"\"\n", - " 对指定特征列进行截面行业和对数市值中性化 (原地修改)。\n", - " 使用 OLS 回归: feature ~ 1 + log(market_cap) + C(industry)\n", - " 将回归残差写回原特征列。\n", + " 对 DataFrame 中的指定特征进行截面市值中性化 (NumPy 优化)。\n", "\n", " Args:\n", - " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date', features 列,\n", - " industry_col, market_cap_col。\n", - " features (list): 需要处理的特征列名列表。\n", - " industry_col (str): 行业分类列名。\n", - " market_cap_col (str): 流通市值列名。\n", - "\n", - " WARNING: 此函数会原地修改输入的 DataFrame 'df' 的 features 列。\n", - " 计算量较大,可能耗时较长。\n", - " 需要安装 statsmodels 库 (pip install statsmodels)。\n", + " df (pd.DataFrame): 包含数据的 DataFrame,需要有 'trade_date' 和 market_cap_col 列。\n", + " features (list): 需要进行市值中性化的特征列名列表。\n", + " market_cap_col (str): 包含市值数据的列名,默认为 'circ_mv'。\n", " \"\"\"\n", - " print(\"开始截面行业市值中性化...\")\n", - " required_cols = features + ['trade_date', industry_col, market_cap_col]\n", + " print(\"开始截面市值中性化 (NumPy 优化)...\")\n", + " required_cols = features + ['trade_date', market_cap_col]\n", " if not all(col in df.columns for col in required_cols):\n", " missing = [col for col in required_cols if col not in df.columns]\n", " print(f\"错误: DataFrame 中缺少必需列: {missing}。无法进行中性化。\")\n", " return\n", "\n", - " # 预处理:计算 log 市值,处理 industry code 可能的 NaN\n", + " df_copy = df\n", " log_cap_col = '_log_market_cap'\n", - " df[log_cap_col] = np.log1p(df[market_cap_col]) # log1p 处理 0 值\n", - " # df[industry_col] = df[industry_col].cat.add_categories('UnknownIndustry')\n", - " # df[industry_col] = df[industry_col].fillna('UnknownIndustry') # 填充行业 NaN\n", - " # df[industry_col] = df[industry_col].astype('category') # 转为类别,ols 会自动处理\n", + " df_copy[log_cap_col] = np.log1p(df_copy[market_cap_col])\n", "\n", - " dates = df['trade_date'].unique()\n", - " all_residuals = [] # 用于收集所有日期的残差\n", + " # 创建一个 DataFrame 来存储所有日期的残差结果\n", + " residuals_container = pd.DataFrame(index=df_copy.index, columns=features, dtype=float)\n", "\n", - " for date in tqdm(dates, desc=\"Neutralizing\"):\n", - " daily_data = df.loc[df['trade_date'] == date, features + [log_cap_col, industry_col]].copy() # 使用 .loc 获取副本\n", + " for date, group_df in tqdm(df_copy.groupby('trade_date'), desc=\"Neutralizing by Date (NumPy)\"):\n", + " # 准备 X 矩阵 (自变量):常数项和对数市值\n", + " X_daily = np.concatenate([np.ones((len(group_df), 1)), group_df[[log_cap_col]].values], axis=1)\n", "\n", - " # 准备自变量 X (常数项 + log市值 + 行业哑变量)\n", - " X = daily_data[[log_cap_col]]\n", - " X = sm.add_constant(X, prepend=True) # 添加常数项\n", - " # 创建行业哑变量 (drop_first=True 避免共线性)\n", - " industry_dummies = pd.get_dummies(daily_data[industry_col], prefix=industry_col, drop_first=True)\n", - " industry_dummies = industry_dummies.astype(int)\n", - " X = pd.concat([X, industry_dummies], axis=1)\n", + " for feature_col in features:\n", + " Y_daily = group_df[feature_col].values\n", "\n", - " daily_residuals = daily_data[[col for col in features]].copy() # 创建用于存储残差的df\n", + " # 处理 NaN:只对有效数据对进行回归\n", + " valid_mask_y = ~np.isnan(Y_daily)\n", + " valid_mask_x = ~np.isnan(X_daily).any(axis=1)\n", + " valid_mask = valid_mask_y & valid_mask_x\n", "\n", - " for col in features:\n", - " Y = daily_data[col]\n", + " current_feature_indices = group_df.index[valid_mask]\n", "\n", - " # 处理 NaN 值,确保 X 和 Y 在相同位置有有效值\n", - " valid_mask = Y.notna() & X.notna().all(axis=1)\n", - " if valid_mask.sum() < (X.shape[1] + 1): # 数据点不足以估计模型\n", - " print(f\"警告: 日期 {date}, 特征 {col} 有效数据不足 ({valid_mask.sum()}个),无法中性化,填充 NaN。\")\n", - " daily_residuals[col] = np.nan\n", + " if np.sum(valid_mask) < X_daily.shape[1] + 1:\n", + " # 有效数据不足,此特征在此日期保持 NaN\n", " continue\n", "\n", - " Y_valid = Y[valid_mask]\n", - " X_valid = X[valid_mask]\n", + " Y_valid = Y_daily[valid_mask]\n", + " X_valid = X_daily[valid_mask, :]\n", "\n", - " # 执行 OLS 回归\n", " try:\n", - " model = sm.OLS(Y_valid.to_numpy(), X_valid.to_numpy())\n", - " results = model.fit()\n", - " # 将残差填回对应位置\n", - " daily_residuals.loc[valid_mask, col] = results.resid\n", - " daily_residuals.loc[~valid_mask, col] = np.nan # 原本无效的位置填充 NaN\n", + " # 使用 np.linalg.lstsq 进行 OLS 计算\n", + " beta, sum_sq_resid, rank, s = np.linalg.lstsq(X_valid, Y_valid, rcond=None)\n", + "\n", + " # 计算预测值 Y_hat = X_valid @ beta\n", + " Y_hat_valid = X_valid @ beta\n", + "\n", + " # 计算残差 residuals = Y_valid - Y_hat_valid\n", + " residuals_valid = Y_valid - Y_hat_valid\n", + "\n", + " # 将计算得到的残差放回 residuals_container\n", + " residuals_container.loc[current_feature_indices, feature_col] = residuals_valid\n", + "\n", + " except np.linalg.LinAlgError:\n", + " pass\n", " except Exception as e:\n", - " print(f\"警告: 日期 {date}, 特征 {col} 回归失败: {e},填充 NaN。\")\n", - " daily_residuals[col] = np.nan\n", - " break\n", - "\n", - " all_residuals.append(daily_residuals)\n", - "\n", - " # 合并所有日期的残差结果\n", - " if all_residuals:\n", - " residuals_df = pd.concat(all_residuals)\n", - " # 将残差结果更新回原始 df (原地修改)\n", - " # 使用 update 比 merge 更适合基于索引的原地更新\n", - " # 确保 residuals_df 的索引与 df 中对应部分一致\n", - " df.update(residuals_df)\n", - " else:\n", - " print(\"没有有效的残差结果可以合并。\")\n", + " pass\n", "\n", + " # 将所有计算得到的残差更新回原始的 df (原地修改)\n", + " for feature_col in features:\n", + " df[feature_col] = residuals_container[feature_col]\n", "\n", " # 清理临时列\n", - " df.drop(columns=[log_cap_col], inplace=True)\n", - " print(\"截面行业市值中性化完成。\")\n", - "\n", + " df.drop(columns=[log_cap_col], inplace=True, errors='ignore')\n", + " print(\"截面市值中性化完成 (NumPy 优化)。\")\n", "\n", "# --- 3. Z-Score 标准化 ---\n", "\n", @@ -956,7 +962,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 12, "id": "40e6b68a91b30c79", "metadata": { "ExecuteTime": { @@ -1283,7 +1289,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 13, "id": "47c12bb34062ae7a", "metadata": { "ExecuteTime": { @@ -1306,7 +1312,7 @@ "# df.groupby('ts_code')['open'].shift(-1)\n", "\n", "df['cat_up_limit'] = df['pct_chg'] > 5\n", - "df['label'] = df.groupby('ts_code')['cat_up_limit'].rolling(window=5, min_periods=1).max().shift(-5).fillna(0).astype(int).reset_index(level=0, drop=True)\n", + "df['label'] = df.groupby('ts_code')['cat_up_limit'].rolling(window=5, min_periods=1).max().groupby('ts_code').shift(-5).fillna(0).astype(int).reset_index(level=0, drop=True)\n", "\n", "filter_index = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99))\n", "\n", @@ -1317,10 +1323,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "29221dde", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "191\n" + ] + } + ], "source": [ "feature_columns = [col for col in df.head(10).merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left').merge(index_data, on='trade_date', how='left').columns]\n", "feature_columns = [col for col in feature_columns if col not in ['trade_date',\n", @@ -1346,7 +1360,17 @@ " 'cs_rank_ind_cap_neutral_pe',\n", " 'cs_rank_opening_gap',\n", " 'cs_rank_ind_adj_lg_flow']]\n", - "\n", + "feature_columns = [col for col in feature_columns if col not in ['roa', 'roe']]\n", + "print(len(feature_columns))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "03ee5daf", + "metadata": {}, + "outputs": [], + "source": [ "# df = fill_nan_with_daily_median(df, feature_columns)\n", "for feature_col in [col for col in feature_columns if col in df.columns]:\n", " # median_val = df[feature_col].median()\n", @@ -1355,7 +1379,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 16, "id": "b76ea08a", "metadata": {}, "outputs": [ @@ -1367,7 +1391,7 @@ "0 000001.SZ 2019-01-02 16.574219\n", "1 000001.SZ 2019-01-03 16.583965\n", "2 000001.SZ 2019-01-04 16.633371\n", - "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', 'industry_cs_rank_intraday_range', 'industry_cs_rank_close_pos_in_range', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", "去除极值\n", "开始截面 MAD 去极值处理 (k=3.0)...\n" ] @@ -1376,7 +1400,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "MAD Filtering: 100%|██████████| 131/131 [00:27<00:00, 4.69it/s]\n" + "MAD Filtering: 100%|██████████| 131/131 [00:28<00:00, 4.67it/s]\n" ] }, { @@ -1391,7 +1415,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "MAD Filtering: 100%|██████████| 131/131 [00:23<00:00, 5.52it/s]\n" + "MAD Filtering: 100%|██████████| 131/131 [00:24<00:00, 5.43it/s]\n" ] }, { @@ -1429,15 +1453,15 @@ "output_type": "stream", "text": [ "截面 MAD 去极值处理完成。\n", - "feature_columns: ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', 'industry_cs_rank_intraday_range', 'industry_cs_rank_close_pos_in_range', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "feature_columns: ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", "df最小日期: 2019-01-02\n", - "df最大日期: 2025-05-09\n", - "2057671\n", + "df最大日期: 2025-05-23\n", + "2057539\n", "train_data最小日期: 2020-01-02\n", "train_data最大日期: 2022-12-30\n", - "1736644\n", + "1766694\n", "test_data最小日期: 2023-01-03\n", - "test_data最大日期: 2025-05-09\n", + "test_data最大日期: 2025-05-23\n", " ts_code trade_date log_circ_mv\n", "0 000001.SZ 2019-01-02 16.574219\n", "1 000001.SZ 2019-01-03 16.583965\n", @@ -1538,12 +1562,12 @@ "print('去除极值')\n", "cs_mad_filter(train_data, transform_feature_columns)\n", "# print('中性化')\n", - "# cs_neutralize_industry_cap(train_data, transform_feature_columns)\n", + "# cs_neutralize_market_cap_numpy(train_data, transform_feature_columns)\n", "# print('标准化')\n", "# cs_zscore_standardize(train_data, transform_feature_columns)\n", "\n", "cs_mad_filter(test_data, transform_feature_columns)\n", - "# cs_neutralize_industry_cap(test_data, transform_feature_columns)\n", + "# cs_neutralize_market_cap_numpy(test_data, transform_feature_columns)\n", "# cs_zscore_standardize(test_data, transform_feature_columns)\n", "\n", "mad_filter_feature_columns = [col for col in feature_columns if col not in transform_feature_columns and not col.startswith('cat') and col in train_data.columns]\n", @@ -1573,7 +1597,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 17, "id": "3ff2d1c5", "metadata": {}, "outputs": [], @@ -1644,7 +1668,9 @@ " 'depth': 10, # 控制模型复杂度\n", " 'l2_leaf_reg': 50, # L2 正则化\n", " 'verbose': 5000,\n", - " 'early_stopping_rounds': 3000,\n", + " 'early_stopping_rounds': 300,\n", + " # 'od_type': 'Iter', # Overfitting detector type\n", + " # 'od_wait': 300, # Number of iterations to wait after the bes\n", " 'one_hot_max_size': 50,\n", " 'class_weights': [0.6, 1.2],\n", " 'task_type': 'GPU',\n", @@ -1714,7 +1740,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 18, "id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81", "metadata": { "ExecuteTime": { @@ -1748,7 +1774,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0acc9aa66b564c16ba0dfdaa7dab6a9e", + "model_id": "b132fdab733b4d4e856d4688f2997dac", "version_major": 2, "version_minor": 0 }, @@ -1763,11 +1789,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "0:\tlearn: 0.6886094\ttest: 0.6894541\tbest: 0.6894541 (0)\ttotal: 255ms\tremaining: 6m 22s\n", - "1499:\tlearn: 0.3197977\ttest: 0.5228570\tbest: 0.5197799 (414)\ttotal: 5m 23s\tremaining: 0us\n", - "bestTest = 0.5197798592\n", - "bestIteration = 414\n", - "Shrink model to first 415 iterations.\n" + "0:\tlearn: 0.6887138\ttest: 0.6894516\tbest: 0.6894516 (0)\ttotal: 328ms\tremaining: 8m 12s\n", + "bestTest = 0.5217666894\n", + "bestIteration = 487\n", + "Shrink model to first 488 iterations.\n" ] } ], @@ -1789,7 +1814,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 19, "id": "5d1522a7538db91b", "metadata": { "ExecuteTime": { @@ -1799,7 +1824,7 @@ }, "outputs": [], "source": [ - "score_df = test_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(500, 'total_mv'))\n", + "score_df = test_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(300, 'total_mv'))\n", "# score_df = fill_nan_with_daily_median(score_df, ['pe_ttm'])\n", "# score_df = score_df[score_df['pe_ttm'] > 0]\n", "score_df = score_df.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", @@ -1827,7 +1852,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 20, "id": "09b1799e", "metadata": {}, "outputs": [ @@ -1836,18 +1861,207 @@ "output_type": "stream", "text": [ "191\n", - "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n" + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "[]\n" ] } ], "source": [ "print(len(feature_columns))\n", - "print(feature_columns)" + "print(feature_columns)\n", + "print([col for col in feature_columns if 'total_mv' in col])" ] }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 21, + "id": "e53b209a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5595 2057539\n", + " ts_code trade_date turnover_rate\n", + "0 000001.SZ 2023-01-03 1.1307\n", + "1 000001.SZ 2023-01-04 1.1284\n", + "2 000001.SZ 2023-01-05 0.8582\n", + "3 000001.SZ 2023-01-06 0.6162\n", + "4 000001.SZ 2023-01-09 0.5450\n", + "... ... ... ...\n", + "1766689 605599.SH 2025-05-19 0.4952\n", + "1766690 605599.SH 2025-05-20 1.6447\n", + "1766691 605599.SH 2025-05-21 1.2658\n", + "1766692 605599.SH 2025-05-22 0.7522\n", + "1766693 605599.SH 2025-05-23 0.6051\n", + "\n", + "[1766694 rows x 3 columns]\n" + ] + } + ], + "source": [ + "print(len(train_data[train_data['pct_chg'] > 7]), len(train_data))\n", + "print(test_data[['ts_code', 'trade_date', 'turnover_rate']])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "364e821a", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, roc_curve\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "def calculate_binary_classification_metrics(df: pd.DataFrame, score_col: str, label_col: str, future_return_col: str = None, total_mv_col: str = None, n_mv_bins: int = 10, threshold: float = 0.5):\n", + " \"\"\"\n", + " 计算二分类模型的评估指标,可选择计算 score 和 future_return 的相关性,\n", + " 并可选择计算 score 在按总市值 (total_mv) 分为 n 份后的每个分组上的预测性能(ROC AUC)。\n", + "\n", + " Args:\n", + " df: 包含 score (预测概率或置信度), label (真实二分类标签), 可选的 future_return 和 total_mv 的 Pandas DataFrame。\n", + " score_col: 包含模型预测 score 的列名。\n", + " label_col: 包含真实二分类标签 (0 或 1) 的列名。\n", + " future_return_col: (可选) 包含未来收益率的列名,用于计算相关性。\n", + " total_mv_col: (可选) 包含总市值的列名,用于按市值分 n 份分析预测性能。\n", + " n_mv_bins: (可选) 将总市值分为多少份,默认为 5。\n", + " threshold: 将 score 转换为预测类别的阈值,默认为 0.5。\n", + "\n", + " Returns:\n", + " 一个包含以下评估指标的字典:\n", + " - accuracy: 准确率\n", + " - precision: 精确率\n", + " - recall: 召回率\n", + " - f1: F1 分数\n", + " - roc_auc: ROC AUC 值\n", + " - fpr: ROC 曲线的假正率 (False Positive Rate)\n", + " - tpr: ROC 曲线的真正率 (True Positive Rate)\n", + " - thresholds: ROC 曲线的阈值\n", + " - score_return_correlation: (如果 future_return_col 提供) score 和 future_return 的皮尔逊相关系数\n", + " - mv_roc_auc: (如果 total_mv_col 提供) 一个字典,包含按总市值分为 n 份后的每个市值分组对应的 ROC AUC 值\n", + " \"\"\"\n", + " y_true = df[label_col].values\n", + " y_score = df[score_col].values\n", + " y_pred = (y_score >= threshold).astype(int)\n", + "\n", + " metrics = {}\n", + " metrics['accuracy'] = accuracy_score(y_true, y_pred)\n", + " metrics['precision'] = precision_score(y_true, y_pred)\n", + " metrics['recall'] = recall_score(y_true, y_pred)\n", + " metrics['f1'] = f1_score(y_true, y_pred)\n", + " metrics['roc_auc'] = roc_auc_score(y_true, y_score)\n", + " metrics['fpr'], metrics['tpr'], metrics['thresholds'] = roc_curve(y_true, y_score)\n", + "\n", + " if future_return_col in df.columns:\n", + " metrics['score_return_correlation'] = df[score_col].corr(df[future_return_col])\n", + "\n", + " if total_mv_col in df.columns and n_mv_bins > 1:\n", + " metrics['mv_roc_auc'] = {}\n", + " df['mv_quantile'] = pd.cut(df[total_mv_col], bins=n_mv_bins, labels=False, duplicates='drop')\n", + " for i in range(df['mv_quantile'].nunique()):\n", + " mv_group = df[df['mv_quantile'] == i]\n", + " if len(mv_group) > 0 and len(np.unique(mv_group[label_col])) > 1 and len(np.unique(mv_group[score_col])) > 1:\n", + " roc_auc_mv = roc_auc_score(mv_group[label_col], mv_group[score_col])\n", + " lower_bound = df[total_mv_col][df['mv_quantile'] == i].min()\n", + " upper_bound = df[total_mv_col][df['mv_quantile'] == i].max()\n", + " metrics['mv_roc_auc'][f'{lower_bound:.0e}-{upper_bound:.0e}'] = roc_auc_mv\n", + " else:\n", + " lower_bound = df[total_mv_col][df['mv_quantile'] == i].min()\n", + " upper_bound = df[total_mv_col][df['mv_quantile'] == i].max()\n", + " metrics['mv_roc_auc'][f'{lower_bound:.0e}-{upper_bound:.0e}'] = np.nan\n", + " print(f'{lower_bound:.0e}-{upper_bound:.0e}')\n", + " df.drop(columns=['mv_quantile'], inplace=True)\n", + "\n", + " return metrics\n", + "\n", + "def plot_roc_curve(metrics: dict):\n", + " plt.figure(figsize=(8, 6))\n", + " plt.plot(metrics['fpr'], metrics['tpr'], color='darkorange', lw=2, label=f'ROC curve (AUC = {metrics[\"roc_auc\"]:.2f})')\n", + " plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')\n", + " plt.xlabel('False Positive Rate')\n", + " plt.ylabel('True Positive Rate')\n", + " plt.title('Receiver Operating Characteristic (ROC)')\n", + " plt.legend(loc=\"lower right\")\n", + " plt.grid(True)\n", + " plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1f6e6336", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6e+04-9e+04\n", + "9e+04-1e+05\n", + "1e+05-1e+05\n", + "1e+05-1e+05\n", + "1e+05-2e+05\n", + "2e+05-2e+05\n", + "2e+05-2e+05\n", + "2e+05-2e+05\n", + "2e+05-3e+05\n", + "3e+05-3e+05\n", + "二分类评估指标:\n", + "accuracy: 0.6585\n", + "precision: 0.4597\n", + "recall: 0.1487\n", + "f1: 0.2247\n", + "roc_auc: 0.6122\n", + "fpr: (array of length 7368)\n", + "tpr: (array of length 7368)\n", + "thresholds: (array of length 7368)\n", + "score_return_correlation: -0.0355\n", + "mv_roc_auc: {'6e+04-9e+04': 0.5986394557823129, '9e+04-1e+05': 0.5806043519120943, '1e+05-1e+05': 0.5902634156155784, '1e+05-2e+05': 0.5821412014040664, '2e+05-2e+05': 0.5919906015824924, '2e+05-3e+05': 0.6058984399066272, '3e+05-3e+05': 0.5884844322344323}\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "for sd in [\n", + " # save_df1, \n", + " # save_df2, \n", + " score_df\n", + " ]:\n", + " # 计算二分类指标\n", + " evaluation_metrics = calculate_binary_classification_metrics(sd, score_col='score', label_col='label', threshold=0.6,\n", + " future_return_col='future_return', total_mv_col='total_mv')\n", + "\n", + " # 打印指标\n", + " print(\"二分类评估指标:\")\n", + " for metric, value in evaluation_metrics.items():\n", + " if isinstance(value, (float, int)):\n", + " print(f\"{metric}: {value:.4f}\")\n", + " elif isinstance(value, (list, tuple, np.ndarray)):\n", + " print(f\"{metric}: (array of length {len(value)})\")\n", + " else:\n", + " print(f\"{metric}: {value}\")\n", + "\n", + " # 绘制 ROC 曲线\n", + " plot_roc_curve(evaluation_metrics)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, "id": "7e9023cc", "metadata": {}, "outputs": [], @@ -2047,7 +2261,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 25, "id": "a0000d75", "metadata": {}, "outputs": [ @@ -2057,7 +2271,7 @@ "text": [ "开始分析 'score' 在 'circ_mv' 和 'future_return' 下的表现...\n", "准备数据,处理 NaN 值...\n", - "原始数据 28300 行,移除 NaN 后剩余 27850 行用于分析。\n", + "原始数据 17280 行,移除 NaN 后剩余 16976 行用于分析。\n", "对 'circ_mv' 和 'future_return' 进行 100 分位数分箱...\n", "按二维分箱分组计算 Spearman Rank IC...\n", "整理结果用于绘图...\n", @@ -2295,7 +2509,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 26, "id": "a436dba4", "metadata": {}, "outputs": [ diff --git a/main/train/Rank2.ipynb b/main/train/Rank2.ipynb new file mode 100644 index 0000000..cd8dbe6 --- /dev/null +++ b/main/train/Rank2.ipynb @@ -0,0 +1,2204 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "79a7758178bafdd3", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:46:06.987506Z", + "start_time": "2025-04-03T12:46:06.259551Z" + }, + "jupyter": { + "source_hidden": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "e:\\PyProject\\NewStock\\main\\train\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "import gc\n", + "import os\n", + "import sys\n", + "sys.path.append('../../')\n", + "print(os.getcwd())\n", + "import pandas as pd\n", + "from main.factor.factor import get_rolling_factor, get_simple_factor\n", + "from main.utils.factor import read_industry_data\n", + "from main.utils.factor_processor import calculate_score\n", + "from main.utils.utils import read_and_merge_h5_data, merge_with_industry_data\n", + "\n", + "import warnings\n", + "\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a79cafb06a7e0e43", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:00.212859Z", + "start_time": "2025-04-03T12:46:06.998047Z" + }, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "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: 8665405 entries, 0 to 8665404\n", + "Data columns (total 32 columns):\n", + " # Column Dtype \n", + "--- ------ ----- \n", + " 0 ts_code object \n", + " 1 trade_date datetime64[ns]\n", + " 2 open float64 \n", + " 3 close float64 \n", + " 4 high float64 \n", + " 5 low float64 \n", + " 6 vol float64 \n", + " 7 pct_chg float64 \n", + " 8 turnover_rate float64 \n", + " 9 pe_ttm float64 \n", + " 10 circ_mv float64 \n", + " 11 total_mv float64 \n", + " 12 volume_ratio float64 \n", + " 13 is_st bool \n", + " 14 up_limit float64 \n", + " 15 down_limit float64 \n", + " 16 buy_sm_vol float64 \n", + " 17 sell_sm_vol float64 \n", + " 18 buy_lg_vol float64 \n", + " 19 sell_lg_vol float64 \n", + " 20 buy_elg_vol float64 \n", + " 21 sell_elg_vol float64 \n", + " 22 net_mf_vol float64 \n", + " 23 his_low float64 \n", + " 24 his_high float64 \n", + " 25 cost_5pct float64 \n", + " 26 cost_15pct float64 \n", + " 27 cost_50pct float64 \n", + " 28 cost_85pct float64 \n", + " 29 cost_95pct float64 \n", + " 30 weight_avg float64 \n", + " 31 winner_rate float64 \n", + "dtypes: bool(1), datetime64[ns](1), float64(29), object(1)\n", + "memory usage: 2.0+ GB\n", + "None\n" + ] + } + ], + "source": [ + "from main.utils.utils import read_and_merge_h5_data\n", + "\n", + "print('daily data')\n", + "df = read_and_merge_h5_data('../../data/daily_data.h5', key='daily_data',\n", + " columns=['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg'],\n", + " df=None)\n", + "\n", + "print('daily basic')\n", + "df = read_and_merge_h5_data('../../data/daily_basic.h5', key='daily_basic',\n", + " columns=['ts_code', 'trade_date', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio',\n", + " 'is_st'], df=df, join='inner')\n", + "\n", + "print('stk limit')\n", + "df = read_and_merge_h5_data('../../data/stk_limit.h5', key='stk_limit',\n", + " columns=['ts_code', 'trade_date', 'pre_close', 'up_limit', 'down_limit'],\n", + " df=df)\n", + "print('money flow')\n", + "df = read_and_merge_h5_data('../../data/money_flow.h5', key='money_flow',\n", + " columns=['ts_code', 'trade_date', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol',\n", + " 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol'],\n", + " df=df)\n", + "print('cyq perf')\n", + "df = read_and_merge_h5_data('../../data/cyq_perf.h5', key='cyq_perf',\n", + " columns=['ts_code', 'trade_date', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct',\n", + " 'cost_50pct',\n", + " 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate'],\n", + " df=df)\n", + "print(df.info())" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cac01788dac10678", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.527104Z", + "start_time": "2025-04-03T12:47:00.488715Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "industry\n" + ] + } + ], + "source": [ + "print('industry')\n", + "industry_df = read_and_merge_h5_data('../../data/industry_data.h5', key='industry_data',\n", + " columns=['ts_code', 'l2_code', 'in_date'],\n", + " df=None, on=['ts_code'], join='left')\n", + "\n", + "\n", + "def merge_with_industry_data(df, industry_df):\n", + " # 确保日期字段是 datetime 类型\n", + " df['trade_date'] = pd.to_datetime(df['trade_date'])\n", + " industry_df['in_date'] = pd.to_datetime(industry_df['in_date'])\n", + "\n", + " # 对 industry_df 按 ts_code 和 in_date 排序\n", + " industry_df_sorted = industry_df.sort_values(['in_date', 'ts_code'])\n", + "\n", + " # 对原始 df 按 ts_code 和 trade_date 排序\n", + " df_sorted = df.sort_values(['trade_date', 'ts_code'])\n", + "\n", + " # 使用 merge_asof 进行向后合并\n", + " merged = pd.merge_asof(\n", + " df_sorted,\n", + " industry_df_sorted,\n", + " by='ts_code', # 按 ts_code 分组\n", + " left_on='trade_date',\n", + " right_on='in_date',\n", + " direction='backward'\n", + " )\n", + "\n", + " # 获取每个 ts_code 的最早 in_date 记录\n", + " min_in_date_per_ts = (industry_df_sorted\n", + " .groupby('ts_code')\n", + " .first()\n", + " .reset_index()[['ts_code', 'l2_code']])\n", + "\n", + " # 填充未匹配到的记录(trade_date 早于所有 in_date 的情况)\n", + " merged['l2_code'] = merged['l2_code'].fillna(\n", + " merged['ts_code'].map(min_in_date_per_ts.set_index('ts_code')['l2_code'])\n", + " )\n", + "\n", + " # 保留需要的列并重置索引\n", + " result = merged.reset_index(drop=True)\n", + " return result\n", + "\n", + "\n", + "# 使用示例\n", + "df = merge_with_industry_data(df, industry_df)\n", + "# print(mdf[mdf['ts_code'] == '600751.SH'][['ts_code', 'trade_date', 'l2_code']])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c4e9e1d31da6dba6", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.719252Z", + "start_time": "2025-04-03T12:47:10.541247Z" + }, + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "from main.factor.factor import *\n", + "\n", + "def calculate_indicators(df):\n", + " \"\"\"\n", + " 计算四个指标:当日涨跌幅、5日移动平均、RSI、MACD。\n", + " \"\"\"\n", + " df = df.sort_values('trade_date')\n", + " df['daily_return'] = (df['close'] - df['pre_close']) / df['pre_close'] * 100\n", + " # df['5_day_ma'] = df['close'].rolling(window=5).mean()\n", + " delta = df['close'].diff()\n", + " gain = delta.where(delta > 0, 0)\n", + " loss = -delta.where(delta < 0, 0)\n", + " avg_gain = gain.rolling(window=14).mean()\n", + " avg_loss = loss.rolling(window=14).mean()\n", + " rs = avg_gain / avg_loss\n", + " df['RSI'] = 100 - (100 / (1 + rs))\n", + "\n", + " # 计算MACD\n", + " ema12 = df['close'].ewm(span=12, adjust=False).mean()\n", + " ema26 = df['close'].ewm(span=26, adjust=False).mean()\n", + " df['MACD'] = ema12 - ema26\n", + " df['Signal_line'] = df['MACD'].ewm(span=9, adjust=False).mean()\n", + " df['MACD_hist'] = df['MACD'] - df['Signal_line']\n", + "\n", + " # 4. 情绪因子1:市场上涨比例(Up Ratio)\n", + " df['up_ratio'] = df['daily_return'].apply(lambda x: 1 if x > 0 else 0)\n", + " df['up_ratio_20d'] = df['up_ratio'].rolling(window=20).mean() # 过去20天上涨比例\n", + "\n", + " # 5. 情绪因子2:成交量变化率(Volume Change Rate)\n", + " df['volume_mean'] = df['vol'].rolling(window=20).mean() # 过去20天的平均成交量\n", + " df['volume_change_rate'] = (df['vol'] - df['volume_mean']) / df['volume_mean'] * 100 # 成交量变化率\n", + "\n", + " # 6. 情绪因子3:波动率(Volatility)\n", + " df['volatility'] = df['daily_return'].rolling(window=20).std() # 过去20天的日收益率标准差\n", + "\n", + " # 7. 情绪因子4:成交额变化率(Amount Change Rate)\n", + " df['amount_mean'] = df['amount'].rolling(window=20).mean() # 过去20天的平均成交额\n", + " df['amount_change_rate'] = (df['amount'] - df['amount_mean']) / df['amount_mean'] * 100 # 成交额变化率\n", + "\n", + " # df = sentiment_panic_greed_index(df)\n", + " # df = sentiment_market_breadth_proxy(df)\n", + " # df = sentiment_reversal_indicator(df)\n", + "\n", + " return df\n", + "\n", + "\n", + "def generate_index_indicators(h5_filename):\n", + " df = pd.read_hdf(h5_filename, key='index_data')\n", + " df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')\n", + " df = df.sort_values('trade_date')\n", + "\n", + " # 计算每个ts_code的相关指标\n", + " df_indicators = []\n", + " for ts_code in df['ts_code'].unique():\n", + " df_index = df[df['ts_code'] == ts_code].copy()\n", + " df_index = calculate_indicators(df_index)\n", + " df_indicators.append(df_index)\n", + "\n", + " # 合并所有指数的结果\n", + " df_all_indicators = pd.concat(df_indicators, ignore_index=True)\n", + "\n", + " # 保留trade_date列,并将同一天的数据按ts_code合并成一行\n", + " df_final = df_all_indicators.pivot_table(\n", + " index='trade_date',\n", + " columns='ts_code',\n", + " values=['daily_return', \n", + " 'RSI', 'MACD', 'Signal_line', 'MACD_hist', \n", + " # 'sentiment_panic_greed_index',\n", + " 'up_ratio_20d', 'volume_change_rate', 'volatility',\n", + " 'amount_change_rate', 'amount_mean'],\n", + " aggfunc='last'\n", + " )\n", + "\n", + " df_final.columns = [f\"{col[1]}_{col[0]}\" for col in df_final.columns]\n", + " df_final = df_final.reset_index()\n", + "\n", + " return df_final\n", + "\n", + "\n", + "# 使用函数\n", + "h5_filename = '../../data/index_data.h5'\n", + "index_data = generate_index_indicators(h5_filename)\n", + "index_data = index_data.dropna()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a735bc02ceb4d872", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.821169Z", + "start_time": "2025-04-03T12:47:10.751831Z" + } + }, + "outputs": [], + "source": [ + "import talib\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "53f86ddc0677a6d7", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:15.944254Z", + "start_time": "2025-04-03T12:47:10.826179Z" + }, + "jupyter": { + "source_hidden": true + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "from main.utils.factor import get_act_factor\n", + "\n", + "\n", + "def read_industry_data(h5_filename):\n", + " # 读取 H5 文件中所有的行业数据\n", + " industry_data = pd.read_hdf(h5_filename, key='sw_daily', columns=[\n", + " 'ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'pe', 'pb', 'vol'\n", + " ]) # 假设 H5 文件的键是 'industry_data'\n", + " industry_data = industry_data.sort_values(by=['ts_code', 'trade_date'])\n", + " industry_data = industry_data.reindex()\n", + " industry_data['trade_date'] = pd.to_datetime(industry_data['trade_date'], format='%Y%m%d')\n", + "\n", + " grouped = industry_data.groupby('ts_code', group_keys=False)\n", + " industry_data['obv'] = grouped.apply(\n", + " lambda x: pd.Series(talib.OBV(x['close'].values, x['vol'].values), index=x.index)\n", + " )\n", + " industry_data['return_5'] = grouped['close'].apply(lambda x: x / x.shift(5) - 1)\n", + " industry_data['return_20'] = grouped['close'].apply(lambda x: x / x.shift(20) - 1)\n", + "\n", + " industry_data = get_act_factor(industry_data, cat=False)\n", + " industry_data = industry_data.sort_values(by=['trade_date', 'ts_code'])\n", + "\n", + " # # 计算每天每个 ts_code 的因子和当天所有 ts_code 的中位数的偏差\n", + " # factor_columns = ['obv', 'return_5', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4'] # 因子列\n", + " # \n", + " # for factor in factor_columns:\n", + " # if factor in industry_data.columns:\n", + " # # 计算每天每个 ts_code 的因子值与当天所有 ts_code 的中位数的偏差\n", + " # industry_data[f'{factor}_deviation'] = industry_data.groupby('trade_date')[factor].transform(\n", + " # lambda x: x - x.mean())\n", + "\n", + " industry_data['return_5_percentile'] = industry_data.groupby('trade_date')['return_5'].transform(\n", + " lambda x: x.rank(pct=True))\n", + " industry_data['return_20_percentile'] = industry_data.groupby('trade_date')['return_20'].transform(\n", + " lambda x: x.rank(pct=True))\n", + "\n", + " # cs_rank_intraday_range(industry_data)\n", + " # cs_rank_close_pos_in_range(industry_data)\n", + "\n", + " industry_data = industry_data.drop(columns=['open', 'close', 'high', 'low', 'pe', 'pb', 'vol'])\n", + "\n", + " industry_data = industry_data.rename(\n", + " columns={col: f'industry_{col}' for col in industry_data.columns if col not in ['ts_code', 'trade_date']})\n", + "\n", + " industry_data = industry_data.rename(columns={'ts_code': 'cat_l2_code'})\n", + " return industry_data\n", + "\n", + "\n", + "industry_df = read_industry_data('../../data/sw_daily.h5')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "dbe2fd8021b9417f", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:15.969344Z", + "start_time": "2025-04-03T12:47:15.963327Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['ts_code', 'open', 'close', 'high', 'low', 'circ_mv', 'total_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" + ] + } + ], + "source": [ + "origin_columns = df.columns.tolist()\n", + "origin_columns = [col for col in origin_columns if\n", + " col not in ['turnover_rate', 'pe_ttm', 'volume_ratio', 'vol', 'pct_chg', 'l2_code', 'winner_rate']]\n", + "origin_columns = [col for col in origin_columns if col not in index_data.columns]\n", + "origin_columns = [col for col in origin_columns if 'cyq' not in col]\n", + "print(origin_columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "85c3e3d0235ffffa", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:16.089879Z", + "start_time": "2025-04-03T12:47:15.990101Z" + } + }, + "outputs": [], + "source": [ + "fina_indicator_df = read_and_merge_h5_data('../../data/fina_indicator.h5', key='fina_indicator',\n", + " columns=['ts_code', 'ann_date', 'undist_profit_ps', 'ocfps', 'bps'],\n", + " df=None)\n", + "cashflow_df = read_and_merge_h5_data('../../data/cashflow.h5', key='cashflow',\n", + " columns=['ts_code', 'ann_date', 'n_cashflow_act'],\n", + " df=None)\n", + "balancesheet_df = read_and_merge_h5_data('../../data/balancesheet.h5', key='balancesheet',\n", + " columns=['ts_code', 'ann_date', 'money_cap', 'total_liab'],\n", + " df=None)\n", + "top_list_df = read_and_merge_h5_data('../../data/top_list.h5', key='top_list',\n", + " columns=['ts_code', 'trade_date', 'reason'],\n", + " df=None)\n", + "\n", + "top_list_df = top_list_df.sort_values(by='trade_date', ascending=False).drop_duplicates(subset=['ts_code', 'trade_date'], keep='first').sort_values(by='trade_date')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "92d84ce15a562ec6", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:01.612695Z", + "start_time": "2025-04-03T12:47:16.121802Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "开始计算因子: AR, BR (原地修改)...\n", + "因子 AR, BR 计算成功。\n", + "因子 AR, BR 计算流程结束。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "计算 BBI...\n", + "--- 计算日级别偏离度 (使用 pct_chg) ---\n", + "--- 计算日级别动量基准 (使用 pct_chg) ---\n", + "日级别动量基准计算完成 (使用 pct_chg)。\n", + "日级别偏离度计算完成 (使用 pct_chg)。\n", + "--- 计算日级别行业偏离度 (使用 pct_chg 和行业基准) ---\n", + "--- 计算日级别行业动量基准 (使用 pct_chg 和 cat_l2_code) ---\n", + "错误: 计算日级别行业动量基准需要以下列: ['pct_chg', 'cat_l2_code', 'trade_date', 'ts_code']。\n", + "错误: 计算日级别行业偏离度需要以下列: ['pct_chg', 'daily_industry_positive_benchmark', 'daily_industry_negative_benchmark']。请先运行 daily_industry_momentum_benchmark(df)。\n", + "Index(['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol',\n", + " 'pct_chg', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv',\n", + " 'volume_ratio', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol',\n", + " 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol',\n", + " 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct',\n", + " 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg',\n", + " 'winner_rate', 'l2_code', 'undist_profit_ps', 'ocfps', 'AR', 'BR',\n", + " 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio',\n", + " 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor',\n", + " 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity',\n", + " 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio',\n", + " 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change',\n", + " 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel',\n", + " 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy',\n", + " 'cost_support_15pct_change', 'cat_winner_price_zone',\n", + " 'flow_chip_consistency', 'profit_taking_vs_absorb', '_is_positive',\n", + " '_is_negative', 'cat_is_positive', '_pos_returns', '_neg_returns',\n", + " '_pos_returns_sq', '_neg_returns_sq', 'upside_vol', 'downside_vol',\n", + " 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate',\n", + " 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike',\n", + " 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike',\n", + " 'vol_std_5', 'atr_14', 'atr_6', 'obv'],\n", + " dtype='object')\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[9], line 39\u001b[0m\n\u001b[0;32m 37\u001b[0m df \u001b[38;5;241m=\u001b[39m daily_deviation(df)\n\u001b[0;32m 38\u001b[0m df \u001b[38;5;241m=\u001b[39m daily_industry_deviation(df)\n\u001b[1;32m---> 39\u001b[0m df, _ \u001b[38;5;241m=\u001b[39m get_rolling_factor(df)\n\u001b[0;32m 40\u001b[0m df, _ \u001b[38;5;241m=\u001b[39m get_simple_factor(df)\n\u001b[0;32m 42\u001b[0m df \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mrename(columns\u001b[38;5;241m=\u001b[39m{\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ml1_code\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcat_l1_code\u001b[39m\u001b[38;5;124m'\u001b[39m})\n", + "File \u001b[1;32me:\\PyProject\\NewStock\\main\\train\\../..\\main\\factor\\factor.py:340\u001b[0m, in \u001b[0;36mget_rolling_factor\u001b[1;34m(df)\u001b[0m\n\u001b[0;32m 336\u001b[0m \u001b[38;5;66;03m# 计算 act_factor1, act_factor2, act_factor3, act_factor4\u001b[39;00m\n\u001b[0;32m 337\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mact_factor1\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m grouped[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_ema_5\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mapply(\n\u001b[0;32m 338\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m x: np\u001b[38;5;241m.\u001b[39marctan((x \u001b[38;5;241m/\u001b[39m x\u001b[38;5;241m.\u001b[39mshift(\u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m100\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m57.3\u001b[39m \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m50\u001b[39m\n\u001b[0;32m 339\u001b[0m )\n\u001b[1;32m--> 340\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mact_factor2\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m grouped[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_ema_13\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mapply(\n\u001b[0;32m 341\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m x: np\u001b[38;5;241m.\u001b[39marctan((x \u001b[38;5;241m/\u001b[39m x\u001b[38;5;241m.\u001b[39mshift(\u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m100\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m57.3\u001b[39m \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m40\u001b[39m\n\u001b[0;32m 342\u001b[0m )\n\u001b[0;32m 343\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mact_factor3\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m grouped[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_ema_20\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mapply(\n\u001b[0;32m 344\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m x: np\u001b[38;5;241m.\u001b[39marctan((x \u001b[38;5;241m/\u001b[39m x\u001b[38;5;241m.\u001b[39mshift(\u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m100\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m57.3\u001b[39m \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m21\u001b[39m\n\u001b[0;32m 345\u001b[0m )\n\u001b[0;32m 346\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mact_factor4\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m grouped[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_ema_60\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mapply(\n\u001b[0;32m 347\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m x: np\u001b[38;5;241m.\u001b[39marctan((x \u001b[38;5;241m/\u001b[39m x\u001b[38;5;241m.\u001b[39mshift(\u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m100\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m57.3\u001b[39m \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m10\u001b[39m\n\u001b[0;32m 348\u001b[0m )\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\groupby\\generic.py:230\u001b[0m, in \u001b[0;36mSeriesGroupBy.apply\u001b[1;34m(self, func, *args, **kwargs)\u001b[0m\n\u001b[0;32m 224\u001b[0m \u001b[38;5;129m@Appender\u001b[39m(\n\u001b[0;32m 225\u001b[0m _apply_docs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtemplate\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mformat(\n\u001b[0;32m 226\u001b[0m \u001b[38;5;28minput\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mseries\u001b[39m\u001b[38;5;124m\"\u001b[39m, examples\u001b[38;5;241m=\u001b[39m_apply_docs[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mseries_examples\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 227\u001b[0m )\n\u001b[0;32m 228\u001b[0m )\n\u001b[0;32m 229\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mapply\u001b[39m(\u001b[38;5;28mself\u001b[39m, func, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Series:\n\u001b[1;32m--> 230\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mapply(func, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\groupby\\groupby.py:1824\u001b[0m, in \u001b[0;36mGroupBy.apply\u001b[1;34m(self, func, include_groups, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1822\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m option_context(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmode.chained_assignment\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m 1823\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m-> 1824\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_python_apply_general(f, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_selected_obj)\n\u001b[0;32m 1825\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[0;32m 1826\u001b[0m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobj, Series)\n\u001b[0;32m 1827\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_selection \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1828\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_selected_obj\u001b[38;5;241m.\u001b[39mshape \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_obj_with_exclusions\u001b[38;5;241m.\u001b[39mshape\n\u001b[0;32m 1829\u001b[0m ):\n\u001b[0;32m 1830\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[0;32m 1831\u001b[0m message\u001b[38;5;241m=\u001b[39m_apply_groupings_depr\u001b[38;5;241m.\u001b[39mformat(\n\u001b[0;32m 1832\u001b[0m \u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m)\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapply\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1835\u001b[0m stacklevel\u001b[38;5;241m=\u001b[39mfind_stack_level(),\n\u001b[0;32m 1836\u001b[0m )\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\groupby\\groupby.py:1885\u001b[0m, in \u001b[0;36mGroupBy._python_apply_general\u001b[1;34m(self, f, data, not_indexed_same, is_transform, is_agg)\u001b[0m\n\u001b[0;32m 1850\u001b[0m \u001b[38;5;129m@final\u001b[39m\n\u001b[0;32m 1851\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_python_apply_general\u001b[39m(\n\u001b[0;32m 1852\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1857\u001b[0m is_agg: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 1858\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m NDFrameT:\n\u001b[0;32m 1859\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 1860\u001b[0m \u001b[38;5;124;03m Apply function f in python space\u001b[39;00m\n\u001b[0;32m 1861\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1883\u001b[0m \u001b[38;5;124;03m data after applying f\u001b[39;00m\n\u001b[0;32m 1884\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m-> 1885\u001b[0m values, mutated \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_grouper\u001b[38;5;241m.\u001b[39mapply_groupwise(f, data, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxis)\n\u001b[0;32m 1886\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m not_indexed_same \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1887\u001b[0m not_indexed_same \u001b[38;5;241m=\u001b[39m mutated\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\groupby\\ops.py:919\u001b[0m, in \u001b[0;36mBaseGrouper.apply_groupwise\u001b[1;34m(self, f, data, axis)\u001b[0m\n\u001b[0;32m 917\u001b[0m \u001b[38;5;66;03m# group might be modified\u001b[39;00m\n\u001b[0;32m 918\u001b[0m group_axes \u001b[38;5;241m=\u001b[39m group\u001b[38;5;241m.\u001b[39maxes\n\u001b[1;32m--> 919\u001b[0m res \u001b[38;5;241m=\u001b[39m f(group)\n\u001b[0;32m 920\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m mutated \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m _is_indexed_like(res, group_axes, axis):\n\u001b[0;32m 921\u001b[0m mutated \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "File \u001b[1;32me:\\PyProject\\NewStock\\main\\train\\../..\\main\\factor\\factor.py:341\u001b[0m, in \u001b[0;36mget_rolling_factor..\u001b[1;34m(x)\u001b[0m\n\u001b[0;32m 336\u001b[0m \u001b[38;5;66;03m# 计算 act_factor1, act_factor2, act_factor3, act_factor4\u001b[39;00m\n\u001b[0;32m 337\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mact_factor1\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m grouped[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_ema_5\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mapply(\n\u001b[0;32m 338\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m x: np\u001b[38;5;241m.\u001b[39marctan((x \u001b[38;5;241m/\u001b[39m x\u001b[38;5;241m.\u001b[39mshift(\u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m100\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m57.3\u001b[39m \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m50\u001b[39m\n\u001b[0;32m 339\u001b[0m )\n\u001b[0;32m 340\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mact_factor2\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m grouped[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_ema_13\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mapply(\n\u001b[1;32m--> 341\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m x: np\u001b[38;5;241m.\u001b[39marctan((x \u001b[38;5;241m/\u001b[39m x\u001b[38;5;241m.\u001b[39mshift(\u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m100\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m57.3\u001b[39m \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m40\u001b[39m\n\u001b[0;32m 342\u001b[0m )\n\u001b[0;32m 343\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mact_factor3\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m grouped[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_ema_20\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mapply(\n\u001b[0;32m 344\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m x: np\u001b[38;5;241m.\u001b[39marctan((x \u001b[38;5;241m/\u001b[39m x\u001b[38;5;241m.\u001b[39mshift(\u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m100\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m57.3\u001b[39m \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m21\u001b[39m\n\u001b[0;32m 345\u001b[0m )\n\u001b[0;32m 346\u001b[0m df[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mact_factor4\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m grouped[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_ema_60\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mapply(\n\u001b[0;32m 347\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m x: np\u001b[38;5;241m.\u001b[39marctan((x \u001b[38;5;241m/\u001b[39m x\u001b[38;5;241m.\u001b[39mshift(\u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m100\u001b[39m) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m57.3\u001b[39m \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m10\u001b[39m\n\u001b[0;32m 348\u001b[0m )\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\ops\\common.py:76\u001b[0m, in \u001b[0;36m_unpack_zerodim_and_defer..new_method\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m 72\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mNotImplemented\u001b[39m\n\u001b[0;32m 74\u001b[0m other \u001b[38;5;241m=\u001b[39m item_from_zerodim(other)\n\u001b[1;32m---> 76\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m method(\u001b[38;5;28mself\u001b[39m, other)\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\arraylike.py:194\u001b[0m, in \u001b[0;36mOpsMixin.__sub__\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m 192\u001b[0m \u001b[38;5;129m@unpack_zerodim_and_defer\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__sub__\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 193\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__sub__\u001b[39m(\u001b[38;5;28mself\u001b[39m, other):\n\u001b[1;32m--> 194\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_arith_method(other, operator\u001b[38;5;241m.\u001b[39msub)\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\series.py:6135\u001b[0m, in \u001b[0;36mSeries._arith_method\u001b[1;34m(self, other, op)\u001b[0m\n\u001b[0;32m 6133\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_arith_method\u001b[39m(\u001b[38;5;28mself\u001b[39m, other, op):\n\u001b[0;32m 6134\u001b[0m \u001b[38;5;28mself\u001b[39m, other \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_align_for_op(other)\n\u001b[1;32m-> 6135\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m base\u001b[38;5;241m.\u001b[39mIndexOpsMixin\u001b[38;5;241m.\u001b[39m_arith_method(\u001b[38;5;28mself\u001b[39m, other, op)\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\base.py:1382\u001b[0m, in \u001b[0;36mIndexOpsMixin._arith_method\u001b[1;34m(self, other, op)\u001b[0m\n\u001b[0;32m 1379\u001b[0m rvalues \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marange(rvalues\u001b[38;5;241m.\u001b[39mstart, rvalues\u001b[38;5;241m.\u001b[39mstop, rvalues\u001b[38;5;241m.\u001b[39mstep)\n\u001b[0;32m 1381\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m np\u001b[38;5;241m.\u001b[39merrstate(\u001b[38;5;28mall\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mignore\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m-> 1382\u001b[0m result \u001b[38;5;241m=\u001b[39m ops\u001b[38;5;241m.\u001b[39marithmetic_op(lvalues, rvalues, op)\n\u001b[0;32m 1384\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_construct_result(result, name\u001b[38;5;241m=\u001b[39mres_name)\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\ops\\array_ops.py:283\u001b[0m, in \u001b[0;36marithmetic_op\u001b[1;34m(left, right, op)\u001b[0m\n\u001b[0;32m 279\u001b[0m _bool_arith_check(op, left, right) \u001b[38;5;66;03m# type: ignore[arg-type]\u001b[39;00m\n\u001b[0;32m 281\u001b[0m \u001b[38;5;66;03m# error: Argument 1 to \"_na_arithmetic_op\" has incompatible type\u001b[39;00m\n\u001b[0;32m 282\u001b[0m \u001b[38;5;66;03m# \"Union[ExtensionArray, ndarray[Any, Any]]\"; expected \"ndarray[Any, Any]\"\u001b[39;00m\n\u001b[1;32m--> 283\u001b[0m res_values \u001b[38;5;241m=\u001b[39m _na_arithmetic_op(left, right, op) \u001b[38;5;66;03m# type: ignore[arg-type]\u001b[39;00m\n\u001b[0;32m 285\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m res_values\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\ops\\array_ops.py:218\u001b[0m, in \u001b[0;36m_na_arithmetic_op\u001b[1;34m(left, right, op, is_cmp)\u001b[0m\n\u001b[0;32m 215\u001b[0m func \u001b[38;5;241m=\u001b[39m partial(expressions\u001b[38;5;241m.\u001b[39mevaluate, op)\n\u001b[0;32m 217\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 218\u001b[0m result \u001b[38;5;241m=\u001b[39m func(left, right)\n\u001b[0;32m 219\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[0;32m 220\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_cmp \u001b[38;5;129;01mand\u001b[39;00m (\n\u001b[0;32m 221\u001b[0m left\u001b[38;5;241m.\u001b[39mdtype \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mobject\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(right, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdtype\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;28mobject\u001b[39m\n\u001b[0;32m 222\u001b[0m ):\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 225\u001b[0m \u001b[38;5;66;03m# Don't do this for comparisons, as that will handle complex numbers\u001b[39;00m\n\u001b[0;32m 226\u001b[0m \u001b[38;5;66;03m# incorrectly, see GH#32047\u001b[39;00m\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\computation\\expressions.py:242\u001b[0m, in \u001b[0;36mevaluate\u001b[1;34m(op, a, b, use_numexpr)\u001b[0m\n\u001b[0;32m 239\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m op_str \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 240\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m use_numexpr:\n\u001b[0;32m 241\u001b[0m \u001b[38;5;66;03m# error: \"None\" not callable\u001b[39;00m\n\u001b[1;32m--> 242\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _evaluate(op, op_str, a, b) \u001b[38;5;66;03m# type: ignore[misc]\u001b[39;00m\n\u001b[0;32m 243\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _evaluate_standard(op, op_str, a, b)\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\computation\\expressions.py:131\u001b[0m, in \u001b[0;36m_evaluate_numexpr\u001b[1;34m(op, op_str, a, b)\u001b[0m\n\u001b[0;32m 128\u001b[0m _store_test_result(result \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m 130\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m result \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 131\u001b[0m result \u001b[38;5;241m=\u001b[39m _evaluate_standard(op, op_str, a, b)\n\u001b[0;32m 133\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", + "File \u001b[1;32me:\\Python\\anaconda\\envs\\new_trader\\Lib\\site-packages\\pandas\\core\\computation\\expressions.py:73\u001b[0m, in \u001b[0;36m_evaluate_standard\u001b[1;34m(op, op_str, a, b)\u001b[0m\n\u001b[0;32m 71\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m _TEST_MODE:\n\u001b[0;32m 72\u001b[0m _store_test_result(\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m---> 73\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op(a, b)\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "\n", + "import numpy as np\n", + "from main.factor.factor import *\n", + "\n", + "def filter_data(df):\n", + " # df = df.groupby('trade_date').apply(lambda x: x.nlargest(1000, 'act_factor1'))\n", + " df = df[~df['is_st']]\n", + " df = df[~df['ts_code'].str.endswith('BJ')]\n", + " df = df[~df['ts_code'].str.startswith('30')]\n", + " df = df[~df['ts_code'].str.startswith('68')]\n", + " df = df[~df['ts_code'].str.startswith('8')]\n", + " df = df[df['trade_date'] >= '2019-01-01']\n", + " if 'in_date' in df.columns:\n", + " df = df.drop(columns=['in_date'])\n", + " df = df.reset_index(drop=True)\n", + " return df\n", + "\n", + "gc.collect()\n", + "\n", + "df = filter_data(df)\n", + "df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\n", + "# df = price_minus_deduction_price(df, n=120)\n", + "# df = price_deduction_price_diff_ratio_to_sma(df, n=120)\n", + "# df = cat_price_vs_sma_vs_deduction_price(df, n=120)\n", + "# df = cat_reason(df, top_list_df)\n", + "# df = cat_is_on_top_list(df, top_list_df)\n", + "\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col='undist_profit_ps')\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col='ocfps')\n", + "calculate_arbr(df, N=26)\n", + "df['log_circ_mv'] = np.log(df['circ_mv'])\n", + "df = calculate_cashflow_to_ev_factor(df, cashflow_df, balancesheet_df)\n", + "df = caculate_book_to_price_ratio(df, fina_indicator_df)\n", + "df = turnover_rate_n(df, n=5)\n", + "df = variance_n(df, n=20)\n", + "df = bbi_ratio_factor(df)\n", + "df = daily_deviation(df)\n", + "df = daily_industry_deviation(df)\n", + "df, _ = get_rolling_factor(df)\n", + "df, _ = get_simple_factor(df)\n", + "\n", + "df = df.rename(columns={'l1_code': 'cat_l1_code'})\n", + "df = df.rename(columns={'l2_code': 'cat_l2_code'})\n", + "\n", + "lg_flow_mom_corr(df, N=20, M=60)\n", + "lg_flow_accel(df)\n", + "profit_pressure(df)\n", + "underwater_resistance(df)\n", + "cost_conc_std(df, N=20)\n", + "profit_decay(df, N=20)\n", + "vol_amp_loss(df, N=20)\n", + "vol_drop_profit_cnt(df, N=20, M=5)\n", + "lg_flow_vol_interact(df, N=20)\n", + "cost_break_confirm_cnt(df, M=5)\n", + "atr_norm_channel_pos(df, N=14)\n", + "turnover_diff_skew(df, N=20)\n", + "lg_sm_flow_diverge(df, N=20)\n", + "pullback_strong(df, N=20, M=20)\n", + "vol_wgt_hist_pos(df, N=20)\n", + "vol_adj_roc(df, N=20)\n", + "\n", + "cs_rank_net_lg_flow_val(df)\n", + "cs_rank_flow_divergence(df)\n", + "cs_rank_industry_adj_lg_flow(df) # Needs cat_l2_code\n", + "cs_rank_elg_buy_ratio(df)\n", + "cs_rank_rel_profit_margin(df)\n", + "cs_rank_cost_breadth(df)\n", + "cs_rank_dist_to_upper_cost(df)\n", + "cs_rank_winner_rate(df)\n", + "cs_rank_intraday_range(df)\n", + "cs_rank_close_pos_in_range(df)\n", + "cs_rank_opening_gap(df) # Needs pre_close\n", + "cs_rank_pos_in_hist_range(df) # Needs his_low, his_high\n", + "cs_rank_vol_x_profit_margin(df)\n", + "cs_rank_lg_flow_price_concordance(df)\n", + "cs_rank_turnover_per_winner(df)\n", + "cs_rank_ind_cap_neutral_pe(df) # Placeholder - needs external libraries\n", + "cs_rank_volume_ratio(df) # Needs volume_ratio\n", + "cs_rank_elg_buy_sell_sm_ratio(df)\n", + "cs_rank_cost_dist_vol_ratio(df) # Needs volume_ratio\n", + "cs_rank_size(df) # Needs circ_mv\n", + "\n", + "\n", + "# df = df.merge(index_data, on='trade_date', how='left')\n", + "\n", + "print(df.info())\n", + "print(df.columns.tolist())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b87b938028afa206", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:03.658725Z", + "start_time": "2025-04-03T13:08:02.469611Z" + } + }, + "outputs": [], + "source": [ + "from scipy.stats import ks_2samp, wasserstein_distance\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 or 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" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4f16d63ad18d1bc", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:03.670700Z", + "start_time": "2025-04-03T13:08:03.665739Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import statsmodels.api as sm # 用于中性化回归\n", + "from tqdm import tqdm # 可选,用于显示进度条\n", + "\n", + "# --- 常量 ---\n", + "epsilon = 1e-10 # 防止除零\n", + "\n", + "# --- 1. 中位数去极值 (MAD) ---\n", + "\n", + "def cs_mad_filter(df: pd.DataFrame,\n", + " features: list,\n", + " k: float = 3.0,\n", + " scale_factor: float = 1.4826):\n", + " \"\"\"\n", + " 对指定特征列进行截面 MAD 去极值处理 (原地修改)。\n", + "\n", + " 方法: 对每日截面数据,计算 median 和 MAD,\n", + " 将超出 [median - k * scale * MAD, median + k * scale * MAD] 范围的值\n", + " 替换为边界值 (Winsorization)。\n", + " scale_factor=1.4826 使得 MAD 约等于正态分布的标准差。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。\n", + " features (list): 需要处理的特征列名列表。\n", + " k (float): MAD 的倍数,用于确定边界。默认为 3.0。\n", + " scale_factor (float): MAD 的缩放因子。默认为 1.4826。\n", + "\n", + " WARNING: 此函数会原地修改输入的 DataFrame 'df'。\n", + " \"\"\"\n", + " print(f\"开始截面 MAD 去极值处理 (k={k})...\")\n", + " if not all(col in df.columns for col in features):\n", + " missing = [col for col in features if col not in df.columns]\n", + " print(f\"错误: DataFrame 中缺少以下特征列: {missing}。跳过去极值处理。\")\n", + " return\n", + "\n", + " grouped = df.groupby('trade_date')\n", + "\n", + " for col in tqdm(features, desc=\"MAD Filtering\"):\n", + " try:\n", + " # 计算截面中位数\n", + " median = grouped[col].transform('median')\n", + " # 计算截面 MAD (Median Absolute Deviation from Median)\n", + " mad = (df[col] - median).abs().groupby(df['trade_date']).transform('median')\n", + "\n", + " # 计算上下边界\n", + " lower_bound = median - k * scale_factor * mad\n", + " upper_bound = median + k * scale_factor * mad\n", + "\n", + " # 原地应用 clip\n", + " df[col] = np.clip(df[col], lower_bound, upper_bound)\n", + "\n", + " except KeyError:\n", + " print(f\"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的 MAD 处理。\")\n", + " except Exception as e:\n", + " print(f\"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的 MAD 处理。\")\n", + "\n", + " print(\"截面 MAD 去极值处理完成。\")\n", + "\n", + "\n", + "# --- 2. 行业市值中性化 ---\n", + "\n", + "def cs_neutralize_industry_cap(df: pd.DataFrame,\n", + " features: list,\n", + " industry_col: str = 'cat_l2_code',\n", + " market_cap_col: str = 'circ_mv'):\n", + " \"\"\"\n", + " 对指定特征列进行截面行业和对数市值中性化 (原地修改)。\n", + " 使用 OLS 回归: feature ~ 1 + log(market_cap) + C(industry)\n", + " 将回归残差写回原特征列。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date', features 列,\n", + " industry_col, market_cap_col。\n", + " features (list): 需要处理的特征列名列表。\n", + " industry_col (str): 行业分类列名。\n", + " market_cap_col (str): 流通市值列名。\n", + "\n", + " WARNING: 此函数会原地修改输入的 DataFrame 'df' 的 features 列。\n", + " 计算量较大,可能耗时较长。\n", + " 需要安装 statsmodels 库 (pip install statsmodels)。\n", + " \"\"\"\n", + " print(\"开始截面行业市值中性化...\")\n", + " required_cols = features + ['trade_date', industry_col, market_cap_col]\n", + " if not all(col in df.columns for col in required_cols):\n", + " missing = [col for col in required_cols if col not in df.columns]\n", + " print(f\"错误: DataFrame 中缺少必需列: {missing}。无法进行中性化。\")\n", + " return\n", + "\n", + " # 预处理:计算 log 市值,处理 industry code 可能的 NaN\n", + " log_cap_col = '_log_market_cap'\n", + " df[log_cap_col] = np.log1p(df[market_cap_col]) # log1p 处理 0 值\n", + " # df[industry_col] = df[industry_col].cat.add_categories('UnknownIndustry')\n", + " # df[industry_col] = df[industry_col].fillna('UnknownIndustry') # 填充行业 NaN\n", + " # df[industry_col] = df[industry_col].astype('category') # 转为类别,ols 会自动处理\n", + "\n", + " dates = df['trade_date'].unique()\n", + " all_residuals = [] # 用于收集所有日期的残差\n", + "\n", + " for date in tqdm(dates, desc=\"Neutralizing\"):\n", + " daily_data = df.loc[df['trade_date'] == date, features + [log_cap_col, industry_col]].copy() # 使用 .loc 获取副本\n", + "\n", + " # 准备自变量 X (常数项 + log市值 + 行业哑变量)\n", + " X = daily_data[[log_cap_col]]\n", + " X = sm.add_constant(X, prepend=True) # 添加常数项\n", + " # 创建行业哑变量 (drop_first=True 避免共线性)\n", + " industry_dummies = pd.get_dummies(daily_data[industry_col], prefix=industry_col, drop_first=True)\n", + " industry_dummies = industry_dummies.astype(int)\n", + " X = pd.concat([X, industry_dummies], axis=1)\n", + "\n", + " daily_residuals = daily_data[[col for col in features]].copy() # 创建用于存储残差的df\n", + "\n", + " for col in features:\n", + " Y = daily_data[col]\n", + "\n", + " # 处理 NaN 值,确保 X 和 Y 在相同位置有有效值\n", + " valid_mask = Y.notna() & X.notna().all(axis=1)\n", + " if valid_mask.sum() < (X.shape[1] + 1): # 数据点不足以估计模型\n", + " print(f\"警告: 日期 {date}, 特征 {col} 有效数据不足 ({valid_mask.sum()}个),无法中性化,填充 NaN。\")\n", + " daily_residuals[col] = np.nan\n", + " continue\n", + "\n", + " Y_valid = Y[valid_mask]\n", + " X_valid = X[valid_mask]\n", + "\n", + " # 执行 OLS 回归\n", + " try:\n", + " model = sm.OLS(Y_valid.to_numpy(), X_valid.to_numpy())\n", + " results = model.fit()\n", + " # 将残差填回对应位置\n", + " daily_residuals.loc[valid_mask, col] = results.resid\n", + " daily_residuals.loc[~valid_mask, col] = np.nan # 原本无效的位置填充 NaN\n", + " except Exception as e:\n", + " print(f\"警告: 日期 {date}, 特征 {col} 回归失败: {e},填充 NaN。\")\n", + " daily_residuals[col] = np.nan\n", + " break\n", + "\n", + " all_residuals.append(daily_residuals)\n", + "\n", + " # 合并所有日期的残差结果\n", + " if all_residuals:\n", + " residuals_df = pd.concat(all_residuals)\n", + " # 将残差结果更新回原始 df (原地修改)\n", + " # 使用 update 比 merge 更适合基于索引的原地更新\n", + " # 确保 residuals_df 的索引与 df 中对应部分一致\n", + " df.update(residuals_df)\n", + " else:\n", + " print(\"没有有效的残差结果可以合并。\")\n", + "\n", + "\n", + " # 清理临时列\n", + " df.drop(columns=[log_cap_col], inplace=True)\n", + " print(\"截面行业市值中性化完成。\")\n", + "\n", + "\n", + "# --- 3. Z-Score 标准化 ---\n", + "\n", + "def cs_zscore_standardize(df: pd.DataFrame, features: list, epsilon: float = 1e-10):\n", + " \"\"\"\n", + " 对指定特征列进行截面 Z-Score 标准化 (原地修改)。\n", + " 方法: Z = (value - cross_sectional_mean) / (cross_sectional_std + epsilon)\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。\n", + " features (list): 需要处理的特征列名列表。\n", + " epsilon (float): 防止除以零的小常数。\n", + "\n", + " WARNING: 此函数会原地修改输入的 DataFrame 'df'。\n", + " \"\"\"\n", + " print(\"开始截面 Z-Score 标准化...\")\n", + " if not all(col in df.columns for col in features):\n", + " missing = [col for col in features if col not in df.columns]\n", + " print(f\"错误: DataFrame 中缺少以下特征列: {missing}。跳过标准化处理。\")\n", + " return\n", + "\n", + " grouped = df.groupby('trade_date')\n", + "\n", + " for col in tqdm(features, desc=\"Standardizing\"):\n", + " try:\n", + " # 使用 transform 计算截面均值和标准差\n", + " mean = grouped[col].transform('mean')\n", + " std = grouped[col].transform('std')\n", + "\n", + " # 计算 Z-Score 并原地赋值\n", + " df[col] = (df[col] - mean) / (std + epsilon)\n", + "\n", + " except KeyError:\n", + " print(f\"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的标准化处理。\")\n", + " except Exception as e:\n", + " print(f\"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的标准化处理。\")\n", + "\n", + " print(\"截面 Z-Score 标准化完成。\")\n", + "\n", + "def fill_nan_with_daily_median(df: pd.DataFrame, feature_columns: list[str]) -> pd.DataFrame:\n", + " \"\"\"\n", + " 对指定特征列进行每日截面中位数填充缺失值 (NaN)。\n", + "\n", + " 参数:\n", + " df (pd.DataFrame): 包含多日数据的DataFrame,需要包含 'trade_date' 和 feature_columns 中的列。\n", + " feature_columns (list[str]): 需要进行缺失值填充的特征列名称列表。\n", + "\n", + " 返回:\n", + " pd.DataFrame: 包含缺失值填充后特征列的DataFrame。在输入DataFrame的副本上操作。\n", + " \"\"\"\n", + " processed_df = df.copy() # 在副本上操作,保留原始数据\n", + "\n", + " # 确保 trade_date 是 datetime 类型以便正确分组\n", + " processed_df['trade_date'] = pd.to_datetime(processed_df['trade_date'])\n", + "\n", + " def _fill_daily_nan(group):\n", + " # group 是某一个交易日的 DataFrame\n", + "\n", + " # 遍历指定的特征列\n", + " for feature_col in feature_columns:\n", + " # 检查列是否存在于当前分组中\n", + " if feature_col in group.columns:\n", + " # 计算当日该特征的中位数\n", + " median_val = group[feature_col].median()\n", + "\n", + " # 使用当日中位数填充该特征列的 NaN 值\n", + " # inplace=True 会直接修改 group DataFrame\n", + " group[feature_col].fillna(median_val, inplace=True)\n", + " # else:\n", + " # print(f\"Warning: Feature column '{feature_col}' not found in daily group for {group['trade_date'].iloc[0]}. Skipping.\")\n", + "\n", + " return group\n", + "\n", + " # 按交易日期分组,并应用每日填充函数\n", + " # group_keys=False 避免将分组键添加到结果索引中\n", + " filled_df = processed_df.groupby('trade_date', group_keys=False).apply(_fill_daily_nan)\n", + "\n", + " return filled_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40e6b68a91b30c79", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:04.694262Z", + "start_time": "2025-04-03T13:08:03.694904Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\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", + " if not (0 <= lower_percentile < upper_percentile <= 1):\n", + " raise ValueError(\"Percentile values must satisfy 0 <= lower_percentile < upper_percentile <= 1.\")\n", + "\n", + " # Calculate lower and upper bounds based on percentiles\n", + " lower_bound = label.quantile(lower_percentile)\n", + " upper_bound = label.quantile(upper_percentile)\n", + "\n", + " # Filter out values outside the bounds\n", + " filtered_label = label[(label >= lower_bound) & (label <= upper_bound)]\n", + "\n", + " # Print the number of removed outliers\n", + " if log:\n", + " print(f\"Removed {len(label) - len(filtered_label)} outliers.\")\n", + " return filtered_label\n", + "\n", + "\n", + "def calculate_risk_adjusted_target(df, days=5):\n", + " df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\n", + " df['future_close'] = df.groupby('ts_code')['close'].shift(-days)\n", + " df['future_open'] = df.groupby('ts_code')['open'].shift(-1)\n", + " df['future_return'] = (df['future_close'] - df['future_open']) / df['future_open']\n", + "\n", + " df['future_volatility'] = df.groupby('ts_code')['future_return'].rolling(days, min_periods=1).std().reset_index(\n", + " level=0, drop=True)\n", + " sharpe_ratio = df['future_return'] * df['future_volatility']\n", + " sharpe_ratio.replace([np.inf, -np.inf], np.nan, inplace=True)\n", + "\n", + " return sharpe_ratio\n", + "\n", + "\n", + "def calculate_score(df, days=5, lambda_param=1.0):\n", + " def calculate_max_drawdown(prices):\n", + " peak = prices.iloc[0] # 初始化峰值\n", + " max_drawdown = 0 # 初始化最大回撤\n", + "\n", + " for price in prices:\n", + " if price > peak:\n", + " peak = price # 更新峰值\n", + " else:\n", + " drawdown = (peak - price) / peak # 计算当前回撤\n", + " max_drawdown = max(max_drawdown, drawdown) # 更新最大回撤\n", + "\n", + " return max_drawdown\n", + "\n", + " def compute_stock_score(stock_df):\n", + " stock_df = stock_df.sort_values(by=['trade_date'])\n", + " future_return = stock_df['future_return']\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", + " return score\n", + "\n", + " # # 确保 DataFrame 按照股票代码和交易日期排序\n", + " # df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\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", + " numeric_features = df[feature_columns].select_dtypes(include=[np.number]).columns.tolist()\n", + " if not numeric_features:\n", + " raise ValueError(\"No numeric features found in the provided data.\")\n", + "\n", + " corr_matrix = df[numeric_features].corr().abs()\n", + " upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))\n", + " to_drop = [column for column in upper.columns if any(upper[column] > threshold)]\n", + " remaining_features = [col for col in feature_columns if col not in to_drop\n", + " or 'act' in col or 'af' in col]\n", + " return remaining_features\n", + "\n", + "\n", + "def cross_sectional_standardization(df, features):\n", + " df_sorted = df.sort_values(by='trade_date') # 按时间排序\n", + " df_standardized = df_sorted.copy()\n", + "\n", + " for date in df_sorted['trade_date'].unique():\n", + " # 获取当前时间点的数据\n", + " current_data = df_standardized[df_standardized['trade_date'] == date]\n", + "\n", + " # 只对指定特征进行标准化\n", + " scaler = StandardScaler()\n", + " standardized_values = scaler.fit_transform(current_data[features])\n", + "\n", + " # 将标准化结果重新赋值回去\n", + " df_standardized.loc[df_standardized['trade_date'] == date, features] = standardized_values\n", + "\n", + " return df_standardized\n", + "\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "\n", + "def neutralize_manual_revised(df: pd.DataFrame, features: list, industry_col: str, mkt_cap_col: str) -> pd.DataFrame:\n", + " \"\"\"\n", + " 手动实现简单回归以提升速度,通过构建 Series 确保索引对齐。\n", + " 对特征在行业内部进行市值中性化。\n", + "\n", + " Args:\n", + " df: 输入的 DataFrame,包含特征、行业分类和市值列。\n", + " features: 需要进行中性化的特征列名列表。\n", + " industry_col: 行业分类列的列名。\n", + " mkt_cap_col: 市值列的列名。\n", + "\n", + " Returns:\n", + " 中性化后的 DataFrame。\n", + " \"\"\"\n", + "\n", + " df[mkt_cap_col] = pd.to_numeric(df[mkt_cap_col], errors='coerce')\n", + " df_cleaned = df.dropna(subset=[mkt_cap_col]).copy()\n", + " df_cleaned = df_cleaned[df_cleaned[mkt_cap_col] > 0].copy()\n", + "\n", + " if df_cleaned.empty:\n", + " print(\"警告: 清理市值异常值后 DataFrame 为空。\")\n", + " return df # 返回原始或空df,取决于清理前的状态\n", + "\n", + " processed_df = df\n", + "\n", + " for col in features:\n", + " if col not in df_cleaned.columns:\n", + " print(f\"警告: 特征列 '{col}' 不存在于清理后的 DataFrame 中,已跳过。\")\n", + " # 对于原始 df 中该列不存在的,在结果 df 中也保持原样(可能全是NaN)\n", + " processed_df[col] = df[col] if col in df.columns else np.nan\n", + " continue\n", + "\n", + " # 跳过对控制变量本身进行中性化\n", + " if col == mkt_cap_col or col == industry_col:\n", + " print(f\"警告: 特征列 '{col}' 是控制变量或内部使用的列,跳过中性化。\")\n", + " # 在结果 df 中也保持原样\n", + " processed_df[col] = df[col] if col in df.columns else np.nan\n", + " continue\n", + "\n", + " residual_series = pd.Series(index=df_cleaned.index, dtype=float)\n", + "\n", + " # 在分组前处理特征列的 NaN,只对有因子值的行进行回归计算\n", + " df_subset_factor = df_cleaned.dropna(subset=[col]).copy()\n", + "\n", + " if not df_subset_factor.empty:\n", + " for industry, group in df_subset_factor.groupby(industry_col):\n", + " x = group[mkt_cap_col] # 市值对数\n", + " y = group[col] # 因子值\n", + "\n", + " # 确保有足够的数据点 (>1) 且市值对数有方差 (>0) 进行回归计算\n", + " # 检查 np.var > 一个很小的正数,避免浮点数误差导致的零方差判断问题\n", + " if len(group) > 1 and np.var(x) > 1e-9:\n", + " try:\n", + " beta = np.cov(y, x)[0, 1] / np.var(x)\n", + " alpha = np.mean(y) - beta * np.mean(x)\n", + "\n", + " # 计算残差\n", + " resid = y - (alpha + beta * x)\n", + "\n", + " # 将计算出的残差存储到 residual_series 中,通过索引自动对齐\n", + " residual_series.loc[resid.index] = resid\n", + "\n", + " except Exception as e:\n", + " # 捕获可能的计算异常,例如np.cov或np.var因为极端数据报错\n", + " print(f\"警告: 在行业 {industry} 计算回归时发生错误: {e}。该组残差将设为原始值或 NaN。\")\n", + " # 此时该组的残差会保持 residual_series 初始化时的 NaN 或后续处理\n", + " # 也可以选择保留原始值:residual_series.loc[group.index] = group[col]\n", + "\n", + " else:\n", + " residual_series.loc[group.index] = group[col] # 保留原始因子值\n", + " processed_df.loc[residual_series.index, col] = residual_series\n", + "\n", + "\n", + " else:\n", + " processed_df[col] = np.nan # 或 df[col] if col in df.columns else np.nan\n", + "\n", + " return processed_df\n", + "\n", + "\n", + "import gc\n", + "\n", + "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(lambda x: x.rolling(window=min(len(x), window)).quantile(lower_quantile))\n", + " rolling_upper = df.groupby('trade_date')[col].transform(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", + "\n", + "def select_top_features_by_rankic(df: pd.DataFrame, feature_columns: list, n: int, target_column: str = 'future_return') -> list:\n", + " \"\"\"\n", + " 计算给定特征与目标列的 RankIC,并返回 RankIC 绝对值最高的 n 个特征。\n", + "\n", + " Args:\n", + " df: 包含特征列和目标列的 Pandas DataFrame。\n", + " feature_columns: 包含所有待评估特征列名的列表。\n", + " n: 希望选取的 RankIC 绝对值最高的特征数量。\n", + " target_column: 目标列的名称,用于计算 RankIC。默认为 'future_return'。\n", + "\n", + " Returns:\n", + " 包含 RankIC 绝对值最高的 n 个特征列名的列表。\n", + " \"\"\"\n", + " numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n", + " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", + " if target_column not in df.columns:\n", + " raise ValueError(f\"目标列 '{target_column}' 不存在于 DataFrame 中。\")\n", + "\n", + " rankic_scores = {}\n", + " for feature in numeric_columns:\n", + " if feature not in df.columns:\n", + " print(f\"警告: 特征列 '{feature}' 不存在于 DataFrame 中,已跳过。\")\n", + " continue\n", + "\n", + " # 计算特征与目标列的 RankIC (斯皮尔曼相关系数)\n", + " # dropna() 是为了处理缺失值,确保相关性计算不失败\n", + " valid_data = df[[feature, target_column]].dropna()\n", + " if len(valid_data) > 1: # 确保有足够的数据点进行相关性计算\n", + " # 计算斯皮尔曼相关性\n", + " correlation = valid_data[feature].corr(valid_data[target_column], method='spearman')\n", + " rankic_scores[feature] = abs(correlation) # 使用绝对值来衡量相关性强度\n", + " else:\n", + " rankic_scores[feature] = 0 # 数据不足,RankIC设为0或跳过\n", + "\n", + " # 将 RankIC 分数转换为 Series 便于排序\n", + " rankic_series = pd.Series(rankic_scores)\n", + "\n", + " # 按 RankIC 绝对值降序排序,选取前 n 个特征\n", + " # handle case where n might be larger than available features\n", + " n_actual = min(n, len(rankic_series))\n", + " top_features = rankic_series.sort_values(ascending=False).head(n_actual).index.tolist()\n", + " top_features = [col for col in feature_columns if col in top_features or col not in numeric_columns]\n", + " return top_features\n", + "\n", + "def create_deviation_within_dates(df, feature_columns):\n", + " groupby_col = 'cat_l2_code' # 使用 trade_date 进行分组\n", + " new_columns = {}\n", + " ret_feature_columns = feature_columns[:]\n", + "\n", + " # 自动选择所有数值型特征\n", + " num_features = [col for col in feature_columns if 'cat' not in col and 'index' not in col]\n", + "\n", + " # 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']\n", + " num_features = [col for col in num_features if 'cat' not in col and 'industry' not in col]\n", + " num_features = [col for col in num_features if 'limit' not in col]\n", + " num_features = [col for col in num_features if 'cyq' not in col]\n", + "\n", + " # 遍历所有数值型特征\n", + " for feature in num_features:\n", + " if feature == 'trade_date': # 不需要对 'trade_date' 计算偏差\n", + " continue\n", + "\n", + " # grouped_mean = df.groupby(['trade_date'])[feature].transform('mean')\n", + " # deviation_col_name = f'deviation_mean_{feature}'\n", + " # new_columns[deviation_col_name] = df[feature] - grouped_mean\n", + " # ret_feature_columns.append(deviation_col_name)\n", + "\n", + " grouped_mean = df.groupby(['trade_date', groupby_col])[feature].transform('mean')\n", + " deviation_col_name = f'deviation_mean_{feature}'\n", + " new_columns[deviation_col_name] = df[feature] - grouped_mean\n", + " ret_feature_columns.append(deviation_col_name)\n", + "\n", + " # 将新计算的偏差特征与原始 DataFrame 合并\n", + " df = pd.concat([df, pd.DataFrame(new_columns)], axis=1)\n", + "\n", + " # for feature in ['obv', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4']:\n", + " # df[f'deviation_industry_{feature}'] = df[feature] - df[f'industry_{feature}']\n", + "\n", + " return df, ret_feature_columns\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47c12bb34062ae7a", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T14:57:50.841165Z", + "start_time": "2025-04-03T14:49:25.889057Z" + } + }, + "outputs": [], + "source": [ + "days = 5\n", + "validation_days = 120\n", + "\n", + "import gc\n", + "\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", + "\n", + "df['cat_up_limit'] = df['pct_chg'] > 5\n", + "# df['label'] = (df.groupby('ts_code')['cat_up_limit']\n", + "# .rolling(window=5, min_periods=1).sum()\n", + "# .groupby('ts_code') # 再次按 ts_code 分组\n", + "# .shift(-5)\n", + "# .fillna(0) # 填充每个股票组最后的 NaN\n", + "# .astype(int)\n", + "# .reset_index(level=0, drop=True))\n", + "df['label'] = df.groupby('trade_date', group_keys=False)['future_return'].transform(\n", + " lambda x: pd.qcut(x, q=20, labels=False, duplicates='drop')\n", + ")\n", + "filter_index = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99))\n", + "\n", + "# for col in [col for col in df.columns]:\n", + "# train_data[col] = train_data[col].astype('str')\n", + "# test_data[col] = test_data[col].astype('str')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8f4dc587", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ts_code trade_date open close high low vol pct_chg \\\n", + "976171 002193.SZ 2019-01-02 18.02 17.82 18.21 17.73 22513.62 -1.00 \n", + "976172 002193.SZ 2019-01-03 17.82 17.78 17.94 17.65 19523.21 -0.22 \n", + "976173 002193.SZ 2019-01-04 17.47 18.04 18.10 17.34 28094.69 1.46 \n", + "976174 002193.SZ 2019-01-07 18.17 18.31 18.39 18.00 23866.88 1.50 \n", + "976175 002193.SZ 2019-01-08 18.25 18.52 18.66 18.13 22853.46 1.15 \n", + "... ... ... ... ... ... ... ... ... \n", + "977704 002193.SZ 2025-05-19 11.74 11.95 11.97 11.61 94249.32 2.49 \n", + "977705 002193.SZ 2025-05-20 11.99 12.20 12.22 11.84 103040.57 2.09 \n", + "977706 002193.SZ 2025-05-21 12.20 11.97 12.28 11.82 83112.00 -1.89 \n", + "977707 002193.SZ 2025-05-22 11.95 11.80 12.17 11.72 88811.00 -1.42 \n", + "977708 002193.SZ 2025-05-23 11.74 11.51 11.90 11.51 93013.00 -2.46 \n", + "\n", + " turnover_rate pe_ttm ... cs_rank_lg_flow_price_concordance \\\n", + "976171 0.9771 23.0129 ... 0.621118 \n", + "976172 0.8473 22.9598 ... 0.230095 \n", + "976173 1.2193 23.3049 ... 0.507119 \n", + "976174 1.0358 23.6499 ... 0.315078 \n", + "976175 0.9918 23.9154 ... 0.248631 \n", + "... ... ... ... ... \n", + "977704 3.6012 NaN ... 0.224402 \n", + "977705 3.9371 NaN ... 0.124834 \n", + "977706 3.1757 NaN ... 0.803720 \n", + "977707 3.3934 NaN ... 0.667220 \n", + "977708 3.5540 NaN ... 0.308867 \n", + "\n", + " cs_rank_turnover_per_winner cs_rank_ind_cap_neutral_pe \\\n", + "976171 0.990869 NaN \n", + "976172 0.934283 NaN \n", + "976173 0.925182 NaN \n", + "976174 0.843796 NaN \n", + "976175 0.834672 NaN \n", + "... ... ... \n", + "977704 0.624335 NaN \n", + "977705 0.641102 NaN \n", + "977706 0.624709 NaN \n", + "977707 0.563268 NaN \n", + "977708 0.661242 NaN \n", + "\n", + " cs_rank_volume_ratio cs_rank_elg_buy_sell_sm_ratio \\\n", + "976171 0.710344 0.341855 \n", + "976172 0.444444 0.318912 \n", + "976173 0.489226 0.260036 \n", + "976174 0.250000 0.251095 \n", + "976175 0.510588 0.286679 \n", + "... ... ... \n", + "977704 0.234043 0.397274 \n", + "977705 0.344124 0.116534 \n", + "977706 0.221189 0.126370 \n", + "977707 0.412155 0.130521 \n", + "977708 0.534540 0.134175 \n", + "\n", + " cs_rank_cost_dist_vol_ratio cs_rank_size future_return \\\n", + "976171 0.261603 0.262235 0.034231 \n", + "976172 0.185342 0.264695 0.029809 \n", + "976173 0.211959 0.259489 0.025499 \n", + "976174 0.145266 0.255474 0.014746 \n", + "976175 0.202299 0.259854 0.003240 \n", + "... ... ... ... \n", + "977704 0.299535 0.031250 NaN \n", + "977705 0.339641 0.032205 NaN \n", + "977706 0.291597 0.030555 NaN \n", + "977707 0.372634 0.030555 NaN \n", + "977708 0.430090 0.027898 NaN \n", + "\n", + " cat_up_limit label \n", + "976171 False 8.0 \n", + "976172 False 7.0 \n", + "976173 False 10.0 \n", + "976174 False 13.0 \n", + "976175 False 6.0 \n", + "... ... ... \n", + "977704 False NaN \n", + "977705 False NaN \n", + "977706 False NaN \n", + "977707 False NaN \n", + "977708 False NaN \n", + "\n", + "[1538 rows x 181 columns]\n" + ] + } + ], + "source": [ + "print(df[df['ts_code'] == '002193.SZ'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29221dde", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "192\n" + ] + } + ], + "source": [ + "feature_columns = [col for col in df.head(10)\n", + " .merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + " .merge(index_data, on='trade_date', how='left')\n", + " .columns\n", + " ]\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 'is_st' 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 'circ_mv' not in col]\n", + "feature_columns = [col for col in feature_columns if '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", + "# feature_columns = [col for col in feature_columns if col not in ['ts_code', 'trade_date', 'vol_std_5', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_007', 'consecutive_up_limit', 'mv_volatility', 'volume_growth', 'mv_growth', 'arbr']]\n", + "feature_columns = [col for col in feature_columns if col not in ['intraday_lg_flow_corr_20', \n", + " 'cap_neutral_cost_metric', \n", + " 'hurst_net_mf_vol_60', \n", + " 'complex_factor_deap_1', \n", + " 'lg_buy_consolidation_20',\n", + " 'cs_rank_ind_cap_neutral_pe',\n", + " 'cs_rank_opening_gap',\n", + " 'cs_rank_ind_adj_lg_flow']]\n", + "feature_columns = [col for col in feature_columns if col not in ['cat_reason', 'cat_is_on_top_list']]\n", + "print(len(feature_columns))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03ee5daf", + "metadata": {}, + "outputs": [], + "source": [ + "# df = fill_nan_with_daily_median(df, feature_columns)\n", + "for feature_col in [col for col in feature_columns if col in df.columns]:\n", + " # median_val = df[feature_col].median()\n", + " df[feature_col].fillna(0, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b76ea08a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ts_code trade_date log_circ_mv\n", + "0 000001.SZ 2019-01-02 16.574219\n", + "1 000001.SZ 2019-01-03 16.583965\n", + "2 000001.SZ 2019-01-04 16.633371\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "去除极值\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 100%|██████████| 132/132 [00:28<00:00, 4.64it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 100%|██████████| 132/132 [00:23<00:00, 5.57it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 0it [00:00, ?it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 0it [00:00, ?it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "feature_columns: ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n", + "df最小日期: 2019-01-02\n", + "df最大日期: 2025-05-23\n", + "2057539\n", + "train_data最小日期: 2020-01-02\n", + "train_data最大日期: 2022-12-30\n", + "1766694\n", + "test_data最小日期: 2023-01-03\n", + "test_data最大日期: 2025-05-23\n", + " ts_code trade_date log_circ_mv\n", + "0 000001.SZ 2019-01-02 16.574219\n", + "1 000001.SZ 2019-01-03 16.583965\n", + "2 000001.SZ 2019-01-04 16.633371\n" + ] + } + ], + "source": [ + "split_date = '2023-01-01'\n", + "train_data = df[filter_index & (df['trade_date'] <= split_date) & (df['trade_date'] >= '2020-01-01')]\n", + "test_data = df[(df['trade_date'] >= split_date)]\n", + "\n", + "print(df[['ts_code', 'trade_date', 'log_circ_mv']].head(3))\n", + "\n", + "industry_df = industry_df.sort_values(by=['trade_date'])\n", + "index_data = index_data.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_data, 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_data, 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], np.nan)\n", + "\n", + "# feature_columns_new = feature_columns[:]\n", + "# train_data, _ = create_deviation_within_dates(train_data, [col for col in feature_columns if col in train_data.columns])\n", + "# test_data, _ = create_deviation_within_dates(test_data, [col for col in feature_columns if col in train_data.columns])\n", + "\n", + "# feature_columns = [\n", + "# 'undist_profit_ps', \n", + "# 'AR_BR',\n", + "# 'pe_ttm',\n", + "# 'alpha_22_improved', \n", + "# 'alpha_003', \n", + "# 'alpha_007', \n", + "# 'alpha_013', \n", + "# 'cat_up_limit', \n", + "# 'cat_down_limit', \n", + "# 'up_limit_count_10d', \n", + "# 'down_limit_count_10d', \n", + "# 'consecutive_up_limit', \n", + "# 'vol_break', \n", + "# 'weight_roc5', \n", + "# 'price_cost_divergence', \n", + "# 'smallcap_concentration', \n", + "# 'cost_stability', \n", + "# 'high_cost_break_days', \n", + "# 'liquidity_risk', \n", + "# 'turnover_std', \n", + "# 'mv_volatility', \n", + "# 'volume_growth', \n", + "# 'mv_growth', \n", + "# 'lg_flow_mom_corr_20_60', \n", + "# 'lg_flow_accel', \n", + "# 'profit_pressure', \n", + "# 'underwater_resistance', \n", + "# 'cost_conc_std_20', \n", + "# 'profit_decay_20', \n", + "# 'vol_amp_loss_20', \n", + "# 'vol_drop_profit_cnt_5', \n", + "# 'lg_flow_vol_interact_20', \n", + "# 'cost_break_confirm_cnt_5', \n", + "# 'atr_norm_channel_pos_14', \n", + "# 'turnover_diff_skew_20', \n", + "# 'lg_sm_flow_diverge_20', \n", + "# 'pullback_strong_20_20', \n", + "# 'vol_wgt_hist_pos_20', \n", + "# 'vol_adj_roc_20',\n", + "# 'cashflow_to_ev_factor',\n", + "# 'ocfps',\n", + "# 'book_to_price_ratio',\n", + "# 'turnover_rate_mean_5',\n", + "# 'variance_20',\n", + "# 'bbi_ratio_factor'\n", + "# ]\n", + "# feature_columns = [col for col in feature_columns if col in train_data.columns]\n", + "# feature_columns = [col for col in feature_columns if not col.startswith('_')]\n", + "\n", + "numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n", + "numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", + "# feature_columns = select_top_features_by_rankic(df, numeric_columns, n=10)\n", + "print(feature_columns)\n", + "\n", + "# train_data = fill_nan_with_daily_median(train_data, feature_columns)\n", + "# test_data = fill_nan_with_daily_median(test_data, feature_columns)\n", + "\n", + "train_data = train_data.dropna(subset=[col for col in feature_columns if col in train_data.columns])\n", + "train_data = train_data.dropna(subset=['label'])\n", + "train_data = train_data.reset_index(drop=True)\n", + "# print(test_data.tail())\n", + "test_data = test_data.dropna(subset=[col for col in feature_columns if col in train_data.columns])\n", + "# test_data = test_data.dropna(subset=['label'])\n", + "test_data = test_data.reset_index(drop=True)\n", + "\n", + "transform_feature_columns = feature_columns\n", + "transform_feature_columns = [col for col in transform_feature_columns if col in feature_columns and not col.startswith('cat') and col in train_data.columns]\n", + "# transform_feature_columns.remove('undist_profit_ps')\n", + "print('去除极值')\n", + "cs_mad_filter(train_data, transform_feature_columns)\n", + "# print('中性化')\n", + "# cs_neutralize_industry_cap(train_data, transform_feature_columns)\n", + "# print('标准化')\n", + "# cs_zscore_standardize(train_data, transform_feature_columns)\n", + "\n", + "cs_mad_filter(test_data, transform_feature_columns)\n", + "# cs_neutralize_industry_cap(test_data, transform_feature_columns)\n", + "# cs_zscore_standardize(test_data, transform_feature_columns)\n", + "\n", + "mad_filter_feature_columns = [col for col in feature_columns if col not in transform_feature_columns and not col.startswith('cat') and col in train_data.columns]\n", + "cs_mad_filter(train_data, mad_filter_feature_columns)\n", + "cs_mad_filter(test_data, mad_filter_feature_columns)\n", + "\n", + "\n", + "print(f'feature_columns: {feature_columns}')\n", + "\n", + "\n", + "print(f\"df最小日期: {df['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"df最大日期: {df['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "print(len(train_data))\n", + "print(f\"train_data最小日期: {train_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"train_data最大日期: {train_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "print(len(test_data))\n", + "print(f\"test_data最小日期: {test_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"test_data最大日期: {test_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "\n", + "cat_columns = [col for col in feature_columns if col.startswith('cat')]\n", + "for col in cat_columns:\n", + " train_data[col] = train_data[col].astype('category')\n", + " test_data[col] = test_data[col].astype('category')\n", + "\n", + "print(df[['ts_code', 'trade_date', 'log_circ_mv']].head(3))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e4b027e", + "metadata": {}, + "outputs": [], + "source": [ + "class RmseObjective(object):\n", + "\n", + " def is_max_optimal(self):\n", + " return False\n", + "\n", + " def get_final_error(self, error, weight):\n", + " return np.sqrt(error / (weight + 1e-38))\n", + "\n", + "\n", + " def evaluate(self, approxes, target, weight):\n", + " assert len(approxes) == 1\n", + " assert len(target) == len(approxes[0])\n", + "\n", + " approx = approxes[0]\n", + "\n", + " error_sum = 0.0\n", + " weight_sum = 0.0\n", + "\n", + " for i in range(len(approx)):\n", + " w = 1.0 if weight is None else weight[i]\n", + " weight_sum += w\n", + " error_sum += w * ((approx[i] - target[i])**2)\n", + "\n", + " return error_sum, weight_sum\n", + "\n", + " def calc_ders_range(self, approxes, targets, weights):\n", + " assert len(approxes) == len(targets)\n", + " if weights is not None:\n", + " assert len(weights) == len(approxes)\n", + "\n", + " result = []\n", + " for index in range(len(targets)):\n", + " der1 = targets[index] - approxes[index]\n", + " der2 = -1\n", + "\n", + " if weights is not None:\n", + " der1 *= weights[index]\n", + " der2 *= weights[index]\n", + "\n", + " result.append((der1, der2))\n", + " return result\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ff2d1c5", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LogisticRegression\n", + "import matplotlib.pyplot as plt # 保持 matplotlib 导入,尽管LightGBM的绘图功能已移除\n", + "from sklearn.decomposition import PCA\n", + "import pandas as pd\n", + "import numpy as np\n", + "import datetime # 用于日期计算\n", + "from catboost import CatBoostClassifier, CatBoostRanker, CatBoostRegressor\n", + "from catboost import Pool\n", + "import lightgbm as lgb\n", + "from lightgbm import LGBMRanker, LGBMRegressor\n", + "\n", + "def train_model(train_data_df, feature_columns,\n", + " print_info=True, # 调整参数名,更通用\n", + " validation_days=180, use_pca=False, split_date=None,\n", + " target_column='label', type='light'): # 增加目标列参数\n", + "\n", + " print('train data size: ', len(train_data_df))\n", + " print(train_data_df[['ts_code', 'trade_date', 'log_circ_mv']])\n", + " # 确保数据按时间排序\n", + " train_data_df = train_data_df.sort_values(by='trade_date')\n", + "\n", + " # 识别数值型特征列\n", + " numeric_feature_columns = train_data_df[feature_columns].select_dtypes(include=['float64', 'int64']).columns.tolist()\n", + "\n", + " # 去除标签为空的样本\n", + " initial_len = len(train_data_df)\n", + " train_data_df = train_data_df.dropna(subset=[target_column])\n", + "\n", + " if print_info:\n", + " print(f'原始样本数: {initial_len}, 去除标签为空后样本数: {len(train_data_df)}')\n", + "\n", + " # 提取特征和标签,只取数值型特征用于线性回归\n", + " \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", + " val_data_split = train_data_df[train_data_df['trade_date'] >= split_date] # 验证集\n", + "\n", + " train_data_split = train_data_split.sort_values('trade_date')\n", + " val_data_split = val_data_split.sort_values('trade_date')\n", + "\n", + " \n", + " X_train = train_data_split[feature_columns]\n", + " y_train = train_data_split[target_column]\n", + " \n", + " X_val = val_data_split[feature_columns]\n", + " y_val = val_data_split[target_column]\n", + "\n", + "\n", + " # # 标准化数值特征 (使用 StandardScaler 对训练集fit并transform, 对验证集只transform)\n", + " scaler = StandardScaler()\n", + " # X_train = scaler.fit_transform(X_train)\n", + "\n", + " # 训练线性回归模型\n", + " # model = LogisticRegression(random_state=42)\n", + " \n", + " # # 使用处理后的特征和样本权重进行训练\n", + " # model.fit(X_train, y_train)\n", + "\n", + "\n", + " if type == 'cat':\n", + " params = {\n", + " 'loss_function': 'QueryRMSE', # 适用于二分类\n", + " 'eval_metric': 'NDCG', # 评估指标\n", + " 'iterations': 1500,\n", + " 'learning_rate': 0.01,\n", + " 'depth': 10, # 控制模型复杂度\n", + " # 'l2_leaf_reg': 0.1, # L2 正则化\n", + " 'verbose': 5000,\n", + " 'early_stopping_rounds': 300,\n", + " 'one_hot_max_size': 50,\n", + " # 'class_weights': [0.6, 1.2],\n", + " 'task_type': 'GPU',\n", + " 'has_time': True,\n", + " 'random_seed': 7\n", + " }\n", + " cat_features = [i for i, col in enumerate(feature_columns) if col.startswith('cat')]\n", + " group_train = train_data_split['trade_date'].factorize()[0]\n", + " group_val = val_data_split['trade_date'].factorize()[0]\n", + " train_pool = Pool(\n", + " data=X_train,\n", + " label=y_train,\n", + " group_id=group_train,\n", + " cat_features=cat_features\n", + " )\n", + " val_pool = Pool(\n", + " data=X_val,\n", + " label=y_val,\n", + " group_id=group_val,\n", + " cat_features=cat_features\n", + " )\n", + "\n", + "\n", + " model = CatBoostRanker(**params)\n", + " model.fit(train_pool,\n", + " eval_set=val_pool, \n", + " plot=True, \n", + " use_best_model=True\n", + " )\n", + " elif type == 'light':\n", + " label_gain = list(range(len(train_data_split['label'].unique())))\n", + " params = {\n", + " 'label_gain': [gain * gain for gain in label_gain],\n", + " 'objective': 'lambdarank',\n", + " 'metric': 'rank_xendcg',\n", + " 'learning_rate': 0.01,\n", + " 'num_leaves': 1024,\n", + " # 'min_data_in_leaf': 128,\n", + " 'max_depth': 10,\n", + " 'max_bin': 1024,\n", + " 'feature_fraction': 0.7,\n", + " 'bagging_fraction': 0.7,\n", + " 'bagging_freq': 5,\n", + " 'lambda_l1': 1,\n", + " 'lambda_l2': 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': 1,\n", + " # 'lambdarank_position_bias_regularization': 1,\n", + " 'seed': 7\n", + " }\n", + " train_groups = train_data_split.groupby('trade_date').size().tolist()\n", + " val_groups = val_data_split.groupby('trade_date').size().tolist()\n", + "\n", + " categorical_feature = [col for col in feature_columns if 'cat' in col]\n", + " train_dataset = lgb.Dataset(\n", + " X_train, label=y_train, \n", + " group=train_groups,\n", + " categorical_feature=categorical_feature\n", + " )\n", + " val_dataset = lgb.Dataset(\n", + " X_val, label=y_val, \n", + " group=val_groups,\n", + " categorical_feature=categorical_feature\n", + " )\n", + "\n", + " evals = {}\n", + " callbacks = [lgb.log_evaluation(period=1000),\n", + " lgb.callback.record_evaluation(evals),\n", + " lgb.early_stopping(100, first_metric_only=True)\n", + " ]\n", + " # # 训练模型\n", + " # model = lgb.train(\n", + " # params, train_dataset, num_boost_round=1000,\n", + " # valid_sets=[train_dataset, val_dataset], valid_names=['train', 'valid'],\n", + " # callbacks=callbacks\n", + " # )\n", + "\n", + " # # 打印特征重要性(如果需要)\n", + " # if True:\n", + " # lgb.plot_metric(evals)\n", + " # lgb.plot_importance(model, importance_type='split', max_num_features=20)\n", + " # plt.show()\n", + "\n", + " from flaml import AutoML\n", + " from sklearn.datasets import fetch_california_housing\n", + "\n", + " # Initialize an AutoML instance\n", + " model = AutoML()\n", + " # Specify automl goal and constraint\n", + " automl_settings = {\n", + " \"time_budget\": 600, # in seconds\n", + " \"metric\": \"ndcg@1\",\n", + " \"task\": \"rank\",\n", + " \"estimator_list\": [\n", + " \"catboost\",\n", + " \"lgbm\",\n", + " \"xgboost\"\n", + " ], \n", + " \"ensemble\": {\n", + " \"final_estimator\": LGBMRanker(),\n", + " \"passthrough\": False,\n", + " },\n", + " }\n", + " model.fit(X_train=X_train, y_train=y_train, groups=train_groups,\n", + " X_val=X_val, y_val=y_val,groups_val=val_groups,\n", + " mlflow_logging=False, **automl_settings)\n", + "\n", + "\n", + " return model, scaler, None # 返回训练好的模型、scaler 和 pca 对象" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T15:03:18.426481Z", + "start_time": "2025-04-03T15:02:19.926352Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train data size: 728000\n", + " ts_code trade_date log_circ_mv\n", + "0 600306.SH 2020-01-02 11.552040\n", + "1 603269.SH 2020-01-02 11.324801\n", + "2 002633.SZ 2020-01-02 11.759023\n", + "3 603991.SH 2020-01-02 11.181150\n", + "4 000691.SZ 2020-01-02 11.677910\n", + "... ... ... ...\n", + "727995 002235.SZ 2022-12-30 12.914708\n", + "727996 605598.SH 2022-12-30 11.783580\n", + "727997 002613.SZ 2022-12-30 12.489464\n", + "727998 600800.SH 2022-12-30 12.571911\n", + "727999 603068.SH 2022-12-30 12.967134\n", + "\n", + "[728000 rows x 3 columns]\n", + "原始样本数: 728000, 去除标签为空后样本数: 728000\n", + "[flaml.automl.logger: 05-26 20:16:56] {1728} INFO - task = rank\n", + "[flaml.automl.logger: 05-26 20:16:56] {1736} INFO - Data split method: group\n", + "[flaml.automl.logger: 05-26 20:16:56] {1739} INFO - Evaluation method: holdout\n", + "[flaml.automl.logger: 05-26 20:16:56] {1838} INFO - Minimizing error metric: 1-ndcg@1\n", + "[flaml.automl.logger: 05-26 20:16:56] {1955} INFO - List of ML learners in AutoML Run: ['catboost', 'lgbm', 'xgboost']\n", + "[flaml.automl.logger: 05-26 20:16:56] {2258} INFO - iteration 0, current learner catboost\n", + "[flaml.automl.logger: 05-26 20:17:16] {2393} INFO - Estimated sufficient time budget=203147s. Estimated necessary time budget=203s.\n", + "[flaml.automl.logger: 05-26 20:17:16] {2442} INFO - at 44.5s,\testimator catboost's best error=0.3789,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:17:16] {2258} INFO - iteration 1, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:17:20] {2442} INFO - at 48.3s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:17:20] {2258} INFO - iteration 2, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:17:25] {2442} INFO - at 53.2s,\testimator xgboost's best error=0.5269,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:17:25] {2258} INFO - iteration 3, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:17:29] {2442} INFO - at 57.0s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:17:29] {2258} INFO - iteration 4, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:17:34] {2442} INFO - at 61.6s,\testimator xgboost's best error=0.5269,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:17:34] {2258} INFO - iteration 5, current learner catboost\n", + "[flaml.automl.logger: 05-26 20:19:53] {2442} INFO - at 200.7s,\testimator catboost's best error=0.3789,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:19:53] {2258} INFO - iteration 6, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:19:56] {2442} INFO - at 204.4s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:19:56] {2258} INFO - iteration 7, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:20:01] {2442} INFO - at 209.4s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:01] {2258} INFO - iteration 8, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:20:05] {2442} INFO - at 212.9s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:05] {2258} INFO - iteration 9, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:20:09] {2442} INFO - at 216.6s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:09] {2258} INFO - iteration 10, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:20:13] {2442} INFO - at 221.4s,\testimator xgboost's best error=0.5266,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:13] {2258} INFO - iteration 11, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:20:18] {2442} INFO - at 226.2s,\testimator xgboost's best error=0.4896,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:18] {2258} INFO - iteration 12, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:20:23] {2442} INFO - at 231.0s,\testimator xgboost's best error=0.4896,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:23] {2258} INFO - iteration 13, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:20:28] {2442} INFO - at 235.7s,\testimator xgboost's best error=0.4896,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:28] {2258} INFO - iteration 14, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:20:34] {2442} INFO - at 242.2s,\testimator xgboost's best error=0.4896,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:34] {2258} INFO - iteration 15, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:20:38] {2442} INFO - at 246.3s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:38] {2258} INFO - iteration 16, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:20:44] {2442} INFO - at 251.8s,\testimator xgboost's best error=0.4896,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:44] {2258} INFO - iteration 17, current learner catboost\n", + "[flaml.automl.logger: 05-26 20:20:52] {2442} INFO - at 260.4s,\testimator catboost's best error=0.3789,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:52] {2258} INFO - iteration 18, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:20:58] {2442} INFO - at 265.8s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:20:58] {2258} INFO - iteration 19, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:21:02] {2442} INFO - at 269.7s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:21:02] {2258} INFO - iteration 20, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:21:07] {2442} INFO - at 275.0s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:21:07] {2258} INFO - iteration 21, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:21:12] {2442} INFO - at 279.9s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:21:12] {2258} INFO - iteration 22, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:21:15] {2442} INFO - at 283.5s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:21:15] {2258} INFO - iteration 23, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:21:20] {2442} INFO - at 288.1s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:21:20] {2258} INFO - iteration 24, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:21:25] {2442} INFO - at 292.8s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:21:25] {2258} INFO - iteration 25, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:21:30] {2442} INFO - at 298.0s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:21:30] {2258} INFO - iteration 26, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:21:36] {2442} INFO - at 304.0s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:21:36] {2258} INFO - iteration 27, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:21:41] {2442} INFO - at 309.0s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:21:41] {2258} INFO - iteration 28, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:21:48] {2442} INFO - at 316.1s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:21:48] {2258} INFO - iteration 29, current learner catboost\n", + "[flaml.automl.logger: 05-26 20:24:08] {2442} INFO - at 456.2s,\testimator catboost's best error=0.3789,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:24:08] {2258} INFO - iteration 30, current learner catboost\n", + "[flaml.automl.logger: 05-26 20:24:17] {2442} INFO - at 465.0s,\testimator catboost's best error=0.3789,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:24:17] {2258} INFO - iteration 31, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:24:22] {2442} INFO - at 469.9s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:24:22] {2258} INFO - iteration 32, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:24:27] {2442} INFO - at 474.9s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:24:27] {2258} INFO - iteration 33, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:24:30] {2442} INFO - at 478.6s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:24:30] {2258} INFO - iteration 34, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:24:35] {2442} INFO - at 483.1s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:24:35] {2258} INFO - iteration 35, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:24:41] {2442} INFO - at 489.2s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:24:41] {2258} INFO - iteration 36, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:24:46] {2442} INFO - at 493.8s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:24:46] {2258} INFO - iteration 37, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:24:52] {2442} INFO - at 500.5s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:24:52] {2258} INFO - iteration 38, current learner lgbm\n", + "[flaml.automl.logger: 05-26 20:24:56] {2442} INFO - at 504.3s,\testimator lgbm's best error=0.4831,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:24:56] {2258} INFO - iteration 39, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:25:01] {2442} INFO - at 509.0s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:25:01] {2258} INFO - iteration 40, current learner xgboost\n", + "[flaml.automl.logger: 05-26 20:25:09] {2442} INFO - at 516.7s,\testimator xgboost's best error=0.4722,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:25:09] {2258} INFO - iteration 41, current learner catboost\n", + "[flaml.automl.logger: 05-26 20:26:37] {2442} INFO - at 605.2s,\testimator catboost's best error=0.3789,\tbest estimator catboost's best error=0.3789\n", + "[flaml.automl.logger: 05-26 20:26:37] {2550} INFO - selected model: \n", + "[flaml.automl.logger: 05-26 20:26:37] {1985} INFO - fit succeeded\n", + "[flaml.automl.logger: 05-26 20:26:37] {1986} INFO - Time taken to find the best model: 44.485583543777466\n" + ] + } + ], + "source": [ + "\n", + "gc.collect()\n", + "\n", + "use_pca = False\n", + "type = 'light'\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_model(train_data\n", + " .dropna(subset=['label']).groupby('trade_date', group_keys=False)\n", + " .apply(lambda x: x.nsmallest(1000, 'total_mv'))\n", + " .merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + " .merge(index_data, on='trade_date', how='left'), \n", + " feature_columns, type=type, target_column='label')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5d1522a7538db91b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T15:04:39.656944Z", + "start_time": "2025-04-03T15:04:39.298483Z" + } + }, + "outputs": [], + "source": [ + "score_df = test_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(1000, 'total_mv'))\n", + "# score_df = fill_nan_with_daily_median(score_df, ['pe_ttm'])\n", + "# score_df = score_df[score_df['pe_ttm'] > 0]\n", + "score_df = score_df.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + "score_df = score_df.merge(index_data, on='trade_date', how='left')\n", + "# score_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(50, 'total_mv')).reset_index()\n", + "numeric_columns = score_df.select_dtypes(include=['float64', 'int64']).columns\n", + "numeric_columns = [col for col in feature_columns if col in numeric_columns]\n", + "\n", + "if type == 'cat':\n", + " score_df['score'] = model.predict(score_df[feature_columns])\n", + "elif type == 'light':\n", + " score_df['score'] = model.predict(score_df[feature_columns])\n", + "score_df['score_ranks'] = score_df.groupby('trade_date')['score'].rank(ascending=True)\n", + "\n", + "score_df = score_df.groupby('trade_date', group_keys=False).apply(\n", + " lambda x: \n", + " x[\n", + " # (x['score'] <= x['score'].quantile(0.99)) & \n", + " (x['score'] >= x['score'].quantile(0.90))\n", + " ] # 计算90%分位数作为阈值,筛选分数>=阈值的行\n", + ").reset_index(drop=True) # drop=True 避免添加旧索引列\n", + "# df_to_drop = score_df.loc[score_df.groupby('trade_date')['score'].idxmax()]\n", + "# score_df = score_df.drop(df_to_drop.index)\n", + "save_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nlargest(2, 'score')).reset_index()\n", + "# save_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(2, 'total_mv')).reset_index()\n", + "save_df = save_df.sort_values(['trade_date', 'score'])\n", + "save_df[['trade_date', 'score', 'ts_code']].to_csv('predictions_test.tsv', index=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "09b1799e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "192\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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', '000852.SH_MACD', '000905.SH_MACD', '399006.SZ_MACD', '000852.SH_MACD_hist', '000905.SH_MACD_hist', '399006.SZ_MACD_hist', '000852.SH_RSI', '000905.SH_RSI', '399006.SZ_RSI', '000852.SH_Signal_line', '000905.SH_Signal_line', '399006.SZ_Signal_line', '000852.SH_amount_change_rate', '000905.SH_amount_change_rate', '399006.SZ_amount_change_rate', '000852.SH_amount_mean', '000905.SH_amount_mean', '399006.SZ_amount_mean', '000852.SH_daily_return', '000905.SH_daily_return', '399006.SZ_daily_return', '000852.SH_up_ratio_20d', '000905.SH_up_ratio_20d', '399006.SZ_up_ratio_20d', '000852.SH_volatility', '000905.SH_volatility', '399006.SZ_volatility', '000852.SH_volume_change_rate', '000905.SH_volume_change_rate', '399006.SZ_volume_change_rate']\n" + ] + } + ], + "source": [ + "print(len(feature_columns))\n", + "print(feature_columns)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bceabd1f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "警告: DataFrame 中没有 'group_id' 列。假设整个 DataFrame 是一个需要排序的组。\n", + "\n", + "NDCG 结果\n", + "{'ndcg@1': 0.16666666666666666, 'ndcg@3': 0.12073315639204953, 'ndcg@5': 0.16262598210797247}\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "def calculate_ndcg(df: pd.DataFrame, score_col: str, label_col: str, group_id: str = 'trade_date', k_values: list = [1, 3, 5, 10]):\n", + " \"\"\"\n", + " 计算 DataFrame 中 score 列和 label 列的 NDCG 值。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 包含 score (排序学习预测分数) 和 label (相关性标签) 的 DataFrame。\n", + " 假设每个需要排序的组(例如,每天的股票)在 DataFrame 中是连续的。\n", + " score_col (str): 包含模型预测分数的列名。\n", + " label_col (str): 包含相关性标签的列名。标签值越高表示相关性越高。\n", + " k_values (list): 一个整数列表,表示计算 NDCG 的 top-k 值。\n", + " 例如,[1, 3, 5] 将计算 NDCG@1, NDCG@3 和 NDCG@5。\n", + "\n", + " Returns:\n", + " dict: 一个字典,包含每个 k 值对应的平均 NDCG 值。\n", + " 例如: {'ndcg@1': 0.85, 'ndcg@3': 0.78, 'ndcg@5': 0.72, 'ndcg@10': 0.65}\n", + " \"\"\"\n", + " ndcg_scores = {f'ndcg@{k}': [] for k in k_values}\n", + "\n", + " def dcg_at_k(r, k):\n", + " r = np.asfarray(r)[:k] if len(r) > 0 else np.zeros(k)\n", + " return np.sum(r / np.log2(np.arange(2, r.size + 2)))\n", + "\n", + " def ndcg_at_k(r, k):\n", + " dcg_max = dcg_at_k(sorted(r, reverse=True), k)\n", + " if not dcg_max:\n", + " return 0.\n", + " return dcg_at_k(r, k) / dcg_max\n", + "\n", + " # 假设 DataFrame 已经按照需要排序的组(例如,'trade_date')进行了分组,\n", + " # 并且每个组内的顺序不重要,我们只需要计算每个组的 NDCG。\n", + " # 如果需要按特定组计算 NDCG,请先对 DataFrame 进行分组。\n", + " if group_id not in df.columns:\n", + " print(\"警告: DataFrame 中没有 'group_id' 列。假设整个 DataFrame 是一个需要排序的组。\")\n", + " group_df = df.sort_values(by=score_col, ascending=False)\n", + " relevant_labels = group_df[label_col].values\n", + " for k in k_values:\n", + " ndcg_scores[f'ndcg@{k}'].append(ndcg_at_k(relevant_labels, k))\n", + " else:\n", + " for _, group_df in df.groupby(group_id):\n", + " group_df_sorted = group_df.sort_values(by=score_col, ascending=False)\n", + " relevant_labels = group_df_sorted[label_col].values\n", + " for k in k_values:\n", + " ndcg_scores[f'ndcg@{k}'].append(ndcg_at_k(relevant_labels, k))\n", + "\n", + " avg_ndcg = {k: np.mean(v) if v else np.nan for k, v in ndcg_scores.items()}\n", + " return avg_ndcg\n", + "\n", + "\n", + "ndcg_results_single_group = calculate_ndcg(score_df, score_col='score', label_col='label', k_values=[1, 3, 5], group_id=None)\n", + "print(\"\\nNDCG 结果\")\n", + "print(ndcg_results_single_group)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "new_trader", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/main/train/Regression2.ipynb b/main/train/Regression2.ipynb new file mode 100644 index 0000000..b2304ef --- /dev/null +++ b/main/train/Regression2.ipynb @@ -0,0 +1,2151 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "79a7758178bafdd3", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:46:06.987506Z", + "start_time": "2025-04-03T12:46:06.259551Z" + }, + "jupyter": { + "source_hidden": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "e:\\PyProject\\NewStock\\main\\train\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "import gc\n", + "import os\n", + "import sys\n", + "sys.path.append('../../')\n", + "print(os.getcwd())\n", + "import pandas as pd\n", + "from main.factor.factor import get_rolling_factor, get_simple_factor\n", + "from main.utils.factor import read_industry_data\n", + "from main.utils.factor_processor import calculate_score\n", + "from main.utils.utils import read_and_merge_h5_data, merge_with_industry_data\n", + "\n", + "import warnings\n", + "\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a79cafb06a7e0e43", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:00.212859Z", + "start_time": "2025-04-03T12:46:06.998047Z" + }, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "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: 8665405 entries, 0 to 8665404\n", + "Data columns (total 32 columns):\n", + " # Column Dtype \n", + "--- ------ ----- \n", + " 0 ts_code object \n", + " 1 trade_date datetime64[ns]\n", + " 2 open float64 \n", + " 3 close float64 \n", + " 4 high float64 \n", + " 5 low float64 \n", + " 6 vol float64 \n", + " 7 pct_chg float64 \n", + " 8 turnover_rate float64 \n", + " 9 pe_ttm float64 \n", + " 10 circ_mv float64 \n", + " 11 total_mv float64 \n", + " 12 volume_ratio float64 \n", + " 13 is_st bool \n", + " 14 up_limit float64 \n", + " 15 down_limit float64 \n", + " 16 buy_sm_vol float64 \n", + " 17 sell_sm_vol float64 \n", + " 18 buy_lg_vol float64 \n", + " 19 sell_lg_vol float64 \n", + " 20 buy_elg_vol float64 \n", + " 21 sell_elg_vol float64 \n", + " 22 net_mf_vol float64 \n", + " 23 his_low float64 \n", + " 24 his_high float64 \n", + " 25 cost_5pct float64 \n", + " 26 cost_15pct float64 \n", + " 27 cost_50pct float64 \n", + " 28 cost_85pct float64 \n", + " 29 cost_95pct float64 \n", + " 30 weight_avg float64 \n", + " 31 winner_rate float64 \n", + "dtypes: bool(1), datetime64[ns](1), float64(29), object(1)\n", + "memory usage: 2.0+ GB\n", + "None\n" + ] + } + ], + "source": [ + "from main.utils.utils import read_and_merge_h5_data\n", + "\n", + "print('daily data')\n", + "df = read_and_merge_h5_data('../../data/daily_data.h5', key='daily_data',\n", + " columns=['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg'],\n", + " df=None)\n", + "\n", + "print('daily basic')\n", + "df = read_and_merge_h5_data('../../data/daily_basic.h5', key='daily_basic',\n", + " columns=['ts_code', 'trade_date', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio',\n", + " 'is_st'], df=df, join='inner')\n", + "\n", + "print('stk limit')\n", + "df = read_and_merge_h5_data('../../data/stk_limit.h5', key='stk_limit',\n", + " columns=['ts_code', 'trade_date', 'pre_close', 'up_limit', 'down_limit'],\n", + " df=df)\n", + "print('money flow')\n", + "df = read_and_merge_h5_data('../../data/money_flow.h5', key='money_flow',\n", + " columns=['ts_code', 'trade_date', 'buy_sm_vol', 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol',\n", + " 'buy_elg_vol', 'sell_elg_vol', 'net_mf_vol'],\n", + " df=df)\n", + "print('cyq perf')\n", + "df = read_and_merge_h5_data('../../data/cyq_perf.h5', key='cyq_perf',\n", + " columns=['ts_code', 'trade_date', 'his_low', 'his_high', 'cost_5pct', 'cost_15pct',\n", + " 'cost_50pct',\n", + " 'cost_85pct', 'cost_95pct', 'weight_avg', 'winner_rate'],\n", + " df=df)\n", + "print(df.info())" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cac01788dac10678", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.527104Z", + "start_time": "2025-04-03T12:47:00.488715Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "industry\n" + ] + } + ], + "source": [ + "print('industry')\n", + "industry_df = read_and_merge_h5_data('../../data/industry_data.h5', key='industry_data',\n", + " columns=['ts_code', 'l2_code', 'in_date'],\n", + " df=None, on=['ts_code'], join='left')\n", + "\n", + "\n", + "def merge_with_industry_data(df, industry_df):\n", + " # 确保日期字段是 datetime 类型\n", + " df['trade_date'] = pd.to_datetime(df['trade_date'])\n", + " industry_df['in_date'] = pd.to_datetime(industry_df['in_date'])\n", + "\n", + " # 对 industry_df 按 ts_code 和 in_date 排序\n", + " industry_df_sorted = industry_df.sort_values(['in_date', 'ts_code'])\n", + "\n", + " # 对原始 df 按 ts_code 和 trade_date 排序\n", + " df_sorted = df.sort_values(['trade_date', 'ts_code'])\n", + "\n", + " # 使用 merge_asof 进行向后合并\n", + " merged = pd.merge_asof(\n", + " df_sorted,\n", + " industry_df_sorted,\n", + " by='ts_code', # 按 ts_code 分组\n", + " left_on='trade_date',\n", + " right_on='in_date',\n", + " direction='backward'\n", + " )\n", + "\n", + " # 获取每个 ts_code 的最早 in_date 记录\n", + " min_in_date_per_ts = (industry_df_sorted\n", + " .groupby('ts_code')\n", + " .first()\n", + " .reset_index()[['ts_code', 'l2_code']])\n", + "\n", + " # 填充未匹配到的记录(trade_date 早于所有 in_date 的情况)\n", + " merged['l2_code'] = merged['l2_code'].fillna(\n", + " merged['ts_code'].map(min_in_date_per_ts.set_index('ts_code')['l2_code'])\n", + " )\n", + "\n", + " # 保留需要的列并重置索引\n", + " result = merged.reset_index(drop=True)\n", + " return result\n", + "\n", + "\n", + "# 使用示例\n", + "df = merge_with_industry_data(df, industry_df)\n", + "# print(mdf[mdf['ts_code'] == '600751.SH'][['ts_code', 'trade_date', 'l2_code']])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c4e9e1d31da6dba6", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.719252Z", + "start_time": "2025-04-03T12:47:10.541247Z" + }, + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "from main.factor.factor import *\n", + "\n", + "def calculate_indicators(df):\n", + " \"\"\"\n", + " 计算四个指标:当日涨跌幅、5日移动平均、RSI、MACD。\n", + " \"\"\"\n", + " df = df.sort_values('trade_date')\n", + " df['daily_return'] = (df['close'] - df['pre_close']) / df['pre_close'] * 100\n", + " # df['5_day_ma'] = df['close'].rolling(window=5).mean()\n", + " delta = df['close'].diff()\n", + " gain = delta.where(delta > 0, 0)\n", + " loss = -delta.where(delta < 0, 0)\n", + " avg_gain = gain.rolling(window=14).mean()\n", + " avg_loss = loss.rolling(window=14).mean()\n", + " rs = avg_gain / avg_loss\n", + " df['RSI'] = 100 - (100 / (1 + rs))\n", + "\n", + " # 计算MACD\n", + " ema12 = df['close'].ewm(span=12, adjust=False).mean()\n", + " ema26 = df['close'].ewm(span=26, adjust=False).mean()\n", + " df['MACD'] = ema12 - ema26\n", + " df['Signal_line'] = df['MACD'].ewm(span=9, adjust=False).mean()\n", + " df['MACD_hist'] = df['MACD'] - df['Signal_line']\n", + "\n", + " # 4. 情绪因子1:市场上涨比例(Up Ratio)\n", + " df['up_ratio'] = df['daily_return'].apply(lambda x: 1 if x > 0 else 0)\n", + " df['up_ratio_20d'] = df['up_ratio'].rolling(window=20).mean() # 过去20天上涨比例\n", + "\n", + " # 5. 情绪因子2:成交量变化率(Volume Change Rate)\n", + " df['volume_mean'] = df['vol'].rolling(window=20).mean() # 过去20天的平均成交量\n", + " df['volume_change_rate'] = (df['vol'] - df['volume_mean']) / df['volume_mean'] * 100 # 成交量变化率\n", + "\n", + " # 6. 情绪因子3:波动率(Volatility)\n", + " df['volatility'] = df['daily_return'].rolling(window=20).std() # 过去20天的日收益率标准差\n", + "\n", + " # 7. 情绪因子4:成交额变化率(Amount Change Rate)\n", + " df['amount_mean'] = df['amount'].rolling(window=20).mean() # 过去20天的平均成交额\n", + " df['amount_change_rate'] = (df['amount'] - df['amount_mean']) / df['amount_mean'] * 100 # 成交额变化率\n", + "\n", + " # df = sentiment_panic_greed_index(df)\n", + " # df = sentiment_market_breadth_proxy(df)\n", + " # df = sentiment_reversal_indicator(df)\n", + "\n", + " return df\n", + "\n", + "\n", + "def generate_index_indicators(h5_filename):\n", + " df = pd.read_hdf(h5_filename, key='index_data')\n", + " df['trade_date'] = pd.to_datetime(df['trade_date'], format='%Y%m%d')\n", + " df = df.sort_values('trade_date')\n", + "\n", + " # 计算每个ts_code的相关指标\n", + " df_indicators = []\n", + " for ts_code in df['ts_code'].unique():\n", + " df_index = df[df['ts_code'] == ts_code].copy()\n", + " df_index = calculate_indicators(df_index)\n", + " df_indicators.append(df_index)\n", + "\n", + " # 合并所有指数的结果\n", + " df_all_indicators = pd.concat(df_indicators, ignore_index=True)\n", + "\n", + " # 保留trade_date列,并将同一天的数据按ts_code合并成一行\n", + " df_final = df_all_indicators.pivot_table(\n", + " index='trade_date',\n", + " columns='ts_code',\n", + " values=['daily_return', \n", + " 'RSI', 'MACD', 'Signal_line', 'MACD_hist', \n", + " # 'sentiment_panic_greed_index',\n", + " 'up_ratio_20d', 'volume_change_rate', 'volatility',\n", + " 'amount_change_rate', 'amount_mean'],\n", + " aggfunc='last'\n", + " )\n", + "\n", + " df_final.columns = [f\"{col[1]}_{col[0]}\" for col in df_final.columns]\n", + " df_final = df_final.reset_index()\n", + "\n", + " return df_final\n", + "\n", + "\n", + "# 使用函数\n", + "h5_filename = '../../data/index_data.h5'\n", + "index_data = generate_index_indicators(h5_filename)\n", + "index_data = index_data.dropna()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a735bc02ceb4d872", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:10.821169Z", + "start_time": "2025-04-03T12:47:10.751831Z" + } + }, + "outputs": [], + "source": [ + "import talib\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "53f86ddc0677a6d7", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:15.944254Z", + "start_time": "2025-04-03T12:47:10.826179Z" + }, + "jupyter": { + "source_hidden": true + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "from main.utils.factor import get_act_factor\n", + "\n", + "\n", + "def read_industry_data(h5_filename):\n", + " # 读取 H5 文件中所有的行业数据\n", + " industry_data = pd.read_hdf(h5_filename, key='sw_daily', columns=[\n", + " 'ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'pe', 'pb', 'vol'\n", + " ]) # 假设 H5 文件的键是 'industry_data'\n", + " industry_data = industry_data.sort_values(by=['ts_code', 'trade_date'])\n", + " industry_data = industry_data.reindex()\n", + " industry_data['trade_date'] = pd.to_datetime(industry_data['trade_date'], format='%Y%m%d')\n", + "\n", + " grouped = industry_data.groupby('ts_code', group_keys=False)\n", + " industry_data['obv'] = grouped.apply(\n", + " lambda x: pd.Series(talib.OBV(x['close'].values, x['vol'].values), index=x.index)\n", + " )\n", + " industry_data['return_5'] = grouped['close'].apply(lambda x: x / x.shift(5) - 1)\n", + " industry_data['return_20'] = grouped['close'].apply(lambda x: x / x.shift(20) - 1)\n", + "\n", + " industry_data = get_act_factor(industry_data, cat=False)\n", + " industry_data = industry_data.sort_values(by=['trade_date', 'ts_code'])\n", + "\n", + " # # 计算每天每个 ts_code 的因子和当天所有 ts_code 的中位数的偏差\n", + " # factor_columns = ['obv', 'return_5', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4'] # 因子列\n", + " # \n", + " # for factor in factor_columns:\n", + " # if factor in industry_data.columns:\n", + " # # 计算每天每个 ts_code 的因子值与当天所有 ts_code 的中位数的偏差\n", + " # industry_data[f'{factor}_deviation'] = industry_data.groupby('trade_date')[factor].transform(\n", + " # lambda x: x - x.mean())\n", + "\n", + " industry_data['return_5_percentile'] = industry_data.groupby('trade_date')['return_5'].transform(\n", + " lambda x: x.rank(pct=True))\n", + " industry_data['return_20_percentile'] = industry_data.groupby('trade_date')['return_20'].transform(\n", + " lambda x: x.rank(pct=True))\n", + "\n", + " # cs_rank_intraday_range(industry_data)\n", + " # cs_rank_close_pos_in_range(industry_data)\n", + "\n", + " industry_data = industry_data.drop(columns=['open', 'close', 'high', 'low', 'pe', 'pb', 'vol'])\n", + "\n", + " industry_data = industry_data.rename(\n", + " columns={col: f'industry_{col}' for col in industry_data.columns if col not in ['ts_code', 'trade_date']})\n", + "\n", + " industry_data = industry_data.rename(columns={'ts_code': 'cat_l2_code'})\n", + " return industry_data\n", + "\n", + "\n", + "industry_df = read_industry_data('../../data/sw_daily.h5')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "dbe2fd8021b9417f", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:15.969344Z", + "start_time": "2025-04-03T12:47:15.963327Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['ts_code', 'open', 'close', 'high', 'low', 'circ_mv', 'total_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" + ] + } + ], + "source": [ + "origin_columns = df.columns.tolist()\n", + "origin_columns = [col for col in origin_columns if\n", + " col not in ['turnover_rate', 'pe_ttm', 'volume_ratio', 'vol', 'pct_chg', 'l2_code', 'winner_rate']]\n", + "origin_columns = [col for col in origin_columns if col not in index_data.columns]\n", + "origin_columns = [col for col in origin_columns if 'cyq' not in col]\n", + "print(origin_columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "85c3e3d0235ffffa", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T12:47:16.089879Z", + "start_time": "2025-04-03T12:47:15.990101Z" + } + }, + "outputs": [], + "source": [ + "fina_indicator_df = read_and_merge_h5_data('../../data/fina_indicator.h5', key='fina_indicator',\n", + " columns=['ts_code', 'ann_date', 'undist_profit_ps', 'ocfps', 'bps'],\n", + " df=None)\n", + "cashflow_df = read_and_merge_h5_data('../../data/cashflow.h5', key='cashflow',\n", + " columns=['ts_code', 'ann_date', 'n_cashflow_act'],\n", + " df=None)\n", + "balancesheet_df = read_and_merge_h5_data('../../data/balancesheet.h5', key='balancesheet',\n", + " columns=['ts_code', 'ann_date', 'money_cap', 'total_liab'],\n", + " df=None)\n", + "top_list_df = read_and_merge_h5_data('../../data/top_list.h5', key='top_list',\n", + " columns=['ts_code', 'trade_date', 'reason'],\n", + " df=None)\n", + "\n", + "top_list_df = top_list_df.sort_values(by='trade_date', ascending=False).drop_duplicates(subset=['ts_code', 'trade_date'], keep='first').sort_values(by='trade_date')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "92d84ce15a562ec6", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:01.612695Z", + "start_time": "2025-04-03T12:47:16.121802Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "开始计算因子: AR, BR (原地修改)...\n", + "因子 AR, BR 计算成功。\n", + "因子 AR, BR 计算流程结束。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "使用 'ann_date' 作为财务数据生效日期。\n", + "警告: 从 financial_data_subset 中移除了 366 行,因为其 'ts_code' 或 'ann_date' 列存在空值。\n", + "计算 BBI...\n", + "--- 计算日级别偏离度 (使用 pct_chg) ---\n", + "--- 计算日级别动量基准 (使用 pct_chg) ---\n", + "日级别动量基准计算完成 (使用 pct_chg)。\n", + "日级别偏离度计算完成 (使用 pct_chg)。\n", + "--- 计算日级别行业偏离度 (使用 pct_chg 和行业基准) ---\n", + "--- 计算日级别行业动量基准 (使用 pct_chg 和 cat_l2_code) ---\n", + "错误: 计算日级别行业动量基准需要以下列: ['pct_chg', 'cat_l2_code', 'trade_date', 'ts_code']。\n", + "错误: 计算日级别行业偏离度需要以下列: ['pct_chg', 'daily_industry_positive_benchmark', 'daily_industry_negative_benchmark']。请先运行 daily_industry_momentum_benchmark(df)。\n", + "Index(['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol',\n", + " 'pct_chg', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv',\n", + " 'volume_ratio', 'is_st', 'up_limit', 'down_limit', 'buy_sm_vol',\n", + " 'sell_sm_vol', 'buy_lg_vol', 'sell_lg_vol', 'buy_elg_vol',\n", + " 'sell_elg_vol', 'net_mf_vol', 'his_low', 'his_high', 'cost_5pct',\n", + " 'cost_15pct', 'cost_50pct', 'cost_85pct', 'cost_95pct', 'weight_avg',\n", + " 'winner_rate', 'l2_code', 'undist_profit_ps', 'ocfps', 'AR', 'BR',\n", + " 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio',\n", + " 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor',\n", + " 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity',\n", + " 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio',\n", + " 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change',\n", + " 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel',\n", + " 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy',\n", + " 'cost_support_15pct_change', 'cat_winner_price_zone',\n", + " 'flow_chip_consistency', 'profit_taking_vs_absorb', '_is_positive',\n", + " '_is_negative', 'cat_is_positive', '_pos_returns', '_neg_returns',\n", + " '_pos_returns_sq', '_neg_returns_sq', 'upside_vol', 'downside_vol',\n", + " 'vol_ratio', 'return_skew', 'return_kurtosis', 'volume_change_rate',\n", + " 'cat_volume_breakout', 'turnover_deviation', 'cat_turnover_spike',\n", + " 'avg_volume_ratio', 'cat_volume_ratio_breakout', 'vol_spike',\n", + " 'vol_std_5', 'atr_14', 'atr_6', 'obv'],\n", + " dtype='object')\n", + "Calculating lg_flow_mom_corr_20_60...\n", + "Finished lg_flow_mom_corr_20_60.\n", + "Calculating lg_flow_accel...\n", + "Finished lg_flow_accel.\n", + "Calculating profit_pressure...\n", + "Finished profit_pressure.\n", + "Calculating underwater_resistance...\n", + "Finished underwater_resistance.\n", + "Calculating cost_conc_std_20...\n", + "Finished cost_conc_std_20.\n", + "Calculating profit_decay_20...\n", + "Finished profit_decay_20.\n", + "Calculating vol_amp_loss_20...\n", + "Finished vol_amp_loss_20.\n", + "Calculating vol_drop_profit_cnt_5...\n", + "Finished vol_drop_profit_cnt_5.\n", + "Calculating lg_flow_vol_interact_20...\n", + "Finished lg_flow_vol_interact_20.\n", + "Calculating cost_break_confirm_cnt_5...\n", + "Finished cost_break_confirm_cnt_5.\n", + "Calculating atr_norm_channel_pos_14...\n", + "Finished atr_norm_channel_pos_14.\n", + "Calculating turnover_diff_skew_20...\n", + "Finished turnover_diff_skew_20.\n", + "Calculating lg_sm_flow_diverge_20...\n", + "Finished lg_sm_flow_diverge_20.\n", + "Calculating pullback_strong_20_20...\n", + "Finished pullback_strong_20_20.\n", + "Calculating vol_wgt_hist_pos_20...\n", + "Finished vol_wgt_hist_pos_20.\n", + "Calculating vol_adj_roc_20...\n", + "Finished vol_adj_roc_20.\n", + "Calculating cs_rank_net_lg_flow_val...\n", + "Finished cs_rank_net_lg_flow_val.\n", + "Calculating cs_rank_flow_divergence...\n", + "Finished cs_rank_flow_divergence.\n", + "Calculating cs_rank_ind_adj_lg_flow...\n", + "Finished cs_rank_ind_adj_lg_flow.\n", + "Calculating cs_rank_elg_buy_ratio...\n", + "Finished cs_rank_elg_buy_ratio.\n", + "Calculating cs_rank_rel_profit_margin...\n", + "Finished cs_rank_rel_profit_margin.\n", + "Calculating cs_rank_cost_breadth...\n", + "Finished cs_rank_cost_breadth.\n", + "Calculating cs_rank_dist_to_upper_cost...\n", + "Finished cs_rank_dist_to_upper_cost.\n", + "Calculating cs_rank_winner_rate...\n", + "Finished cs_rank_winner_rate.\n", + "Calculating cs_rank_intraday_range...\n", + "Finished cs_rank_intraday_range.\n", + "Calculating cs_rank_close_pos_in_range...\n", + "Finished cs_rank_close_pos_in_range.\n", + "Calculating cs_rank_opening_gap...\n", + "Error calculating cs_rank_opening_gap: Missing 'pre_close' column. Assigning NaN.\n", + "Calculating cs_rank_pos_in_hist_range...\n", + "Finished cs_rank_pos_in_hist_range.\n", + "Calculating cs_rank_vol_x_profit_margin...\n", + "Finished cs_rank_vol_x_profit_margin.\n", + "Calculating cs_rank_lg_flow_price_concordance...\n", + "Finished cs_rank_lg_flow_price_concordance.\n", + "Calculating cs_rank_turnover_per_winner...\n", + "Finished cs_rank_turnover_per_winner.\n", + "Calculating cs_rank_ind_cap_neutral_pe (Placeholder - requires statsmodels)...\n", + "Finished cs_rank_ind_cap_neutral_pe (Placeholder).\n", + "Calculating cs_rank_volume_ratio...\n", + "Finished cs_rank_volume_ratio.\n", + "Calculating cs_rank_elg_buy_sell_sm_ratio...\n", + "Finished cs_rank_elg_buy_sell_sm_ratio.\n", + "Calculating cs_rank_cost_dist_vol_ratio...\n", + "Finished cs_rank_cost_dist_vol_ratio.\n", + "Calculating cs_rank_size...\n", + "Finished cs_rank_size.\n", + "\n", + "RangeIndex: 4539678 entries, 0 to 4539677\n", + "Columns: 178 entries, ts_code to cs_rank_size\n", + "dtypes: bool(10), datetime64[ns](1), float64(162), int32(3), object(2)\n", + "memory usage: 5.7+ GB\n", + "None\n", + "['ts_code', 'trade_date', 'open', 'close', 'high', 'low', 'vol', 'pct_chg', 'turnover_rate', 'pe_ttm', 'circ_mv', 'total_mv', 'volume_ratio', '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', 'winner_rate', 'cat_l2_code', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'flow_divergence_diff', 'flow_divergence_ratio', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'price_cost_divergence', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_flow_divergence', 'cs_rank_ind_adj_lg_flow', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_opening_gap', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_ind_cap_neutral_pe', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size']\n" + ] + } + ], + "source": [ + "\n", + "import numpy as np\n", + "from main.factor.factor import *\n", + "\n", + "def filter_data(df):\n", + " # df = df.groupby('trade_date').apply(lambda x: x.nlargest(1000, 'act_factor1'))\n", + " df = df[~df['is_st']]\n", + " df = df[~df['ts_code'].str.endswith('BJ')]\n", + " df = df[~df['ts_code'].str.startswith('30')]\n", + " df = df[~df['ts_code'].str.startswith('68')]\n", + " df = df[~df['ts_code'].str.startswith('8')]\n", + " df = df[df['trade_date'] >= '2019-01-01']\n", + " if 'in_date' in df.columns:\n", + " df = df.drop(columns=['in_date'])\n", + " df = df.reset_index(drop=True)\n", + " return df\n", + "\n", + "gc.collect()\n", + "\n", + "df = filter_data(df)\n", + "df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\n", + "# df = price_minus_deduction_price(df, n=120)\n", + "# df = price_deduction_price_diff_ratio_to_sma(df, n=120)\n", + "# df = cat_price_vs_sma_vs_deduction_price(df, n=120)\n", + "# df = cat_reason(df, top_list_df)\n", + "# df = cat_is_on_top_list(df, top_list_df)\n", + "\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col='undist_profit_ps')\n", + "df = add_financial_factor(df, fina_indicator_df, factor_value_col='ocfps')\n", + "calculate_arbr(df, N=26)\n", + "df['log_circ_mv'] = np.log(df['circ_mv'])\n", + "df = calculate_cashflow_to_ev_factor(df, cashflow_df, balancesheet_df)\n", + "df = caculate_book_to_price_ratio(df, fina_indicator_df)\n", + "df = turnover_rate_n(df, n=5)\n", + "df = variance_n(df, n=20)\n", + "df = bbi_ratio_factor(df)\n", + "df = daily_deviation(df)\n", + "df = daily_industry_deviation(df)\n", + "df, _ = get_rolling_factor(df)\n", + "df, _ = get_simple_factor(df)\n", + "\n", + "df = df.rename(columns={'l1_code': 'cat_l1_code'})\n", + "df = df.rename(columns={'l2_code': 'cat_l2_code'})\n", + "\n", + "lg_flow_mom_corr(df, N=20, M=60)\n", + "lg_flow_accel(df)\n", + "profit_pressure(df)\n", + "underwater_resistance(df)\n", + "cost_conc_std(df, N=20)\n", + "profit_decay(df, N=20)\n", + "vol_amp_loss(df, N=20)\n", + "vol_drop_profit_cnt(df, N=20, M=5)\n", + "lg_flow_vol_interact(df, N=20)\n", + "cost_break_confirm_cnt(df, M=5)\n", + "atr_norm_channel_pos(df, N=14)\n", + "turnover_diff_skew(df, N=20)\n", + "lg_sm_flow_diverge(df, N=20)\n", + "pullback_strong(df, N=20, M=20)\n", + "vol_wgt_hist_pos(df, N=20)\n", + "vol_adj_roc(df, N=20)\n", + "\n", + "cs_rank_net_lg_flow_val(df)\n", + "cs_rank_flow_divergence(df)\n", + "cs_rank_industry_adj_lg_flow(df) # Needs cat_l2_code\n", + "cs_rank_elg_buy_ratio(df)\n", + "cs_rank_rel_profit_margin(df)\n", + "cs_rank_cost_breadth(df)\n", + "cs_rank_dist_to_upper_cost(df)\n", + "cs_rank_winner_rate(df)\n", + "cs_rank_intraday_range(df)\n", + "cs_rank_close_pos_in_range(df)\n", + "cs_rank_opening_gap(df) # Needs pre_close\n", + "cs_rank_pos_in_hist_range(df) # Needs his_low, his_high\n", + "cs_rank_vol_x_profit_margin(df)\n", + "cs_rank_lg_flow_price_concordance(df)\n", + "cs_rank_turnover_per_winner(df)\n", + "cs_rank_ind_cap_neutral_pe(df) # Placeholder - needs external libraries\n", + "cs_rank_volume_ratio(df) # Needs volume_ratio\n", + "cs_rank_elg_buy_sell_sm_ratio(df)\n", + "cs_rank_cost_dist_vol_ratio(df) # Needs volume_ratio\n", + "cs_rank_size(df) # Needs circ_mv\n", + "\n", + "\n", + "# df = df.merge(index_data, on='trade_date', how='left')\n", + "\n", + "print(df.info())\n", + "print(df.columns.tolist())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b87b938028afa206", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:03.658725Z", + "start_time": "2025-04-03T13:08:02.469611Z" + } + }, + "outputs": [], + "source": [ + "from scipy.stats import ks_2samp, wasserstein_distance\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 or 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" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f4f16d63ad18d1bc", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:03.670700Z", + "start_time": "2025-04-03T13:08:03.665739Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import statsmodels.api as sm # 用于中性化回归\n", + "from tqdm import tqdm # 可选,用于显示进度条\n", + "\n", + "# --- 常量 ---\n", + "epsilon = 1e-10 # 防止除零\n", + "\n", + "# --- 1. 中位数去极值 (MAD) ---\n", + "\n", + "def cs_mad_filter(df: pd.DataFrame,\n", + " features: list,\n", + " k: float = 3.0,\n", + " scale_factor: float = 1.4826):\n", + " \"\"\"\n", + " 对指定特征列进行截面 MAD 去极值处理 (原地修改)。\n", + "\n", + " 方法: 对每日截面数据,计算 median 和 MAD,\n", + " 将超出 [median - k * scale * MAD, median + k * scale * MAD] 范围的值\n", + " 替换为边界值 (Winsorization)。\n", + " scale_factor=1.4826 使得 MAD 约等于正态分布的标准差。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。\n", + " features (list): 需要处理的特征列名列表。\n", + " k (float): MAD 的倍数,用于确定边界。默认为 3.0。\n", + " scale_factor (float): MAD 的缩放因子。默认为 1.4826。\n", + "\n", + " WARNING: 此函数会原地修改输入的 DataFrame 'df'。\n", + " \"\"\"\n", + " print(f\"开始截面 MAD 去极值处理 (k={k})...\")\n", + " if not all(col in df.columns for col in features):\n", + " missing = [col for col in features if col not in df.columns]\n", + " print(f\"错误: DataFrame 中缺少以下特征列: {missing}。跳过去极值处理。\")\n", + " return\n", + "\n", + " grouped = df.groupby('trade_date')\n", + "\n", + " for col in tqdm(features, desc=\"MAD Filtering\"):\n", + " try:\n", + " # 计算截面中位数\n", + " median = grouped[col].transform('median')\n", + " # 计算截面 MAD (Median Absolute Deviation from Median)\n", + " mad = (df[col] - median).abs().groupby(df['trade_date']).transform('median')\n", + "\n", + " # 计算上下边界\n", + " lower_bound = median - k * scale_factor * mad\n", + " upper_bound = median + k * scale_factor * mad\n", + "\n", + " # 原地应用 clip\n", + " df[col] = np.clip(df[col], lower_bound, upper_bound)\n", + "\n", + " except KeyError:\n", + " print(f\"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的 MAD 处理。\")\n", + " except Exception as e:\n", + " print(f\"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的 MAD 处理。\")\n", + "\n", + " print(\"截面 MAD 去极值处理完成。\")\n", + "\n", + "\n", + "# --- 2. 行业市值中性化 ---\n", + "\n", + "def cs_neutralize_industry_cap(df: pd.DataFrame,\n", + " features: list,\n", + " industry_col: str = 'cat_l2_code',\n", + " market_cap_col: str = 'circ_mv'):\n", + " \"\"\"\n", + " 对指定特征列进行截面行业和对数市值中性化 (原地修改)。\n", + " 使用 OLS 回归: feature ~ 1 + log(market_cap) + C(industry)\n", + " 将回归残差写回原特征列。\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date', features 列,\n", + " industry_col, market_cap_col。\n", + " features (list): 需要处理的特征列名列表。\n", + " industry_col (str): 行业分类列名。\n", + " market_cap_col (str): 流通市值列名。\n", + "\n", + " WARNING: 此函数会原地修改输入的 DataFrame 'df' 的 features 列。\n", + " 计算量较大,可能耗时较长。\n", + " 需要安装 statsmodels 库 (pip install statsmodels)。\n", + " \"\"\"\n", + " print(\"开始截面行业市值中性化...\")\n", + " required_cols = features + ['trade_date', industry_col, market_cap_col]\n", + " if not all(col in df.columns for col in required_cols):\n", + " missing = [col for col in required_cols if col not in df.columns]\n", + " print(f\"错误: DataFrame 中缺少必需列: {missing}。无法进行中性化。\")\n", + " return\n", + "\n", + " # 预处理:计算 log 市值,处理 industry code 可能的 NaN\n", + " log_cap_col = '_log_market_cap'\n", + " df[log_cap_col] = np.log1p(df[market_cap_col]) # log1p 处理 0 值\n", + " # df[industry_col] = df[industry_col].cat.add_categories('UnknownIndustry')\n", + " # df[industry_col] = df[industry_col].fillna('UnknownIndustry') # 填充行业 NaN\n", + " # df[industry_col] = df[industry_col].astype('category') # 转为类别,ols 会自动处理\n", + "\n", + " dates = df['trade_date'].unique()\n", + " all_residuals = [] # 用于收集所有日期的残差\n", + "\n", + " for date in tqdm(dates, desc=\"Neutralizing\"):\n", + " daily_data = df.loc[df['trade_date'] == date, features + [log_cap_col, industry_col]].copy() # 使用 .loc 获取副本\n", + "\n", + " # 准备自变量 X (常数项 + log市值 + 行业哑变量)\n", + " X = daily_data[[log_cap_col]]\n", + " X = sm.add_constant(X, prepend=True) # 添加常数项\n", + " # 创建行业哑变量 (drop_first=True 避免共线性)\n", + " industry_dummies = pd.get_dummies(daily_data[industry_col], prefix=industry_col, drop_first=True)\n", + " industry_dummies = industry_dummies.astype(int)\n", + " X = pd.concat([X, industry_dummies], axis=1)\n", + "\n", + " daily_residuals = daily_data[[col for col in features]].copy() # 创建用于存储残差的df\n", + "\n", + " for col in features:\n", + " Y = daily_data[col]\n", + "\n", + " # 处理 NaN 值,确保 X 和 Y 在相同位置有有效值\n", + " valid_mask = Y.notna() & X.notna().all(axis=1)\n", + " if valid_mask.sum() < (X.shape[1] + 1): # 数据点不足以估计模型\n", + " print(f\"警告: 日期 {date}, 特征 {col} 有效数据不足 ({valid_mask.sum()}个),无法中性化,填充 NaN。\")\n", + " daily_residuals[col] = np.nan\n", + " continue\n", + "\n", + " Y_valid = Y[valid_mask]\n", + " X_valid = X[valid_mask]\n", + "\n", + " # 执行 OLS 回归\n", + " try:\n", + " model = sm.OLS(Y_valid.to_numpy(), X_valid.to_numpy())\n", + " results = model.fit()\n", + " # 将残差填回对应位置\n", + " daily_residuals.loc[valid_mask, col] = results.resid\n", + " daily_residuals.loc[~valid_mask, col] = np.nan # 原本无效的位置填充 NaN\n", + " except Exception as e:\n", + " print(f\"警告: 日期 {date}, 特征 {col} 回归失败: {e},填充 NaN。\")\n", + " daily_residuals[col] = np.nan\n", + " break\n", + "\n", + " all_residuals.append(daily_residuals)\n", + "\n", + " # 合并所有日期的残差结果\n", + " if all_residuals:\n", + " residuals_df = pd.concat(all_residuals)\n", + " # 将残差结果更新回原始 df (原地修改)\n", + " # 使用 update 比 merge 更适合基于索引的原地更新\n", + " # 确保 residuals_df 的索引与 df 中对应部分一致\n", + " df.update(residuals_df)\n", + " else:\n", + " print(\"没有有效的残差结果可以合并。\")\n", + "\n", + "\n", + " # 清理临时列\n", + " df.drop(columns=[log_cap_col], inplace=True)\n", + " print(\"截面行业市值中性化完成。\")\n", + "\n", + "\n", + "# --- 3. Z-Score 标准化 ---\n", + "\n", + "def cs_zscore_standardize(df: pd.DataFrame, features: list, epsilon: float = 1e-10):\n", + " \"\"\"\n", + " 对指定特征列进行截面 Z-Score 标准化 (原地修改)。\n", + " 方法: Z = (value - cross_sectional_mean) / (cross_sectional_std + epsilon)\n", + "\n", + " Args:\n", + " df (pd.DataFrame): 输入 DataFrame,需包含 'trade_date' 和 features 列。\n", + " features (list): 需要处理的特征列名列表。\n", + " epsilon (float): 防止除以零的小常数。\n", + "\n", + " WARNING: 此函数会原地修改输入的 DataFrame 'df'。\n", + " \"\"\"\n", + " print(\"开始截面 Z-Score 标准化...\")\n", + " if not all(col in df.columns for col in features):\n", + " missing = [col for col in features if col not in df.columns]\n", + " print(f\"错误: DataFrame 中缺少以下特征列: {missing}。跳过标准化处理。\")\n", + " return\n", + "\n", + " grouped = df.groupby('trade_date')\n", + "\n", + " for col in tqdm(features, desc=\"Standardizing\"):\n", + " try:\n", + " # 使用 transform 计算截面均值和标准差\n", + " mean = grouped[col].transform('mean')\n", + " std = grouped[col].transform('std')\n", + "\n", + " # 计算 Z-Score 并原地赋值\n", + " df[col] = (df[col] - mean) / (std + epsilon)\n", + "\n", + " except KeyError:\n", + " print(f\"警告: 列 '{col}' 可能不存在或在分组中出错,跳过此列的标准化处理。\")\n", + " except Exception as e:\n", + " print(f\"警告: 处理列 '{col}' 时发生错误: {e},跳过此列的标准化处理。\")\n", + "\n", + " print(\"截面 Z-Score 标准化完成。\")\n", + "\n", + "def fill_nan_with_daily_median(df: pd.DataFrame, feature_columns: list[str]) -> pd.DataFrame:\n", + " \"\"\"\n", + " 对指定特征列进行每日截面中位数填充缺失值 (NaN)。\n", + "\n", + " 参数:\n", + " df (pd.DataFrame): 包含多日数据的DataFrame,需要包含 'trade_date' 和 feature_columns 中的列。\n", + " feature_columns (list[str]): 需要进行缺失值填充的特征列名称列表。\n", + "\n", + " 返回:\n", + " pd.DataFrame: 包含缺失值填充后特征列的DataFrame。在输入DataFrame的副本上操作。\n", + " \"\"\"\n", + " processed_df = df.copy() # 在副本上操作,保留原始数据\n", + "\n", + " # 确保 trade_date 是 datetime 类型以便正确分组\n", + " processed_df['trade_date'] = pd.to_datetime(processed_df['trade_date'])\n", + "\n", + " def _fill_daily_nan(group):\n", + " # group 是某一个交易日的 DataFrame\n", + "\n", + " # 遍历指定的特征列\n", + " for feature_col in feature_columns:\n", + " # 检查列是否存在于当前分组中\n", + " if feature_col in group.columns:\n", + " # 计算当日该特征的中位数\n", + " median_val = group[feature_col].median()\n", + "\n", + " # 使用当日中位数填充该特征列的 NaN 值\n", + " # inplace=True 会直接修改 group DataFrame\n", + " group[feature_col].fillna(median_val, inplace=True)\n", + " # else:\n", + " # print(f\"Warning: Feature column '{feature_col}' not found in daily group for {group['trade_date'].iloc[0]}. Skipping.\")\n", + "\n", + " return group\n", + "\n", + " # 按交易日期分组,并应用每日填充函数\n", + " # group_keys=False 避免将分组键添加到结果索引中\n", + " filled_df = processed_df.groupby('trade_date', group_keys=False).apply(_fill_daily_nan)\n", + "\n", + " return filled_df" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "40e6b68a91b30c79", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T13:08:04.694262Z", + "start_time": "2025-04-03T13:08:03.694904Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\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", + " if not (0 <= lower_percentile < upper_percentile <= 1):\n", + " raise ValueError(\"Percentile values must satisfy 0 <= lower_percentile < upper_percentile <= 1.\")\n", + "\n", + " # Calculate lower and upper bounds based on percentiles\n", + " lower_bound = label.quantile(lower_percentile)\n", + " upper_bound = label.quantile(upper_percentile)\n", + "\n", + " # Filter out values outside the bounds\n", + " filtered_label = label[(label >= lower_bound) & (label <= upper_bound)]\n", + "\n", + " # Print the number of removed outliers\n", + " if log:\n", + " print(f\"Removed {len(label) - len(filtered_label)} outliers.\")\n", + " return filtered_label\n", + "\n", + "\n", + "def calculate_risk_adjusted_target(df, days=5):\n", + " df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\n", + " df['future_close'] = df.groupby('ts_code')['close'].shift(-days)\n", + " df['future_open'] = df.groupby('ts_code')['open'].shift(-1)\n", + " df['future_return'] = (df['future_close'] - df['future_open']) / df['future_open']\n", + "\n", + " df['future_volatility'] = df.groupby('ts_code')['future_return'].rolling(days, min_periods=1).std().reset_index(\n", + " level=0, drop=True)\n", + " sharpe_ratio = df['future_return'] * df['future_volatility']\n", + " sharpe_ratio.replace([np.inf, -np.inf], np.nan, inplace=True)\n", + "\n", + " return sharpe_ratio\n", + "\n", + "\n", + "def calculate_score(df, days=5, lambda_param=1.0):\n", + " def calculate_max_drawdown(prices):\n", + " peak = prices.iloc[0] # 初始化峰值\n", + " max_drawdown = 0 # 初始化最大回撤\n", + "\n", + " for price in prices:\n", + " if price > peak:\n", + " peak = price # 更新峰值\n", + " else:\n", + " drawdown = (peak - price) / peak # 计算当前回撤\n", + " max_drawdown = max(max_drawdown, drawdown) # 更新最大回撤\n", + "\n", + " return max_drawdown\n", + "\n", + " def compute_stock_score(stock_df):\n", + " stock_df = stock_df.sort_values(by=['trade_date'])\n", + " future_return = stock_df['future_return']\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", + " return score\n", + "\n", + " # # 确保 DataFrame 按照股票代码和交易日期排序\n", + " # df = df.sort_values(by=['ts_code', 'trade_date'])\n", + "\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", + " numeric_features = df[feature_columns].select_dtypes(include=[np.number]).columns.tolist()\n", + " if not numeric_features:\n", + " raise ValueError(\"No numeric features found in the provided data.\")\n", + "\n", + " corr_matrix = df[numeric_features].corr().abs()\n", + " upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))\n", + " to_drop = [column for column in upper.columns if any(upper[column] > threshold)]\n", + " remaining_features = [col for col in feature_columns if col not in to_drop\n", + " or 'act' in col or 'af' in col]\n", + " return remaining_features\n", + "\n", + "\n", + "def cross_sectional_standardization(df, features):\n", + " df_sorted = df.sort_values(by='trade_date') # 按时间排序\n", + " df_standardized = df_sorted.copy()\n", + "\n", + " for date in df_sorted['trade_date'].unique():\n", + " # 获取当前时间点的数据\n", + " current_data = df_standardized[df_standardized['trade_date'] == date]\n", + "\n", + " # 只对指定特征进行标准化\n", + " scaler = StandardScaler()\n", + " standardized_values = scaler.fit_transform(current_data[features])\n", + "\n", + " # 将标准化结果重新赋值回去\n", + " df_standardized.loc[df_standardized['trade_date'] == date, features] = standardized_values\n", + "\n", + " return df_standardized\n", + "\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "\n", + "def neutralize_manual_revised(df: pd.DataFrame, features: list, industry_col: str, mkt_cap_col: str) -> pd.DataFrame:\n", + " \"\"\"\n", + " 手动实现简单回归以提升速度,通过构建 Series 确保索引对齐。\n", + " 对特征在行业内部进行市值中性化。\n", + "\n", + " Args:\n", + " df: 输入的 DataFrame,包含特征、行业分类和市值列。\n", + " features: 需要进行中性化的特征列名列表。\n", + " industry_col: 行业分类列的列名。\n", + " mkt_cap_col: 市值列的列名。\n", + "\n", + " Returns:\n", + " 中性化后的 DataFrame。\n", + " \"\"\"\n", + "\n", + " df[mkt_cap_col] = pd.to_numeric(df[mkt_cap_col], errors='coerce')\n", + " df_cleaned = df.dropna(subset=[mkt_cap_col]).copy()\n", + " df_cleaned = df_cleaned[df_cleaned[mkt_cap_col] > 0].copy()\n", + "\n", + " if df_cleaned.empty:\n", + " print(\"警告: 清理市值异常值后 DataFrame 为空。\")\n", + " return df # 返回原始或空df,取决于清理前的状态\n", + "\n", + " processed_df = df\n", + "\n", + " for col in features:\n", + " if col not in df_cleaned.columns:\n", + " print(f\"警告: 特征列 '{col}' 不存在于清理后的 DataFrame 中,已跳过。\")\n", + " # 对于原始 df 中该列不存在的,在结果 df 中也保持原样(可能全是NaN)\n", + " processed_df[col] = df[col] if col in df.columns else np.nan\n", + " continue\n", + "\n", + " # 跳过对控制变量本身进行中性化\n", + " if col == mkt_cap_col or col == industry_col:\n", + " print(f\"警告: 特征列 '{col}' 是控制变量或内部使用的列,跳过中性化。\")\n", + " # 在结果 df 中也保持原样\n", + " processed_df[col] = df[col] if col in df.columns else np.nan\n", + " continue\n", + "\n", + " residual_series = pd.Series(index=df_cleaned.index, dtype=float)\n", + "\n", + " # 在分组前处理特征列的 NaN,只对有因子值的行进行回归计算\n", + " df_subset_factor = df_cleaned.dropna(subset=[col]).copy()\n", + "\n", + " if not df_subset_factor.empty:\n", + " for industry, group in df_subset_factor.groupby(industry_col):\n", + " x = group[mkt_cap_col] # 市值对数\n", + " y = group[col] # 因子值\n", + "\n", + " # 确保有足够的数据点 (>1) 且市值对数有方差 (>0) 进行回归计算\n", + " # 检查 np.var > 一个很小的正数,避免浮点数误差导致的零方差判断问题\n", + " if len(group) > 1 and np.var(x) > 1e-9:\n", + " try:\n", + " beta = np.cov(y, x)[0, 1] / np.var(x)\n", + " alpha = np.mean(y) - beta * np.mean(x)\n", + "\n", + " # 计算残差\n", + " resid = y - (alpha + beta * x)\n", + "\n", + " # 将计算出的残差存储到 residual_series 中,通过索引自动对齐\n", + " residual_series.loc[resid.index] = resid\n", + "\n", + " except Exception as e:\n", + " # 捕获可能的计算异常,例如np.cov或np.var因为极端数据报错\n", + " print(f\"警告: 在行业 {industry} 计算回归时发生错误: {e}。该组残差将设为原始值或 NaN。\")\n", + " # 此时该组的残差会保持 residual_series 初始化时的 NaN 或后续处理\n", + " # 也可以选择保留原始值:residual_series.loc[group.index] = group[col]\n", + "\n", + " else:\n", + " residual_series.loc[group.index] = group[col] # 保留原始因子值\n", + " processed_df.loc[residual_series.index, col] = residual_series\n", + "\n", + "\n", + " else:\n", + " processed_df[col] = np.nan # 或 df[col] if col in df.columns else np.nan\n", + "\n", + " return processed_df\n", + "\n", + "\n", + "import gc\n", + "\n", + "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(lambda x: x.rolling(window=min(len(x), window)).quantile(lower_quantile))\n", + " rolling_upper = df.groupby('trade_date')[col].transform(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", + "\n", + "def select_top_features_by_rankic(df: pd.DataFrame, feature_columns: list, n: int, target_column: str = 'future_return') -> list:\n", + " \"\"\"\n", + " 计算给定特征与目标列的 RankIC,并返回 RankIC 绝对值最高的 n 个特征。\n", + "\n", + " Args:\n", + " df: 包含特征列和目标列的 Pandas DataFrame。\n", + " feature_columns: 包含所有待评估特征列名的列表。\n", + " n: 希望选取的 RankIC 绝对值最高的特征数量。\n", + " target_column: 目标列的名称,用于计算 RankIC。默认为 'future_return'。\n", + "\n", + " Returns:\n", + " 包含 RankIC 绝对值最高的 n 个特征列名的列表。\n", + " \"\"\"\n", + " numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n", + " numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", + " if target_column not in df.columns:\n", + " raise ValueError(f\"目标列 '{target_column}' 不存在于 DataFrame 中。\")\n", + "\n", + " rankic_scores = {}\n", + " for feature in numeric_columns:\n", + " if feature not in df.columns:\n", + " print(f\"警告: 特征列 '{feature}' 不存在于 DataFrame 中,已跳过。\")\n", + " continue\n", + "\n", + " # 计算特征与目标列的 RankIC (斯皮尔曼相关系数)\n", + " # dropna() 是为了处理缺失值,确保相关性计算不失败\n", + " valid_data = df[[feature, target_column]].dropna()\n", + " if len(valid_data) > 1: # 确保有足够的数据点进行相关性计算\n", + " # 计算斯皮尔曼相关性\n", + " correlation = valid_data[feature].corr(valid_data[target_column], method='spearman')\n", + " rankic_scores[feature] = abs(correlation) # 使用绝对值来衡量相关性强度\n", + " else:\n", + " rankic_scores[feature] = 0 # 数据不足,RankIC设为0或跳过\n", + "\n", + " # 将 RankIC 分数转换为 Series 便于排序\n", + " rankic_series = pd.Series(rankic_scores)\n", + "\n", + " # 按 RankIC 绝对值降序排序,选取前 n 个特征\n", + " # handle case where n might be larger than available features\n", + " n_actual = min(n, len(rankic_series))\n", + " top_features = rankic_series.sort_values(ascending=False).head(n_actual).index.tolist()\n", + " top_features = [col for col in feature_columns if col in top_features or col not in numeric_columns]\n", + " return top_features\n", + "\n", + "def create_deviation_within_dates(df, feature_columns):\n", + " groupby_col = 'cat_l2_code' # 使用 trade_date 进行分组\n", + " new_columns = {}\n", + " ret_feature_columns = feature_columns[:]\n", + "\n", + " # 自动选择所有数值型特征\n", + " num_features = [col for col in feature_columns if 'cat' not in col and 'index' not in col]\n", + "\n", + " # 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']\n", + " num_features = [col for col in num_features if 'cat' not in col and 'industry' not in col]\n", + " num_features = [col for col in num_features if 'limit' not in col]\n", + " num_features = [col for col in num_features if 'cyq' not in col]\n", + "\n", + " # 遍历所有数值型特征\n", + " for feature in num_features:\n", + " if feature == 'trade_date': # 不需要对 'trade_date' 计算偏差\n", + " continue\n", + "\n", + " # grouped_mean = df.groupby(['trade_date'])[feature].transform('mean')\n", + " # deviation_col_name = f'deviation_mean_{feature}'\n", + " # new_columns[deviation_col_name] = df[feature] - grouped_mean\n", + " # ret_feature_columns.append(deviation_col_name)\n", + "\n", + " grouped_mean = df.groupby(['trade_date', groupby_col])[feature].transform('mean')\n", + " deviation_col_name = f'deviation_mean_{feature}'\n", + " new_columns[deviation_col_name] = df[feature] - grouped_mean\n", + " ret_feature_columns.append(deviation_col_name)\n", + "\n", + " # 将新计算的偏差特征与原始 DataFrame 合并\n", + " df = pd.concat([df, pd.DataFrame(new_columns)], axis=1)\n", + "\n", + " # for feature in ['obv', 'return_20', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4']:\n", + " # df[f'deviation_industry_{feature}'] = df[feature] - df[f'industry_{feature}']\n", + "\n", + " return df, ret_feature_columns\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "47c12bb34062ae7a", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T14:57:50.841165Z", + "start_time": "2025-04-03T14:49:25.889057Z" + } + }, + "outputs": [], + "source": [ + "days = 5\n", + "validation_days = 120\n", + "\n", + "import gc\n", + "\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", + "df['future_return'] = np.log1p(df['future_return'])\n", + "\n", + "df['future_return_2'] = df.groupby('ts_code', group_keys=False)['close'].apply(lambda x: x.shift(-2) / 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_return_2'] = np.log1p(df['future_return_2'])\n", + "\n", + "df['cat_up_limit'] = df['pct_chg'] > 5\n", + "# df['label'] = (df.groupby('ts_code')['cat_up_limit']\n", + "# .rolling(window=5, min_periods=1).sum()\n", + "# .groupby('ts_code') # 再次按 ts_code 分组\n", + "# .shift(-5)\n", + "# .fillna(0) # 填充每个股票组最后的 NaN\n", + "# .astype(int)\n", + "# .reset_index(level=0, drop=True))\n", + "df['label'] = df.groupby('trade_date', group_keys=False)['future_return'].transform(\n", + " lambda x: pd.qcut(x, q=20, labels=False, duplicates='drop')\n", + ")\n", + "filter_index = df['future_return'].between(df['future_return'].quantile(0.01), df['future_return'].quantile(0.99))\n", + "\n", + "# for col in [col for col in df.columns]:\n", + "# train_data[col] = train_data[col].astype('str')\n", + "# test_data[col] = test_data[col].astype('str')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8f4dc587", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ts_code trade_date open close high low vol pct_chg \\\n", + "976171 002193.SZ 2019-01-02 18.02 17.82 18.21 17.73 22513.62 -1.00 \n", + "976172 002193.SZ 2019-01-03 17.82 17.78 17.94 17.65 19523.21 -0.22 \n", + "976173 002193.SZ 2019-01-04 17.47 18.04 18.10 17.34 28094.69 1.46 \n", + "976174 002193.SZ 2019-01-07 18.17 18.31 18.39 18.00 23866.88 1.50 \n", + "976175 002193.SZ 2019-01-08 18.25 18.52 18.66 18.13 22853.46 1.15 \n", + "... ... ... ... ... ... ... ... ... \n", + "977704 002193.SZ 2025-05-19 11.74 11.95 11.97 11.61 94249.32 2.49 \n", + "977705 002193.SZ 2025-05-20 11.99 12.20 12.22 11.84 103040.57 2.09 \n", + "977706 002193.SZ 2025-05-21 12.20 11.97 12.28 11.82 83112.00 -1.89 \n", + "977707 002193.SZ 2025-05-22 11.95 11.80 12.17 11.72 88811.00 -1.42 \n", + "977708 002193.SZ 2025-05-23 11.74 11.51 11.90 11.51 93013.00 -2.46 \n", + "\n", + " turnover_rate pe_ttm ... cs_rank_lg_flow_price_concordance \\\n", + "976171 0.9771 23.0129 ... 0.621118 \n", + "976172 0.8473 22.9598 ... 0.230095 \n", + "976173 1.2193 23.3049 ... 0.507119 \n", + "976174 1.0358 23.6499 ... 0.315078 \n", + "976175 0.9918 23.9154 ... 0.248631 \n", + "... ... ... ... ... \n", + "977704 3.6012 NaN ... 0.224402 \n", + "977705 3.9371 NaN ... 0.124834 \n", + "977706 3.1757 NaN ... 0.803720 \n", + "977707 3.3934 NaN ... 0.667220 \n", + "977708 3.5540 NaN ... 0.308867 \n", + "\n", + " cs_rank_turnover_per_winner cs_rank_ind_cap_neutral_pe \\\n", + "976171 0.990869 NaN \n", + "976172 0.934283 NaN \n", + "976173 0.925182 NaN \n", + "976174 0.843796 NaN \n", + "976175 0.834672 NaN \n", + "... ... ... \n", + "977704 0.624335 NaN \n", + "977705 0.641102 NaN \n", + "977706 0.624709 NaN \n", + "977707 0.563268 NaN \n", + "977708 0.661242 NaN \n", + "\n", + " cs_rank_volume_ratio cs_rank_elg_buy_sell_sm_ratio \\\n", + "976171 0.710344 0.341855 \n", + "976172 0.444444 0.318912 \n", + "976173 0.489226 0.260036 \n", + "976174 0.250000 0.251095 \n", + "976175 0.510588 0.286679 \n", + "... ... ... \n", + "977704 0.234043 0.397274 \n", + "977705 0.344124 0.116534 \n", + "977706 0.221189 0.126370 \n", + "977707 0.412155 0.130521 \n", + "977708 0.534540 0.134175 \n", + "\n", + " cs_rank_cost_dist_vol_ratio cs_rank_size future_return \\\n", + "976171 0.261603 0.262235 0.033658 \n", + "976172 0.185342 0.264695 0.029373 \n", + "976173 0.211959 0.259489 0.025179 \n", + "976174 0.145266 0.255474 0.014638 \n", + "976175 0.202299 0.259854 0.003235 \n", + "... ... ... ... \n", + "977704 0.299535 0.031250 NaN \n", + "977705 0.339641 0.032205 NaN \n", + "977706 0.291597 0.030555 NaN \n", + "977707 0.372634 0.030555 NaN \n", + "977708 0.430090 0.027898 NaN \n", + "\n", + " cat_up_limit label \n", + "976171 False 8.0 \n", + "976172 False 7.0 \n", + "976173 False 10.0 \n", + "976174 False 13.0 \n", + "976175 False 6.0 \n", + "... ... ... \n", + "977704 False NaN \n", + "977705 False NaN \n", + "977706 False NaN \n", + "977707 False NaN \n", + "977708 False NaN \n", + "\n", + "[1538 rows x 181 columns]\n" + ] + } + ], + "source": [ + "print(df[df['ts_code'] == '002193.SZ'])" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "29221dde", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "162\n" + ] + } + ], + "source": [ + "feature_columns = [col for col in df.head(10)\n", + " .merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + " # .merge(index_data, on='trade_date', how='left')\n", + " .columns\n", + " ]\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 'is_st' 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 'circ_mv' not in col]\n", + "feature_columns = [col for col in feature_columns if '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", + "# feature_columns = [col for col in feature_columns if col not in ['ts_code', 'trade_date', 'vol_std_5', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_007', 'consecutive_up_limit', 'mv_volatility', 'volume_growth', 'mv_growth', 'arbr']]\n", + "feature_columns = [col for col in feature_columns if col not in ['intraday_lg_flow_corr_20', \n", + " 'cap_neutral_cost_metric', \n", + " 'hurst_net_mf_vol_60', \n", + " 'complex_factor_deap_1', \n", + " 'lg_buy_consolidation_20',\n", + " 'cs_rank_ind_cap_neutral_pe',\n", + " 'cs_rank_opening_gap',\n", + " 'cs_rank_ind_adj_lg_flow']]\n", + "feature_columns = [col for col in feature_columns if col not in ['cat_reason', 'cat_is_on_top_list']]\n", + "print(len(feature_columns))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "03ee5daf", + "metadata": {}, + "outputs": [], + "source": [ + "# df = fill_nan_with_daily_median(df, feature_columns)\n", + "for feature_col in [col for col in feature_columns if col in df.columns]:\n", + " # median_val = df[feature_col].median()\n", + " df[feature_col].fillna(0, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "b76ea08a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ts_code trade_date log_circ_mv\n", + "0 000001.SZ 2019-01-02 16.574219\n", + "1 000001.SZ 2019-01-03 16.583965\n", + "2 000001.SZ 2019-01-04 16.633371\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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", + "去除极值\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 100%|██████████| 132/132 [00:28<00:00, 4.57it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 100%|██████████| 132/132 [00:24<00:00, 5.46it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 0it [00:00, ?it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "开始截面 MAD 去极值处理 (k=3.0)...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "MAD Filtering: 0it [00:00, ?it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "截面 MAD 去极值处理完成。\n", + "feature_columns: ['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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", + "df最小日期: 2019-01-02\n", + "df最大日期: 2025-05-23\n", + "2057539\n", + "train_data最小日期: 2020-01-02\n", + "train_data最大日期: 2022-12-30\n", + "1766694\n", + "test_data最小日期: 2023-01-03\n", + "test_data最大日期: 2025-05-23\n", + " ts_code trade_date log_circ_mv\n", + "0 000001.SZ 2019-01-02 16.574219\n", + "1 000001.SZ 2019-01-03 16.583965\n", + "2 000001.SZ 2019-01-04 16.633371\n" + ] + } + ], + "source": [ + "split_date = '2023-01-01'\n", + "train_data = df[filter_index & (df['trade_date'] <= split_date) & (df['trade_date'] >= '2020-01-01')]\n", + "test_data = df[(df['trade_date'] >= split_date)]\n", + "\n", + "print(df[['ts_code', 'trade_date', 'log_circ_mv']].head(3))\n", + "\n", + "industry_df = industry_df.sort_values(by=['trade_date'])\n", + "index_data = index_data.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_data, 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_data, 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], np.nan)\n", + "\n", + "# feature_columns_new = feature_columns[:]\n", + "# train_data, _ = create_deviation_within_dates(train_data, [col for col in feature_columns if col in train_data.columns])\n", + "# test_data, _ = create_deviation_within_dates(test_data, [col for col in feature_columns if col in train_data.columns])\n", + "\n", + "# feature_columns = [\n", + "# 'undist_profit_ps', \n", + "# 'AR_BR',\n", + "# 'pe_ttm',\n", + "# 'alpha_22_improved', \n", + "# 'alpha_003', \n", + "# 'alpha_007', \n", + "# 'alpha_013', \n", + "# 'cat_up_limit', \n", + "# 'cat_down_limit', \n", + "# 'up_limit_count_10d', \n", + "# 'down_limit_count_10d', \n", + "# 'consecutive_up_limit', \n", + "# 'vol_break', \n", + "# 'weight_roc5', \n", + "# 'price_cost_divergence', \n", + "# 'smallcap_concentration', \n", + "# 'cost_stability', \n", + "# 'high_cost_break_days', \n", + "# 'liquidity_risk', \n", + "# 'turnover_std', \n", + "# 'mv_volatility', \n", + "# 'volume_growth', \n", + "# 'mv_growth', \n", + "# 'lg_flow_mom_corr_20_60', \n", + "# 'lg_flow_accel', \n", + "# 'profit_pressure', \n", + "# 'underwater_resistance', \n", + "# 'cost_conc_std_20', \n", + "# 'profit_decay_20', \n", + "# 'vol_amp_loss_20', \n", + "# 'vol_drop_profit_cnt_5', \n", + "# 'lg_flow_vol_interact_20', \n", + "# 'cost_break_confirm_cnt_5', \n", + "# 'atr_norm_channel_pos_14', \n", + "# 'turnover_diff_skew_20', \n", + "# 'lg_sm_flow_diverge_20', \n", + "# 'pullback_strong_20_20', \n", + "# 'vol_wgt_hist_pos_20', \n", + "# 'vol_adj_roc_20',\n", + "# 'cashflow_to_ev_factor',\n", + "# 'ocfps',\n", + "# 'book_to_price_ratio',\n", + "# 'turnover_rate_mean_5',\n", + "# 'variance_20',\n", + "# 'bbi_ratio_factor'\n", + "# ]\n", + "# feature_columns = [col for col in feature_columns if col in train_data.columns]\n", + "# feature_columns = [col for col in feature_columns if not col.startswith('_')]\n", + "\n", + "numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n", + "numeric_columns = [col for col in numeric_columns if col in feature_columns]\n", + "# feature_columns = select_top_features_by_rankic(df, numeric_columns, n=10)\n", + "print(feature_columns)\n", + "\n", + "# train_data = fill_nan_with_daily_median(train_data, feature_columns)\n", + "# test_data = fill_nan_with_daily_median(test_data, feature_columns)\n", + "\n", + "train_data = train_data.dropna(subset=[col for col in feature_columns if col in train_data.columns])\n", + "train_data = train_data.dropna(subset=['label'])\n", + "train_data = train_data.reset_index(drop=True)\n", + "# print(test_data.tail())\n", + "test_data = test_data.dropna(subset=[col for col in feature_columns if col in train_data.columns])\n", + "# test_data = test_data.dropna(subset=['label'])\n", + "test_data = test_data.reset_index(drop=True)\n", + "\n", + "transform_feature_columns = feature_columns\n", + "transform_feature_columns = [col for col in transform_feature_columns if col in feature_columns and not col.startswith('cat') and col in train_data.columns]\n", + "# transform_feature_columns.remove('undist_profit_ps')\n", + "print('去除极值')\n", + "cs_mad_filter(train_data, transform_feature_columns)\n", + "# print('中性化')\n", + "# cs_neutralize_industry_cap(train_data, transform_feature_columns)\n", + "# print('标准化')\n", + "# cs_zscore_standardize(train_data, transform_feature_columns)\n", + "\n", + "cs_mad_filter(test_data, transform_feature_columns)\n", + "# cs_neutralize_industry_cap(test_data, transform_feature_columns)\n", + "# cs_zscore_standardize(test_data, transform_feature_columns)\n", + "\n", + "mad_filter_feature_columns = [col for col in feature_columns if col not in transform_feature_columns and not col.startswith('cat') and col in train_data.columns]\n", + "cs_mad_filter(train_data, mad_filter_feature_columns)\n", + "cs_mad_filter(test_data, mad_filter_feature_columns)\n", + "\n", + "\n", + "print(f'feature_columns: {feature_columns}')\n", + "\n", + "\n", + "print(f\"df最小日期: {df['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"df最大日期: {df['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "print(len(train_data))\n", + "print(f\"train_data最小日期: {train_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"train_data最大日期: {train_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "print(len(test_data))\n", + "print(f\"test_data最小日期: {test_data['trade_date'].min().strftime('%Y-%m-%d')}\")\n", + "print(f\"test_data最大日期: {test_data['trade_date'].max().strftime('%Y-%m-%d')}\")\n", + "\n", + "cat_columns = [col for col in feature_columns if col.startswith('cat')]\n", + "for col in cat_columns:\n", + " train_data[col] = train_data[col].astype('category')\n", + " test_data[col] = test_data[col].astype('category')\n", + "\n", + "print(df[['ts_code', 'trade_date', 'log_circ_mv']].head(3))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "2e4b027e", + "metadata": {}, + "outputs": [], + "source": [ + "class RmseObjective(object):\n", + "\n", + " def is_max_optimal(self):\n", + " return False\n", + "\n", + " def get_final_error(self, error, weight):\n", + " return np.sqrt(error / (weight + 1e-38))\n", + "\n", + "\n", + " def evaluate(self, approxes, target, weight):\n", + " assert len(approxes) == 1\n", + " assert len(target) == len(approxes[0])\n", + "\n", + " approx = approxes[0]\n", + "\n", + " error_sum = 0.0\n", + " weight_sum = 0.0\n", + "\n", + " for i in range(len(approx)):\n", + " w = 1.0 if weight is None else weight[i]\n", + " weight_sum += w\n", + " error_sum += w * ((approx[i] - target[i])**2)\n", + "\n", + " return error_sum, weight_sum\n", + "\n", + " def calc_ders_range(self, approxes, targets, weights):\n", + " assert len(approxes) == len(targets)\n", + " if weights is not None:\n", + " assert len(weights) == len(approxes)\n", + "\n", + " result = []\n", + " for index in range(len(targets)):\n", + " der1 = targets[index] - approxes[index]\n", + " der2 = -1\n", + "\n", + " if weights is not None:\n", + " der1 *= weights[index]\n", + " der2 *= weights[index]\n", + "\n", + " result.append((der1, der2))\n", + " return result\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "3ff2d1c5", + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.linear_model import LogisticRegression\n", + "import matplotlib.pyplot as plt # 保持 matplotlib 导入,尽管LightGBM的绘图功能已移除\n", + "from sklearn.decomposition import PCA\n", + "import pandas as pd\n", + "import numpy as np\n", + "import datetime # 用于日期计算\n", + "from catboost import CatBoostClassifier, CatBoostRanker, CatBoostRegressor\n", + "from catboost import Pool\n", + "import lightgbm as lgb\n", + "from lightgbm import LGBMClassifier, LGBMRegressor\n", + "\n", + "def train_model(train_data_df, feature_columns,\n", + " print_info=True, # 调整参数名,更通用\n", + " validation_days=180, use_pca=False, split_date=None,\n", + " target_column='label', type='light'): # 增加目标列参数\n", + "\n", + " print('train data size: ', len(train_data_df))\n", + " print(train_data_df[['ts_code', 'trade_date', 'log_circ_mv']])\n", + " # 确保数据按时间排序\n", + " train_data_df = train_data_df.sort_values(by='trade_date')\n", + "\n", + " # 识别数值型特征列\n", + " numeric_feature_columns = train_data_df[feature_columns].select_dtypes(include=['float64', 'int64']).columns.tolist()\n", + "\n", + " # 去除标签为空的样本\n", + " initial_len = len(train_data_df)\n", + " train_data_df = train_data_df.dropna(subset=[target_column])\n", + "\n", + " if print_info:\n", + " print(f'原始样本数: {initial_len}, 去除标签为空后样本数: {len(train_data_df)}')\n", + "\n", + " # 提取特征和标签,只取数值型特征用于线性回归\n", + " \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", + " val_data_split = train_data_df[train_data_df['trade_date'] >= split_date] # 验证集\n", + " \n", + " X_train = train_data_split[feature_columns]\n", + " y_train = train_data_split[target_column]\n", + " \n", + " X_val = val_data_split[feature_columns]\n", + " y_val = val_data_split[target_column]\n", + "\n", + "\n", + " # # 标准化数值特征 (使用 StandardScaler 对训练集fit并transform, 对验证集只transform)\n", + " scaler = StandardScaler()\n", + " # X_train = scaler.fit_transform(X_train)\n", + "\n", + " # 训练线性回归模型\n", + " # model = LogisticRegression(random_state=42)\n", + " \n", + " # # 使用处理后的特征和样本权重进行训练\n", + " # model.fit(X_train, y_train)\n", + "\n", + "\n", + " if type == 'cat':\n", + " params = {\n", + " 'loss_function': 'RMSE', # 适用于二分类\n", + " 'eval_metric': 'RMSE', # 评估指标\n", + " 'iterations': 1500,\n", + " 'learning_rate': 0.01,\n", + " 'depth': 8, # 控制模型复杂度\n", + " 'l2_leaf_reg': 1, # L2 正则化\n", + " 'verbose': 5000,\n", + " 'early_stopping_rounds': 300,\n", + " 'one_hot_max_size': 50,\n", + " # 'class_weights': [0.6, 1.2],\n", + " 'task_type': 'GPU',\n", + " 'has_time': True,\n", + " 'random_seed': 7\n", + " }\n", + " cat_features = [i for i, col in enumerate(feature_columns) if col.startswith('cat')]\n", + " group_train = train_data_split['trade_date'].factorize()[0]\n", + " group_val = val_data_split['trade_date'].factorize()[0]\n", + " train_pool = Pool(\n", + " data=X_train,\n", + " label=y_train,\n", + " # group_id=group_train,\n", + " cat_features=cat_features\n", + " )\n", + " val_pool = Pool(\n", + " data=X_val,\n", + " label=y_val,\n", + " # group_id=group_val,\n", + " cat_features=cat_features\n", + " )\n", + "\n", + " model = CatBoostRegressor(**params)\n", + " model.fit(train_pool,\n", + " eval_set=val_pool, \n", + " plot=True, \n", + " use_best_model=True\n", + " )\n", + " elif type == 'light':\n", + " label_gain = list(range(len(train_data_split['label'].unique())))\n", + " params = {\n", + " 'label_gain': [gain * gain for gain in label_gain],\n", + " 'objective': 'rmse',\n", + " 'metric': 'rmse',\n", + " 'learning_rate': 0.01,\n", + " 'num_leaves': 1024,\n", + " # 'min_data_in_leaf': 128,\n", + " 'max_depth': 100,\n", + " 'max_bin': 1024,\n", + " 'feature_fraction': 0.7,\n", + " 'bagging_fraction': 0.7,\n", + " 'bagging_freq': 5,\n", + " 'lambda_l1': 1,\n", + " 'lambda_l2': 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': 1,\n", + " # 'lambdarank_position_bias_regularization': 1,\n", + " 'seed': 7\n", + " }\n", + " train_groups = train_data_split.groupby('trade_date').size().tolist()\n", + " val_groups = val_data_split.groupby('trade_date').size().tolist()\n", + "\n", + " categorical_feature = [col for col in feature_columns if 'cat' in col]\n", + " train_dataset = lgb.Dataset(\n", + " X_train, label=y_train, \n", + " group=train_groups,\n", + " categorical_feature=categorical_feature\n", + " )\n", + " val_dataset = lgb.Dataset(\n", + " X_val, label=y_val, \n", + " group=val_groups,\n", + " categorical_feature=categorical_feature\n", + " )\n", + "\n", + " evals = {}\n", + " callbacks = [lgb.log_evaluation(period=1000),\n", + " lgb.callback.record_evaluation(evals),\n", + " lgb.early_stopping(100, first_metric_only=True)\n", + " ]\n", + " # 训练模型\n", + " model = lgb.train(\n", + " params, train_dataset, num_boost_round=1000,\n", + " valid_sets=[train_dataset, val_dataset], valid_names=['train', 'valid'],\n", + " callbacks=callbacks\n", + " )\n", + " from flaml import AutoML\n", + " from sklearn.datasets import fetch_california_housing\n", + "\n", + " # # Initialize an AutoML instance\n", + " # model = AutoML()\n", + " # # Specify automl goal and constraint\n", + " # automl_settings = {\n", + " # \"time_budget\": 3000, # in seconds\n", + " # \"metric\": \"r2\",\n", + " # \"task\": \"regression\",\n", + " # \"estimator_list\": [\n", + " # # \"catboost\",\n", + " # \"lgbm\",\n", + " # # \"xgboost\"\n", + " # ], \n", + " # # \"ensemble\": {\n", + " # # \"final_estimator\": LGBMRegressor(),\n", + " # # \"passthrough\": False,\n", + " # # },\n", + " # }\n", + " # model.fit(X_train=X_train, y_train=y_train, X_val=X_val, y_val=y_val, mlflow_logging=False, **automl_settings)\n", + "\n", + " # 打印特征重要性(如果需要)\n", + " if True:\n", + " lgb.plot_metric(evals)\n", + " lgb.plot_importance(model, importance_type='split', max_num_features=20)\n", + " plt.show()\n", + "\n", + "\n", + " return model, scaler, None # 返回训练好的模型、scaler 和 pca 对象" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "c6eb5cd4-e714-420a-ac48-39af3e11ee81", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T15:03:18.426481Z", + "start_time": "2025-04-03T15:02:19.926352Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "train data size: 728000\n", + " ts_code trade_date log_circ_mv\n", + "0 600306.SH 2020-01-02 11.552040\n", + "1 603269.SH 2020-01-02 11.324801\n", + "2 002633.SZ 2020-01-02 11.759023\n", + "3 603991.SH 2020-01-02 11.181150\n", + "4 000691.SZ 2020-01-02 11.677910\n", + "... ... ... ...\n", + "727995 002235.SZ 2022-12-30 12.914708\n", + "727996 605598.SH 2022-12-30 11.783580\n", + "727997 002613.SZ 2022-12-30 12.489464\n", + "727998 600800.SH 2022-12-30 12.571911\n", + "727999 603068.SH 2022-12-30 12.967134\n", + "\n", + "[728000 rows x 3 columns]\n", + "原始样本数: 728000, 去除标签为空后样本数: 728000\n", + "Training until validation scores don't improve for 100 rounds\n", + "Early stopping, best iteration is:\n", + "[58]\ttrain's rmse: 0.0373704\tvalid's rmse: 0.040525\n", + "Evaluated only: rmse\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkgAAAHHCAYAAABEEKc/AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAYSpJREFUeJzt3XlcVPX+P/DX7MMwwLAjiqCCG+6ghnUzC8MsyxYt9Zpa2W2x8nL13mwxzW9Z3TRNLduz+9Ob125a11xCXNJyBdHcNVkU2bcZGAaGmfP7Y2BgDqCIyADzej4e8xjmc86c+bxHnHnxOZ9zjkQQBAFEREREZCd1dgeIiIiI2hoGJCIiIiIRBiQiIiIiEQYkIiIiIhEGJCIiIiIRBiQiIiIiEQYkIiIiIhEGJCIiIiIRBiQiIiIiEQYkImoxX3/9NSQSCdLS0m7aayxYsAASiaTdbNfZ0tLSIJFI8PXXXzfr+RKJBAsWLGjRPhG1BwxIRO1QTRCRSCTYt29fveWCICAkJAQSiQT33Xdfs17jo48+avaXKl2fdevWYdmyZc7uBhHVwYBE1I6p1WqsW7euXvuePXtw+fJlqFSqZm+7OQFp6tSpKC8vR2hoaLNf11lee+01lJeXO+W1b2ZACg0NRXl5OaZOndqs55eXl+O1115r4V4RtX0MSETt2NixY7FhwwZUVVU5tK9btw5RUVEICgpqlX6UlZUBAGQyGdRqdbvaVVXTd7lcDrVa7eTeXJvJZILVam3y+hKJBGq1GjKZrFmvp1arIZfLm/VcovaMAYmoHZs0aRIKCgqQkJBgb6usrMR3332HyZMnN/gcq9WKZcuWITIyEmq1GoGBgfjLX/6CoqIi+zphYWE4efIk9uzZY9+Vd8cddwCo3b23Z88ePPfccwgICECXLl0clonnIG3duhUjR46Eh4cHPD09MXTo0AZHvsT27duHoUOHQq1Wo0ePHvjkk0/qrXO1OTbi+TM184xOnTqFyZMnw9vbG7fddpvDMvHzZ82ahU2bNqFfv35QqVSIjIzEtm3b6r3W7t27ER0d7dDXpsxruuOOO/DTTz8hPT3d/l6HhYXZtymRSPDtt9/itddeQ+fOnaHRaKDX61FYWIg5c+agf//+0Gq18PT0xD333INjx45d8/2ZPn06tFotMjMzMX78eGi1Wvj7+2POnDmwWCxNeg8vXLiA6dOnQ6fTwcvLCzNmzIDRaHR4bnl5OV588UX4+fnBw8MD999/PzIzMzmvidoF/llA1I6FhYUhJiYG//73v3HPPfcAsIWRkpISPPbYY/jwww/rPecvf/kLvv76a8yYMQMvvvgiUlNTsXLlShw9ehS//vorFAoFli1bhhdeeAFarRavvvoqACAwMNBhO8899xz8/f0xf/58+yhMQ77++ms88cQTiIyMxLx586DT6XD06FFs27at0RAHAL///jvuvvtu+Pv7Y8GCBaiqqsIbb7xRrx/NMWHCBERERODtt9+GIAhXXXffvn34/vvv8dxzz8HDwwMffvghHn74YWRkZMDX1xcAcPToUYwZMwadOnXCwoULYbFY8Oabb8Lf3/+afXn11VdRUlKCy5cv44MPPgAAaLVah3UWLVoEpVKJOXPmoKKiAkqlEqdOncKmTZswYcIEdOvWDTk5Ofjkk08wcuRInDp1CsHBwVd9XYvFgri4OAwfPhzvv/8+duzYgSVLlqBHjx549tlnr9nviRMnolu3bli8eDGSk5Px+eefIyAgAO+++659nenTp+M///kPpk6diltuuQV79uzBvffee81tE7UJAhG1O1999ZUAQDh8+LCwcuVKwcPDQzAajYIgCMKECROEUaNGCYIgCKGhocK9995rf97evXsFAMLatWsdtrdt27Z67ZGRkcLIkSMbfe3bbrtNqKqqanBZamqqIAiCUFxcLHh4eAjDhw8XysvLHda1Wq1XrXH8+PGCWq0W0tPT7W2nTp0SZDKZUPejKzU1VQAgfPXVV/W2AUB444037I/feOMNAYAwadKkeuvWLBM/X6lUChcuXLC3HTt2TAAgrFixwt42btw4QaPRCJmZmfa28+fPC3K5vN42G3LvvfcKoaGh9dp37dolABC6d+9u//etYTKZBIvF4tCWmpoqqFQq4c0333RoE78/06ZNEwA4rCcIgjB48GAhKiqq3nvQ0Hv4xBNPOKz34IMPCr6+vvbHSUlJAgBh9uzZDutNnz693jaJ2iLuYiNq5yZOnIjy8nJs3rwZBoMBmzdvbnRkZsOGDfDy8sLo0aORn59vv0VFRUGr1WLXrl1Nft2ZM2dec15LQkICDAYDXn755Xrze66268lisWD79u0YP348unbtam/v06cP4uLimtzHxjzzzDNNXjc2NhY9evSwPx4wYAA8PT1x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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "gc.collect()\n", + "\n", + "use_pca = False\n", + "type = 'light'\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_model(train_data\n", + " .dropna(subset=['label']).groupby('trade_date', group_keys=False)\n", + " .apply(lambda x: x.nsmallest(1000, 'total_mv'))\n", + " .merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + " .merge(index_data, on='trade_date', how='left'), \n", + " feature_columns, type=type, target_column='future_return_2')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "5d1522a7538db91b", + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-03T15:04:39.656944Z", + "start_time": "2025-04-03T15:04:39.298483Z" + } + }, + "outputs": [], + "source": [ + "score_df = test_data.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(1000, 'total_mv'))\n", + "# score_df = fill_nan_with_daily_median(score_df, ['pe_ttm'])\n", + "# score_df = score_df[score_df['pe_ttm'] > 0]\n", + "score_df = score_df.merge(industry_df, on=['cat_l2_code', 'trade_date'], how='left')\n", + "score_df = score_df.merge(index_data, on='trade_date', how='left')\n", + "# score_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(50, 'total_mv')).reset_index()\n", + "numeric_columns = score_df.select_dtypes(include=['float64', 'int64']).columns\n", + "numeric_columns = [col for col in feature_columns if col in numeric_columns]\n", + "\n", + "import pandas as pd\n", + "\n", + "def filter_high_volatility_daily(df: pd.DataFrame, threshold: float, window: int = 5,\n", + " date_col: str = 'trade_date', code_col: str = 'ts_code',\n", + " close_col: str = 'close') -> pd.DataFrame:\n", + " df = df.sort_values([code_col, date_col])\n", + "\n", + " def get_daily_std_rank(group):\n", + " rolling_std = group[close_col].rolling(window=window, min_periods=window).std()\n", + " # 在每个日期内计算标准差的百分比排名\n", + " return rolling_std.groupby(group[date_col]).rank(pct=True, ascending=False)\n", + "\n", + " # 直接在 apply 中计算并添加 'std_rank' 列\n", + " df_with_std = df.groupby(code_col, group_keys=False).apply(\n", + " lambda x: x.assign(std_rank=get_daily_std_rank(x))\n", + " )\n", + "\n", + " # 过滤掉每天标准差排名在前 top_percent 的股票\n", + " threshold_rank = threshold / 100.0\n", + " df_filtered = df_with_std[df_with_std['std_rank'] > threshold_rank].drop(\n", + " columns=['std_rank']\n", + " )\n", + "\n", + " return df_filtered\n", + "\n", + "# threshold = 10\n", + "# score_df = filter_high_volatility_daily(score_df, threshold=threshold)\n", + "# print(len(score_df))\n", + "\n", + "if type == 'cat':\n", + " score_df['score'] = model.predict(score_df[feature_columns])\n", + "elif type == 'light':\n", + " score_df['score'] = model.predict(score_df[feature_columns])\n", + "score_df['score_ranks'] = score_df.groupby('trade_date')['score'].rank(ascending=True)\n", + "\n", + "score_df = score_df.groupby('trade_date', group_keys=False).apply(\n", + " lambda x: \n", + " x[\n", + " # (x['score'] <= x['score'].quantile(0.99)) & \n", + " (x['score'] >= x['score'].quantile(0.90))\n", + " ] # 计算90%分位数作为阈值,筛选分数>=阈值的行\n", + ").reset_index(drop=True) # drop=True 避免添加旧索引列\n", + "# df_to_drop = score_df.loc[score_df.groupby('trade_date')['score'].idxmax()]\n", + "# score_df = score_df.drop(df_to_drop.index)\n", + "save_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nlargest(2, 'score')).reset_index()\n", + "# save_df = score_df.groupby('trade_date', group_keys=False).apply(lambda x: x.nsmallest(2, 'total_mv')).reset_index()\n", + "save_df = save_df.sort_values(['trade_date', 'score'])\n", + "save_df[['trade_date', 'score', 'ts_code']].to_csv('predictions_test.tsv', index=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "09b1799e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "162\n", + "['vol', 'pct_chg', 'turnover_rate', 'volume_ratio', 'winner_rate', 'undist_profit_ps', 'ocfps', 'AR', 'BR', 'AR_BR', 'log_circ_mv', 'cashflow_to_ev_factor', 'book_to_price_ratio', 'turnover_rate_mean_5', 'variance_20', 'bbi_ratio_factor', 'daily_deviation', 'lg_elg_net_buy_vol', 'flow_lg_elg_intensity', 'sm_net_buy_vol', 'total_buy_vol', 'lg_elg_buy_prop', 'flow_struct_buy_change', 'lg_elg_net_buy_vol_change', 'flow_lg_elg_accel', 'chip_concentration_range', 'chip_skewness', 'floating_chip_proxy', 'cost_support_15pct_change', 'cat_winner_price_zone', 'flow_chip_consistency', 'profit_taking_vs_absorb', 'cat_is_positive', 'upside_vol', 'downside_vol', 'vol_ratio', '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', 'atr_6', 'obv', 'maobv_6', 'rsi_3', 'return_5', 'return_20', 'std_return_5', 'std_return_90', 'std_return_90_2', 'act_factor1', 'act_factor2', 'act_factor3', 'act_factor4', 'rank_act_factor1', 'rank_act_factor2', 'rank_act_factor3', 'cov', 'delta_cov', 'alpha_22_improved', 'alpha_003', 'alpha_007', 'alpha_013', 'vol_break', 'weight_roc5', 'smallcap_concentration', 'cost_stability', 'high_cost_break_days', 'liquidity_risk', 'turnover_std', 'mv_volatility', 'volume_growth', 'mv_growth', 'momentum_factor', 'resonance_factor', 'log_close', 'cat_vol_spike', 'up', 'down', 'obv_maobv_6', 'std_return_5_over_std_return_90', 'std_return_90_minus_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_turnover_ratio', 'mv_adjusted_volume', 'mv_weighted_turnover', 'nonlinear_mv_volume', 'mv_volume_ratio', 'mv_momentum', 'lg_flow_mom_corr_20_60', 'lg_flow_accel', 'profit_pressure', 'underwater_resistance', 'cost_conc_std_20', 'profit_decay_20', 'vol_amp_loss_20', 'vol_drop_profit_cnt_5', 'lg_flow_vol_interact_20', 'cost_break_confirm_cnt_5', 'atr_norm_channel_pos_14', 'turnover_diff_skew_20', 'lg_sm_flow_diverge_20', 'pullback_strong_20_20', 'vol_wgt_hist_pos_20', 'vol_adj_roc_20', 'cs_rank_net_lg_flow_val', 'cs_rank_elg_buy_ratio', 'cs_rank_rel_profit_margin', 'cs_rank_cost_breadth', 'cs_rank_dist_to_upper_cost', 'cs_rank_winner_rate', 'cs_rank_intraday_range', 'cs_rank_close_pos_in_range', 'cs_rank_pos_in_hist_range', 'cs_rank_vol_x_profit_margin', 'cs_rank_lg_flow_price_concordance', 'cs_rank_turnover_per_winner', 'cs_rank_volume_ratio', 'cs_rank_elg_buy_sell_sm_ratio', 'cs_rank_cost_dist_vol_ratio', 'cs_rank_size', 'cat_up_limit', 'industry_obv', 'industry_return_5', 'industry_return_20', 'industry__ema_5', 'industry__ema_13', 'industry__ema_20', 'industry__ema_60', '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" + ] + } + ], + "source": [ + "print(len(feature_columns))\n", + "print(feature_columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "bceabd1f", + "metadata": {}, + "outputs": [], + "source": [ + "# print(model.get_feature_importance())" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "new_trader", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/main/train/catboost_info/catboost_training.json b/main/train/catboost_info/catboost_training.json index 20639b3..6c45bd2 100644 --- a/main/train/catboost_info/catboost_training.json +++ b/main/train/catboost_info/catboost_training.json @@ -1,1504 +1,792 @@ { "meta":{"test_sets":["test"],"test_metrics":[{"best_value":"Min","name":"Logloss"}],"learn_metrics":[{"best_value":"Min","name":"Logloss"}],"launch_mode":"Train","parameters":"","iteration_count":1500,"learn_sets":["learn"],"name":"experiment"}, "iterations":[ -{"learn":[0.6886094006],"iteration":0,"passed_time":0.2548376797,"remaining_time":382.0016819,"test":[0.6894541077]}, -{"learn":[0.6842840712],"iteration":1,"passed_time":0.4612183746,"remaining_time":345.4525626,"test":[0.6855832199]}, -{"learn":[0.6801700826],"iteration":2,"passed_time":0.6899614699,"remaining_time":344.2907735,"test":[0.6821220668]}, -{"learn":[0.6761092858],"iteration":3,"passed_time":0.8930737467,"remaining_time":334.0095813,"test":[0.6785342336]}, -{"learn":[0.6722299853],"iteration":4,"passed_time":0.9379687136,"remaining_time":280.4526454,"test":[0.675241269]}, -{"learn":[0.668121543],"iteration":5,"passed_time":1.143657382,"remaining_time":284.770688,"test":[0.6727295383]}, -{"learn":[0.6641551391],"iteration":6,"passed_time":1.350557392,"remaining_time":288.0545981,"test":[0.6695484864]}, -{"learn":[0.6603305622],"iteration":7,"passed_time":1.55876027,"remaining_time":290.7087903,"test":[0.6667001793]}, -{"learn":[0.6566888023],"iteration":8,"passed_time":1.764462049,"remaining_time":292.3125461,"test":[0.6635442319]}, -{"learn":[0.6530217934],"iteration":9,"passed_time":1.970239651,"remaining_time":293.565708,"test":[0.6604540991]}, -{"learn":[0.6494780711],"iteration":10,"passed_time":2.178919427,"remaining_time":294.9464569,"test":[0.6580433454]}, -{"learn":[0.6458671064],"iteration":11,"passed_time":2.38462734,"remaining_time":295.6937901,"test":[0.6555645419]}, -{"learn":[0.6425007076],"iteration":12,"passed_time":2.590190533,"remaining_time":296.2779479,"test":[0.6532769959]}, -{"learn":[0.6391117537],"iteration":13,"passed_time":2.796950522,"remaining_time":296.8763197,"test":[0.6512511917]}, -{"learn":[0.6357860278],"iteration":14,"passed_time":2.958310984,"remaining_time":292.8727874,"test":[0.6483123646]}, -{"learn":[0.6325226318],"iteration":15,"passed_time":3.164133379,"remaining_time":293.4733709,"test":[0.6461847852]}, -{"learn":[0.6295236628],"iteration":16,"passed_time":3.259382939,"remaining_time":284.3332293,"test":[0.643417539]}, -{"learn":[0.6263974456],"iteration":17,"passed_time":3.468036779,"remaining_time":285.5350282,"test":[0.6414505249]}, -{"learn":[0.6232680591],"iteration":18,"passed_time":3.672525318,"remaining_time":286.263684,"test":[0.6387744772]}, -{"learn":[0.6203073332],"iteration":19,"passed_time":3.89776556,"remaining_time":288.4346514,"test":[0.6367427261]}, -{"learn":[0.6173680002],"iteration":20,"passed_time":4.110851718,"remaining_time":289.5214139,"test":[0.634672021]}, -{"learn":[0.6144953286],"iteration":21,"passed_time":4.314641328,"remaining_time":289.8654492,"test":[0.6329852278]}, -{"learn":[0.6116808668],"iteration":22,"passed_time":4.520332417,"remaining_time":290.2839556,"test":[0.6312399637]}, -{"learn":[0.6088264188],"iteration":23,"passed_time":4.745343843,"remaining_time":291.8386464,"test":[0.6291118654]}, -{"learn":[0.6060673673],"iteration":24,"passed_time":4.971715628,"remaining_time":293.3312221,"test":[0.6273949387]}, -{"learn":[0.6033653635],"iteration":25,"passed_time":5.178199542,"remaining_time":293.5640817,"test":[0.6254813266]}, -{"learn":[0.6007803605],"iteration":26,"passed_time":5.387937424,"remaining_time":293.9419195,"test":[0.6230177695]}, -{"learn":[0.5983245601],"iteration":27,"passed_time":5.591638996,"remaining_time":293.9604501,"test":[0.6206095301]}, -{"learn":[0.5958047923],"iteration":28,"passed_time":5.797954824,"remaining_time":294.0962602,"test":[0.6190039175]}, -{"learn":[0.5933361561],"iteration":29,"passed_time":6.002219145,"remaining_time":294.1087381,"test":[0.6169711287]}, -{"learn":[0.5908417429],"iteration":30,"passed_time":6.21037572,"remaining_time":294.2916752,"test":[0.6155199748]}, -{"learn":[0.5885609946],"iteration":31,"passed_time":6.419369917,"remaining_time":294.4885949,"test":[0.6141367508]}, -{"learn":[0.5862544163],"iteration":32,"passed_time":6.634169461,"remaining_time":294.9189878,"test":[0.6124635276]}, -{"learn":[0.5840255392],"iteration":33,"passed_time":6.839723498,"remaining_time":294.9127838,"test":[0.611132189]}, -{"learn":[0.5818528647],"iteration":34,"passed_time":7.041488248,"remaining_time":294.7365795,"test":[0.6091998981]}, -{"learn":[0.5797131512],"iteration":35,"passed_time":7.24532856,"remaining_time":294.6433614,"test":[0.6078234592]}, -{"learn":[0.5775249999],"iteration":36,"passed_time":7.449498663,"remaining_time":294.5572039,"test":[0.6061353488]}, -{"learn":[0.5754249556],"iteration":37,"passed_time":7.654332705,"remaining_time":294.4903793,"test":[0.6049632584]}, -{"learn":[0.5734558571],"iteration":38,"passed_time":7.85621901,"remaining_time":294.3060506,"test":[0.6032521588]}, -{"learn":[0.5714098498],"iteration":39,"passed_time":8.072546573,"remaining_time":294.6479499,"test":[0.6016046787]}, -{"learn":[0.5694267007],"iteration":40,"passed_time":8.279746239,"remaining_time":294.6377991,"test":[0.5999589946]}, -{"learn":[0.5674763011],"iteration":41,"passed_time":8.486171616,"remaining_time":294.5913861,"test":[0.5988397474]}, -{"learn":[0.5655860659],"iteration":42,"passed_time":8.691159293,"remaining_time":294.488816,"test":[0.5970643499]}, -{"learn":[0.5637778104],"iteration":43,"passed_time":8.916241823,"remaining_time":295.0465476,"test":[0.5954772165]}, -{"learn":[0.5620264442],"iteration":44,"passed_time":9.130735858,"remaining_time":295.2271261,"test":[0.5943097159]}, -{"learn":[0.5602958898],"iteration":45,"passed_time":9.34575604,"remaining_time":295.4071583,"test":[0.5932678178]}, -{"learn":[0.5586157805],"iteration":46,"passed_time":9.550334518,"remaining_time":295.2475756,"test":[0.5917338469]}, -{"learn":[0.5569170778],"iteration":47,"passed_time":9.758118522,"remaining_time":295.1830853,"test":[0.5907270712]}, -{"learn":[0.5552938578],"iteration":48,"passed_time":9.965769845,"remaining_time":295.1088172,"test":[0.5891976503]}, -{"learn":[0.5536610241],"iteration":49,"passed_time":10.17508646,"remaining_time":295.0775073,"test":[0.5881479295]}, -{"learn":[0.5520403923],"iteration":50,"passed_time":10.38143641,"remaining_time":294.9549286,"test":[0.5872138332]}, -{"learn":[0.5505269364],"iteration":51,"passed_time":10.58904546,"remaining_time":294.8641889,"test":[0.5857426436]}, -{"learn":[0.5489814704],"iteration":52,"passed_time":10.79508044,"remaining_time":294.7260642,"test":[0.5847088876]}, -{"learn":[0.5474507945],"iteration":53,"passed_time":10.99882652,"remaining_time":294.5241324,"test":[0.5837608222]}, -{"learn":[0.5460741475],"iteration":54,"passed_time":11.20549429,"remaining_time":294.3988955,"test":[0.5824919456]}, -{"learn":[0.5446328993],"iteration":55,"passed_time":11.41196586,"remaining_time":294.265691,"test":[0.5810779496]}, -{"learn":[0.5432053319],"iteration":56,"passed_time":11.62084152,"remaining_time":294.1907775,"test":[0.5801092498]}, -{"learn":[0.5417448564],"iteration":57,"passed_time":11.82940409,"remaining_time":294.1034604,"test":[0.5792040497]}, -{"learn":[0.5403179229],"iteration":58,"passed_time":12.0392982,"remaining_time":294.0445544,"test":[0.5779750451]}, -{"learn":[0.538951946],"iteration":59,"passed_time":12.25986747,"remaining_time":294.2368192,"test":[0.577159008]}, -{"learn":[0.5376593917],"iteration":60,"passed_time":12.46379519,"remaining_time":294.0229717,"test":[0.5761436114]}, -{"learn":[0.5363245798],"iteration":61,"passed_time":12.67456377,"remaining_time":293.9681082,"test":[0.5748410891]}, -{"learn":[0.5350903938],"iteration":62,"passed_time":12.87982854,"remaining_time":293.7827557,"test":[0.5741973114]}, -{"learn":[0.5339010008],"iteration":63,"passed_time":13.11407169,"remaining_time":294.2469837,"test":[0.5731644733]}, -{"learn":[0.5327094421],"iteration":64,"passed_time":13.32836283,"remaining_time":294.249241,"test":[0.5722342885]}, -{"learn":[0.5315422344],"iteration":65,"passed_time":13.53458795,"remaining_time":294.0696836,"test":[0.5711859247]}, -{"learn":[0.5303893415],"iteration":66,"passed_time":13.74676472,"remaining_time":294.0166244,"test":[0.5700398967]}, -{"learn":[0.5292133125],"iteration":67,"passed_time":13.95309606,"remaining_time":293.8357875,"test":[0.5689985174]}, -{"learn":[0.5280834499],"iteration":68,"passed_time":14.15617661,"remaining_time":293.5867932,"test":[0.5685869867]}, -{"learn":[0.5269904571],"iteration":69,"passed_time":14.36181384,"remaining_time":293.3913399,"test":[0.5681149895]}, -{"learn":[0.5259452682],"iteration":70,"passed_time":14.56468688,"remaining_time":293.1399655,"test":[0.5671515181]}, -{"learn":[0.5249150279],"iteration":71,"passed_time":14.76801732,"remaining_time":292.8990101,"test":[0.5661324895]}, -{"learn":[0.5238462804],"iteration":72,"passed_time":14.97288832,"remaining_time":292.6892005,"test":[0.5657845383]}, -{"learn":[0.5228017782],"iteration":73,"passed_time":15.18354376,"remaining_time":292.5909919,"test":[0.565092627]}, -{"learn":[0.5217467115],"iteration":74,"passed_time":15.38644237,"remaining_time":292.3424051,"test":[0.5644229465]}, -{"learn":[0.5206653924],"iteration":75,"passed_time":15.60045919,"remaining_time":292.3033406,"test":[0.563980045]}, -{"learn":[0.519690985],"iteration":76,"passed_time":15.80687643,"remaining_time":292.1192877,"test":[0.5630679003]}, -{"learn":[0.5188082765],"iteration":77,"passed_time":16.01246975,"remaining_time":291.9196409,"test":[0.5625441375]}, -{"learn":[0.5178517758],"iteration":78,"passed_time":16.22169132,"remaining_time":291.7851059,"test":[0.5622948882]}, -{"learn":[0.517003296],"iteration":79,"passed_time":16.44761767,"remaining_time":291.9452136,"test":[0.5617445042]}, -{"learn":[0.5160910601],"iteration":80,"passed_time":16.65366396,"remaining_time":291.7475205,"test":[0.5611259508]}, -{"learn":[0.5152263111],"iteration":81,"passed_time":16.86228485,"remaining_time":291.5941453,"test":[0.5602181564]}, -{"learn":[0.5142879283],"iteration":82,"passed_time":17.06833973,"remaining_time":291.3956312,"test":[0.5593856358]}, -{"learn":[0.5133673465],"iteration":83,"passed_time":17.29706104,"remaining_time":291.5790289,"test":[0.5586139806]}, -{"learn":[0.5125676214],"iteration":84,"passed_time":17.50323309,"remaining_time":291.3773508,"test":[0.5577438231]}, -{"learn":[0.511806879],"iteration":85,"passed_time":17.70628474,"remaining_time":291.1242631,"test":[0.5573124562]}, -{"learn":[0.5109763058],"iteration":86,"passed_time":17.91154028,"remaining_time":290.9081197,"test":[0.556940917]}, -{"learn":[0.5102151408],"iteration":87,"passed_time":18.12127971,"remaining_time":290.7641698,"test":[0.5564853236]}, -{"learn":[0.5093848846],"iteration":88,"passed_time":18.33259774,"remaining_time":290.6437687,"test":[0.5560559522]}, -{"learn":[0.5086172754],"iteration":89,"passed_time":18.53822292,"remaining_time":290.4321591,"test":[0.5556498894]}, -{"learn":[0.5078550539],"iteration":90,"passed_time":18.74940451,"remaining_time":290.3067138,"test":[0.5550825029]}, -{"learn":[0.5071185039],"iteration":91,"passed_time":18.95738042,"remaining_time":290.1303438,"test":[0.554764286]}, -{"learn":[0.5064200915],"iteration":92,"passed_time":19.16438358,"remaining_time":289.9385773,"test":[0.5544176119]}, -{"learn":[0.5056497882],"iteration":93,"passed_time":19.37176577,"remaining_time":289.7521561,"test":[0.5537595458]}, -{"learn":[0.5049258627],"iteration":94,"passed_time":19.60451169,"remaining_time":289.9404097,"test":[0.5534369785]}, -{"learn":[0.504269972],"iteration":95,"passed_time":19.81274528,"remaining_time":289.7613998,"test":[0.5531940751]}, -{"learn":[0.5034799661],"iteration":96,"passed_time":20.02356807,"remaining_time":289.6192372,"test":[0.5525149755]}, -{"learn":[0.5028081231],"iteration":97,"passed_time":20.23358211,"remaining_time":289.4641033,"test":[0.5521479065]}, -{"learn":[0.5020622765],"iteration":98,"passed_time":20.45018756,"remaining_time":289.4011391,"test":[0.551840785]}, -{"learn":[0.5014704588],"iteration":99,"passed_time":20.68953505,"remaining_time":289.6534908,"test":[0.5513785663]}, -{"learn":[0.5008064863],"iteration":100,"passed_time":20.89566905,"remaining_time":289.4360495,"test":[0.5507428907]}, -{"learn":[0.5001531838],"iteration":101,"passed_time":21.10381306,"remaining_time":289.2463789,"test":[0.5504985904]}, -{"learn":[0.4995469985],"iteration":102,"passed_time":21.30866392,"remaining_time":289.0116844,"test":[0.5498629947]}, -{"learn":[0.4989194204],"iteration":103,"passed_time":21.53365614,"remaining_time":289.0479229,"test":[0.5495887606]}, -{"learn":[0.4983277611],"iteration":104,"passed_time":21.74069718,"remaining_time":288.8406911,"test":[0.5489601893]}, -{"learn":[0.4978244203],"iteration":105,"passed_time":21.94610155,"remaining_time":288.6119393,"test":[0.5487091839]}, -{"learn":[0.4972450686],"iteration":106,"passed_time":22.14974821,"remaining_time":288.3607407,"test":[0.5484093663]}, -{"learn":[0.4966463841],"iteration":107,"passed_time":22.35168781,"remaining_time":288.0884206,"test":[0.548056466]}, -{"learn":[0.4960494427],"iteration":108,"passed_time":22.55682802,"remaining_time":287.8582365,"test":[0.5477675443]}, -{"learn":[0.49544368],"iteration":109,"passed_time":22.76704937,"remaining_time":287.6927148,"test":[0.5474838112]}, -{"learn":[0.4949225909],"iteration":110,"passed_time":22.97066985,"remaining_time":287.4437876,"test":[0.546970625]}, -{"learn":[0.4944312407],"iteration":111,"passed_time":23.17848493,"remaining_time":287.2476526,"test":[0.5466213566]}, -{"learn":[0.4938673659],"iteration":112,"passed_time":23.39058466,"remaining_time":287.103902,"test":[0.5459944218]}, -{"learn":[0.4932931379],"iteration":113,"passed_time":23.59985729,"remaining_time":286.9245807,"test":[0.5457387466]}, -{"learn":[0.4927523991],"iteration":114,"passed_time":23.80799154,"remaining_time":286.7310285,"test":[0.5455292894]}, -{"learn":[0.4922124526],"iteration":115,"passed_time":24.01842387,"remaining_time":286.5646434,"test":[0.5449328472]}, -{"learn":[0.4916421335],"iteration":116,"passed_time":24.22344621,"remaining_time":286.3335565,"test":[0.5443990665]}, -{"learn":[0.4911280698],"iteration":117,"passed_time":24.43446199,"remaining_time":286.1731057,"test":[0.5442677965]}, -{"learn":[0.4905679981],"iteration":118,"passed_time":24.64803423,"remaining_time":286.0414729,"test":[0.5440104451]}, -{"learn":[0.490077493],"iteration":119,"passed_time":24.89150329,"remaining_time":286.2522878,"test":[0.543743874]}, -{"learn":[0.4895810719],"iteration":120,"passed_time":25.09811702,"remaining_time":286.035565,"test":[0.5434209076]}, -{"learn":[0.4891463997],"iteration":121,"passed_time":25.30568719,"remaining_time":285.829811,"test":[0.543206182]}, -{"learn":[0.4887393533],"iteration":122,"passed_time":25.51729082,"remaining_time":285.6691826,"test":[0.5428123721]}, -{"learn":[0.4882983953],"iteration":123,"passed_time":25.76951125,"remaining_time":285.9584475,"test":[0.5423325122]}, -{"learn":[0.4878777737],"iteration":124,"passed_time":25.97686999,"remaining_time":285.7455699,"test":[0.5420352889]}, -{"learn":[0.487388325],"iteration":125,"passed_time":26.18376288,"remaining_time":285.5277,"test":[0.5417448905]}, -{"learn":[0.4869629495],"iteration":126,"passed_time":26.38934883,"remaining_time":285.2958736,"test":[0.5415824494]}, -{"learn":[0.4865456557],"iteration":127,"passed_time":26.59054938,"remaining_time":285.0174512,"test":[0.5413982164]}, -{"learn":[0.4861641752],"iteration":128,"passed_time":26.79896686,"remaining_time":284.8169269,"test":[0.5410186949]}, -{"learn":[0.485755914],"iteration":129,"passed_time":27.00836775,"remaining_time":284.6266447,"test":[0.5405840153]}, -{"learn":[0.4853674082],"iteration":130,"passed_time":27.21704835,"remaining_time":284.4285434,"test":[0.5400429308]}, -{"learn":[0.4850003481],"iteration":131,"passed_time":27.41972598,"remaining_time":284.1680693,"test":[0.5396564247]}, -{"learn":[0.4845859067],"iteration":132,"passed_time":27.62258279,"remaining_time":283.9103058,"test":[0.5394588612]}, -{"learn":[0.4842318936],"iteration":133,"passed_time":27.8251271,"remaining_time":283.6501763,"test":[0.5393060388]}, -{"learn":[0.4838624566],"iteration":134,"passed_time":28.03313574,"remaining_time":283.4461503,"test":[0.5388860467]}, -{"learn":[0.4835127749],"iteration":135,"passed_time":28.23448192,"remaining_time":283.1752451,"test":[0.5386006373]}, -{"learn":[0.4831545361],"iteration":136,"passed_time":28.44342064,"remaining_time":282.980893,"test":[0.5382334885]}, -{"learn":[0.4827900644],"iteration":137,"passed_time":28.59899402,"remaining_time":282.2596366,"test":[0.5382419897]}, -{"learn":[0.4824663183],"iteration":138,"passed_time":28.81931476,"remaining_time":282.1804848,"test":[0.5381403742]}, -{"learn":[0.4821112488],"iteration":139,"passed_time":29.05849951,"remaining_time":282.2825667,"test":[0.5378730049]}, -{"learn":[0.4817231128],"iteration":140,"passed_time":29.27088094,"remaining_time":282.1214695,"test":[0.5376378045]}, -{"learn":[0.4812918212],"iteration":141,"passed_time":29.47672829,"remaining_time":281.8971621,"test":[0.5373320002]}, -{"learn":[0.4809127177],"iteration":142,"passed_time":29.7006185,"remaining_time":281.8443308,"test":[0.5370232822]}, -{"learn":[0.4805652546],"iteration":143,"passed_time":29.92045637,"remaining_time":281.7509641,"test":[0.5367278549]}, -{"learn":[0.4801548276],"iteration":144,"passed_time":30.12627217,"remaining_time":281.5248193,"test":[0.5364668316]}, -{"learn":[0.4798612429],"iteration":145,"passed_time":30.33169237,"remaining_time":281.295284,"test":[0.5361811428]}, -{"learn":[0.4795304188],"iteration":146,"passed_time":30.53825147,"remaining_time":281.0765595,"test":[0.5358966514]}, -{"learn":[0.4791973232],"iteration":147,"passed_time":30.74883519,"remaining_time":280.8947647,"test":[0.5356389807]}, -{"learn":[0.4787542523],"iteration":148,"passed_time":30.95568066,"remaining_time":280.6786884,"test":[0.5356706706]}, -{"learn":[0.478443342],"iteration":149,"passed_time":31.16358331,"remaining_time":280.4722498,"test":[0.5354533109]}, -{"learn":[0.478118117],"iteration":150,"passed_time":31.36905939,"remaining_time":280.2441133,"test":[0.5354791737]}, -{"learn":[0.477766164],"iteration":151,"passed_time":31.57479571,"remaining_time":280.018583,"test":[0.5354239358]}, -{"learn":[0.4773950894],"iteration":152,"passed_time":31.79765439,"remaining_time":279.9440553,"test":[0.5351100293]}, -{"learn":[0.4770596697],"iteration":153,"passed_time":32.01054221,"remaining_time":279.7804534,"test":[0.5350417003]}, -{"learn":[0.4766443304],"iteration":154,"passed_time":32.2242387,"remaining_time":279.6232326,"test":[0.5349833093]}, -{"learn":[0.4763934259],"iteration":155,"passed_time":32.43076654,"remaining_time":279.4035271,"test":[0.5348715562]}, -{"learn":[0.4760888014],"iteration":156,"passed_time":32.63407225,"remaining_time":279.156427,"test":[0.5346331629]}, -{"learn":[0.4757386972],"iteration":157,"passed_time":32.84186019,"remaining_time":278.9479517,"test":[0.5344197544]}, -{"learn":[0.4754284208],"iteration":158,"passed_time":33.07004547,"remaining_time":278.9115156,"test":[0.5343285958]}, -{"learn":[0.4752018672],"iteration":159,"passed_time":33.27663766,"remaining_time":278.6918404,"test":[0.5342445814]}, -{"learn":[0.4748744764],"iteration":160,"passed_time":33.48309473,"remaining_time":278.471204,"test":[0.5339958509]}, -{"learn":[0.4745125401],"iteration":161,"passed_time":33.69267635,"remaining_time":278.2765491,"test":[0.5338577959]}, -{"learn":[0.4741907485],"iteration":162,"passed_time":33.93396718,"remaining_time":278.3418044,"test":[0.5335452864]}, -{"learn":[0.4739415871],"iteration":163,"passed_time":34.13872297,"remaining_time":278.1056944,"test":[0.5333889917]}, -{"learn":[0.4736589366],"iteration":164,"passed_time":34.34260984,"remaining_time":277.8629342,"test":[0.5333351906]}, -{"learn":[0.473393506],"iteration":165,"passed_time":34.54898564,"remaining_time":277.6406437,"test":[0.5330863005]}, -{"learn":[0.4731260683],"iteration":166,"passed_time":34.76683972,"remaining_time":277.5101638,"test":[0.5330717326]}, -{"learn":[0.4728718888],"iteration":167,"passed_time":35.01616589,"remaining_time":277.6281724,"test":[0.5330295059]}, -{"learn":[0.4725338808],"iteration":168,"passed_time":35.22747148,"remaining_time":277.4423938,"test":[0.5328613973]}, -{"learn":[0.4722885755],"iteration":169,"passed_time":35.43840245,"remaining_time":277.2533839,"test":[0.5327863631]}, -{"learn":[0.4718623547],"iteration":170,"passed_time":35.65512855,"remaining_time":277.109157,"test":[0.532462798]}, -{"learn":[0.4716504857],"iteration":171,"passed_time":35.86115468,"remaining_time":276.8814733,"test":[0.5323185567]}, -{"learn":[0.4714240906],"iteration":172,"passed_time":36.08980158,"remaining_time":276.8275532,"test":[0.5322493097]}, -{"learn":[0.4711224242],"iteration":173,"passed_time":36.30236016,"remaining_time":276.6490205,"test":[0.5321949099]}, -{"learn":[0.4708753757],"iteration":174,"passed_time":36.52077834,"remaining_time":276.5144646,"test":[0.5321501687]}, -{"learn":[0.4705578626],"iteration":175,"passed_time":36.72949897,"remaining_time":276.3060036,"test":[0.5318850744]}, -{"learn":[0.470318579],"iteration":176,"passed_time":36.93718245,"remaining_time":276.0897874,"test":[0.5318113173]}, -{"learn":[0.4700258923],"iteration":177,"passed_time":37.19622727,"remaining_time":276.2551261,"test":[0.5317642613]}, -{"learn":[0.4697032555],"iteration":178,"passed_time":37.44252199,"remaining_time":276.3216287,"test":[0.5315113002]}, -{"learn":[0.4694980949],"iteration":179,"passed_time":37.66626378,"remaining_time":276.2192677,"test":[0.5313999861]}, -{"learn":[0.4692407461],"iteration":180,"passed_time":37.89928207,"remaining_time":276.183166,"test":[0.531258379]}, -{"learn":[0.4690375399],"iteration":181,"passed_time":38.12774034,"remaining_time":276.1118778,"test":[0.531088195]}, -{"learn":[0.4687665102],"iteration":182,"passed_time":38.35028425,"remaining_time":275.996308,"test":[0.5308870394]}, -{"learn":[0.4685097953],"iteration":183,"passed_time":38.59055916,"remaining_time":276.0063905,"test":[0.5306738704]}, -{"learn":[0.4682683987],"iteration":184,"passed_time":38.81730296,"remaining_time":275.9175859,"test":[0.5305879003]}, -{"learn":[0.4679814696],"iteration":185,"passed_time":39.0289892,"remaining_time":275.7209237,"test":[0.5306117676]}, -{"learn":[0.4677498452],"iteration":186,"passed_time":39.23829423,"remaining_time":275.5073814,"test":[0.5304378718]}, -{"learn":[0.4675479595],"iteration":187,"passed_time":39.44064752,"remaining_time":275.2453699,"test":[0.530306083]}, -{"learn":[0.4673429573],"iteration":188,"passed_time":39.65189447,"remaining_time":275.0456807,"test":[0.5303453163]}, -{"learn":[0.4670665926],"iteration":189,"passed_time":39.86049164,"remaining_time":274.8276003,"test":[0.5301496685]}, -{"learn":[0.4668145788],"iteration":190,"passed_time":40.07315016,"remaining_time":274.6374532,"test":[0.529982877]}, -{"learn":[0.4666169189],"iteration":191,"passed_time":40.27513909,"remaining_time":274.3743851,"test":[0.5297919788]}, -{"learn":[0.4663742546],"iteration":192,"passed_time":40.49257923,"remaining_time":274.2165857,"test":[0.5297191796]}, -{"learn":[0.4661475426],"iteration":193,"passed_time":40.70035285,"remaining_time":273.993097,"test":[0.5296563983]}, -{"learn":[0.4658186729],"iteration":194,"passed_time":40.91325154,"remaining_time":273.804068,"test":[0.529535266]}, -{"learn":[0.4655949189],"iteration":195,"passed_time":41.1205853,"remaining_time":273.5777716,"test":[0.5293826432]}, -{"learn":[0.4654052879],"iteration":196,"passed_time":41.34614188,"remaining_time":273.4721973,"test":[0.529236965]}, -{"learn":[0.4650987618],"iteration":197,"passed_time":41.56926333,"remaining_time":273.3493983,"test":[0.5290585592]}, -{"learn":[0.4647930809],"iteration":198,"passed_time":41.78255518,"remaining_time":273.1613281,"test":[0.5290010462]}, -{"learn":[0.4645638863],"iteration":199,"passed_time":41.99233346,"remaining_time":272.9501675,"test":[0.5290082304]}, -{"learn":[0.4643999268],"iteration":200,"passed_time":42.21965583,"remaining_time":272.8524026,"test":[0.5288512971]}, -{"learn":[0.4641465396],"iteration":201,"passed_time":42.43404941,"remaining_time":272.6702779,"test":[0.5286590818]}, -{"learn":[0.4639578595],"iteration":202,"passed_time":42.63116582,"remaining_time":272.3774486,"test":[0.5284484671]}, -{"learn":[0.4637831771],"iteration":203,"passed_time":42.84055077,"remaining_time":272.163499,"test":[0.5282372537]}, -{"learn":[0.4635943385],"iteration":204,"passed_time":43.04992309,"remaining_time":271.9495142,"test":[0.5281120104]}, -{"learn":[0.4632829528],"iteration":205,"passed_time":43.25998115,"remaining_time":271.7398816,"test":[0.5280276369]}, -{"learn":[0.4630655902],"iteration":206,"passed_time":43.47422336,"remaining_time":271.5563807,"test":[0.5279043492]}, -{"learn":[0.4628626481],"iteration":207,"passed_time":43.68352362,"remaining_time":271.3418871,"test":[0.5279763901]}, -{"learn":[0.4626137509],"iteration":208,"passed_time":43.89338785,"remaining_time":271.1309268,"test":[0.5277915185]}, -{"learn":[0.4624257574],"iteration":209,"passed_time":44.09996623,"remaining_time":270.8997926,"test":[0.5277201562]}, -{"learn":[0.4621862096],"iteration":210,"passed_time":44.30809257,"remaining_time":270.6783475,"test":[0.527805807]}, -{"learn":[0.4620176546],"iteration":211,"passed_time":44.51326196,"remaining_time":270.4390632,"test":[0.5277612654]}, -{"learn":[0.4618566003],"iteration":212,"passed_time":44.71820554,"remaining_time":270.1987349,"test":[0.5277774696]}, -{"learn":[0.4616117703],"iteration":213,"passed_time":44.93383825,"remaining_time":270.0229719,"test":[0.5277155264]}, -{"learn":[0.4613963622],"iteration":214,"passed_time":45.14355909,"remaining_time":269.8115043,"test":[0.5276143899]}, -{"learn":[0.4611555996],"iteration":215,"passed_time":45.36020426,"remaining_time":269.6412142,"test":[0.5275091424]}, -{"learn":[0.4609431495],"iteration":216,"passed_time":45.59376453,"remaining_time":269.5705064,"test":[0.5273555218]}, -{"learn":[0.4606419056],"iteration":217,"passed_time":45.8025467,"remaining_time":269.3525911,"test":[0.5273034768]}, -{"learn":[0.4604990749],"iteration":218,"passed_time":46.00997437,"remaining_time":269.1268364,"test":[0.5272039367]}, -{"learn":[0.4602662356],"iteration":219,"passed_time":46.22078285,"remaining_time":268.9209184,"test":[0.5270597353]}, -{"learn":[0.4601193376],"iteration":220,"passed_time":46.45326326,"remaining_time":268.8403788,"test":[0.5269038796]}, -{"learn":[0.4598976965],"iteration":221,"passed_time":46.66027242,"remaining_time":268.6118385,"test":[0.5267533323]}, -{"learn":[0.4596782739],"iteration":222,"passed_time":46.86726703,"remaining_time":268.3834081,"test":[0.5266567856]}, -{"learn":[0.4594982037],"iteration":223,"passed_time":47.06700197,"remaining_time":268.1138148,"test":[0.5265556091]}, -{"learn":[0.4593121118],"iteration":224,"passed_time":47.27029324,"remaining_time":267.864995,"test":[0.5265692589]}, -{"learn":[0.4591613578],"iteration":225,"passed_time":47.47576303,"remaining_time":267.6288588,"test":[0.526538886]}, -{"learn":[0.4589852492],"iteration":226,"passed_time":47.68529789,"remaining_time":267.4157895,"test":[0.526435714]}, -{"learn":[0.4587977311],"iteration":227,"passed_time":47.94800431,"remaining_time":267.4993924,"test":[0.5263467106]}, -{"learn":[0.4585018223],"iteration":228,"passed_time":48.1631554,"remaining_time":267.3160284,"test":[0.5263170561]}, -{"learn":[0.4583266117],"iteration":229,"passed_time":48.36761962,"remaining_time":267.0733779,"test":[0.526298577]}, -{"learn":[0.4581678816],"iteration":230,"passed_time":48.64888836,"remaining_time":267.2529841,"test":[0.5262108508]}, -{"learn":[0.4579662072],"iteration":231,"passed_time":48.85721763,"remaining_time":267.0299653,"test":[0.5262104517]}, -{"learn":[0.4578352087],"iteration":232,"passed_time":49.06186637,"remaining_time":266.7870588,"test":[0.5261221268]}, -{"learn":[0.457673679],"iteration":233,"passed_time":49.27223003,"remaining_time":266.5753984,"test":[0.5260186355]}, -{"learn":[0.4574698389],"iteration":234,"passed_time":49.4803428,"remaining_time":266.3516325,"test":[0.5258674096]}, -{"learn":[0.457183438],"iteration":235,"passed_time":49.74400332,"remaining_time":266.4255093,"test":[0.5256993409]}, -{"learn":[0.4570205878],"iteration":236,"passed_time":49.95075045,"remaining_time":266.1932397,"test":[0.5256229497]}, -{"learn":[0.4568795531],"iteration":237,"passed_time":50.15927502,"remaining_time":265.9706096,"test":[0.5254896442]}, -{"learn":[0.4567206645],"iteration":238,"passed_time":50.36793779,"remaining_time":265.7488266,"test":[0.5255100791]}, -{"learn":[0.4565087954],"iteration":239,"passed_time":50.63999861,"remaining_time":265.8599927,"test":[0.5253485559]}, -{"learn":[0.4562582079],"iteration":240,"passed_time":50.86614844,"remaining_time":265.7281364,"test":[0.5251955739]}, -{"learn":[0.4560229387],"iteration":241,"passed_time":51.07334741,"remaining_time":265.4969878,"test":[0.525201401]}, -{"learn":[0.4558351565],"iteration":242,"passed_time":51.28091579,"remaining_time":265.2679471,"test":[0.5251467218]}, -{"learn":[0.4556336406],"iteration":243,"passed_time":51.49515669,"remaining_time":265.0734295,"test":[0.5250919229]}, -{"learn":[0.4553961528],"iteration":244,"passed_time":51.70194105,"remaining_time":264.8405552,"test":[0.5251040162]}, -{"learn":[0.4552254321],"iteration":245,"passed_time":51.91022031,"remaining_time":264.6155133,"test":[0.5251262072]}, -{"learn":[0.4550482672],"iteration":246,"passed_time":52.11363939,"remaining_time":264.365952,"test":[0.5250505344]}, -{"learn":[0.454885681],"iteration":247,"passed_time":52.32173495,"remaining_time":264.1403716,"test":[0.5250028397]}, -{"learn":[0.454700223],"iteration":248,"passed_time":52.53728055,"remaining_time":263.9523613,"test":[0.5248889713]}, -{"learn":[0.4545273366],"iteration":249,"passed_time":52.74199282,"remaining_time":263.7099641,"test":[0.5248956765]}, -{"learn":[0.4544055819],"iteration":250,"passed_time":52.94923436,"remaining_time":263.480453,"test":[0.5247977329]}, -{"learn":[0.454199893],"iteration":251,"passed_time":53.15464372,"remaining_time":263.2420451,"test":[0.5247529917]}, -{"learn":[0.4540775045],"iteration":252,"passed_time":53.35804577,"remaining_time":262.9940042,"test":[0.524670494]}, -{"learn":[0.4538600891],"iteration":253,"passed_time":53.56632895,"remaining_time":262.7702593,"test":[0.5246514561]}, -{"learn":[0.4536116144],"iteration":254,"passed_time":53.85454954,"remaining_time":262.9369183,"test":[0.5244733296]}, -{"learn":[0.4534992092],"iteration":255,"passed_time":54.06009406,"remaining_time":262.6982696,"test":[0.5243745878]}, -{"learn":[0.4533003872],"iteration":256,"passed_time":54.277315,"remaining_time":262.5163523,"test":[0.5243039838]}, -{"learn":[0.4531977541],"iteration":257,"passed_time":54.48216019,"remaining_time":262.2745851,"test":[0.5244688595]}, -{"learn":[0.4530556629],"iteration":258,"passed_time":54.73822863,"remaining_time":262.2785395,"test":[0.5245450511]}, -{"learn":[0.45287105],"iteration":259,"passed_time":54.94931078,"remaining_time":262.0659437,"test":[0.5244637907]}, -{"learn":[0.4525722359],"iteration":260,"passed_time":55.1619596,"remaining_time":261.8607967,"test":[0.5243809337]}, -{"learn":[0.4524406035],"iteration":261,"passed_time":55.37414518,"remaining_time":261.6534035,"test":[0.5243914305]}, -{"learn":[0.452250233],"iteration":262,"passed_time":55.58524676,"remaining_time":261.4408755,"test":[0.5242310249]}, -{"learn":[0.4521208719],"iteration":263,"passed_time":55.7902195,"remaining_time":261.199664,"test":[0.5241210679]}, -{"learn":[0.4518656889],"iteration":264,"passed_time":56.00603121,"remaining_time":261.0092398,"test":[0.5239771858]}, -{"learn":[0.451704212],"iteration":265,"passed_time":56.21199348,"remaining_time":260.7729322,"test":[0.5239547154]}, -{"learn":[0.4515996773],"iteration":266,"passed_time":56.41696288,"remaining_time":260.5322668,"test":[0.5238165008]}, -{"learn":[0.4513194037],"iteration":267,"passed_time":56.63707534,"remaining_time":260.3614807,"test":[0.5236885834]}, -{"learn":[0.4511126056],"iteration":268,"passed_time":56.85691712,"remaining_time":260.1890891,"test":[0.5236250438]}, -{"learn":[0.4509529775],"iteration":269,"passed_time":57.06385368,"remaining_time":259.9575556,"test":[0.5236230482]}, -{"learn":[0.4507664102],"iteration":270,"passed_time":57.27852566,"remaining_time":259.7612842,"test":[0.5235145679]}, -{"learn":[0.4505616722],"iteration":271,"passed_time":57.48764214,"remaining_time":259.5397961,"test":[0.5233660161]}, -{"learn":[0.4503905817],"iteration":272,"passed_time":57.69780654,"remaining_time":259.3231085,"test":[0.5233280998]}, -{"learn":[0.4502793914],"iteration":273,"passed_time":57.92427658,"remaining_time":259.1794273,"test":[0.5232822811]}, -{"learn":[0.4501244645],"iteration":274,"passed_time":58.16200097,"remaining_time":259.0852771,"test":[0.5232123955]}, -{"learn":[0.4499517894],"iteration":275,"passed_time":58.37208007,"remaining_time":258.8674855,"test":[0.523155561]}, -{"learn":[0.4497570875],"iteration":276,"passed_time":58.58213507,"remaining_time":258.6496433,"test":[0.52314243]}, -{"learn":[0.4496612684],"iteration":277,"passed_time":58.8714461,"remaining_time":258.7802415,"test":[0.523102638]}, -{"learn":[0.4495419963],"iteration":278,"passed_time":59.02864615,"remaining_time":258.3296665,"test":[0.5230515109]}, -{"learn":[0.4494077228],"iteration":279,"passed_time":59.2369233,"remaining_time":258.1037373,"test":[0.5230513912]}, -{"learn":[0.449301709],"iteration":280,"passed_time":59.44376963,"remaining_time":257.8717266,"test":[0.523002579]}, -{"learn":[0.4491572937],"iteration":281,"passed_time":59.65105663,"remaining_time":257.6417978,"test":[0.5229601927]}, -{"learn":[0.4490279854],"iteration":282,"passed_time":59.86136468,"remaining_time":257.4250205,"test":[0.5228612912]}, -{"learn":[0.4488724246],"iteration":283,"passed_time":60.06745398,"remaining_time":257.1902255,"test":[0.5227504161]}, -{"learn":[0.4486344087],"iteration":284,"passed_time":60.27480601,"remaining_time":256.9610151,"test":[0.5228104036]}, -{"learn":[0.4484893595],"iteration":285,"passed_time":60.48233078,"remaining_time":256.7326908,"test":[0.5226840827]}, -{"learn":[0.4484240187],"iteration":286,"passed_time":60.6835873,"remaining_time":256.4780188,"test":[0.5226614128]}, -{"learn":[0.4481634477],"iteration":287,"passed_time":60.90007295,"remaining_time":256.287807,"test":[0.5226812889]}, -{"learn":[0.4479560686],"iteration":288,"passed_time":61.11017688,"remaining_time":256.070672,"test":[0.5226106849]}, -{"learn":[0.4477917922],"iteration":289,"passed_time":61.31804447,"remaining_time":255.8442545,"test":[0.522569895]}, -{"learn":[0.4476275686],"iteration":290,"passed_time":61.52817588,"remaining_time":255.6273699,"test":[0.5225533316]}, -{"learn":[0.4474951438],"iteration":291,"passed_time":61.73049431,"remaining_time":255.3782093,"test":[0.5225332559]}, -{"learn":[0.447323261],"iteration":292,"passed_time":61.93645055,"remaining_time":255.1443543,"test":[0.5225249144]}, -{"learn":[0.447158562],"iteration":293,"passed_time":62.21261383,"remaining_time":255.1986812,"test":[0.5224744658]}, -{"learn":[0.4470886257],"iteration":294,"passed_time":62.41536699,"remaining_time":254.9509058,"test":[0.5224637694]}, -{"learn":[0.4470127205],"iteration":295,"passed_time":62.61829786,"remaining_time":254.7041575,"test":[0.522384744]}, -{"learn":[0.4468302205],"iteration":296,"passed_time":62.83639672,"remaining_time":254.5191423,"test":[0.5224226204]}, -{"learn":[0.4467086242],"iteration":297,"passed_time":63.10092666,"remaining_time":254.5211874,"test":[0.5223818305]}, -{"learn":[0.4465980678],"iteration":298,"passed_time":63.30359364,"remaining_time":254.2729631,"test":[0.5222914302]}, -{"learn":[0.4465148203],"iteration":299,"passed_time":63.50381515,"remaining_time":254.0152606,"test":[0.5222959802]}, -{"learn":[0.4464396018],"iteration":300,"passed_time":63.70560879,"remaining_time":253.7642024,"test":[0.5222638112]}, -{"learn":[0.4463183225],"iteration":301,"passed_time":63.91356249,"remaining_time":253.5379068,"test":[0.5222312831]}, -{"learn":[0.4461492921],"iteration":302,"passed_time":64.11900351,"remaining_time":253.3018059,"test":[0.5221857836]}, -{"learn":[0.446020829],"iteration":303,"passed_time":64.32311239,"remaining_time":253.0606659,"test":[0.522149863]}, -{"learn":[0.4458343673],"iteration":304,"passed_time":64.52736667,"remaining_time":252.8203383,"test":[0.5221769631]}, -{"learn":[0.4456622204],"iteration":305,"passed_time":64.73365682,"remaining_time":252.5881903,"test":[0.5221064788]}, -{"learn":[0.445596774],"iteration":306,"passed_time":64.9352562,"remaining_time":252.3379826,"test":[0.5220758266]}, -{"learn":[0.4454220916],"iteration":307,"passed_time":65.13779275,"remaining_time":252.0917174,"test":[0.5220174755]}, -{"learn":[0.4450990851],"iteration":308,"passed_time":65.35844541,"remaining_time":251.9155614,"test":[0.5220429791]}, -{"learn":[0.444992279],"iteration":309,"passed_time":65.56234469,"remaining_time":251.674807,"test":[0.5220126062]}, -{"learn":[0.4447645634],"iteration":310,"passed_time":65.77579812,"remaining_time":251.4708166,"test":[0.5219440776]}, -{"learn":[0.4446559085],"iteration":311,"passed_time":65.99064031,"remaining_time":251.2720535,"test":[0.5218769859]}, -{"learn":[0.4444993441],"iteration":312,"passed_time":66.2550545,"remaining_time":251.2611811,"test":[0.5218586264]}, -{"learn":[0.444352499],"iteration":313,"passed_time":66.49828075,"remaining_time":251.1686655,"test":[0.521794528]}, -{"learn":[0.4442798159],"iteration":314,"passed_time":66.69981454,"remaining_time":250.9183499,"test":[0.5217505452]}, -{"learn":[0.4441964628],"iteration":315,"passed_time":66.90539474,"remaining_time":250.6835043,"test":[0.5217173386]}, -{"learn":[0.4440341408],"iteration":316,"passed_time":67.18555792,"remaining_time":250.7271767,"test":[0.5217161412]}, -{"learn":[0.4439694866],"iteration":317,"passed_time":67.38811631,"remaining_time":250.4803569,"test":[0.5217222078]}, -{"learn":[0.4439021914],"iteration":318,"passed_time":67.59152592,"remaining_time":250.2369659,"test":[0.5217046466]}, -{"learn":[0.4437099193],"iteration":319,"passed_time":67.79706494,"remaining_time":250.001677,"test":[0.5216551959]}, -{"learn":[0.4436455821],"iteration":320,"passed_time":68.03303561,"remaining_time":249.8783457,"test":[0.5216333641]}, -{"learn":[0.4434661458],"iteration":321,"passed_time":68.23969401,"remaining_time":249.6470793,"test":[0.5216336435]}, -{"learn":[0.4432080575],"iteration":322,"passed_time":68.45122437,"remaining_time":249.4337185,"test":[0.5216289738]}, -{"learn":[0.4430162872],"iteration":323,"passed_time":68.7177994,"remaining_time":249.4201608,"test":[0.5216116521]}, -{"learn":[0.4429581038],"iteration":324,"passed_time":68.92061301,"remaining_time":249.1745239,"test":[0.5215553764]}, -{"learn":[0.4428937138],"iteration":325,"passed_time":69.12456496,"remaining_time":248.9332493,"test":[0.5215919756]}, -{"learn":[0.4427885716],"iteration":326,"passed_time":69.32820665,"remaining_time":248.6910899,"test":[0.5215249636]}, -{"learn":[0.4427152547],"iteration":327,"passed_time":69.52937247,"remaining_time":248.4403187,"test":[0.5215122716]}, -{"learn":[0.44249364],"iteration":328,"passed_time":69.7366116,"remaining_time":248.2114656,"test":[0.5214512465]}, -{"learn":[0.4424281407],"iteration":329,"passed_time":69.93877301,"remaining_time":247.9647407,"test":[0.5214193569]}, -{"learn":[0.4422756436],"iteration":330,"passed_time":70.14953543,"remaining_time":247.7486614,"test":[0.5214139688]}, -{"learn":[0.4421993422],"iteration":331,"passed_time":70.41460145,"remaining_time":247.7236581,"test":[0.5214042703]}, -{"learn":[0.4421153288],"iteration":332,"passed_time":70.65334843,"remaining_time":247.6049778,"test":[0.5214492908]}, -{"learn":[0.4420295723],"iteration":333,"passed_time":70.85733293,"remaining_time":247.3642221,"test":[0.5214255832]}, -{"learn":[0.4418158281],"iteration":334,"passed_time":71.0756712,"remaining_time":247.1736028,"test":[0.5214452198]}, -{"learn":[0.4417356971],"iteration":335,"passed_time":71.33658116,"remaining_time":247.130299,"test":[0.5214269402]}, -{"learn":[0.4416540343],"iteration":336,"passed_time":71.53826565,"remaining_time":246.8813144,"test":[0.5213244067]}, -{"learn":[0.4415295857],"iteration":337,"passed_time":71.74899595,"remaining_time":246.663708,"test":[0.5212698872]}, -{"learn":[0.4412303226],"iteration":338,"passed_time":71.97584219,"remaining_time":246.5013357,"test":[0.5211978862]}, -{"learn":[0.4410611602],"iteration":339,"passed_time":72.18770115,"remaining_time":246.287451,"test":[0.5211577349]}, -{"learn":[0.4409150281],"iteration":340,"passed_time":72.39268327,"remaining_time":246.050205,"test":[0.5211128341]}, -{"learn":[0.4407749442],"iteration":341,"passed_time":72.60342852,"remaining_time":245.8326615,"test":[0.5210809446]}, -{"learn":[0.4405557593],"iteration":342,"passed_time":72.82516298,"remaining_time":245.6522261,"test":[0.5209546237]}, -{"learn":[0.44040107],"iteration":343,"passed_time":73.03213034,"remaining_time":245.4219264,"test":[0.5208835008]}, -{"learn":[0.4402975653],"iteration":344,"passed_time":73.24438157,"remaining_time":245.2094514,"test":[0.5208267462]}, -{"learn":[0.4401624731],"iteration":345,"passed_time":73.4515478,"remaining_time":244.9800178,"test":[0.520855802]}, -{"learn":[0.4399556749],"iteration":346,"passed_time":73.66369146,"remaining_time":244.7672515,"test":[0.5208142937]}, -{"learn":[0.4398478388],"iteration":347,"passed_time":73.8694989,"remaining_time":244.5335136,"test":[0.520786116]}, -{"learn":[0.4397832375],"iteration":348,"passed_time":74.06774678,"remaining_time":244.2750044,"test":[0.5207108822]}, -{"learn":[0.4397173421],"iteration":349,"passed_time":74.26721184,"remaining_time":244.0208389,"test":[0.5206722077]}, -{"learn":[0.439509778],"iteration":350,"passed_time":74.52693265,"remaining_time":243.9642325,"test":[0.5206926026]}, -{"learn":[0.4393479578],"iteration":351,"passed_time":74.81340014,"remaining_time":243.9937027,"test":[0.5206879728]}, -{"learn":[0.4392969582],"iteration":352,"passed_time":75.01205854,"remaining_time":243.7360656,"test":[0.5206462251]}, -{"learn":[0.4392013504],"iteration":353,"passed_time":75.21983032,"remaining_time":243.5082643,"test":[0.5206983499]}, -{"learn":[0.4391486076],"iteration":354,"passed_time":75.49751784,"remaining_time":243.5060787,"test":[0.5206852189]}, -{"learn":[0.4389969557],"iteration":355,"passed_time":75.70150131,"remaining_time":243.2654986,"test":[0.52067568]}, -{"learn":[0.4388265783],"iteration":356,"passed_time":75.90918459,"remaining_time":243.0369692,"test":[0.5206148943]}, -{"learn":[0.4386331705],"iteration":357,"passed_time":76.11771271,"remaining_time":242.8112512,"test":[0.5206184065]}, -{"learn":[0.4385288735],"iteration":358,"passed_time":76.3262227,"remaining_time":242.5855713,"test":[0.5205935814]}, -{"learn":[0.4383196456],"iteration":359,"passed_time":76.54000191,"remaining_time":242.3766727,"test":[0.5205935814]}, -{"learn":[0.4382746412],"iteration":360,"passed_time":76.74875703,"remaining_time":242.1518955,"test":[0.5205976524]}, -{"learn":[0.4382349455],"iteration":361,"passed_time":76.94885989,"remaining_time":241.9000071,"test":[0.5206694537]}, -{"learn":[0.4381737776],"iteration":362,"passed_time":77.15922134,"remaining_time":241.6805362,"test":[0.5206845005]}, -{"learn":[0.4379406477],"iteration":363,"passed_time":77.37148412,"remaining_time":241.4670493,"test":[0.5206001668]}, -{"learn":[0.4378149842],"iteration":364,"passed_time":77.57106964,"remaining_time":241.214148,"test":[0.5205752618]}, -{"learn":[0.43767424],"iteration":365,"passed_time":77.83977388,"remaining_time":241.1756928,"test":[0.5205704325]}, -{"learn":[0.4376312429],"iteration":366,"passed_time":78.03559253,"remaining_time":240.9109709,"test":[0.5205585388]}, -{"learn":[0.4375809035],"iteration":367,"passed_time":78.23803289,"remaining_time":240.6669925,"test":[0.5205341128]}, -{"learn":[0.4373529766],"iteration":368,"passed_time":78.44843585,"remaining_time":240.4476448,"test":[0.5204625109]}, -{"learn":[0.4372716835],"iteration":369,"passed_time":78.68251653,"remaining_time":240.3006586,"test":[0.5204397213]}, -{"learn":[0.437206686],"iteration":370,"passed_time":78.95345988,"remaining_time":240.2653806,"test":[0.520347964]}, -{"learn":[0.4369936549],"iteration":371,"passed_time":79.16761954,"remaining_time":240.0566528,"test":[0.5202713333]}, -{"learn":[0.436909932],"iteration":372,"passed_time":79.37445022,"remaining_time":239.8257517,"test":[0.5203832062]}, -{"learn":[0.4368650333],"iteration":373,"passed_time":79.65036725,"remaining_time":239.8029773,"test":[0.5203872373]}, -{"learn":[0.436660665],"iteration":374,"passed_time":79.86185129,"remaining_time":239.5855539,"test":[0.5203436136]}, -{"learn":[0.4366189092],"iteration":375,"passed_time":80.06215152,"remaining_time":239.3347295,"test":[0.5203308019]}, -{"learn":[0.4365230373],"iteration":376,"passed_time":80.26999605,"remaining_time":239.1066461,"test":[0.5203397023]}, -{"learn":[0.4364827605],"iteration":377,"passed_time":80.47024008,"remaining_time":238.8561094,"test":[0.5203498399]}, -{"learn":[0.4363414089],"iteration":378,"passed_time":80.67939528,"remaining_time":238.6321955,"test":[0.5202615948]}, -{"learn":[0.4362572634],"iteration":379,"passed_time":80.88411789,"remaining_time":238.3952948,"test":[0.5202774398]}, -{"learn":[0.4360898441],"iteration":380,"passed_time":81.11428412,"remaining_time":238.2332912,"test":[0.5202466678]}, -{"learn":[0.4359583701],"iteration":381,"passed_time":81.36944923,"remaining_time":238.1440949,"test":[0.5202159357]}, -{"learn":[0.4357939088],"iteration":382,"passed_time":81.57914166,"remaining_time":237.9214131,"test":[0.520237089]}, -{"learn":[0.4356719428],"iteration":383,"passed_time":81.78804931,"remaining_time":237.6965183,"test":[0.5202604374]}, -{"learn":[0.4354242341],"iteration":384,"passed_time":82.00732236,"remaining_time":237.5017258,"test":[0.5201882768]}, -{"learn":[0.4353074446],"iteration":385,"passed_time":82.23533814,"remaining_time":237.332038,"test":[0.5201937847]}, -{"learn":[0.4350243187],"iteration":386,"passed_time":82.44503031,"remaining_time":237.1093507,"test":[0.5202097893]}, -{"learn":[0.4349750358],"iteration":387,"passed_time":82.67492539,"remaining_time":236.9446315,"test":[0.5202151375]}, -{"learn":[0.4348339746],"iteration":388,"passed_time":82.95558749,"remaining_time":236.9245699,"test":[0.520131642]}, -{"learn":[0.4346901139],"iteration":389,"passed_time":83.16707455,"remaining_time":236.7062891,"test":[0.5200898942]}, -{"learn":[0.4345142167],"iteration":390,"passed_time":83.37881817,"remaining_time":236.4887707,"test":[0.5200576454]}, -{"learn":[0.4344513057],"iteration":391,"passed_time":83.58161307,"remaining_time":236.245988,"test":[0.5200576055]}, -{"learn":[0.4343266193],"iteration":392,"passed_time":83.8325184,"remaining_time":236.1389259,"test":[0.5200681023]}, -{"learn":[0.4342603806],"iteration":393,"passed_time":84.03752622,"remaining_time":235.9022944,"test":[0.5200805947]}, -{"learn":[0.4341046613],"iteration":394,"passed_time":84.24431358,"remaining_time":235.6708013,"test":[0.5200674238]}, -{"learn":[0.4340624037],"iteration":395,"passed_time":84.44540716,"remaining_time":235.4235593,"test":[0.5200692199]}, -{"learn":[0.433915585],"iteration":396,"passed_time":84.65195537,"remaining_time":235.1917047,"test":[0.5200981959]}, -{"learn":[0.433756221],"iteration":397,"passed_time":84.86690869,"remaining_time":234.9832497,"test":[0.5201238991]}, -{"learn":[0.4336769087],"iteration":398,"passed_time":85.06729751,"remaining_time":234.7345728,"test":[0.5201292073]}, -{"learn":[0.4335894619],"iteration":399,"passed_time":85.2692688,"remaining_time":234.4904892,"test":[0.5201031449]}, -{"learn":[0.433471933],"iteration":400,"passed_time":85.4722338,"remaining_time":234.249339,"test":[0.520052417]}, -{"learn":[0.4334123762],"iteration":401,"passed_time":85.67113574,"remaining_time":233.9972812,"test":[0.5200121061]}, -{"learn":[0.4333829279],"iteration":402,"passed_time":85.88169293,"remaining_time":233.7772138,"test":[0.5199880791]}, -{"learn":[0.4333428624],"iteration":403,"passed_time":86.08507659,"remaining_time":233.5377325,"test":[0.519927493]}, -{"learn":[0.4332305364],"iteration":404,"passed_time":86.2854902,"remaining_time":233.2903994,"test":[0.5199221847]}, -{"learn":[0.4330941236],"iteration":405,"passed_time":86.48954622,"remaining_time":233.0531122,"test":[0.5199680434]}, -{"learn":[0.4330649923],"iteration":406,"passed_time":86.68870952,"remaining_time":232.8028489,"test":[0.5199661276]}, -{"learn":[0.4329271269],"iteration":407,"passed_time":86.90296166,"remaining_time":232.5932209,"test":[0.5199203887]}, -{"learn":[0.4326923859],"iteration":408,"passed_time":87.14809664,"remaining_time":232.4659497,"test":[0.5199692008]}, -{"learn":[0.4325448541],"iteration":409,"passed_time":87.3634863,"remaining_time":232.2590245,"test":[0.5199173953]}, -{"learn":[0.432499929],"iteration":410,"passed_time":87.56356056,"remaining_time":232.011478,"test":[0.5198898561]}, -{"learn":[0.4323177723],"iteration":411,"passed_time":87.77023803,"remaining_time":231.7815995,"test":[0.5198764458]}, -{"learn":[0.4320929883],"iteration":412,"passed_time":88.04325622,"remaining_time":231.7264395,"test":[0.5197944669]}, -{"learn":[0.432058205],"iteration":413,"passed_time":88.24045574,"remaining_time":231.4713404,"test":[0.519793509]}, -{"learn":[0.4319379293],"iteration":414,"passed_time":88.4519217,"remaining_time":231.2538194,"test":[0.5197798592]}, -{"learn":[0.4317621641],"iteration":415,"passed_time":88.66027041,"remaining_time":231.0282046,"test":[0.519885865]}, -{"learn":[0.4316120704],"iteration":416,"passed_time":88.86721685,"remaining_time":230.7990308,"test":[0.5198682639]}, -{"learn":[0.4315593276],"iteration":417,"passed_time":89.06831879,"remaining_time":230.5548348,"test":[0.5199132844]}, -{"learn":[0.4314243674],"iteration":418,"passed_time":89.27490963,"remaining_time":230.3250055,"test":[0.5199031069]}, -{"learn":[0.4313901916],"iteration":419,"passed_time":89.47556432,"remaining_time":230.0800225,"test":[0.5199104506]}, -{"learn":[0.4311070657],"iteration":420,"passed_time":89.70171143,"remaining_time":229.9005858,"test":[0.519926575]}, -{"learn":[0.4310475353],"iteration":421,"passed_time":89.90046314,"remaining_time":229.6509461,"test":[0.5199218654]}, -{"learn":[0.431018985],"iteration":422,"passed_time":90.09976008,"remaining_time":229.4029352,"test":[0.519938828]}, -{"learn":[0.430816439],"iteration":423,"passed_time":90.3159263,"remaining_time":229.1979639,"test":[0.5199363534]}, -{"learn":[0.430703532],"iteration":424,"passed_time":90.51697569,"remaining_time":228.9547032,"test":[0.5199619369]}, -{"learn":[0.4306646814],"iteration":425,"passed_time":90.71496097,"remaining_time":228.7039157,"test":[0.5199521585]}, -{"learn":[0.4306214202],"iteration":426,"passed_time":90.9165442,"remaining_time":228.4624167,"test":[0.5199667662]}, -{"learn":[0.4305729824],"iteration":427,"passed_time":91.13414482,"remaining_time":228.2612225,"test":[0.5199761056]}, -{"learn":[0.4305362183],"iteration":428,"passed_time":91.42596822,"remaining_time":228.2452493,"test":[0.5199664868]}, -{"learn":[0.4303169278],"iteration":429,"passed_time":91.63767768,"remaining_time":228.0286398,"test":[0.5199745889]}, -{"learn":[0.4301751535],"iteration":430,"passed_time":91.84155176,"remaining_time":227.7926191,"test":[0.5199711166]}, -{"learn":[0.4300101904],"iteration":431,"passed_time":92.11819462,"remaining_time":227.7366478,"test":[0.5200000128]}, -{"learn":[0.4299042823],"iteration":432,"passed_time":92.32853166,"remaining_time":227.5162662,"test":[0.5199679237]}, -{"learn":[0.4298305428],"iteration":433,"passed_time":92.53530468,"remaining_time":227.2871769,"test":[0.5200088333]}, -{"learn":[0.4296876593],"iteration":434,"passed_time":92.74581555,"remaining_time":227.0673415,"test":[0.5200194897]}, -{"learn":[0.4295342114],"iteration":435,"passed_time":92.95804418,"remaining_time":226.8517408,"test":[0.5199837287]}, -{"learn":[0.42950199],"iteration":436,"passed_time":93.15710845,"remaining_time":226.6041334,"test":[0.5199968597]}, -{"learn":[0.4293759303],"iteration":437,"passed_time":93.3647949,"remaining_time":226.3776534,"test":[0.5199699592]}, -{"learn":[0.429199584],"iteration":438,"passed_time":93.56885208,"remaining_time":226.1424876,"test":[0.5200188512]}, -{"learn":[0.4291747841],"iteration":439,"passed_time":93.76988202,"remaining_time":225.9001703,"test":[0.5199947444]}, -{"learn":[0.4289956383],"iteration":440,"passed_time":93.97653575,"remaining_time":225.671545,"test":[0.5199776622]}, -{"learn":[0.4289693065],"iteration":441,"passed_time":94.17961974,"remaining_time":225.4344744,"test":[0.5199651698]}, -{"learn":[0.4289362663],"iteration":442,"passed_time":94.37863154,"remaining_time":225.1878409,"test":[0.5199538348]}, -{"learn":[0.4287428058],"iteration":443,"passed_time":94.6177151,"remaining_time":225.0367278,"test":[0.5199529567]}, -{"learn":[0.4285975717],"iteration":444,"passed_time":94.84931126,"remaining_time":224.8674683,"test":[0.5199578659]}, -{"learn":[0.4284043488],"iteration":445,"passed_time":95.07086496,"remaining_time":224.6741966,"test":[0.5199937067]}, -{"learn":[0.4282537269],"iteration":446,"passed_time":95.31252392,"remaining_time":224.5281604,"test":[0.5200144209]}, -{"learn":[0.4282239617],"iteration":447,"passed_time":95.56156695,"remaining_time":224.3990367,"test":[0.5200216849]}, -{"learn":[0.4280819233],"iteration":448,"passed_time":95.77755532,"remaining_time":224.1920059,"test":[0.5199705578]}, -{"learn":[0.4280580214],"iteration":449,"passed_time":95.97742468,"remaining_time":223.9473242,"test":[0.5199875204]}, -{"learn":[0.4278186057],"iteration":450,"passed_time":96.2180616,"remaining_time":223.7976643,"test":[0.5199454533]}, -{"learn":[0.4277642254],"iteration":451,"passed_time":96.46902476,"remaining_time":223.6715441,"test":[0.5199908331]}, -{"learn":[0.4277265105],"iteration":452,"passed_time":96.66886596,"remaining_time":223.4267167,"test":[0.5200136626]}, -{"learn":[0.4276279182],"iteration":453,"passed_time":96.87035787,"remaining_time":223.1858906,"test":[0.5200052013]}, -{"learn":[0.4275099139],"iteration":454,"passed_time":97.07477563,"remaining_time":222.9519572,"test":[0.5200637919]}, -{"learn":[0.4274100011],"iteration":455,"passed_time":97.28095214,"remaining_time":222.7221799,"test":[0.5200609581]}, -{"learn":[0.4270585235],"iteration":456,"passed_time":97.50164697,"remaining_time":222.5256407,"test":[0.5199847665]}, -{"learn":[0.4269455637],"iteration":457,"passed_time":97.72368835,"remaining_time":222.3320595,"test":[0.5199773429]}, -{"learn":[0.4268328151],"iteration":458,"passed_time":97.9289344,"remaining_time":222.100263,"test":[0.519973192]}, -{"learn":[0.4267528954],"iteration":459,"passed_time":98.13978929,"remaining_time":221.8812627,"test":[0.5199794981]}, -{"learn":[0.4266029338],"iteration":460,"passed_time":98.38188989,"remaining_time":221.7327193,"test":[0.5199991347]}, -{"learn":[0.4264877026],"iteration":461,"passed_time":98.59261523,"remaining_time":221.5132784,"test":[0.5199552716]}, -{"learn":[0.4264385781],"iteration":462,"passed_time":98.79176102,"remaining_time":221.2679399,"test":[0.5199895958]}, -{"learn":[0.4262895672],"iteration":463,"passed_time":99.03382375,"remaining_time":221.1186237,"test":[0.5200350953]}, -{"learn":[0.4262548632],"iteration":464,"passed_time":99.24489525,"remaining_time":220.8999281,"test":[0.5200508604]}, -{"learn":[0.4262294822],"iteration":465,"passed_time":99.45460984,"remaining_time":220.6782545,"test":[0.5200206871]}, -{"learn":[0.4262004565],"iteration":466,"passed_time":99.71343138,"remaining_time":220.5652561,"test":[0.5200187713]}, -{"learn":[0.4261561917],"iteration":467,"passed_time":99.91106322,"remaining_time":220.3167035,"test":[0.5200414013]}, -{"learn":[0.4259361088],"iteration":468,"passed_time":100.1329093,"remaining_time":220.1215981,"test":[0.5200267537]}, -{"learn":[0.4257916671],"iteration":469,"passed_time":100.4019517,"remaining_time":220.029809,"test":[0.5199988553]}, -{"learn":[0.4257394525],"iteration":470,"passed_time":100.6309363,"remaining_time":219.8497526,"test":[0.5199964207]}, -{"learn":[0.4254953885],"iteration":471,"passed_time":100.8414026,"remaining_time":219.6291565,"test":[0.5200036048]}, -{"learn":[0.4254622691],"iteration":472,"passed_time":101.0430665,"remaining_time":219.3894912,"test":[0.52002392]}, -{"learn":[0.4254261917],"iteration":473,"passed_time":101.2489866,"remaining_time":219.1591987,"test":[0.5200445544]}, -{"learn":[0.425293133],"iteration":474,"passed_time":101.4541313,"remaining_time":218.9273359,"test":[0.5200434368]}, -{"learn":[0.4252466761],"iteration":475,"passed_time":101.6545452,"remaining_time":218.6854082,"test":[0.520013503]}, -{"learn":[0.4251952803],"iteration":476,"passed_time":101.8542196,"remaining_time":218.4420684,"test":[0.5200027667]}, -{"learn":[0.4251056414],"iteration":477,"passed_time":102.0584428,"remaining_time":218.2086371,"test":[0.5199612185]}, -{"learn":[0.4249928928],"iteration":478,"passed_time":102.2698046,"remaining_time":217.9905437,"test":[0.5199244597]}, -{"learn":[0.4248955683],"iteration":479,"passed_time":102.4687469,"remaining_time":217.7460872,"test":[0.5198940868]}, -{"learn":[0.4248150147],"iteration":480,"passed_time":102.6742863,"remaining_time":217.5157958,"test":[0.5198775234]}, -{"learn":[0.4247213349],"iteration":481,"passed_time":102.8754755,"remaining_time":217.2764191,"test":[0.5199081358]}, -{"learn":[0.4246937882],"iteration":482,"passed_time":103.0803202,"remaining_time":217.0448979,"test":[0.5199373113]}, -{"learn":[0.4245429286],"iteration":483,"passed_time":103.2855091,"remaining_time":216.8142092,"test":[0.5199887976]}, -{"learn":[0.4244326627],"iteration":484,"passed_time":103.4902911,"remaining_time":216.5827741,"test":[0.5199453735]}, -{"learn":[0.4241665983],"iteration":485,"passed_time":103.737895,"remaining_time":216.4407933,"test":[0.5199990948]}, -{"learn":[0.4240887386],"iteration":486,"passed_time":103.9437925,"remaining_time":216.211626,"test":[0.520009432]}, -{"learn":[0.4238527828],"iteration":487,"passed_time":104.1576785,"remaining_time":215.9991201,"test":[0.520004882]}, -{"learn":[0.4237342238],"iteration":488,"passed_time":104.3700745,"remaining_time":215.7835283,"test":[0.5199634535]}, -{"learn":[0.4235270295],"iteration":489,"passed_time":104.6361918,"remaining_time":215.678681,"test":[0.5199306859]}, -{"learn":[0.4233882397],"iteration":490,"passed_time":104.8377547,"remaining_time":215.4405183,"test":[0.5199287702]}, -{"learn":[0.4232716879],"iteration":491,"passed_time":105.0657953,"remaining_time":215.2567514,"test":[0.5199335995]}, -{"learn":[0.4232206883],"iteration":492,"passed_time":105.2885592,"remaining_time":215.0620265,"test":[0.5199494046]}, -{"learn":[0.4230846981],"iteration":493,"passed_time":105.4976254,"remaining_time":214.8392938,"test":[0.5199841279]}, -{"learn":[0.4230572306],"iteration":494,"passed_time":105.6953898,"remaining_time":214.5936702,"test":[0.5199897953]}, -{"learn":[0.4229158525],"iteration":495,"passed_time":105.9037182,"remaining_time":214.3696232,"test":[0.5199431783]}, -{"learn":[0.4228947502],"iteration":496,"passed_time":106.1030662,"remaining_time":214.1275158,"test":[0.5199535554]}, -{"learn":[0.4227387668],"iteration":497,"passed_time":106.3109693,"remaining_time":213.9027937,"test":[0.519960101]}, -{"learn":[0.4225079347],"iteration":498,"passed_time":106.5249324,"remaining_time":213.6902953,"test":[0.5199666066]}, -{"learn":[0.4224208312],"iteration":499,"passed_time":106.7307658,"remaining_time":213.4615316,"test":[0.5200086337]}, -{"learn":[0.422350842],"iteration":500,"passed_time":106.9351568,"remaining_time":213.2299833,"test":[0.5200445544]}, -{"learn":[0.4222371955],"iteration":501,"passed_time":107.1418548,"remaining_time":213.0031297,"test":[0.5200366119]}, -{"learn":[0.4222099658],"iteration":502,"passed_time":107.3408992,"remaining_time":212.7611858,"test":[0.5200776812]}, -{"learn":[0.4219659545],"iteration":503,"passed_time":107.5547729,"remaining_time":212.5487179,"test":[0.5201466089]}, -{"learn":[0.4219492892],"iteration":504,"passed_time":107.6161354,"remaining_time":212.035752,"test":[0.5201616157]}, -{"learn":[0.4219165924],"iteration":505,"passed_time":107.8884154,"remaining_time":211.9389029,"test":[0.5201815317]}, -{"learn":[0.4217989578],"iteration":506,"passed_time":108.0968609,"remaining_time":211.716337,"test":[0.5201858422]}, -{"learn":[0.4217040895],"iteration":507,"passed_time":108.3012585,"remaining_time":211.485922,"test":[0.5201896737]}, -{"learn":[0.4216258865],"iteration":508,"passed_time":108.5012808,"remaining_time":211.2470909,"test":[0.5201390656]}, -{"learn":[0.4215985247],"iteration":509,"passed_time":108.7934524,"remaining_time":211.1872899,"test":[0.5201187105]}, -{"learn":[0.4214814712],"iteration":510,"passed_time":109.0097017,"remaining_time":210.979638,"test":[0.5200924485]}, -{"learn":[0.4214580182],"iteration":511,"passed_time":109.211039,"remaining_time":210.7431767,"test":[0.5201084931]}, -{"learn":[0.4213440283],"iteration":512,"passed_time":109.42459,"remaining_time":210.5303515,"test":[0.5201131229]}, -{"learn":[0.4213161647],"iteration":513,"passed_time":109.6392029,"remaining_time":210.3195604,"test":[0.5201197482]}, -{"learn":[0.4211270355],"iteration":514,"passed_time":109.8527494,"remaining_time":210.1067148,"test":[0.5201213447]}, -{"learn":[0.4210071296],"iteration":515,"passed_time":110.0590225,"remaining_time":209.8799964,"test":[0.5201227416]}, -{"learn":[0.4209019082],"iteration":516,"passed_time":110.2633684,"remaining_time":209.6496928,"test":[0.5201209456]}, -{"learn":[0.4208812284],"iteration":517,"passed_time":110.4632604,"remaining_time":209.4110457,"test":[0.5201347551]}, -{"learn":[0.4208323416],"iteration":518,"passed_time":110.6625524,"remaining_time":209.1714141,"test":[0.5201500812]}, -{"learn":[0.4208045044],"iteration":519,"passed_time":110.8691569,"remaining_time":208.9457187,"test":[0.5201858821]}, -{"learn":[0.4207619827],"iteration":520,"passed_time":111.0725841,"remaining_time":208.7141264,"test":[0.5201573851]}, -{"learn":[0.420640677],"iteration":521,"passed_time":111.284209,"remaining_time":208.4980008,"test":[0.5201469681]}, -{"learn":[0.420474182],"iteration":522,"passed_time":111.4920569,"remaining_time":208.2748367,"test":[0.5201292472]}, -{"learn":[0.420325224],"iteration":523,"passed_time":111.6974951,"remaining_time":208.0472428,"test":[0.5200983954]}, -{"learn":[0.4201793032],"iteration":524,"passed_time":111.9339603,"remaining_time":207.8773548,"test":[0.5200661866]}, -{"learn":[0.4200712558],"iteration":525,"passed_time":112.1761348,"remaining_time":207.7177858,"test":[0.5201342362]}, -{"learn":[0.419971343],"iteration":526,"passed_time":112.3841889,"remaining_time":207.4949067,"test":[0.5200893753]}, -{"learn":[0.4199164081],"iteration":527,"passed_time":112.5984683,"remaining_time":207.2835439,"test":[0.520094045]}, -{"learn":[0.4198784555],"iteration":528,"passed_time":112.8145318,"remaining_time":207.075445,"test":[0.5200934064]}, -{"learn":[0.4197912464],"iteration":529,"passed_time":113.1179616,"remaining_time":207.0272128,"test":[0.5201197881]}, -{"learn":[0.4195674132],"iteration":530,"passed_time":113.3325958,"remaining_time":206.81598,"test":[0.5201802146]}, -{"learn":[0.419458415],"iteration":531,"passed_time":113.5373737,"remaining_time":206.5868004,"test":[0.5201709152]}, -{"learn":[0.4194369693],"iteration":532,"passed_time":113.7403124,"remaining_time":206.3543754,"test":[0.5201437751]}, -{"learn":[0.4192974399],"iteration":533,"passed_time":113.947412,"remaining_time":206.1295881,"test":[0.5201276907]}, -{"learn":[0.4190451621],"iteration":534,"passed_time":114.1611697,"remaining_time":205.9168762,"test":[0.5201376287]}, -{"learn":[0.4188749696],"iteration":535,"passed_time":114.3851502,"remaining_time":205.7225462,"test":[0.5201646889]}, -{"learn":[0.4186943976],"iteration":536,"passed_time":114.6283101,"remaining_time":205.5625002,"test":[0.5201266131]}, -{"learn":[0.4186515589],"iteration":537,"passed_time":114.8385925,"remaining_time":205.3433569,"test":[0.520132999]}, -{"learn":[0.4183546201],"iteration":538,"passed_time":115.0557676,"remaining_time":205.1365356,"test":[0.5201444137]}, -{"learn":[0.4182880908],"iteration":539,"passed_time":115.2617812,"remaining_time":204.9098333,"test":[0.5201345156]}, -{"learn":[0.4181779833],"iteration":540,"passed_time":115.4655734,"remaining_time":204.6792696,"test":[0.5201387063]}, -{"learn":[0.4180091378],"iteration":541,"passed_time":115.670835,"remaining_time":204.4514021,"test":[0.5200985151]}, -{"learn":[0.4179237774],"iteration":542,"passed_time":115.8723213,"remaining_time":204.2169641,"test":[0.5201492431]}, -{"learn":[0.4177213107],"iteration":543,"passed_time":116.1663767,"remaining_time":204.1453237,"test":[0.5202024455]}, -{"learn":[0.4175728017],"iteration":544,"passed_time":116.3979633,"remaining_time":203.9634035,"test":[0.5201879176]}, -{"learn":[0.4174015527],"iteration":545,"passed_time":116.6112695,"remaining_time":203.749361,"test":[0.5201683209]}, -{"learn":[0.4173581066],"iteration":546,"passed_time":116.8113132,"remaining_time":203.5122148,"test":[0.5201845251]}, -{"learn":[0.4171991917],"iteration":547,"passed_time":117.0815466,"remaining_time":203.3971394,"test":[0.520125735]}, -{"learn":[0.4171664156],"iteration":548,"passed_time":117.2866225,"remaining_time":203.1686303,"test":[0.5201832879]}, -{"learn":[0.4170447137],"iteration":549,"passed_time":117.4976083,"remaining_time":202.9504144,"test":[0.5202263128]}, -{"learn":[0.4168904471],"iteration":550,"passed_time":117.7520509,"remaining_time":202.8070713,"test":[0.5202586813]}, -{"learn":[0.4167184586],"iteration":551,"passed_time":117.9595524,"remaining_time":202.5827096,"test":[0.52025473]}, -{"learn":[0.4165827325],"iteration":552,"passed_time":118.1717841,"remaining_time":202.3665092,"test":[0.5202184103]}, -{"learn":[0.4165529409],"iteration":553,"passed_time":118.3717915,"remaining_time":202.1294491,"test":[0.5202456301]}, -{"learn":[0.416382273],"iteration":554,"passed_time":118.6059192,"remaining_time":201.9506192,"test":[0.5202739675]}, -{"learn":[0.4163037795],"iteration":555,"passed_time":118.809931,"remaining_time":201.7204584,"test":[0.5202816306]}, -{"learn":[0.416267438],"iteration":556,"passed_time":119.0252296,"remaining_time":201.5095,"test":[0.5202893735]}, -{"learn":[0.4161516258],"iteration":557,"passed_time":119.2365346,"remaining_time":201.2917842,"test":[0.5203027838]}, -{"learn":[0.4159738533],"iteration":558,"passed_time":119.4472328,"remaining_time":201.0730699,"test":[0.5203118837]}, -{"learn":[0.4158370443],"iteration":559,"passed_time":119.6871283,"remaining_time":200.9033939,"test":[0.5203420172]}, -{"learn":[0.415724375],"iteration":560,"passed_time":119.8992162,"remaining_time":200.6869233,"test":[0.5203212231]}, -{"learn":[0.4155583819],"iteration":561,"passed_time":120.1138361,"remaining_time":200.4746944,"test":[0.5203345537]}, -{"learn":[0.4154293906],"iteration":562,"passed_time":120.3847497,"remaining_time":200.3561464,"test":[0.5202938835]}, -{"learn":[0.4152592773],"iteration":563,"passed_time":120.5946552,"remaining_time":200.1358107,"test":[0.5202580427]}, -{"learn":[0.4150933898],"iteration":564,"passed_time":120.8071218,"remaining_time":199.9197502,"test":[0.5202353329]}, -{"learn":[0.4149931865],"iteration":565,"passed_time":121.0132633,"remaining_time":199.6932649,"test":[0.5202075941]}, -{"learn":[0.4148317889],"iteration":566,"passed_time":121.2958673,"remaining_time":199.5926705,"test":[0.520212663]}, -{"learn":[0.4147933609],"iteration":567,"passed_time":121.5005321,"remaining_time":199.3635492,"test":[0.5202100288]}, -{"learn":[0.414666324],"iteration":568,"passed_time":121.7158,"remaining_time":199.1518625,"test":[0.5202300645]}, -{"learn":[0.4145690258],"iteration":569,"passed_time":121.9170748,"remaining_time":198.9173326,"test":[0.5202381666]}, -{"learn":[0.4143404915],"iteration":570,"passed_time":122.1263912,"remaining_time":198.6960025,"test":[0.5202658654]}, -{"learn":[0.4142584061],"iteration":571,"passed_time":122.3277873,"remaining_time":198.4618648,"test":[0.5202797946]}, -{"learn":[0.4141421713],"iteration":572,"passed_time":122.5479695,"remaining_time":198.2582333,"test":[0.5202670229]}, -{"learn":[0.4140006083],"iteration":573,"passed_time":122.7579728,"remaining_time":198.0381234,"test":[0.5202421977]}, -{"learn":[0.4138716698],"iteration":574,"passed_time":122.9619189,"remaining_time":197.8083043,"test":[0.5202740473]}, -{"learn":[0.4138337964],"iteration":575,"passed_time":123.1624506,"remaining_time":197.5730979,"test":[0.5203150368]}, -{"learn":[0.4138146749],"iteration":576,"passed_time":123.3591426,"remaining_time":197.3318693,"test":[0.5202987527]}, -{"learn":[0.4136360044],"iteration":577,"passed_time":123.5659082,"remaining_time":197.1068639,"test":[0.5203086908]}, -{"learn":[0.4135483463],"iteration":578,"passed_time":123.7686269,"remaining_time":196.8754842,"test":[0.5203692769]}, -{"learn":[0.4134781987],"iteration":579,"passed_time":123.9719266,"remaining_time":196.645125,"test":[0.520348882]}, -{"learn":[0.4133906991],"iteration":580,"passed_time":124.1918632,"remaining_time":196.4411744,"test":[0.5203541504]}, -{"learn":[0.4132962269],"iteration":581,"passed_time":124.413224,"remaining_time":196.2394151,"test":[0.5203645673]}, -{"learn":[0.4132042638],"iteration":582,"passed_time":124.6537621,"remaining_time":196.0677528,"test":[0.5203621327]}, -{"learn":[0.4130792342],"iteration":583,"passed_time":124.9033079,"remaining_time":195.9099829,"test":[0.5203313607]}, -{"learn":[0.413046643],"iteration":584,"passed_time":125.1462401,"remaining_time":195.741555,"test":[0.5203426957]}, -{"learn":[0.4130256198],"iteration":585,"passed_time":125.4150799,"remaining_time":195.6132817,"test":[0.5203563854]}, -{"learn":[0.4130014009],"iteration":586,"passed_time":125.6304236,"remaining_time":195.4013233,"test":[0.5203516758]}, -{"learn":[0.4129758087],"iteration":587,"passed_time":125.8336925,"remaining_time":195.1706252,"test":[0.5203908293]}, -{"learn":[0.4127330124],"iteration":588,"passed_time":126.0495983,"remaining_time":194.9595654,"test":[0.5203867184]}, -{"learn":[0.4126291379],"iteration":589,"passed_time":126.2552186,"remaining_time":194.7326252,"test":[0.5204073129]}, -{"learn":[0.4125800663],"iteration":590,"passed_time":126.4537761,"remaining_time":194.4948943,"test":[0.5204325372]}, -{"learn":[0.4123417334],"iteration":591,"passed_time":126.6894448,"remaining_time":194.314216,"test":[0.5203874368]}, -{"learn":[0.4122409754],"iteration":592,"passed_time":126.9019706,"remaining_time":194.0979551,"test":[0.5203395426]}, -{"learn":[0.411888283],"iteration":593,"passed_time":127.1257066,"remaining_time":193.898805,"test":[0.5203482035]}, -{"learn":[0.4117402229],"iteration":594,"passed_time":127.3315584,"remaining_time":193.6723703,"test":[0.5203930245]}, -{"learn":[0.411514805],"iteration":595,"passed_time":127.54374,"remaining_time":193.4556056,"test":[0.5204131799]}, -{"learn":[0.4114420427],"iteration":596,"passed_time":127.7515708,"remaining_time":193.2322754,"test":[0.5204463067]}, -{"learn":[0.411346699],"iteration":597,"passed_time":127.9574735,"remaining_time":193.0060888,"test":[0.520445748]}, -{"learn":[0.4113182543],"iteration":598,"passed_time":128.1568067,"remaining_time":192.7700882,"test":[0.5204443112]}, -{"learn":[0.4112403419],"iteration":599,"passed_time":128.363984,"remaining_time":192.545976,"test":[0.5204419164]}, -{"learn":[0.4112103918],"iteration":600,"passed_time":128.5979505,"remaining_time":192.3619926,"test":[0.5204277078]}, -{"learn":[0.4110535369],"iteration":601,"passed_time":128.8385145,"remaining_time":192.1876844,"test":[0.5204198851]}, -{"learn":[0.4110251451],"iteration":602,"passed_time":129.0385269,"remaining_time":191.9528336,"test":[0.5204318188]}, -{"learn":[0.4109839703],"iteration":603,"passed_time":129.240268,"remaining_time":191.7206624,"test":[0.5204229583]}, -{"learn":[0.4109038129],"iteration":604,"passed_time":129.4563031,"remaining_time":191.5097376,"test":[0.5204171711]}, -{"learn":[0.4108756324],"iteration":605,"passed_time":129.7118122,"remaining_time":191.3570299,"test":[0.5204160137]}, -{"learn":[0.4108519417],"iteration":606,"passed_time":129.9025516,"remaining_time":191.1086962,"test":[0.5203927052]}, -{"learn":[0.4107468524],"iteration":607,"passed_time":130.1089564,"remaining_time":190.8835347,"test":[0.5204610342]}, -{"learn":[0.4106109149],"iteration":608,"passed_time":130.3174322,"remaining_time":190.6614649,"test":[0.5204563645]}, -{"learn":[0.4105870922],"iteration":609,"passed_time":130.5203294,"remaining_time":190.4313003,"test":[0.5204928439]}, -{"learn":[0.4105503545],"iteration":610,"passed_time":130.7213536,"remaining_time":190.1984998,"test":[0.5204986311]}, -{"learn":[0.4105113191],"iteration":611,"passed_time":130.922785,"remaining_time":189.966394,"test":[0.5205117621]}, -{"learn":[0.4103531436],"iteration":612,"passed_time":131.1411842,"remaining_time":189.7589403,"test":[0.5205105249]}, -{"learn":[0.4102633462],"iteration":613,"passed_time":131.3547496,"remaining_time":189.5444758,"test":[0.5205219396]}, -{"learn":[0.4102406856],"iteration":614,"passed_time":131.5564595,"remaining_time":189.3129539,"test":[0.5205329154]}, -{"learn":[0.4101803364],"iteration":615,"passed_time":131.7689794,"remaining_time":189.0970419,"test":[0.5205818872]}, -{"learn":[0.4100715759],"iteration":616,"passed_time":131.9813069,"remaining_time":188.8808655,"test":[0.5205612129]}, -{"learn":[0.4100329895],"iteration":617,"passed_time":132.1833791,"remaining_time":188.6500653,"test":[0.5205876744]}, -{"learn":[0.4100085065],"iteration":618,"passed_time":132.3851236,"remaining_time":188.4188916,"test":[0.5205704724]}, -{"learn":[0.409977051],"iteration":619,"passed_time":132.5839001,"remaining_time":188.1836001,"test":[0.5205443302]}, -{"learn":[0.4098961012],"iteration":620,"passed_time":132.8760272,"remaining_time":188.0805603,"test":[0.5205513147]}, -{"learn":[0.4098370462],"iteration":621,"passed_time":133.0700912,"remaining_time":187.8384888,"test":[0.520565244]}, -{"learn":[0.4097284442],"iteration":622,"passed_time":133.2784828,"remaining_time":187.6167406,"test":[0.5205961357]}, -{"learn":[0.4096754373],"iteration":623,"passed_time":133.4824724,"remaining_time":187.3888555,"test":[0.5206138167]}, -{"learn":[0.409616937],"iteration":624,"passed_time":133.7383298,"remaining_time":187.2336617,"test":[0.5206345708]}, -{"learn":[0.4095200614],"iteration":625,"passed_time":133.943276,"remaining_time":187.0070658,"test":[0.5206739239]}, -{"learn":[0.4094847499],"iteration":626,"passed_time":134.1405844,"remaining_time":186.7699045,"test":[0.5206234354]}, -{"learn":[0.4093862897],"iteration":627,"passed_time":134.341939,"remaining_time":186.5384886,"test":[0.5205827253]}, -{"learn":[0.4093056041],"iteration":628,"passed_time":134.5469012,"remaining_time":186.3121637,"test":[0.5205668404]}, -{"learn":[0.4092387579],"iteration":629,"passed_time":134.7537591,"remaining_time":186.0885244,"test":[0.5206188056]}, -{"learn":[0.4092014127],"iteration":630,"passed_time":134.959857,"remaining_time":185.8638918,"test":[0.5206294222]}, -{"learn":[0.4090089558],"iteration":631,"passed_time":135.1758247,"remaining_time":185.6528732,"test":[0.5206458658]}, -{"learn":[0.408898188],"iteration":632,"passed_time":135.3920329,"remaining_time":185.4421682,"test":[0.5205848008]}, -{"learn":[0.4088724901],"iteration":633,"passed_time":135.5911911,"remaining_time":185.208157,"test":[0.520566601]}, -{"learn":[0.4087240339],"iteration":634,"passed_time":135.8041283,"remaining_time":184.9930252,"test":[0.5205558248]}, -{"learn":[0.4086902278],"iteration":635,"passed_time":136.0044999,"remaining_time":184.76083,"test":[0.5205707119]}, -{"learn":[0.4085883078],"iteration":636,"passed_time":136.2189753,"remaining_time":184.5478425,"test":[0.5205835236]}, -{"learn":[0.4084600295],"iteration":637,"passed_time":136.4270512,"remaining_time":184.326204,"test":[0.520596016]}, -{"learn":[0.408364501],"iteration":638,"passed_time":136.634625,"remaining_time":184.1039313,"test":[0.5206205218]}, -{"learn":[0.4082498772],"iteration":639,"passed_time":136.8461475,"remaining_time":183.8870107,"test":[0.5206716489]}, -{"learn":[0.4081061486],"iteration":640,"passed_time":137.1321046,"remaining_time":183.7698562,"test":[0.5207238935]}, -{"learn":[0.4080852575],"iteration":641,"passed_time":137.3441241,"remaining_time":183.5533621,"test":[0.5207303193]}, -{"learn":[0.4080110161],"iteration":642,"passed_time":137.5443016,"remaining_time":183.3210987,"test":[0.5207254899]}, -{"learn":[0.407881972],"iteration":643,"passed_time":137.8123084,"remaining_time":183.1790932,"test":[0.5207040972]}, -{"learn":[0.4077751659],"iteration":644,"passed_time":138.0433703,"remaining_time":182.9877235,"test":[0.5206793519]}, -{"learn":[0.4075843728],"iteration":645,"passed_time":138.2604396,"remaining_time":182.7777329,"test":[0.5206736844]}, -{"learn":[0.4073488924],"iteration":646,"passed_time":138.4718852,"remaining_time":182.5603062,"test":[0.520633573]}, -{"learn":[0.4072274546],"iteration":647,"passed_time":138.6860248,"remaining_time":182.3464401,"test":[0.5206248722]}, -{"learn":[0.4070840957],"iteration":648,"passed_time":138.8977582,"remaining_time":182.1294179,"test":[0.5205260107]}, -{"learn":[0.4068929857],"iteration":649,"passed_time":139.1168822,"remaining_time":181.9220767,"test":[0.5205286847]}, -{"learn":[0.4067916731],"iteration":650,"passed_time":139.3385107,"remaining_time":181.7179655,"test":[0.520519505]}, -{"learn":[0.4067024303],"iteration":651,"passed_time":139.5462018,"remaining_time":181.4956735,"test":[0.5205392215]}, -{"learn":[0.4066307245],"iteration":652,"passed_time":139.7483863,"remaining_time":181.2662837,"test":[0.5205486407]}, -{"learn":[0.4065174741],"iteration":653,"passed_time":139.9510216,"remaining_time":181.03756,"test":[0.5205624501]}, -{"learn":[0.4064330117],"iteration":654,"passed_time":140.1527866,"remaining_time":180.8077934,"test":[0.5205954572]}, -{"learn":[0.4063061333],"iteration":655,"passed_time":140.3629459,"remaining_time":180.5889121,"test":[0.52054441]}, -{"learn":[0.4061701695],"iteration":656,"passed_time":140.5671645,"remaining_time":180.3624348,"test":[0.5205577406]}, -{"learn":[0.4061058323],"iteration":657,"passed_time":140.7772042,"remaining_time":180.143474,"test":[0.5205856788]}, -{"learn":[0.4060142125],"iteration":658,"passed_time":140.9840472,"remaining_time":179.9204608,"test":[0.5205488801]}, -{"learn":[0.405792228],"iteration":659,"passed_time":141.2744299,"remaining_time":179.8038199,"test":[0.5205664014]}, -{"learn":[0.4056412892],"iteration":660,"passed_time":141.4775814,"remaining_time":179.5759316,"test":[0.5205728272]}, -{"learn":[0.4055080985],"iteration":661,"passed_time":141.6866521,"remaining_time":179.355611,"test":[0.5205408179]}, -{"learn":[0.4054061256],"iteration":662,"passed_time":141.9395327,"remaining_time":179.1906317,"test":[0.5205439311]}, -{"learn":[0.405253787],"iteration":663,"passed_time":142.2047422,"remaining_time":179.0409104,"test":[0.5205122411]}, -{"learn":[0.4050393825],"iteration":664,"passed_time":142.4183266,"remaining_time":178.8260191,"test":[0.5205037798]}, -{"learn":[0.4048894737],"iteration":665,"passed_time":142.6288847,"remaining_time":178.6073421,"test":[0.5205251326]}, -{"learn":[0.4047538532],"iteration":666,"passed_time":142.8445386,"remaining_time":178.3950534,"test":[0.5205099661]}, -{"learn":[0.4046765482],"iteration":667,"passed_time":143.0525812,"remaining_time":178.1732748,"test":[0.5205040592]}, -{"learn":[0.4045781408],"iteration":668,"passed_time":143.2615941,"remaining_time":177.9527424,"test":[0.5205219796]}, -{"learn":[0.4043456712],"iteration":669,"passed_time":143.4832231,"remaining_time":177.7478734,"test":[0.520555705]}, -{"learn":[0.4043171737],"iteration":670,"passed_time":143.6782986,"remaining_time":177.5101483,"test":[0.520546685]}, -{"learn":[0.4041254563],"iteration":671,"passed_time":143.8912045,"remaining_time":177.2945199,"test":[0.5205513946]}, -{"learn":[0.4039945105],"iteration":672,"passed_time":144.1015465,"remaining_time":177.0757488,"test":[0.5205479622]}, -{"learn":[0.4038426473],"iteration":673,"passed_time":144.3107944,"remaining_time":176.8556619,"test":[0.5205465253]}, -{"learn":[0.4036126867],"iteration":674,"passed_time":144.5235368,"remaining_time":176.6398783,"test":[0.5205144362]}, -{"learn":[0.4035745756],"iteration":675,"passed_time":144.7226266,"remaining_time":176.407462,"test":[0.5205578204]}, -{"learn":[0.4035122721],"iteration":676,"passed_time":144.924096,"remaining_time":176.178037,"test":[0.5205761399]}, -{"learn":[0.4034046473],"iteration":677,"passed_time":145.1536714,"remaining_time":175.9827697,"test":[0.5206204819]}, -{"learn":[0.4033447471],"iteration":678,"passed_time":145.4310821,"remaining_time":175.8452406,"test":[0.5206112224]}, -{"learn":[0.4031923028],"iteration":679,"passed_time":145.6450204,"remaining_time":175.6307599,"test":[0.5205604546]}, -{"learn":[0.403123687],"iteration":680,"passed_time":145.8500597,"remaining_time":175.4055784,"test":[0.5205915459]}, -{"learn":[0.4030560749],"iteration":681,"passed_time":146.1174814,"remaining_time":175.2552782,"test":[0.5206318169]}, -{"learn":[0.4029534681],"iteration":682,"passed_time":146.3592207,"remaining_time":175.0739141,"test":[0.5206347704]}, -{"learn":[0.4028241863],"iteration":683,"passed_time":146.5644562,"remaining_time":174.8488249,"test":[0.5206549258]}, -{"learn":[0.4027304008],"iteration":684,"passed_time":146.7705523,"remaining_time":174.6248177,"test":[0.520700585]}, -{"learn":[0.4026478401],"iteration":685,"passed_time":146.9754218,"remaining_time":174.3994072,"test":[0.5206742831]}, -{"learn":[0.4025439128],"iteration":686,"passed_time":147.1889304,"remaining_time":174.1842801,"test":[0.5206455466]}, -{"learn":[0.4023881671],"iteration":687,"passed_time":147.4002585,"remaining_time":173.9665841,"test":[0.5206472628]}, -{"learn":[0.4022772937],"iteration":688,"passed_time":147.6190541,"remaining_time":173.7576965,"test":[0.5206453869]}, -{"learn":[0.4021326143],"iteration":689,"passed_time":147.8236458,"remaining_time":173.532106,"test":[0.5206270275]}, -{"learn":[0.401997522],"iteration":690,"passed_time":148.0349813,"remaining_time":173.3144716,"test":[0.5206409567]}, -{"learn":[0.401858204],"iteration":691,"passed_time":148.2487934,"remaining_time":173.0997472,"test":[0.5207035783]}, -{"learn":[0.4017396714],"iteration":692,"passed_time":148.4546944,"remaining_time":172.875813,"test":[0.5206809084]}, -{"learn":[0.4016806693],"iteration":693,"passed_time":148.656011,"remaining_time":172.6466064,"test":[0.5206687752]}, -{"learn":[0.4015834768],"iteration":694,"passed_time":148.8659327,"remaining_time":172.4274472,"test":[0.5206365265]}, -{"learn":[0.4014522141],"iteration":695,"passed_time":149.0756162,"remaining_time":172.2080394,"test":[0.5206251516]}, -{"learn":[0.401294963],"iteration":696,"passed_time":149.2823665,"remaining_time":171.9852803,"test":[0.5205623304]}, -{"learn":[0.4012343498],"iteration":697,"passed_time":149.5276849,"remaining_time":171.8068816,"test":[0.5205912665]}, -{"learn":[0.4011175603],"iteration":698,"passed_time":149.7368052,"remaining_time":171.5868111,"test":[0.5205262501]}, -{"learn":[0.4009536537],"iteration":699,"passed_time":149.9469191,"remaining_time":171.3679076,"test":[0.5204902497]}, -{"learn":[0.400831133],"iteration":700,"passed_time":150.1581971,"remaining_time":171.1503559,"test":[0.5204807506]}, -{"learn":[0.400691683],"iteration":701,"passed_time":150.4308777,"remaining_time":171.0026216,"test":[0.520533115]}, -{"learn":[0.4005758707],"iteration":702,"passed_time":150.6345678,"remaining_time":170.7763165,"test":[0.5205052166]}, -{"learn":[0.4004488866],"iteration":703,"passed_time":150.8414358,"remaining_time":170.5536688,"test":[0.5204971544]}, -{"learn":[0.400335425],"iteration":704,"passed_time":151.1120062,"remaining_time":170.4029006,"test":[0.5204580408]}, -{"learn":[0.4002290151],"iteration":705,"passed_time":151.317379,"remaining_time":170.1784688,"test":[0.520445748]}, -{"learn":[0.4000014843],"iteration":706,"passed_time":151.5303342,"remaining_time":169.9625954,"test":[0.5204842629]}, -{"learn":[0.3999130339],"iteration":707,"passed_time":151.7375751,"remaining_time":169.7403383,"test":[0.5205302014]}, -{"learn":[0.3998857777],"iteration":708,"passed_time":151.9349283,"remaining_time":169.5070921,"test":[0.5204859791]}, -{"learn":[0.3998205954],"iteration":709,"passed_time":152.1417812,"remaining_time":169.2845171,"test":[0.5204877751]}, -{"learn":[0.3997079524],"iteration":710,"passed_time":152.3518026,"remaining_time":169.0655025,"test":[0.5204985513]}, -{"learn":[0.3996026518],"iteration":711,"passed_time":152.5547243,"remaining_time":168.8386555,"test":[0.5204836243]}, -{"learn":[0.3995276181],"iteration":712,"passed_time":152.7623295,"remaining_time":168.6170453,"test":[0.5205089683]}, -{"learn":[0.3993842328],"iteration":713,"passed_time":152.968602,"remaining_time":168.3940072,"test":[0.5205148353]}, -{"learn":[0.3992326337],"iteration":714,"passed_time":153.1842016,"remaining_time":168.1812563,"test":[0.52053084]}, -{"learn":[0.3991446586],"iteration":715,"passed_time":153.3858422,"remaining_time":167.9532127,"test":[0.5205283655]}, -{"learn":[0.3990109926],"iteration":716,"passed_time":153.6762058,"remaining_time":167.8221327,"test":[0.5205759004]}, -{"learn":[0.3988556695],"iteration":717,"passed_time":153.889745,"remaining_time":167.6069368,"test":[0.5206002067]}, -{"learn":[0.398705523],"iteration":718,"passed_time":154.1041184,"remaining_time":167.3926515,"test":[0.5205989295]}, -{"learn":[0.3985037957],"iteration":719,"passed_time":154.3892361,"remaining_time":167.2550057,"test":[0.5205526318]}, -{"learn":[0.3984158735],"iteration":720,"passed_time":154.6483445,"remaining_time":167.0888494,"test":[0.5205573414]}, -{"learn":[0.398388723],"iteration":721,"passed_time":154.8724854,"remaining_time":166.8847557,"test":[0.5205696343]}, -{"learn":[0.3981767219],"iteration":722,"passed_time":155.0861535,"remaining_time":166.6693517,"test":[0.5205459666]}, -{"learn":[0.3981073138],"iteration":723,"passed_time":155.3405498,"remaining_time":166.4976058,"test":[0.5205692352]}, -{"learn":[0.3980124455],"iteration":724,"passed_time":155.5589473,"remaining_time":166.2871506,"test":[0.5205620909]}, -{"learn":[0.3979056658],"iteration":725,"passed_time":155.788684,"remaining_time":166.0887623,"test":[0.5205626497]}, -{"learn":[0.3977599035],"iteration":726,"passed_time":155.9964344,"remaining_time":165.8669103,"test":[0.5206092667]}, -{"learn":[0.397652173],"iteration":727,"passed_time":156.2239263,"remaining_time":165.6660317,"test":[0.5205688759]}, -{"learn":[0.3974028796],"iteration":728,"passed_time":156.4391424,"remaining_time":165.4520971,"test":[0.52059873]}, -{"learn":[0.3972820229],"iteration":729,"passed_time":156.6733138,"remaining_time":165.2581529,"test":[0.5205825258]}, -{"learn":[0.3971923311],"iteration":730,"passed_time":156.8834726,"remaining_time":165.0388378,"test":[0.5206172092]}, -{"learn":[0.3970427128],"iteration":731,"passed_time":157.113335,"remaining_time":164.8402203,"test":[0.5206132978]}, -{"learn":[0.3969815978],"iteration":732,"passed_time":157.3162365,"remaining_time":164.6133061,"test":[0.5206499369]}, -{"learn":[0.3969509346],"iteration":733,"passed_time":157.5164219,"remaining_time":164.3836229,"test":[0.5206802698]}, -{"learn":[0.3968253767],"iteration":734,"passed_time":157.7803279,"remaining_time":164.2203413,"test":[0.5206485399]}, -{"learn":[0.3966863492],"iteration":735,"passed_time":157.9916056,"remaining_time":164.0021558,"test":[0.5206590767]}, -{"learn":[0.3965898962],"iteration":736,"passed_time":158.2004797,"remaining_time":163.7815007,"test":[0.520645347]}, -{"learn":[0.396401665],"iteration":737,"passed_time":158.4111317,"remaining_time":163.5627133,"test":[0.5206840216]}, -{"learn":[0.3963686777],"iteration":738,"passed_time":158.6355354,"remaining_time":163.3581088,"test":[0.5207120396]}, -{"learn":[0.3962630073],"iteration":739,"passed_time":158.8421673,"remaining_time":163.1351988,"test":[0.5206870548]}, -{"learn":[0.3962051144],"iteration":740,"passed_time":159.0443066,"remaining_time":162.9077311,"test":[0.5206786734]}, -{"learn":[0.3960346314],"iteration":741,"passed_time":159.2676449,"remaining_time":162.7019876,"test":[0.5207279645]}, -{"learn":[0.3959875934],"iteration":742,"passed_time":159.4687114,"remaining_time":162.4735054,"test":[0.5207478006]}, -{"learn":[0.39590255],"iteration":743,"passed_time":159.6735676,"remaining_time":162.2489477,"test":[0.5207316763]}, -{"learn":[0.3957626245],"iteration":744,"passed_time":159.8792149,"remaining_time":162.0252446,"test":[0.5207505546]}, -{"learn":[0.3957432652],"iteration":745,"passed_time":160.0757106,"remaining_time":161.7923402,"test":[0.5207410955]}, -{"learn":[0.395606377],"iteration":746,"passed_time":160.2904546,"remaining_time":161.5779281,"test":[0.5207485191]}, -{"learn":[0.3955399533],"iteration":747,"passed_time":160.5019264,"remaining_time":161.3602255,"test":[0.5207350289]}, -{"learn":[0.3954245109],"iteration":748,"passed_time":160.7425722,"remaining_time":161.1717913,"test":[0.5207113611]}, -{"learn":[0.3952730174],"iteration":749,"passed_time":160.9577255,"remaining_time":160.9577255,"test":[0.5206989885]}, -{"learn":[0.3951517645],"iteration":750,"passed_time":161.1610184,"remaining_time":160.7318279,"test":[0.5207013433]}, -{"learn":[0.3950575564],"iteration":751,"passed_time":161.368223,"remaining_time":160.5098814,"test":[0.5207391797]}, -{"learn":[0.3949702417],"iteration":752,"passed_time":161.5721311,"remaining_time":160.2847037,"test":[0.5207498361]}, -{"learn":[0.3949202721],"iteration":753,"passed_time":161.8738806,"remaining_time":160.1563858,"test":[0.5207558628]}, -{"learn":[0.3946860857],"iteration":754,"passed_time":162.0873157,"remaining_time":159.9404639,"test":[0.5207812867]}, -{"learn":[0.3945830828],"iteration":755,"passed_time":162.3012704,"remaining_time":159.7250598,"test":[0.5207514725]}, -{"learn":[0.3944809779],"iteration":756,"passed_time":162.537904,"remaining_time":159.531919,"test":[0.5207433305]}, -{"learn":[0.394384789],"iteration":757,"passed_time":162.7919169,"remaining_time":159.3556759,"test":[0.5207252505]}, -{"learn":[0.3942265607],"iteration":758,"passed_time":163.0025629,"remaining_time":159.1368894,"test":[0.520707809]}, -{"learn":[0.3941514214],"iteration":759,"passed_time":163.2218351,"remaining_time":158.9265237,"test":[0.5207047358]}, -{"learn":[0.3940130278],"iteration":760,"passed_time":163.4297548,"remaining_time":158.7051101,"test":[0.520660713]}, -{"learn":[0.3938855947],"iteration":761,"passed_time":163.6387364,"remaining_time":158.4847605,"test":[0.5206760392]}, -{"learn":[0.3937863686],"iteration":762,"passed_time":163.8610875,"remaining_time":158.2773545,"test":[0.5206904474]}, -{"learn":[0.3936499558],"iteration":763,"passed_time":164.0728165,"remaining_time":158.0596766,"test":[0.5207452064]}, -{"learn":[0.3934777033],"iteration":764,"passed_time":164.2886435,"remaining_time":157.8459516,"test":[0.5207463239]}, -{"learn":[0.3933875097],"iteration":765,"passed_time":164.4983421,"remaining_time":157.6263487,"test":[0.5207513927]}, -{"learn":[0.3933341331],"iteration":766,"passed_time":164.7051187,"remaining_time":157.4039791,"test":[0.5207789718]}, -{"learn":[0.3930968566],"iteration":767,"passed_time":164.9379188,"remaining_time":157.2064539,"test":[0.520758058]}, -{"learn":[0.3929859568],"iteration":768,"passed_time":165.1431858,"remaining_time":156.9826643,"test":[0.5207602531]}, -{"learn":[0.3928818447],"iteration":769,"passed_time":165.352363,"remaining_time":156.7626298,"test":[0.5207775349]}, -{"learn":[0.3927987029],"iteration":770,"passed_time":165.5596502,"remaining_time":156.5408365,"test":[0.5207818454]}, -{"learn":[0.3926696851],"iteration":771,"passed_time":165.7703406,"remaining_time":156.3222901,"test":[0.5208001649]}, -{"learn":[0.3925721757],"iteration":772,"passed_time":166.0535621,"remaining_time":156.1719789,"test":[0.5208457842]}, -{"learn":[0.3924765679],"iteration":773,"passed_time":166.2718658,"remaining_time":155.9604323,"test":[0.5207989277]}, -{"learn":[0.3923689431],"iteration":774,"passed_time":166.4811256,"remaining_time":155.7404078,"test":[0.5208158902]}, -{"learn":[0.3923019384],"iteration":775,"passed_time":166.6945278,"remaining_time":155.5242759,"test":[0.5208247905]}, -{"learn":[0.3922111373],"iteration":776,"passed_time":166.9700335,"remaining_time":155.3659385,"test":[0.5208451456]}, -{"learn":[0.3921330136],"iteration":777,"passed_time":167.1702879,"remaining_time":155.1374651,"test":[0.5208688532]}, -{"learn":[0.3920802973],"iteration":778,"passed_time":167.3720125,"remaining_time":154.9104249,"test":[0.5208460635]}, -{"learn":[0.3919959141],"iteration":779,"passed_time":167.5806596,"remaining_time":154.6898397,"test":[0.5208294203]}, -{"learn":[0.3918737368],"iteration":780,"passed_time":167.7958711,"remaining_time":154.4753282,"test":[0.520844068]}, -{"learn":[0.3917405726],"iteration":781,"passed_time":168.0028897,"remaining_time":154.2532926,"test":[0.5208552832]}, -{"learn":[0.3916381507],"iteration":782,"passed_time":168.2097601,"remaining_time":154.0311596,"test":[0.5208543253]}, -{"learn":[0.3914880042],"iteration":783,"passed_time":168.4262432,"remaining_time":153.8178446,"test":[0.5208273449]}, -{"learn":[0.3913821225],"iteration":784,"passed_time":168.6366234,"remaining_time":153.5989627,"test":[0.5208089455]}, -{"learn":[0.3912784065],"iteration":785,"passed_time":168.8453287,"remaining_time":153.378581,"test":[0.5208142139]}, -{"learn":[0.3911938385],"iteration":786,"passed_time":169.0536139,"remaining_time":153.1578484,"test":[0.5208445868]}, -{"learn":[0.3911118851],"iteration":787,"passed_time":169.2557427,"remaining_time":152.9315848,"test":[0.5208542455]}, -{"learn":[0.39095849],"iteration":788,"passed_time":169.4670504,"remaining_time":152.7136538,"test":[0.5208386799]}, -{"learn":[0.3908507596],"iteration":789,"passed_time":169.6744478,"remaining_time":152.4922252,"test":[0.5208122582]}, -{"learn":[0.3907657162],"iteration":790,"passed_time":169.8838009,"remaining_time":152.2725851,"test":[0.5207883111]}, -{"learn":[0.3905791489],"iteration":791,"passed_time":170.173842,"remaining_time":152.1251012,"test":[0.5207503151]}, -{"learn":[0.3904356051],"iteration":792,"passed_time":170.4241137,"remaining_time":151.9418012,"test":[0.5208063114]}, -{"learn":[0.3903660385],"iteration":793,"passed_time":170.6396806,"remaining_time":151.7274742,"test":[0.5208297795]}, -{"learn":[0.3902386318],"iteration":794,"passed_time":170.8518649,"remaining_time":151.5101443,"test":[0.5208032382]}, -{"learn":[0.3901565729],"iteration":795,"passed_time":171.1120383,"remaining_time":151.33527,"test":[0.5207970518]}, -{"learn":[0.3899930624],"iteration":796,"passed_time":171.3290316,"remaining_time":151.1220944,"test":[0.5208036772]}, -{"learn":[0.3899004654],"iteration":797,"passed_time":171.5407289,"remaining_time":150.9042503,"test":[0.5207925019]}, -{"learn":[0.3897640262],"iteration":798,"passed_time":171.7505316,"remaining_time":150.6847593,"test":[0.5207576589]}, -{"learn":[0.389706054],"iteration":799,"passed_time":171.951312,"remaining_time":150.457398,"test":[0.52075263]}, -{"learn":[0.3896595971],"iteration":800,"passed_time":172.1520568,"remaining_time":150.230072,"test":[0.5207645636]}, -{"learn":[0.3895810508],"iteration":801,"passed_time":172.3510025,"remaining_time":150.0012466,"test":[0.5207865949]}, -{"learn":[0.3895170041],"iteration":802,"passed_time":172.5514773,"remaining_time":149.7738227,"test":[0.5207816858]}, -{"learn":[0.3893874317],"iteration":803,"passed_time":172.7600147,"remaining_time":149.5534455,"test":[0.5207970119]}, -{"learn":[0.389266707],"iteration":804,"passed_time":172.9684975,"remaining_time":149.3330507,"test":[0.5207964531]}, -{"learn":[0.3891872363],"iteration":805,"passed_time":173.1754567,"remaining_time":149.1113734,"test":[0.5208260278]}, -{"learn":[0.3890630518],"iteration":806,"passed_time":173.3886789,"remaining_time":148.8951108,"test":[0.5208259081]}, -{"learn":[0.3888924896],"iteration":807,"passed_time":173.6207087,"remaining_time":148.6949634,"test":[0.5208352873]}, -{"learn":[0.3887323333],"iteration":808,"passed_time":173.8325105,"remaining_time":148.4774595,"test":[0.5207972115]}, -{"learn":[0.3886538662],"iteration":809,"passed_time":174.0385006,"remaining_time":148.255019,"test":[0.5208293006]}, -{"learn":[0.3885185098],"iteration":810,"passed_time":174.3061219,"remaining_time":148.084979,"test":[0.5208185244]}, -{"learn":[0.3883717967],"iteration":811,"passed_time":174.526892,"remaining_time":147.8750021,"test":[0.5208113802]}, -{"learn":[0.3883075652],"iteration":812,"passed_time":174.7352021,"remaining_time":147.6544697,"test":[0.5207896681]}, -{"learn":[0.3882100822],"iteration":813,"passed_time":174.9426924,"remaining_time":147.4332764,"test":[0.5207760183]}, -{"learn":[0.3881361842],"iteration":814,"passed_time":175.2167226,"remaining_time":147.2680429,"test":[0.5207791713]}, -{"learn":[0.3880302761],"iteration":815,"passed_time":175.423788,"remaining_time":147.0464105,"test":[0.5207660004]}, -{"learn":[0.3878564389],"iteration":816,"passed_time":175.6498624,"remaining_time":146.8407051,"test":[0.5207927813]}, -{"learn":[0.3877110992],"iteration":817,"passed_time":175.861636,"remaining_time":146.6230266,"test":[0.52078428]}, -{"learn":[0.3875246639],"iteration":818,"passed_time":176.08187,"remaining_time":146.4123974,"test":[0.5207887502]}, -{"learn":[0.3873748871],"iteration":819,"passed_time":176.2937264,"remaining_time":146.1947975,"test":[0.5207878322]}, -{"learn":[0.3872878101],"iteration":820,"passed_time":176.5262919,"remaining_time":145.9943389,"test":[0.5207691136]}, -{"learn":[0.387244047],"iteration":821,"passed_time":176.7295105,"remaining_time":145.7695962,"test":[0.5207654816]}, -{"learn":[0.387153114],"iteration":822,"passed_time":176.9735832,"remaining_time":145.5785126,"test":[0.5207442485]}, -{"learn":[0.3870743035],"iteration":823,"passed_time":177.1787507,"remaining_time":145.3553829,"test":[0.5207950163]}, -{"learn":[0.3869800691],"iteration":824,"passed_time":177.3876493,"remaining_time":145.1353495,"test":[0.5207791713]}, -{"learn":[0.3868912489],"iteration":825,"passed_time":177.5927799,"remaining_time":144.9122683,"test":[0.5208097837]}, -{"learn":[0.3868699352],"iteration":826,"passed_time":177.7076948,"remaining_time":144.6158145,"test":[0.5208107416]}, -{"learn":[0.3866831566],"iteration":827,"passed_time":177.9216886,"remaining_time":144.400211,"test":[0.5207984487]}, -{"learn":[0.3866126657],"iteration":828,"passed_time":178.1243528,"remaining_time":144.1754412,"test":[0.5207885107]}, -{"learn":[0.3864292677],"iteration":829,"passed_time":178.3674232,"remaining_time":143.9833416,"test":[0.5208219169]}, -{"learn":[0.3863339504],"iteration":830,"passed_time":178.6096996,"remaining_time":143.7904802,"test":[0.5208155709]}, -{"learn":[0.3862723599],"iteration":831,"passed_time":178.8088321,"remaining_time":143.5628604,"test":[0.5208341698]}, -{"learn":[0.3861423386],"iteration":832,"passed_time":179.0188344,"remaining_time":143.3440126,"test":[0.520822755]}, -{"learn":[0.3860811443],"iteration":833,"passed_time":179.3063652,"remaining_time":143.1870974,"test":[0.5207928212]}, -{"learn":[0.3859714066],"iteration":834,"passed_time":179.5768481,"remaining_time":143.0162922,"test":[0.520771189]}, -{"learn":[0.3858774363],"iteration":835,"passed_time":179.7874961,"remaining_time":142.7977242,"test":[0.5207582575]}, -{"learn":[0.385788035],"iteration":836,"passed_time":179.9876221,"remaining_time":142.5708404,"test":[0.5207779341]}, -{"learn":[0.3857161971],"iteration":837,"passed_time":180.1924193,"remaining_time":142.3477107,"test":[0.520784759]}, -{"learn":[0.385601098],"iteration":838,"passed_time":180.4047741,"remaining_time":142.1305789,"test":[0.5207683552]}, -{"learn":[0.3855223668],"iteration":839,"passed_time":180.6109756,"remaining_time":141.9086237,"test":[0.5207654417]}, -{"learn":[0.3854583465],"iteration":840,"passed_time":180.8186245,"remaining_time":141.6878402,"test":[0.5207413748]}, -{"learn":[0.3853565585],"iteration":841,"passed_time":181.030544,"remaining_time":141.4704251,"test":[0.5207353082]}, -{"learn":[0.3851537221],"iteration":842,"passed_time":181.2459954,"remaining_time":141.2557758,"test":[0.5207311175]}, -{"learn":[0.3850419507],"iteration":843,"passed_time":181.4536385,"remaining_time":141.0350556,"test":[0.5207350688]}, -{"learn":[0.3849328205],"iteration":844,"passed_time":181.6672019,"remaining_time":140.8189553,"test":[0.5207838809]}, -{"learn":[0.3848402499],"iteration":845,"passed_time":181.8821975,"remaining_time":140.6039682,"test":[0.5207970518]}, -{"learn":[0.3846764225],"iteration":846,"passed_time":182.0902332,"remaining_time":140.3836155,"test":[0.5207546655]}, -{"learn":[0.384490938],"iteration":847,"passed_time":182.3037683,"remaining_time":140.16752,"test":[0.5207718276]}, -{"learn":[0.3843220397],"iteration":848,"passed_time":182.5435249,"remaining_time":139.9715368,"test":[0.5207792512]}, -{"learn":[0.3841868154],"iteration":849,"passed_time":182.7820324,"remaining_time":139.7744954,"test":[0.5207821647]}, -{"learn":[0.3840635024],"iteration":850,"passed_time":182.9895132,"remaining_time":139.5536946,"test":[0.5207896681]}, -{"learn":[0.3840131366],"iteration":851,"passed_time":183.1917853,"remaining_time":139.3289634,"test":[0.520789748]}, -{"learn":[0.3838962415],"iteration":852,"passed_time":183.495498,"remaining_time":139.1812277,"test":[0.5207778143]}, -{"learn":[0.3837903598],"iteration":853,"passed_time":183.712705,"remaining_time":138.9676902,"test":[0.5207721468]}, -{"learn":[0.3837085121],"iteration":854,"passed_time":183.9219584,"remaining_time":138.7481441,"test":[0.5207908655]}, -{"learn":[0.3835712806],"iteration":855,"passed_time":184.1334334,"remaining_time":138.5302934,"test":[0.5207709894]}, -{"learn":[0.3834753558],"iteration":856,"passed_time":184.3869091,"remaining_time":138.3439703,"test":[0.5207798897]}, -{"learn":[0.3832889998],"iteration":857,"passed_time":184.6004023,"remaining_time":138.1275738,"test":[0.5207644838]}, -{"learn":[0.3831362386],"iteration":858,"passed_time":184.8135961,"remaining_time":137.9109605,"test":[0.5207748609]}, -{"learn":[0.3830139557],"iteration":859,"passed_time":185.0264949,"remaining_time":137.6941358,"test":[0.5207832423]}, -{"learn":[0.3828592929],"iteration":860,"passed_time":185.2555753,"remaining_time":137.4893294,"test":[0.5208197617]}, -{"learn":[0.3827558146],"iteration":861,"passed_time":185.4625463,"remaining_time":137.2681027,"test":[0.5208267861]}, -{"learn":[0.3826881496],"iteration":862,"passed_time":185.6679395,"remaining_time":137.0457444,"test":[0.5208670572]}, -{"learn":[0.3825099282],"iteration":863,"passed_time":185.9063309,"remaining_time":136.8477158,"test":[0.5208782325]}, -{"learn":[0.3824270769],"iteration":864,"passed_time":186.1102392,"remaining_time":136.6242797,"test":[0.5208908845]}, -{"learn":[0.3823122946],"iteration":865,"passed_time":186.3410943,"remaining_time":136.4206164,"test":[0.5208806671]}, -{"learn":[0.3821204451],"iteration":866,"passed_time":186.5656197,"remaining_time":136.212269,"test":[0.5209153505]}, -{"learn":[0.3820351112],"iteration":867,"passed_time":186.8354957,"remaining_time":136.0369047,"test":[0.5209112795]}, -{"learn":[0.3819018941],"iteration":868,"passed_time":187.0509453,"remaining_time":135.8218027,"test":[0.5208622278]}, -{"learn":[0.3818172469],"iteration":869,"passed_time":187.2638585,"remaining_time":135.604863,"test":[0.5208837004]}, -{"learn":[0.3817131083],"iteration":870,"passed_time":187.4904049,"remaining_time":135.3977781,"test":[0.5208981884]}, -{"learn":[0.3816451264],"iteration":871,"passed_time":187.7828214,"remaining_time":135.238087,"test":[0.5208566801]}, -{"learn":[0.3816026575],"iteration":872,"passed_time":187.985317,"remaining_time":135.0135095,"test":[0.5208603919]}, -{"learn":[0.3814867924],"iteration":873,"passed_time":188.1961459,"remaining_time":134.7949512,"test":[0.520827305]}, -{"learn":[0.3814064766],"iteration":874,"passed_time":188.3996888,"remaining_time":134.5712063,"test":[0.5208720062]}, -{"learn":[0.3812512591],"iteration":875,"passed_time":188.6530069,"remaining_time":134.3829638,"test":[0.5208907249]}, -{"learn":[0.3811269162],"iteration":876,"passed_time":188.8752501,"remaining_time":134.1724981,"test":[0.5209121575]}, -{"learn":[0.3809351723],"iteration":877,"passed_time":189.0833301,"remaining_time":133.9519719,"test":[0.5209412532]}, -{"learn":[0.3809117986],"iteration":878,"passed_time":189.2827241,"remaining_time":133.7253375,"test":[0.5209240113]}, -{"learn":[0.3807909947],"iteration":879,"passed_time":189.4924272,"remaining_time":133.5060283,"test":[0.5208987072]}, -{"learn":[0.3807601466],"iteration":880,"passed_time":189.6931045,"remaining_time":133.2803992,"test":[0.5208905253]}, -{"learn":[0.3806211455],"iteration":881,"passed_time":189.9065455,"remaining_time":133.06377,"test":[0.5208882902]}, -{"learn":[0.3804656375],"iteration":882,"passed_time":190.126832,"remaining_time":132.8519313,"test":[0.5209654797]}, -{"learn":[0.3804158],"iteration":883,"passed_time":190.3463033,"remaining_time":132.6395054,"test":[0.5209779322]}, -{"learn":[0.3803325261],"iteration":884,"passed_time":190.5563263,"remaining_time":132.4204979,"test":[0.521004713]}, -{"learn":[0.3802163177],"iteration":885,"passed_time":190.7642813,"remaining_time":132.2000776,"test":[0.5210394363]}, -{"learn":[0.3801171444],"iteration":886,"passed_time":191.0485906,"remaining_time":132.0324532,"test":[0.5210071476]}, -{"learn":[0.379954796],"iteration":887,"passed_time":191.2617284,"remaining_time":131.8155155,"test":[0.5210001232]}, -{"learn":[0.3798679566],"iteration":888,"passed_time":191.4779119,"remaining_time":131.6006796,"test":[0.5209691915]}, -{"learn":[0.3797358752],"iteration":889,"passed_time":191.7394794,"remaining_time":131.4169465,"test":[0.5209936575]}, -{"learn":[0.3796585438],"iteration":890,"passed_time":192.0488364,"remaining_time":131.265703,"test":[0.5209807659]}, -{"learn":[0.3795713875],"iteration":891,"passed_time":192.3184906,"remaining_time":131.0870429,"test":[0.5209650806]}, -{"learn":[0.3794183094],"iteration":892,"passed_time":192.5817511,"remaining_time":130.903833,"test":[0.5209377011]}, -{"learn":[0.3793026556],"iteration":893,"passed_time":192.7892935,"remaining_time":130.6826754,"test":[0.5209417322]}, -{"learn":[0.3792277804],"iteration":894,"passed_time":192.9910864,"remaining_time":130.4576618,"test":[0.5209623666]}, -{"learn":[0.3790288527],"iteration":895,"passed_time":193.221675,"remaining_time":130.2521113,"test":[0.5209284415]}, -{"learn":[0.3789600785],"iteration":896,"passed_time":193.4291773,"remaining_time":130.0309854,"test":[0.5209447256]}, -{"learn":[0.378870466],"iteration":897,"passed_time":193.6363296,"remaining_time":129.8096552,"test":[0.5209372221]}, -{"learn":[0.3787758882],"iteration":898,"passed_time":193.8451119,"remaining_time":129.5894463,"test":[0.5209489562]}, -{"learn":[0.3786803068],"iteration":899,"passed_time":194.0580128,"remaining_time":129.3720085,"test":[0.5209339893]}, -{"learn":[0.378490755],"iteration":900,"passed_time":194.2722838,"remaining_time":129.1554917,"test":[0.5209676349]}, -{"learn":[0.3782728907],"iteration":901,"passed_time":194.5150627,"remaining_time":128.9578797,"test":[0.5209991653]}, -{"learn":[0.3781796335],"iteration":902,"passed_time":194.725333,"remaining_time":128.7386753,"test":[0.5209918215]}, -{"learn":[0.3780963596],"iteration":903,"passed_time":194.9369599,"remaining_time":128.5203851,"test":[0.5209928991]}, -{"learn":[0.3780401042],"iteration":904,"passed_time":195.1966235,"remaining_time":128.3336917,"test":[0.5210184826]}, -{"learn":[0.3779341696],"iteration":905,"passed_time":195.4120044,"remaining_time":128.1178042,"test":[0.5209855154]}, -{"learn":[0.3778110944],"iteration":906,"passed_time":195.6257147,"remaining_time":127.9008256,"test":[0.5210304961]}, -{"learn":[0.3777207688],"iteration":907,"passed_time":195.8397239,"remaining_time":127.6840491,"test":[0.5210201988]}, -{"learn":[0.3776341935],"iteration":908,"passed_time":196.074221,"remaining_time":127.4805992,"test":[0.5210099415]}, -{"learn":[0.3775205734],"iteration":909,"passed_time":196.3109582,"remaining_time":127.2785333,"test":[0.5210049126]}, -{"learn":[0.3774297195],"iteration":910,"passed_time":196.5709054,"remaining_time":127.0913977,"test":[0.5210138528]}, -{"learn":[0.3773887297],"iteration":911,"passed_time":196.7742397,"remaining_time":126.8676019,"test":[0.5210173651]}, -{"learn":[0.3771895379],"iteration":912,"passed_time":197.0076994,"remaining_time":126.6632197,"test":[0.5209933382]}, -{"learn":[0.377059094],"iteration":913,"passed_time":197.2241007,"remaining_time":126.447837,"test":[0.5209859146]}, -{"learn":[0.3769735487],"iteration":914,"passed_time":197.4311529,"remaining_time":126.2264748,"test":[0.5209742603]}, -{"learn":[0.3767859514],"iteration":915,"passed_time":197.6440558,"remaining_time":126.008874,"test":[0.520937741]}, -{"learn":[0.3766662832],"iteration":916,"passed_time":197.852613,"remaining_time":125.7885206,"test":[0.5209219359]}, -{"learn":[0.3765442379],"iteration":917,"passed_time":198.0567269,"remaining_time":125.5653759,"test":[0.520895195]}, -{"learn":[0.3764072969],"iteration":918,"passed_time":198.269997,"remaining_time":125.3480612,"test":[0.5209067295]}, -{"learn":[0.3763070672],"iteration":919,"passed_time":198.4845689,"remaining_time":125.131576,"test":[0.5208787912]}, -{"learn":[0.3760766576],"iteration":920,"passed_time":198.710905,"remaining_time":124.9224908,"test":[0.5208475004]}, -{"learn":[0.3759803895],"iteration":921,"passed_time":198.9151464,"remaining_time":124.6995169,"test":[0.5208389193]}, -{"learn":[0.3758646829],"iteration":922,"passed_time":199.1492258,"remaining_time":124.4952365,"test":[0.5208194424]}, -{"learn":[0.3756695585],"iteration":923,"passed_time":199.4293561,"remaining_time":124.3195986,"test":[0.5208652611]}, -{"learn":[0.3755853866],"iteration":924,"passed_time":199.6330852,"remaining_time":124.0962421,"test":[0.5208945564]}, -{"learn":[0.375455286],"iteration":925,"passed_time":199.849111,"remaining_time":123.8805505,"test":[0.5209136742]}, -{"learn":[0.3752258008],"iteration":926,"passed_time":200.1679997,"remaining_time":123.72844,"test":[0.5208968713]}, -{"learn":[0.375161939],"iteration":927,"passed_time":200.372519,"remaining_time":123.5054751,"test":[0.5208845784]}, -{"learn":[0.3749880754],"iteration":928,"passed_time":200.6103928,"remaining_time":123.3030509,"test":[0.5208632655]}, -{"learn":[0.3749237911],"iteration":929,"passed_time":200.8180408,"remaining_time":123.082025,"test":[0.5208824232]}, -{"learn":[0.3747906796],"iteration":930,"passed_time":201.0350499,"remaining_time":122.8667491,"test":[0.5209207785]}, -{"learn":[0.3747345562],"iteration":931,"passed_time":201.2411327,"remaining_time":122.6448105,"test":[0.5209282021]}, -{"learn":[0.3746972903],"iteration":932,"passed_time":201.4478843,"remaining_time":122.4233123,"test":[0.5208960331]}, -{"learn":[0.3746012599],"iteration":933,"passed_time":201.6595375,"remaining_time":122.2048161,"test":[0.520878432]}, -{"learn":[0.3745170881],"iteration":934,"passed_time":201.8614909,"remaining_time":121.9804731,"test":[0.5208734031]}, -{"learn":[0.3744314636],"iteration":935,"passed_time":202.0768571,"remaining_time":121.76426,"test":[0.5208538463]}, -{"learn":[0.3743783247],"iteration":936,"passed_time":202.2883481,"remaining_time":121.5457203,"test":[0.5208716869]}, -{"learn":[0.3742938359],"iteration":937,"passed_time":202.4946392,"remaining_time":121.3240802,"test":[0.5208699707]}, -{"learn":[0.3741377733],"iteration":938,"passed_time":202.7033754,"remaining_time":121.1039336,"test":[0.520877554]}, -{"learn":[0.374108325],"iteration":939,"passed_time":202.9022598,"remaining_time":120.877942,"test":[0.5208624673]}, -{"learn":[0.3739925128],"iteration":940,"passed_time":203.1165044,"remaining_time":120.6611328,"test":[0.5208382807]}, -{"learn":[0.3738371633],"iteration":941,"passed_time":203.3754876,"remaining_time":120.4708303,"test":[0.5208289813]}, -{"learn":[0.3737582208],"iteration":942,"passed_time":203.6521557,"remaining_time":120.2908279,"test":[0.5208389592]}, -{"learn":[0.3736916387],"iteration":943,"passed_time":203.8512087,"remaining_time":120.0649068,"test":[0.520848578]}, -{"learn":[0.3735721025],"iteration":944,"passed_time":204.0625698,"remaining_time":119.8462712,"test":[0.5208118192]}, -{"learn":[0.3734448279],"iteration":945,"passed_time":204.3269674,"remaining_time":119.6587103,"test":[0.5207976505]}, -{"learn":[0.3733377313],"iteration":946,"passed_time":204.5413322,"remaining_time":119.4417705,"test":[0.5207563418]}, -{"learn":[0.3732737903],"iteration":947,"passed_time":204.743233,"remaining_time":119.2175787,"test":[0.5207597343]}, -{"learn":[0.3731410222],"iteration":948,"passed_time":204.9589006,"remaining_time":119.001427,"test":[0.520781566]}, -{"learn":[0.3731100685],"iteration":949,"passed_time":205.1627974,"remaining_time":118.7784616,"test":[0.5208499749]}, -{"learn":[0.3730120837],"iteration":950,"passed_time":205.3717542,"remaining_time":118.5584575,"test":[0.5208657401]}, -{"learn":[0.3729871253],"iteration":951,"passed_time":205.5740492,"remaining_time":118.3346418,"test":[0.5208645826]}, -{"learn":[0.3728805833],"iteration":952,"passed_time":205.7832648,"remaining_time":118.1148435,"test":[0.520889328]}, -{"learn":[0.3728039914],"iteration":953,"passed_time":205.9900764,"remaining_time":117.8936915,"test":[0.5208899266]}, -{"learn":[0.372728139],"iteration":954,"passed_time":206.2171146,"remaining_time":117.6841125,"test":[0.5208848179]}, -{"learn":[0.3726554823],"iteration":955,"passed_time":206.424215,"remaining_time":117.4631516,"test":[0.5208852569]}, -{"learn":[0.372607969],"iteration":956,"passed_time":206.6251852,"remaining_time":117.2387415,"test":[0.5208797491]}, -{"learn":[0.372522186],"iteration":957,"passed_time":206.825116,"remaining_time":117.0137921,"test":[0.5208957538]}, -{"learn":[0.3723003336],"iteration":958,"passed_time":207.0378336,"remaining_time":116.7961084,"test":[0.5208442675]}, -{"learn":[0.3722247982],"iteration":959,"passed_time":207.2402967,"remaining_time":116.5726669,"test":[0.5208396377]}, -{"learn":[0.3721584537],"iteration":960,"passed_time":207.4438181,"remaining_time":116.3498626,"test":[0.5208198415]}, -{"learn":[0.3720815185],"iteration":961,"passed_time":207.7455786,"remaining_time":116.1820387,"test":[0.5208139345]}, -{"learn":[0.3719817377],"iteration":962,"passed_time":207.9626506,"remaining_time":115.9667117,"test":[0.5207988878]}, -{"learn":[0.3718679063],"iteration":963,"passed_time":208.1749186,"remaining_time":115.7487099,"test":[0.5208145731]}, -{"learn":[0.3717649827],"iteration":964,"passed_time":208.4598616,"remaining_time":115.5710114,"test":[0.5208130565]}, -{"learn":[0.3717168354],"iteration":965,"passed_time":208.6611078,"remaining_time":115.3468236,"test":[0.5208156507]}, -{"learn":[0.3716290188],"iteration":966,"passed_time":208.8684731,"remaining_time":115.126056,"test":[0.5208170077]}, -{"learn":[0.3713768202],"iteration":967,"passed_time":209.0962737,"remaining_time":114.9165471,"test":[0.5208644629]}, -{"learn":[0.3712956328],"iteration":968,"passed_time":209.3038177,"remaining_time":114.6959001,"test":[0.5208628664]}, -{"learn":[0.3712129928],"iteration":969,"passed_time":209.5089214,"remaining_time":114.4739468,"test":[0.5208665782]}, -{"learn":[0.3711150608],"iteration":970,"passed_time":209.7211468,"remaining_time":114.255908,"test":[0.5208716869]}, -{"learn":[0.3709856469],"iteration":971,"passed_time":209.9270507,"remaining_time":114.0344473,"test":[0.5209948149]}, -{"learn":[0.370919276],"iteration":972,"passed_time":210.1313525,"remaining_time":113.8121508,"test":[0.5210389574]}, -{"learn":[0.3707053734],"iteration":973,"passed_time":210.3661762,"remaining_time":113.6063744,"test":[0.5209841984]}, -{"learn":[0.3705584226],"iteration":974,"passed_time":210.5858889,"remaining_time":113.3924017,"test":[0.5210424696]}, -{"learn":[0.3704944287],"iteration":975,"passed_time":210.8026459,"remaining_time":113.1768304,"test":[0.5210295781]}, -{"learn":[0.3704255224],"iteration":976,"passed_time":211.012067,"remaining_time":112.9573296,"test":[0.5210114581]}, -{"learn":[0.370362004],"iteration":977,"passed_time":211.2258996,"remaining_time":112.7402041,"test":[0.5210460218]}, -{"learn":[0.3702698032],"iteration":978,"passed_time":211.4376201,"remaining_time":112.5219612,"test":[0.5210378797]}, -{"learn":[0.3701812471],"iteration":979,"passed_time":211.6961378,"remaining_time":112.3285629,"test":[0.5210524077]}, -{"learn":[0.3701202112],"iteration":980,"passed_time":211.9416757,"remaining_time":112.1281648,"test":[0.5210503322]}, -{"learn":[0.3700575379],"iteration":981,"passed_time":212.1457671,"remaining_time":111.905812,"test":[0.5210658978]}, -{"learn":[0.3698672467],"iteration":982,"passed_time":212.3584367,"remaining_time":111.6880079,"test":[0.5210412723]}, -{"learn":[0.369781992],"iteration":983,"passed_time":212.6190128,"remaining_time":111.495336,"test":[0.5210088239]}, -{"learn":[0.3696331132],"iteration":984,"passed_time":212.8368707,"remaining_time":111.2801913,"test":[0.5209735419]}, -{"learn":[0.3695535897],"iteration":985,"passed_time":213.0386355,"remaining_time":111.0566518,"test":[0.5209825221]}, -{"learn":[0.369406586],"iteration":986,"passed_time":213.2461279,"remaining_time":110.8361334,"test":[0.5209818036]}, -{"learn":[0.3691954301],"iteration":987,"passed_time":213.4579015,"remaining_time":110.6178599,"test":[0.5209459628]}, -{"learn":[0.3691112582],"iteration":988,"passed_time":213.660556,"remaining_time":110.3948879,"test":[0.5209387388]}, -{"learn":[0.3690500904],"iteration":989,"passed_time":213.8678818,"remaining_time":110.1743634,"test":[0.5209321134]}, -{"learn":[0.3689075502],"iteration":990,"passed_time":214.0859771,"remaining_time":109.9593969,"test":[0.5209414927]}, -{"learn":[0.3688160625],"iteration":991,"passed_time":214.3148512,"remaining_time":109.749944,"test":[0.520959453]}, -{"learn":[0.368679861],"iteration":992,"passed_time":214.5465142,"remaining_time":109.5418758,"test":[0.5209747393]}, -{"learn":[0.3686532915],"iteration":993,"passed_time":214.7560349,"remaining_time":109.3224886,"test":[0.5209689121]}, -{"learn":[0.3685900372],"iteration":994,"passed_time":214.9663006,"remaining_time":109.1034993,"test":[0.5209637236]}, -{"learn":[0.3684272398],"iteration":995,"passed_time":215.177948,"remaining_time":108.8852267,"test":[0.5208955542]}, -{"learn":[0.3683541605],"iteration":996,"passed_time":215.4000773,"remaining_time":108.6722557,"test":[0.5209167873]}, -{"learn":[0.3681510599],"iteration":997,"passed_time":215.6151391,"remaining_time":108.4557112,"test":[0.5209247697]}, -{"learn":[0.368094197],"iteration":998,"passed_time":215.8632169,"remaining_time":108.2557274,"test":[0.5209497944]}, -{"learn":[0.3680558483],"iteration":999,"passed_time":216.0863532,"remaining_time":108.0431766,"test":[0.5209367432]}, -{"learn":[0.367993307],"iteration":1000,"passed_time":216.2925288,"remaining_time":107.8221497,"test":[0.5209080466]}, -{"learn":[0.3679084221],"iteration":1001,"passed_time":216.5070875,"remaining_time":107.6053189,"test":[0.5208963923]}, -{"learn":[0.3677388635],"iteration":1002,"passed_time":216.7718172,"remaining_time":107.4133531,"test":[0.5209097229]}, -{"learn":[0.3676849586],"iteration":1003,"passed_time":216.9672042,"remaining_time":107.1869853,"test":[0.5208945963]}, -{"learn":[0.3676106909],"iteration":1004,"passed_time":217.1696942,"remaining_time":106.9641778,"test":[0.5209064102]}, -{"learn":[0.367461099],"iteration":1005,"passed_time":217.3945287,"remaining_time":106.7523829,"test":[0.520863944]}, -{"learn":[0.3674003537],"iteration":1006,"passed_time":217.5995737,"remaining_time":106.5308737,"test":[0.5209064102]}, -{"learn":[0.3672810024],"iteration":1007,"passed_time":217.8133699,"remaining_time":106.3136687,"test":[0.5209242907]}, -{"learn":[0.3671352136],"iteration":1008,"passed_time":218.0245894,"remaining_time":106.0952164,"test":[0.5209080865]}, -{"learn":[0.3670708236],"iteration":1009,"passed_time":218.2296201,"remaining_time":105.8737761,"test":[0.5208776737]}, -{"learn":[0.3669081583],"iteration":1010,"passed_time":218.4544992,"remaining_time":105.6619684,"test":[0.5208607511]}, -{"learn":[0.3668888518],"iteration":1011,"passed_time":218.6548763,"remaining_time":105.4383198,"test":[0.5208856162]}, -{"learn":[0.3667959644],"iteration":1012,"passed_time":218.8593366,"remaining_time":105.2166801,"test":[0.5209123172]}, -{"learn":[0.366736117],"iteration":1013,"passed_time":219.0671788,"remaining_time":104.9966952,"test":[0.5209222951]}, -{"learn":[0.3665828276],"iteration":1014,"passed_time":219.2905196,"remaining_time":104.7841399,"test":[0.5209469207]}, -{"learn":[0.3665613554],"iteration":1015,"passed_time":219.5025643,"remaining_time":104.5661822,"test":[0.5209724244]}, -{"learn":[0.3663577795],"iteration":1016,"passed_time":219.7208502,"remaining_time":104.3512003,"test":[0.5209695906]}, -{"learn":[0.3662789162],"iteration":1017,"passed_time":219.9661856,"remaining_time":104.1490191,"test":[0.5209926197]}, -{"learn":[0.3661279245],"iteration":1018,"passed_time":220.2228366,"remaining_time":103.9520946,"test":[0.5210012407]}, -{"learn":[0.3660209072],"iteration":1019,"passed_time":220.4376931,"remaining_time":103.735385,"test":[0.5210192808]}, -{"learn":[0.3659825584],"iteration":1020,"passed_time":220.6467973,"remaining_time":103.5159803,"test":[0.5210260659]}, -{"learn":[0.365871685],"iteration":1021,"passed_time":220.9177938,"remaining_time":103.3255435,"test":[0.5210407534]}, -{"learn":[0.3656501231],"iteration":1022,"passed_time":221.1458198,"remaining_time":103.1149131,"test":[0.5210770732]}, -{"learn":[0.3655259386],"iteration":1023,"passed_time":221.3513047,"remaining_time":102.8937705,"test":[0.5211190604]}, -{"learn":[0.3654622617],"iteration":1024,"passed_time":221.5764892,"remaining_time":102.6817877,"test":[0.5211071667]}, -{"learn":[0.3653981094],"iteration":1025,"passed_time":221.7855698,"remaining_time":102.4623393,"test":[0.5211064083]}, -{"learn":[0.3652841723],"iteration":1026,"passed_time":221.9929976,"remaining_time":102.2421498,"test":[0.5211000624]}, -{"learn":[0.365221948],"iteration":1027,"passed_time":222.2007436,"remaining_time":102.0221313,"test":[0.5210992641]}, -{"learn":[0.3650262161],"iteration":1028,"passed_time":222.4159375,"remaining_time":101.8055457,"test":[0.521073521]}, -{"learn":[0.3647673883],"iteration":1029,"passed_time":222.6337476,"remaining_time":101.5901567,"test":[0.5210112187]}, -{"learn":[0.364646109],"iteration":1030,"passed_time":222.8439154,"remaining_time":101.3712864,"test":[0.5210245492]}, -{"learn":[0.3645739277],"iteration":1031,"passed_time":223.0748421,"remaining_time":101.161847,"test":[0.5210273829]}, -{"learn":[0.3645454302],"iteration":1032,"passed_time":223.2793284,"remaining_time":100.9404127,"test":[0.521059472]}, -{"learn":[0.3644716643],"iteration":1033,"passed_time":223.4886753,"remaining_time":100.7212018,"test":[0.5210469796]}, -{"learn":[0.3644073271],"iteration":1034,"passed_time":223.6881043,"remaining_time":100.4975541,"test":[0.5210749179]}, -{"learn":[0.3643612663],"iteration":1035,"passed_time":223.9025255,"remaining_time":100.2806678,"test":[0.521089805]}, -{"learn":[0.364343254],"iteration":1036,"passed_time":224.1070681,"remaining_time":100.0593756,"test":[0.521111996]}, -{"learn":[0.3642708087],"iteration":1037,"passed_time":224.3480293,"remaining_time":99.85432518,"test":[0.5211555398]}, -{"learn":[0.3641713977],"iteration":1038,"passed_time":224.5785114,"remaining_time":99.64455607,"test":[0.5211429277]}, -{"learn":[0.3641001408],"iteration":1039,"passed_time":224.7931058,"remaining_time":99.42771987,"test":[0.5211575753]}, -{"learn":[0.3640005977],"iteration":1040,"passed_time":225.050386,"remaining_time":99.22970908,"test":[0.5211365418]}, -{"learn":[0.3639340684],"iteration":1041,"passed_time":225.2560249,"remaining_time":99.00888619,"test":[0.5211657173]}, -{"learn":[0.3637593068],"iteration":1042,"passed_time":225.4863487,"remaining_time":98.7989083,"test":[0.5211348655]}, -{"learn":[0.363644868],"iteration":1043,"passed_time":225.7019369,"remaining_time":98.58245519,"test":[0.5211828395]}, -{"learn":[0.3635717095],"iteration":1044,"passed_time":225.9436918,"remaining_time":98.37739693,"test":[0.5211624445]}, -{"learn":[0.3634735398],"iteration":1045,"passed_time":226.1899077,"remaining_time":98.17420466,"test":[0.5211199385]}, -{"learn":[0.3633955746],"iteration":1046,"passed_time":226.3977172,"remaining_time":97.95431319,"test":[0.521148196]}, -{"learn":[0.3633414056],"iteration":1047,"passed_time":226.6044275,"remaining_time":97.73397063,"test":[0.5211158275]}, -{"learn":[0.3632657381],"iteration":1048,"passed_time":226.8117949,"remaining_time":97.5139366,"test":[0.5211246081]}, -{"learn":[0.3632202055],"iteration":1049,"passed_time":227.0200441,"remaining_time":97.29430461,"test":[0.5211289984]}, -{"learn":[0.3630583061],"iteration":1050,"passed_time":227.2280576,"remaining_time":97.0745936,"test":[0.5211381382]}, -{"learn":[0.3629922786],"iteration":1051,"passed_time":227.4486245,"remaining_time":96.86025075,"test":[0.5211600897]}, -{"learn":[0.3629469573],"iteration":1052,"passed_time":227.6574147,"remaining_time":96.64089683,"test":[0.5211766931]}, -{"learn":[0.3627624501],"iteration":1053,"passed_time":227.8741181,"remaining_time":96.42491145,"test":[0.5212257048]}, -{"learn":[0.3627421664],"iteration":1054,"passed_time":228.0738257,"remaining_time":96.20175588,"test":[0.5212518869]}, -{"learn":[0.3627005955],"iteration":1055,"passed_time":228.3032021,"remaining_time":95.99111909,"test":[0.5212286583]}, -{"learn":[0.3625106212],"iteration":1056,"passed_time":228.537284,"remaining_time":95.78241892,"test":[0.521274477]}, -{"learn":[0.362401174],"iteration":1057,"passed_time":228.7456277,"remaining_time":95.5629182,"test":[0.5212937544]}, -{"learn":[0.3623106899],"iteration":1058,"passed_time":228.9481152,"remaining_time":95.34099982,"test":[0.5213091604]}, -{"learn":[0.3621572684],"iteration":1059,"passed_time":229.1725277,"remaining_time":95.12821904,"test":[0.521308442]}, -{"learn":[0.3621187084],"iteration":1060,"passed_time":229.3784958,"remaining_time":94.9077848,"test":[0.5213249655]}, -{"learn":[0.3618698639],"iteration":1061,"passed_time":229.5963163,"remaining_time":94.69226603,"test":[0.5213545401]}, -{"learn":[0.3617479243],"iteration":1062,"passed_time":229.8033788,"remaining_time":94.47232036,"test":[0.5213264422]}, -{"learn":[0.3616873903],"iteration":1063,"passed_time":230.0041299,"remaining_time":94.24981263,"test":[0.5213149077]}, -{"learn":[0.3616666841],"iteration":1064,"passed_time":230.206078,"remaining_time":94.02783468,"test":[0.5213183401]}, -{"learn":[0.361489836],"iteration":1065,"passed_time":230.4186694,"remaining_time":93.81022749,"test":[0.5213724206]}, -{"learn":[0.3614341352],"iteration":1066,"passed_time":230.6218108,"remaining_time":93.58879484,"test":[0.5213284777]}, -{"learn":[0.361220391],"iteration":1067,"passed_time":230.8335229,"remaining_time":93.37086319,"test":[0.5213454003]}, -{"learn":[0.3611753603],"iteration":1068,"passed_time":231.039419,"remaining_time":93.15059832,"test":[0.5213692277]}, -{"learn":[0.3610790922],"iteration":1069,"passed_time":231.2552318,"remaining_time":92.93434549,"test":[0.5213791258]}, -{"learn":[0.3609966899],"iteration":1070,"passed_time":231.4600269,"remaining_time":92.71368026,"test":[0.5214370778]}, -{"learn":[0.360933726],"iteration":1071,"passed_time":231.6696553,"remaining_time":92.4949743,"test":[0.5214350423]}, -{"learn":[0.3608361902],"iteration":1072,"passed_time":231.8759905,"remaining_time":92.27497479,"test":[0.5213883454]}, -{"learn":[0.3607590437],"iteration":1073,"passed_time":232.0820002,"remaining_time":92.0548716,"test":[0.5213784872]}, -{"learn":[0.3606524753],"iteration":1074,"passed_time":232.2942153,"remaining_time":91.83724792,"test":[0.5213639992]}, -{"learn":[0.3605963783],"iteration":1075,"passed_time":232.5430346,"remaining_time":91.63405823,"test":[0.521388984]}, -{"learn":[0.3604486616],"iteration":1076,"passed_time":232.7658942,"remaining_time":91.42058798,"test":[0.521362762]}, -{"learn":[0.3604083056],"iteration":1077,"passed_time":232.9696976,"remaining_time":91.19964045,"test":[0.5213588905]}, -{"learn":[0.3602384565],"iteration":1078,"passed_time":233.1986916,"remaining_time":90.98855345,"test":[0.5213640391]}, -{"learn":[0.3601371439],"iteration":1079,"passed_time":233.4589568,"remaining_time":90.78959432,"test":[0.521364558]}, -{"learn":[0.3600734405],"iteration":1080,"passed_time":233.6688596,"remaining_time":90.5710011,"test":[0.5213606067]}, -{"learn":[0.359975667],"iteration":1081,"passed_time":233.883979,"remaining_time":90.35443919,"test":[0.5213580923]}, -{"learn":[0.3598768899],"iteration":1082,"passed_time":234.097364,"remaining_time":90.13721219,"test":[0.5213207747]}, -{"learn":[0.3597882282],"iteration":1083,"passed_time":234.3084696,"remaining_time":89.91911749,"test":[0.5213402118]}, -{"learn":[0.3596489365],"iteration":1084,"passed_time":234.5155851,"remaining_time":89.69950951,"test":[0.5213499104]}, -{"learn":[0.3595070302],"iteration":1085,"passed_time":234.7291449,"remaining_time":89.4823812,"test":[0.5213154265]}, -{"learn":[0.3594236771],"iteration":1086,"passed_time":234.9389812,"remaining_time":89.26384474,"test":[0.5212945128]}, -{"learn":[0.3593062538],"iteration":1087,"passed_time":235.1473684,"remaining_time":89.04477553,"test":[0.521275395]}, -{"learn":[0.3592398302],"iteration":1088,"passed_time":235.3567871,"remaining_time":88.82611522,"test":[0.5212614658]}, -{"learn":[0.3591712144],"iteration":1089,"passed_time":235.5633298,"remaining_time":88.60639012,"test":[0.5212766722]}, -{"learn":[0.3589635975],"iteration":1090,"passed_time":235.7816672,"remaining_time":88.39111079,"test":[0.5213198967]}, -{"learn":[0.358914341],"iteration":1091,"passed_time":235.9832612,"remaining_time":88.16957013,"test":[0.5213265619]}, -{"learn":[0.3587902621],"iteration":1092,"passed_time":236.1995349,"remaining_time":87.9535322,"test":[0.5212738384]}, -{"learn":[0.3586495707],"iteration":1093,"passed_time":236.4075186,"remaining_time":87.73441731,"test":[0.5212720025]}, -{"learn":[0.3583883923],"iteration":1094,"passed_time":236.6517677,"remaining_time":87.52873601,"test":[0.5212376384]}, -{"learn":[0.3582232444],"iteration":1095,"passed_time":236.8633732,"remaining_time":87.31095144,"test":[0.5213529037]}, -{"learn":[0.3580444947],"iteration":1096,"passed_time":237.07898,"remaining_time":87.09464809,"test":[0.5213671124]}, -{"learn":[0.3579685895],"iteration":1097,"passed_time":237.2917211,"remaining_time":86.87729681,"test":[0.5213969265]}, -{"learn":[0.3578222197],"iteration":1098,"passed_time":237.5539747,"remaining_time":86.67801989,"test":[0.521412093]}, -{"learn":[0.357727325],"iteration":1099,"passed_time":237.763904,"remaining_time":86.45960146,"test":[0.5214048689]}, -{"learn":[0.3576691416],"iteration":1100,"passed_time":237.9720771,"remaining_time":86.24056198,"test":[0.521402594]}, -{"learn":[0.3575913084],"iteration":1101,"passed_time":238.1750807,"remaining_time":86.01967525,"test":[0.5213626821]}, -{"learn":[0.3574220667],"iteration":1102,"passed_time":238.381821,"remaining_time":85.80016584,"test":[0.5213355022]}, -{"learn":[0.3573666564],"iteration":1103,"passed_time":238.5887246,"remaining_time":85.58073817,"test":[0.52133199]}, -{"learn":[0.3572650269],"iteration":1104,"passed_time":238.80214,"remaining_time":85.3636609,"test":[0.5213266817]}, -{"learn":[0.3571120544],"iteration":1105,"passed_time":239.0153902,"remaining_time":85.1465314,"test":[0.5213296352]}, -{"learn":[0.3570259545],"iteration":1106,"passed_time":239.2241572,"remaining_time":84.92781733,"test":[0.5213631212]}, -{"learn":[0.3568969104],"iteration":1107,"passed_time":239.4360728,"remaining_time":84.71023515,"test":[0.5213943721]}, -{"learn":[0.3567895761],"iteration":1108,"passed_time":239.6453013,"remaining_time":84.49171579,"test":[0.5213891038]}, -{"learn":[0.3567679455],"iteration":1109,"passed_time":239.8455754,"remaining_time":84.27006704,"test":[0.5213875472]}, -{"learn":[0.3566135468],"iteration":1110,"passed_time":240.0538719,"remaining_time":84.05126567,"test":[0.5213343048]}, -{"learn":[0.3565158261],"iteration":1111,"passed_time":240.2578146,"remaining_time":83.83096408,"test":[0.5213331474]}, -{"learn":[0.3563395062],"iteration":1112,"passed_time":240.475852,"remaining_time":83.61559274,"test":[0.5213612852]}, -{"learn":[0.3562944755],"iteration":1113,"passed_time":240.6846976,"remaining_time":83.39703167,"test":[0.5214025141]}, -{"learn":[0.3562287385],"iteration":1114,"passed_time":240.938794,"remaining_time":83.19411274,"test":[0.5214190376]}, -{"learn":[0.3560953101],"iteration":1115,"passed_time":241.1503715,"remaining_time":82.97647191,"test":[0.5214575525]}, -{"learn":[0.3559713897],"iteration":1116,"passed_time":241.3615226,"remaining_time":82.75869576,"test":[0.5214474149]}, -{"learn":[0.355911965],"iteration":1117,"passed_time":241.5772918,"remaining_time":82.54250937,"test":[0.5214081417]}, -{"learn":[0.3558743557],"iteration":1118,"passed_time":241.7839512,"remaining_time":82.32322198,"test":[0.5214244656]}, -{"learn":[0.3557724621],"iteration":1119,"passed_time":241.9935136,"remaining_time":82.10494211,"test":[0.5214290156]}, -{"learn":[0.3557243148],"iteration":1120,"passed_time":242.1977161,"remaining_time":81.88486567,"test":[0.521441947]}, -{"learn":[0.3556553293],"iteration":1121,"passed_time":242.3987127,"remaining_time":81.66373742,"test":[0.5214466566]}, -{"learn":[0.3556107475],"iteration":1122,"passed_time":242.6053787,"remaining_time":81.44454833,"test":[0.5214589495]}, -{"learn":[0.3555511115],"iteration":1123,"passed_time":242.8188772,"remaining_time":81.22766711,"test":[0.5214417874]}, -{"learn":[0.3554895474],"iteration":1124,"passed_time":243.0442472,"remaining_time":81.01474905,"test":[0.5214508074]}, -{"learn":[0.3554307829],"iteration":1125,"passed_time":243.2466921,"remaining_time":80.79419436,"test":[0.5214019554]}, -{"learn":[0.3553907439],"iteration":1126,"passed_time":243.4510086,"remaining_time":80.57429122,"test":[0.5214282972]}, -{"learn":[0.3553201473],"iteration":1127,"passed_time":243.6555213,"remaining_time":80.35448043,"test":[0.5214755528]}, -{"learn":[0.3551664617],"iteration":1128,"passed_time":243.8616642,"remaining_time":80.13523244,"test":[0.5214911982]}, -{"learn":[0.3550973441],"iteration":1129,"passed_time":244.0679024,"remaining_time":79.91603883,"test":[0.5214584705]}, -{"learn":[0.3550310261],"iteration":1130,"passed_time":244.2759049,"remaining_time":79.69744378,"test":[0.5214698853]}, -{"learn":[0.3549639949],"iteration":1131,"passed_time":244.4835295,"remaining_time":79.47874457,"test":[0.5214861294]}, -{"learn":[0.3547969454],"iteration":1132,"passed_time":244.7066322,"remaining_time":79.26507858,"test":[0.5215495892]}, -{"learn":[0.3547689233],"iteration":1133,"passed_time":244.9165071,"remaining_time":79.04712662,"test":[0.5215529019]}, -{"learn":[0.354723602],"iteration":1134,"passed_time":245.1225025,"remaining_time":78.82794133,"test":[0.5215577711]}, -{"learn":[0.3546701726],"iteration":1135,"passed_time":245.3248136,"remaining_time":78.60759874,"test":[0.5215716604]}, -{"learn":[0.3545605405],"iteration":1136,"passed_time":245.537935,"remaining_time":78.39073916,"test":[0.5215812792]}, -{"learn":[0.3544628726],"iteration":1137,"passed_time":245.7818062,"remaining_time":78.18366769,"test":[0.5215941308]}, -{"learn":[0.354329365],"iteration":1138,"passed_time":245.999715,"remaining_time":77.96830301,"test":[0.5216019535]}, -{"learn":[0.3542345231],"iteration":1139,"passed_time":246.2146228,"remaining_time":77.75198613,"test":[0.5216271379]}, -{"learn":[0.3540737594],"iteration":1140,"passed_time":246.4297036,"remaining_time":77.53572621,"test":[0.5216787439]}, -{"learn":[0.3539656592],"iteration":1141,"passed_time":246.6418661,"remaining_time":77.31855347,"test":[0.5216932318]}, -{"learn":[0.3539201794],"iteration":1142,"passed_time":246.8453606,"remaining_time":77.09868219,"test":[0.5217007353]}, -{"learn":[0.353898496],"iteration":1143,"passed_time":247.0452926,"remaining_time":76.87773092,"test":[0.5217192144]}, -{"learn":[0.3538379091],"iteration":1144,"passed_time":247.2507629,"remaining_time":76.65853349,"test":[0.5217498667]}, -{"learn":[0.3537080463],"iteration":1145,"passed_time":247.4601554,"remaining_time":76.44057156,"test":[0.5217505053]}, -{"learn":[0.3535884044],"iteration":1146,"passed_time":247.6717731,"remaining_time":76.22330943,"test":[0.5217782839]}, -{"learn":[0.3535536211],"iteration":1147,"passed_time":247.8721826,"remaining_time":76.00262046,"test":[0.5218048253]}, -{"learn":[0.3534339793],"iteration":1148,"passed_time":248.0810132,"remaining_time":75.78453928,"test":[0.521828932]}, -{"learn":[0.3533821609],"iteration":1149,"passed_time":248.2858189,"remaining_time":75.56524924,"test":[0.5218128875]}, -{"learn":[0.3533180614],"iteration":1150,"passed_time":248.4879463,"remaining_time":75.34517226,"test":[0.5218179563]}, -{"learn":[0.3532425524],"iteration":1151,"passed_time":248.6926093,"remaining_time":75.1258924,"test":[0.5218637351]}, -{"learn":[0.353185848],"iteration":1152,"passed_time":248.8997847,"remaining_time":74.90739399,"test":[0.5218940681]}, -{"learn":[0.3531209297],"iteration":1153,"passed_time":249.1225205,"remaining_time":74.69358067,"test":[0.5219257581]}, -{"learn":[0.3530387651],"iteration":1154,"passed_time":249.3302605,"remaining_time":74.47527261,"test":[0.5219308269]}, -{"learn":[0.352939988],"iteration":1155,"passed_time":249.5401223,"remaining_time":74.25761425,"test":[0.5218781433]}, -{"learn":[0.3528662221],"iteration":1156,"passed_time":249.747728,"remaining_time":74.03930052,"test":[0.5218438591]}, -{"learn":[0.3528122116],"iteration":1157,"passed_time":249.9662395,"remaining_time":73.82422618,"test":[0.5218273356]}, -{"learn":[0.3527410603],"iteration":1158,"passed_time":250.1750184,"remaining_time":73.60628237,"test":[0.5218074196]}, -{"learn":[0.3526548284],"iteration":1159,"passed_time":250.3836956,"remaining_time":73.38832457,"test":[0.5217854681]}, -{"learn":[0.3525551005],"iteration":1160,"passed_time":250.594963,"remaining_time":73.17113908,"test":[0.5218083375]}, -{"learn":[0.3524496678],"iteration":1161,"passed_time":250.8053867,"remaining_time":72.95371833,"test":[0.5218412249]}, -{"learn":[0.3523390321],"iteration":1162,"passed_time":251.012283,"remaining_time":72.7352875,"test":[0.521819912]}, -{"learn":[0.3522470426],"iteration":1163,"passed_time":251.2277027,"remaining_time":72.51933686,"test":[0.5218140848]}, -{"learn":[0.3521805397],"iteration":1164,"passed_time":251.4379158,"remaining_time":72.30188996,"test":[0.5218226659]}, -{"learn":[0.3520193269],"iteration":1165,"passed_time":251.6496497,"remaining_time":72.08489109,"test":[0.5218112112]}, -{"learn":[0.3519884525],"iteration":1166,"passed_time":251.8491185,"remaining_time":71.86440143,"test":[0.521790936]}, -{"learn":[0.3519121511],"iteration":1167,"passed_time":252.0553559,"remaining_time":71.6458717,"test":[0.5217758493]}, -{"learn":[0.3518350046],"iteration":1168,"passed_time":252.2615793,"remaining_time":71.42735906,"test":[0.5217833527]}, -{"learn":[0.3517706674],"iteration":1169,"passed_time":252.4716329,"remaining_time":71.20994775,"test":[0.5217927719]}, -{"learn":[0.351707281],"iteration":1170,"passed_time":252.6805068,"remaining_time":70.99221753,"test":[0.521804945]}, -{"learn":[0.3516247994],"iteration":1171,"passed_time":252.8924785,"remaining_time":70.77536941,"test":[0.5218032288]}, -{"learn":[0.3515422386],"iteration":1172,"passed_time":253.1102529,"remaining_time":70.56014724,"test":[0.5217769668]}, -{"learn":[0.3514245248],"iteration":1173,"passed_time":253.3402964,"remaining_time":70.34832762,"test":[0.5217643547]}, -{"learn":[0.3513319278],"iteration":1174,"passed_time":253.5525889,"remaining_time":70.13156714,"test":[0.5217356581]}, -{"learn":[0.3512806377],"iteration":1175,"passed_time":253.7624074,"remaining_time":69.91413266,"test":[0.5217420041]}, -{"learn":[0.3511702661],"iteration":1176,"passed_time":253.9758504,"remaining_time":69.69770577,"test":[0.521764674]}, -{"learn":[0.351109468],"iteration":1177,"passed_time":254.1985012,"remaining_time":69.48380084,"test":[0.5217622394]}, -{"learn":[0.3510220476],"iteration":1178,"passed_time":254.4117325,"remaining_time":69.26731647,"test":[0.5217839115]}, -{"learn":[0.3509819293],"iteration":1179,"passed_time":254.6155561,"remaining_time":69.04828641,"test":[0.521775969]}, -{"learn":[0.3508707126],"iteration":1180,"passed_time":254.8245757,"remaining_time":68.83068557,"test":[0.5217974416]}, -{"learn":[0.35081657],"iteration":1181,"passed_time":255.028221,"remaining_time":68.61165335,"test":[0.5218461739]}, -{"learn":[0.3507096583],"iteration":1182,"passed_time":255.2338233,"remaining_time":68.39317157,"test":[0.5218596242]}, -{"learn":[0.3505858699],"iteration":1183,"passed_time":255.450924,"remaining_time":68.17778039,"test":[0.5218575089]}, -{"learn":[0.3504076749],"iteration":1184,"passed_time":255.6647233,"remaining_time":67.96150873,"test":[0.5218413845]}, -{"learn":[0.3501920291],"iteration":1185,"passed_time":255.8832137,"remaining_time":67.74648323,"test":[0.5218552339]}, -{"learn":[0.3500326915],"iteration":1186,"passed_time":256.094099,"remaining_time":67.52944648,"test":[0.5217772063]}, -{"learn":[0.34997913],"iteration":1187,"passed_time":256.3000017,"remaining_time":67.31111156,"test":[0.5218165993]}, -{"learn":[0.3498853182],"iteration":1188,"passed_time":256.5112655,"remaining_time":67.09419981,"test":[0.5218594247]}, -{"learn":[0.3497534216],"iteration":1189,"passed_time":256.7282014,"remaining_time":66.87877514,"test":[0.5218685246]}, -{"learn":[0.3496579194],"iteration":1190,"passed_time":256.9354955,"remaining_time":66.66084644,"test":[0.5218689636]}, -{"learn":[0.3496068406],"iteration":1191,"passed_time":257.1408592,"remaining_time":66.44243676,"test":[0.5218824139]}, -{"learn":[0.3495561579],"iteration":1192,"passed_time":257.3886691,"remaining_time":66.23497184,"test":[0.5219070794]}, -{"learn":[0.3494295964],"iteration":1193,"passed_time":257.5948813,"remaining_time":66.01677862,"test":[0.5219050838]}, -{"learn":[0.3492731376],"iteration":1194,"passed_time":257.8062263,"remaining_time":65.7999155,"test":[0.5218853274]}, -{"learn":[0.3491270319],"iteration":1195,"passed_time":258.0144536,"remaining_time":65.58226914,"test":[0.5219426408]}, -{"learn":[0.3490965801],"iteration":1196,"passed_time":258.2499949,"remaining_time":65.37155259,"test":[0.5219371729]}, -{"learn":[0.3489798963],"iteration":1197,"passed_time":258.4639753,"remaining_time":65.15535938,"test":[0.5219283524]}, -{"learn":[0.3488902045],"iteration":1198,"passed_time":258.673731,"remaining_time":64.93810928,"test":[0.5219230441]}, -{"learn":[0.3487869111],"iteration":1199,"passed_time":258.8822903,"remaining_time":64.72057259,"test":[0.5219811956]}, -{"learn":[0.3486699896],"iteration":1200,"passed_time":259.0914402,"remaining_time":64.50319785,"test":[0.5220332806]}, -{"learn":[0.3485725858],"iteration":1201,"passed_time":259.2999224,"remaining_time":64.28567128,"test":[0.5220025085]}, -{"learn":[0.3485040493],"iteration":1202,"passed_time":259.5066983,"remaining_time":64.06773849,"test":[0.5219879407]}, -{"learn":[0.348428012],"iteration":1203,"passed_time":259.7126386,"remaining_time":63.84961879,"test":[0.5219500644]}, -{"learn":[0.3483484357],"iteration":1204,"passed_time":259.9278918,"remaining_time":63.63379924,"test":[0.5219792799]}, -{"learn":[0.3482645807],"iteration":1205,"passed_time":260.13567,"remaining_time":63.41615836,"test":[0.5220027879]}, -{"learn":[0.3482475985],"iteration":1206,"passed_time":260.3359022,"remaining_time":63.19670202,"test":[0.5220069787]}, -{"learn":[0.3481676788],"iteration":1207,"passed_time":260.5440051,"remaining_time":62.97918003,"test":[0.5220037059]}, -{"learn":[0.3480407211],"iteration":1208,"passed_time":260.7578923,"remaining_time":62.7630659,"test":[0.5219982779]}, -{"learn":[0.3479134201],"iteration":1209,"passed_time":260.9662142,"remaining_time":62.54562158,"test":[0.5220081361]}, -{"learn":[0.3478303839],"iteration":1210,"passed_time":261.1789683,"remaining_time":62.32925008,"test":[0.5220035862]}, -{"learn":[0.3477605532],"iteration":1211,"passed_time":261.3859356,"remaining_time":62.11150944,"test":[0.5219960827]}, -{"learn":[0.3477263246],"iteration":1212,"passed_time":261.6172098,"remaining_time":61.89953768,"test":[0.5220019897]}, -{"learn":[0.3475753065],"iteration":1213,"passed_time":261.8277601,"remaining_time":61.68265189,"test":[0.5220316841]}, -{"learn":[0.3474492204],"iteration":1214,"passed_time":262.0507384,"remaining_time":61.46869173,"test":[0.522045773]}, -{"learn":[0.3473390337],"iteration":1215,"passed_time":262.2655292,"remaining_time":61.25280453,"test":[0.5220681635]}, -{"learn":[0.3472799259],"iteration":1216,"passed_time":262.4878366,"remaining_time":61.03866701,"test":[0.5220699196]}, -{"learn":[0.3472254136],"iteration":1217,"passed_time":262.6903325,"remaining_time":60.81992919,"test":[0.5220693209]}, -{"learn":[0.3471532059],"iteration":1218,"passed_time":262.9026202,"remaining_time":60.6034752,"test":[0.5220479681]}, -{"learn":[0.3470847486],"iteration":1219,"passed_time":263.1108155,"remaining_time":60.38608881,"test":[0.5220445756]}, -{"learn":[0.3469542782],"iteration":1220,"passed_time":263.3227686,"remaining_time":60.16957611,"test":[0.5220535158]}, -{"learn":[0.3468893336],"iteration":1221,"passed_time":263.5373529,"remaining_time":59.95366947,"test":[0.5220678442]}, -{"learn":[0.3467616364],"iteration":1222,"passed_time":263.7416415,"remaining_time":59.73543312,"test":[0.5220607399]}, -{"learn":[0.3466169834],"iteration":1223,"passed_time":263.9513451,"remaining_time":59.51844057,"test":[0.52207427]}, -{"learn":[0.3465490278],"iteration":1224,"passed_time":264.160149,"remaining_time":59.30125795,"test":[0.5220816936]}, -{"learn":[0.3464336118],"iteration":1225,"passed_time":264.3666345,"remaining_time":59.08357083,"test":[0.5221177739]}, -{"learn":[0.3463022435],"iteration":1226,"passed_time":264.5794098,"remaining_time":58.86730146,"test":[0.5220721547]}, -{"learn":[0.3462382496],"iteration":1227,"passed_time":264.7871556,"remaining_time":58.64992372,"test":[0.5220621767]}, -{"learn":[0.3461630839],"iteration":1228,"passed_time":264.9964698,"remaining_time":58.43290749,"test":[0.5220753476]}, -{"learn":[0.3460831642],"iteration":1229,"passed_time":265.2055482,"remaining_time":58.21585204,"test":[0.5221078358]}, -{"learn":[0.3460061762],"iteration":1230,"passed_time":265.4099245,"remaining_time":57.99778203,"test":[0.5220926693]}, -{"learn":[0.3459881374],"iteration":1231,"passed_time":265.6188599,"remaining_time":57.78072602,"test":[0.5220992947]}, -{"learn":[0.3459353154],"iteration":1232,"passed_time":265.8546865,"remaining_time":57.56950632,"test":[0.5221269137]}, -{"learn":[0.3458377268],"iteration":1233,"passed_time":266.0633029,"remaining_time":57.35238134,"test":[0.5220990153]}, -{"learn":[0.3456172742],"iteration":1234,"passed_time":266.2784291,"remaining_time":57.13666697,"test":[0.5221084345]}, -{"learn":[0.3455547329],"iteration":1235,"passed_time":266.5088523,"remaining_time":56.92422088,"test":[0.5220854852]}, -{"learn":[0.3455043143],"iteration":1236,"passed_time":266.7158161,"remaining_time":56.70675798,"test":[0.5221093525]}, -{"learn":[0.3454320538],"iteration":1237,"passed_time":266.9248384,"remaining_time":56.48974771,"test":[0.5221230821]}, -{"learn":[0.3453458483],"iteration":1238,"passed_time":267.1325651,"remaining_time":56.27247739,"test":[0.5221144213]}, -{"learn":[0.3452301418],"iteration":1239,"passed_time":267.3424243,"remaining_time":56.05566961,"test":[0.5221205677]}, -{"learn":[0.3450607152],"iteration":1240,"passed_time":267.5549843,"remaining_time":55.83943668,"test":[0.5221606791]}, -{"learn":[0.3449794221],"iteration":1241,"passed_time":267.7593083,"remaining_time":55.62149883,"test":[0.5221733311]}, -{"learn":[0.3449037282],"iteration":1242,"passed_time":267.9675187,"remaining_time":55.4043864,"test":[0.5221965199]}, -{"learn":[0.3447377615],"iteration":1243,"passed_time":268.1812436,"remaining_time":55.18842312,"test":[0.5222069768]}, -{"learn":[0.344598734],"iteration":1244,"passed_time":268.3966061,"remaining_time":54.97279883,"test":[0.5221865819]}, -{"learn":[0.3444494326],"iteration":1245,"passed_time":268.6100393,"remaining_time":54.75678168,"test":[0.522153455]}, -{"learn":[0.3443445809],"iteration":1246,"passed_time":268.8198336,"remaining_time":54.54003038,"test":[0.5221449937]}, -{"learn":[0.3442595903],"iteration":1247,"passed_time":269.0256584,"remaining_time":54.32248872,"test":[0.5221960809]}, -{"learn":[0.3441718794],"iteration":1248,"passed_time":269.2355453,"remaining_time":54.10578212,"test":[0.5222445737]}, -{"learn":[0.3440871793],"iteration":1249,"passed_time":269.4490179,"remaining_time":53.88980358,"test":[0.5222437755]}, -{"learn":[0.3438821507],"iteration":1250,"passed_time":269.6684577,"remaining_time":53.67501675,"test":[0.5222642902]}, -{"learn":[0.3438117918],"iteration":1251,"passed_time":269.9134095,"remaining_time":53.46527599,"test":[0.5222604187]}, -{"learn":[0.3437252166],"iteration":1252,"passed_time":270.1287794,"remaining_time":53.24964766,"test":[0.5222529552]}, -{"learn":[0.3436605096],"iteration":1253,"passed_time":270.3361483,"remaining_time":53.03245015,"test":[0.5223144593]}, -{"learn":[0.3436000813],"iteration":1254,"passed_time":270.5485536,"remaining_time":52.8162515,"test":[0.5223488234]}, -{"learn":[0.3435104423],"iteration":1255,"passed_time":270.788195,"remaining_time":52.60534998,"test":[0.5223727306]}, -{"learn":[0.3433409894],"iteration":1256,"passed_time":271.0035071,"remaining_time":52.38969947,"test":[0.5223960391]}, -{"learn":[0.3431781391],"iteration":1257,"passed_time":271.2145679,"remaining_time":52.17323166,"test":[0.5224503591]}, -{"learn":[0.3430472198],"iteration":1258,"passed_time":271.424885,"remaining_time":51.95663008,"test":[0.5224876766]}, -{"learn":[0.3429976728],"iteration":1259,"passed_time":271.6317691,"remaining_time":51.73938458,"test":[0.5224826876]}, -{"learn":[0.3428691833],"iteration":1260,"passed_time":271.8497143,"remaining_time":51.52425196,"test":[0.5224706742]}, -{"learn":[0.3427937534],"iteration":1261,"passed_time":272.0617017,"remaining_time":51.3079913,"test":[0.5224641686]}, -{"learn":[0.3426756434],"iteration":1262,"passed_time":272.2745672,"remaining_time":51.09190215,"test":[0.522417791]}, -{"learn":[0.3426158225],"iteration":1263,"passed_time":272.4794756,"remaining_time":50.87433247,"test":[0.5224382658]}, -{"learn":[0.3425187621],"iteration":1264,"passed_time":272.6929219,"remaining_time":50.65836888,"test":[0.5223804336]}, -{"learn":[0.3424641706],"iteration":1265,"passed_time":272.9062428,"remaining_time":50.44238611,"test":[0.5223896931]}, -{"learn":[0.3423682986],"iteration":1266,"passed_time":273.1171346,"remaining_time":50.22596082,"test":[0.5223926865]}, -{"learn":[0.3422603569],"iteration":1267,"passed_time":273.3215509,"remaining_time":50.00835946,"test":[0.5223582027]}, -{"learn":[0.3422038902],"iteration":1268,"passed_time":273.5265245,"remaining_time":49.79088036,"test":[0.5223638302]}, -{"learn":[0.3421232574],"iteration":1269,"passed_time":273.7341371,"remaining_time":49.57389884,"test":[0.5223421581]}, -{"learn":[0.3419796872],"iteration":1270,"passed_time":273.9911612,"remaining_time":49.36583471,"test":[0.5223780389]}, -{"learn":[0.3419036235],"iteration":1271,"passed_time":274.1967877,"remaining_time":49.14848082,"test":[0.5223708946]}, -{"learn":[0.341863426],"iteration":1272,"passed_time":274.4032219,"remaining_time":48.93128937,"test":[0.5223709346]}, -{"learn":[0.3417600797],"iteration":1273,"passed_time":274.613729,"remaining_time":48.71483732,"test":[0.5224034627]}, -{"learn":[0.3416898529],"iteration":1274,"passed_time":274.84845,"remaining_time":48.50266765,"test":[0.522403782]}, -{"learn":[0.341629134],"iteration":1275,"passed_time":275.0593499,"remaining_time":48.28628085,"test":[0.5223825888]}, -{"learn":[0.3415635555],"iteration":1276,"passed_time":275.2651052,"remaining_time":48.06900428,"test":[0.5223837862]}, -{"learn":[0.3415005124],"iteration":1277,"passed_time":275.4725137,"remaining_time":47.8520329,"test":[0.5223907308]}, -{"learn":[0.3413679292],"iteration":1278,"passed_time":275.7171265,"remaining_time":47.64150505,"test":[0.5224157954]}, -{"learn":[0.3413072367],"iteration":1279,"passed_time":275.9291712,"remaining_time":47.4253263,"test":[0.5224107665]}, -{"learn":[0.341213821],"iteration":1280,"passed_time":276.1418241,"remaining_time":47.20925799,"test":[0.5224256137]}, -{"learn":[0.3411239444],"iteration":1281,"passed_time":276.3482563,"remaining_time":46.99213718,"test":[0.5224228598]}, -{"learn":[0.3410302382],"iteration":1282,"passed_time":276.5550359,"remaining_time":46.7750918,"test":[0.5224507582]}, -{"learn":[0.3409716057],"iteration":1283,"passed_time":276.7614516,"remaining_time":46.55800121,"test":[0.5224904305]}, -{"learn":[0.3408919238],"iteration":1284,"passed_time":276.9641632,"remaining_time":46.34030747,"test":[0.5225057567]}, -{"learn":[0.3408205348],"iteration":1285,"passed_time":277.1741586,"remaining_time":46.1238491,"test":[0.5225224797]}, -{"learn":[0.3407168452],"iteration":1286,"passed_time":277.3816343,"remaining_time":45.90698377,"test":[0.5225299832]}, -{"learn":[0.3406713391],"iteration":1287,"passed_time":277.5844662,"remaining_time":45.68936866,"test":[0.5225037611]}, -{"learn":[0.3405330511],"iteration":1288,"passed_time":277.7997569,"remaining_time":45.47381591,"test":[0.5224944217]}, -{"learn":[0.3404472418],"iteration":1289,"passed_time":278.014954,"remaining_time":45.25824832,"test":[0.5224848828]}, -{"learn":[0.3403912504],"iteration":1290,"passed_time":278.2521847,"remaining_time":45.04624833,"test":[0.5224814903]}, -{"learn":[0.340241817],"iteration":1291,"passed_time":278.4700862,"remaining_time":44.83109746,"test":[0.5225165728]}, -{"learn":[0.340131287],"iteration":1292,"passed_time":278.6800121,"remaining_time":44.61466551,"test":[0.5225226793]}, -{"learn":[0.3399558915],"iteration":1293,"passed_time":278.9163447,"remaining_time":44.40244746,"test":[0.522518728]}, -{"learn":[0.3398570087],"iteration":1294,"passed_time":279.1274959,"remaining_time":44.18620591,"test":[0.5225469457]}, -{"learn":[0.3397680037],"iteration":1295,"passed_time":279.3377214,"remaining_time":43.96982652,"test":[0.5225301428]}, -{"learn":[0.3396487316],"iteration":1296,"passed_time":279.5640069,"remaining_time":43.75597024,"test":[0.5225059562]}, -{"learn":[0.3395986035],"iteration":1297,"passed_time":279.7677695,"remaining_time":43.53858971,"test":[0.5225126614]}, -{"learn":[0.339428728],"iteration":1298,"passed_time":279.9826926,"remaining_time":43.32295705,"test":[0.5225290652]}, -{"learn":[0.3393526379],"iteration":1299,"passed_time":280.1942427,"remaining_time":43.10680657,"test":[0.5225134597]}, -{"learn":[0.3392952996],"iteration":1300,"passed_time":280.402731,"remaining_time":42.89019482,"test":[0.5225152956]}, -{"learn":[0.3392205301],"iteration":1301,"passed_time":280.6086807,"remaining_time":42.6732095,"test":[0.5225192469]}, -{"learn":[0.3391168141],"iteration":1302,"passed_time":280.8185304,"remaining_time":42.45683077,"test":[0.5225120228]}, -{"learn":[0.3389963799],"iteration":1303,"passed_time":281.0307035,"remaining_time":42.24081127,"test":[0.5225123022]}, -{"learn":[0.3388871704],"iteration":1304,"passed_time":281.2463184,"remaining_time":42.02531195,"test":[0.5225166127]}, -{"learn":[0.3387812887],"iteration":1305,"passed_time":281.4548653,"remaining_time":41.80876254,"test":[0.5224720312]}, -{"learn":[0.3386707851],"iteration":1306,"passed_time":281.6683441,"remaining_time":41.59295365,"test":[0.5224480841]}, -{"learn":[0.3386314591],"iteration":1307,"passed_time":281.873229,"remaining_time":41.37588683,"test":[0.5224393833]}, -{"learn":[0.3385645336],"iteration":1308,"passed_time":282.0789702,"remaining_time":41.15896356,"test":[0.5224219818]}, -{"learn":[0.3384171339],"iteration":1309,"passed_time":282.322389,"remaining_time":40.94752207,"test":[0.5223980347]}, -{"learn":[0.3383085846],"iteration":1310,"passed_time":282.5370335,"remaining_time":40.73188355,"test":[0.5223830278]}, -{"learn":[0.3382448285],"iteration":1311,"passed_time":282.7472885,"remaining_time":40.51561755,"test":[0.5223801143]}, -{"learn":[0.3381088118],"iteration":1312,"passed_time":282.9632617,"remaining_time":40.30017513,"test":[0.5224185893]}, -{"learn":[0.337922984],"iteration":1313,"passed_time":283.2115933,"remaining_time":40.0893123,"test":[0.5223885756]}, -{"learn":[0.337836356],"iteration":1314,"passed_time":283.4227874,"remaining_time":39.87316781,"test":[0.5223995513]}, -{"learn":[0.3377290745],"iteration":1315,"passed_time":283.6336766,"remaining_time":39.65698822,"test":[0.5224151568]}, -{"learn":[0.337671657],"iteration":1316,"passed_time":283.8373019,"remaining_time":39.43980733,"test":[0.5224277291]}, -{"learn":[0.3376403599],"iteration":1317,"passed_time":284.043653,"remaining_time":39.22302341,"test":[0.5224325584]}, -{"learn":[0.3374833465],"iteration":1318,"passed_time":284.2985659,"remaining_time":39.0129192,"test":[0.5224520354]}, -{"learn":[0.3374192206],"iteration":1319,"passed_time":284.5088783,"remaining_time":38.79666522,"test":[0.5224646475]}, -{"learn":[0.3373553588],"iteration":1320,"passed_time":284.7252897,"remaining_time":38.58124667,"test":[0.5224745057]}, -{"learn":[0.3372769446],"iteration":1321,"passed_time":284.9566277,"remaining_time":38.36783641,"test":[0.5224886345]}, -{"learn":[0.3371770318],"iteration":1322,"passed_time":285.169962,"remaining_time":38.15199038,"test":[0.5225155351]}, -{"learn":[0.3370968744],"iteration":1323,"passed_time":285.3761326,"remaining_time":37.93519588,"test":[0.5224937033]}, -{"learn":[0.3369890647],"iteration":1324,"passed_time":285.5937524,"remaining_time":37.71992956,"test":[0.5225292647]}, -{"learn":[0.3369427398],"iteration":1325,"passed_time":285.7979355,"remaining_time":37.50289652,"test":[0.5225556065]}, -{"learn":[0.3368575379],"iteration":1326,"passed_time":286.0074815,"remaining_time":37.28658198,"test":[0.5225476242]}, -{"learn":[0.3367710683],"iteration":1327,"passed_time":286.2175958,"remaining_time":37.07035126,"test":[0.5225774383]}, -{"learn":[0.3366422618],"iteration":1328,"passed_time":286.4635183,"remaining_time":36.85873712,"test":[0.5225951592]}, -{"learn":[0.3365308602],"iteration":1329,"passed_time":286.6759783,"remaining_time":36.64279422,"test":[0.5225939219]}, -{"learn":[0.3364610296],"iteration":1330,"passed_time":286.8730023,"remaining_time":36.42489661,"test":[0.522584383]}, -{"learn":[0.3363111207],"iteration":1331,"passed_time":287.1111193,"remaining_time":36.21221324,"test":[0.5225664226]}, -{"learn":[0.3362267112],"iteration":1332,"passed_time":287.3549287,"remaining_time":36.00020487,"test":[0.5225569236]}, -{"learn":[0.336146633],"iteration":1333,"passed_time":287.5630534,"remaining_time":35.78370829,"test":[0.5226093678]}, -{"learn":[0.3360918302],"iteration":1334,"passed_time":287.7693825,"remaining_time":35.56700233,"test":[0.5225747243]}, -{"learn":[0.3359925248],"iteration":1335,"passed_time":287.9874718,"remaining_time":35.35175552,"test":[0.5225727287]}, -{"learn":[0.3359524065],"iteration":1336,"passed_time":288.1896594,"remaining_time":35.13456581,"test":[0.5225611144]}, -{"learn":[0.3358285918],"iteration":1337,"passed_time":288.4093731,"remaining_time":34.91952051,"test":[0.5225889329]}, -{"learn":[0.3357373418],"iteration":1338,"passed_time":288.6150459,"remaining_time":34.70277997,"test":[0.5226014652]}, -{"learn":[0.3356392777],"iteration":1339,"passed_time":288.8289039,"remaining_time":34.4870333,"test":[0.5226008266]}, -{"learn":[0.3355216431],"iteration":1340,"passed_time":289.043649,"remaining_time":34.27139462,"test":[0.5226172703]}, -{"learn":[0.3354703266],"iteration":1341,"passed_time":289.248603,"remaining_time":34.05460452,"test":[0.5226396209]}, -{"learn":[0.3354137278],"iteration":1342,"passed_time":289.4557556,"remaining_time":33.83808908,"test":[0.5226857989]}, -{"learn":[0.3352910223],"iteration":1343,"passed_time":289.6742031,"remaining_time":33.62289857,"test":[0.5226770582]}, -{"learn":[0.3352410263],"iteration":1344,"passed_time":289.8759962,"remaining_time":33.40578395,"test":[0.5227019233]}, -{"learn":[0.3351337184],"iteration":1345,"passed_time":290.0826476,"remaining_time":33.18924794,"test":[0.5227172095]}, -{"learn":[0.3350811605],"iteration":1346,"passed_time":290.2887515,"remaining_time":32.97266442,"test":[0.5226976128]}, -{"learn":[0.3350021124],"iteration":1347,"passed_time":290.5760981,"remaining_time":32.76525735,"test":[0.5227091074]}, -{"learn":[0.3349181254],"iteration":1348,"passed_time":290.7945691,"remaining_time":32.55002219,"test":[0.5226950584]}, -{"learn":[0.3347808674],"iteration":1349,"passed_time":291.0083556,"remaining_time":32.33426173,"test":[0.5226820073]}, -{"learn":[0.33467385],"iteration":1350,"passed_time":291.2342383,"remaining_time":32.11983828,"test":[0.5226631689]}, -{"learn":[0.3346003218],"iteration":1351,"passed_time":291.526617,"remaining_time":31.91267701,"test":[0.5226591777]}, -{"learn":[0.3344930667],"iteration":1352,"passed_time":291.737853,"remaining_time":31.69657383,"test":[0.5226456476]}, -{"learn":[0.3343413091],"iteration":1353,"passed_time":291.9748693,"remaining_time":31.48325769,"test":[0.5225884141]}, -{"learn":[0.3342185244],"iteration":1354,"passed_time":292.1870007,"remaining_time":31.26724361,"test":[0.5225520544]}, -{"learn":[0.3340889784],"iteration":1355,"passed_time":292.393064,"remaining_time":31.05059087,"test":[0.5225166925]}, -{"learn":[0.3340138392],"iteration":1356,"passed_time":292.6068314,"remaining_time":30.83476558,"test":[0.5225146171]}, -{"learn":[0.333896363],"iteration":1357,"passed_time":292.8177421,"remaining_time":30.61864461,"test":[0.5224650466]}, -{"learn":[0.3338261098],"iteration":1358,"passed_time":293.0268397,"remaining_time":30.40234319,"test":[0.5224844837]}, -{"learn":[0.3337807093],"iteration":1359,"passed_time":293.2296511,"remaining_time":30.18540526,"test":[0.5224537516]}, -{"learn":[0.3336794495],"iteration":1360,"passed_time":293.4419718,"remaining_time":29.96945928,"test":[0.5224488823]}, -{"learn":[0.3335516731],"iteration":1361,"passed_time":293.6499531,"remaining_time":29.75307895,"test":[0.5224673615]}, -{"learn":[0.3334976362],"iteration":1362,"passed_time":293.8538324,"remaining_time":29.53629863,"test":[0.5224695167]}, -{"learn":[0.3334466365],"iteration":1363,"passed_time":294.0626608,"remaining_time":29.32003069,"test":[0.522469836]}, -{"learn":[0.3332702903],"iteration":1364,"passed_time":294.2911383,"remaining_time":29.10571697,"test":[0.5224326781]}, -{"learn":[0.3331880728],"iteration":1365,"passed_time":294.501782,"remaining_time":28.88963308,"test":[0.5224494012]}, -{"learn":[0.3331237356],"iteration":1366,"passed_time":294.7799752,"remaining_time":28.68012926,"test":[0.5224741864]}, -{"learn":[0.3330643109],"iteration":1367,"passed_time":294.9890327,"remaining_time":28.46385403,"test":[0.5224976546]}, -{"learn":[0.3330009509],"iteration":1368,"passed_time":295.1979598,"remaining_time":28.24757687,"test":[0.5224852819]}, -{"learn":[0.3329285319],"iteration":1369,"passed_time":295.4368561,"remaining_time":28.03415423,"test":[0.5225218012]}, -{"learn":[0.3328636137],"iteration":1370,"passed_time":295.6987788,"remaining_time":27.82286103,"test":[0.5224939428]}, -{"learn":[0.3327922776],"iteration":1371,"passed_time":295.9120334,"remaining_time":27.60695355,"test":[0.5224878363]}, -{"learn":[0.3326889314],"iteration":1372,"passed_time":296.1279894,"remaining_time":27.39129982,"test":[0.5225030427]}, -{"learn":[0.3326080873],"iteration":1373,"passed_time":296.3348276,"remaining_time":27.17480952,"test":[0.5225407194]}, -{"learn":[0.3325447273],"iteration":1374,"passed_time":296.5419002,"remaining_time":26.95835457,"test":[0.5225311406]}, -{"learn":[0.3325160449],"iteration":1375,"passed_time":296.7527055,"remaining_time":26.74224963,"test":[0.5225275884]}, -{"learn":[0.3324560127],"iteration":1376,"passed_time":296.9991907,"remaining_time":26.52933948,"test":[0.5225325774]}, -{"learn":[0.3323354994],"iteration":1377,"passed_time":297.2104935,"remaining_time":26.31326576,"test":[0.5225284266]}, -{"learn":[0.3322758897],"iteration":1378,"passed_time":297.4201103,"remaining_time":26.09705101,"test":[0.5225334555]}, -{"learn":[0.3322166763],"iteration":1379,"passed_time":297.623426,"remaining_time":25.88029791,"test":[0.5225407993]}, -{"learn":[0.3320972985],"iteration":1380,"passed_time":297.8461336,"remaining_time":25.66523527,"test":[0.5225504579]}, -{"learn":[0.3320257511],"iteration":1381,"passed_time":298.0664049,"remaining_time":25.44995353,"test":[0.5225496996]}, -{"learn":[0.3319777095],"iteration":1382,"passed_time":298.2687183,"remaining_time":25.23314537,"test":[0.5225269499]}, -{"learn":[0.3318514121],"iteration":1383,"passed_time":298.4834342,"remaining_time":25.01739766,"test":[0.5225244354]}, -{"learn":[0.3317970319],"iteration":1384,"passed_time":298.7123803,"remaining_time":24.80283303,"test":[0.522530502]}, -{"learn":[0.3317440514],"iteration":1385,"passed_time":298.9797612,"remaining_time":24.59140893,"test":[0.5225093487]}, -{"learn":[0.3316090384],"iteration":1386,"passed_time":299.1993832,"remaining_time":24.37601319,"test":[0.5224567051]}, -{"learn":[0.3314799678],"iteration":1387,"passed_time":299.4110078,"remaining_time":24.15996604,"test":[0.5224365895]}, -{"learn":[0.3313398839],"iteration":1388,"passed_time":299.696397,"remaining_time":23.94982007,"test":[0.5223975956]}, -{"learn":[0.3312634769],"iteration":1389,"passed_time":299.9092362,"remaining_time":23.73382445,"test":[0.5223981943]}, -{"learn":[0.3311515735],"iteration":1390,"passed_time":300.129466,"remaining_time":23.5184125,"test":[0.5224040614]}, -{"learn":[0.3310364743],"iteration":1391,"passed_time":300.345027,"remaining_time":23.3026314,"test":[0.5224112455]}, -{"learn":[0.3309221675],"iteration":1392,"passed_time":300.5622683,"remaining_time":23.08697969,"test":[0.5224052188]}, -{"learn":[0.330857936],"iteration":1393,"passed_time":300.7637745,"remaining_time":22.8701292,"test":[0.5224212234]}, -{"learn":[0.3307400373],"iteration":1394,"passed_time":300.9819979,"remaining_time":22.65455898,"test":[0.5224439333]}, -{"learn":[0.3304451585],"iteration":1395,"passed_time":301.2169072,"remaining_time":22.44022804,"test":[0.5225019251]}, -{"learn":[0.3302972833],"iteration":1396,"passed_time":301.4398197,"remaining_time":22.22498313,"test":[0.522484803]}, -{"learn":[0.3301715141],"iteration":1397,"passed_time":301.6500364,"remaining_time":22.00880094,"test":[0.5224358312]}, -{"learn":[0.3301201447],"iteration":1398,"passed_time":301.8531751,"remaining_time":21.79211629,"test":[0.5224543902]}, -{"learn":[0.3299773668],"iteration":1399,"passed_time":302.0691218,"remaining_time":21.57636584,"test":[0.5224473258]}, -{"learn":[0.3298368339],"iteration":1400,"passed_time":302.281523,"remaining_time":21.36036458,"test":[0.5224643681]}, -{"learn":[0.329678632],"iteration":1401,"passed_time":302.4940246,"remaining_time":21.14437547,"test":[0.5224336759]}, -{"learn":[0.3295973918],"iteration":1402,"passed_time":302.7045977,"remaining_time":20.928258,"test":[0.5224694768]}, -{"learn":[0.3294485658],"iteration":1403,"passed_time":302.9548237,"remaining_time":20.71485974,"test":[0.5224529134]}, -{"learn":[0.3293563914],"iteration":1404,"passed_time":303.2025785,"remaining_time":20.50124196,"test":[0.5224777386]}, -{"learn":[0.3292805918],"iteration":1405,"passed_time":303.4125506,"remaining_time":20.28504962,"test":[0.5224812508]}, -{"learn":[0.3291836371],"iteration":1406,"passed_time":303.621855,"remaining_time":20.06882197,"test":[0.5224984528]}, -{"learn":[0.32907831],"iteration":1407,"passed_time":303.8603756,"remaining_time":19.85451318,"test":[0.5225105461]}, -{"learn":[0.328999658],"iteration":1408,"passed_time":304.0696421,"remaining_time":19.63828065,"test":[0.5225276284]}, -{"learn":[0.3288077557],"iteration":1409,"passed_time":304.3221096,"remaining_time":19.42481551,"test":[0.5225290253]}, -{"learn":[0.3286868197],"iteration":1410,"passed_time":304.5314236,"remaining_time":19.20857314,"test":[0.5225562052]}, -{"learn":[0.3285791685],"iteration":1411,"passed_time":304.7441674,"remaining_time":18.99255434,"test":[0.5224901911]}, -{"learn":[0.3284545614],"iteration":1412,"passed_time":304.9710344,"remaining_time":18.77740976,"test":[0.5225068742]}, -{"learn":[0.3283906204],"iteration":1413,"passed_time":305.174387,"remaining_time":18.56081844,"test":[0.522521442]}, -{"learn":[0.3282693411],"iteration":1414,"passed_time":305.3857933,"remaining_time":18.34472963,"test":[0.522530981]}, -{"learn":[0.3282179981],"iteration":1415,"passed_time":305.5977726,"remaining_time":18.12868143,"test":[0.5225297836]}, -{"learn":[0.3280556233],"iteration":1416,"passed_time":305.8125928,"remaining_time":17.91280537,"test":[0.5225751633]}, -{"learn":[0.3279876413],"iteration":1417,"passed_time":306.0174947,"remaining_time":17.69635724,"test":[0.5225968355]}, -{"learn":[0.3279144301],"iteration":1418,"passed_time":306.223877,"remaining_time":17.48000989,"test":[0.5225970749]}, -{"learn":[0.3278193769],"iteration":1419,"passed_time":306.4350859,"remaining_time":17.2639485,"test":[0.5226357096]}, -{"learn":[0.3277440527],"iteration":1420,"passed_time":306.6435983,"remaining_time":17.04774403,"test":[0.5226497585]}, -{"learn":[0.3276547835],"iteration":1421,"passed_time":306.8513857,"remaining_time":16.83151061,"test":[0.5226541887]}, -{"learn":[0.3274946536],"iteration":1422,"passed_time":307.0960604,"remaining_time":16.61728507,"test":[0.5226263702]}, -{"learn":[0.3273700201],"iteration":1423,"passed_time":307.3409944,"remaining_time":16.4030306,"test":[0.5226520734]}, -{"learn":[0.327228959],"iteration":1424,"passed_time":307.5555592,"remaining_time":16.18713469,"test":[0.5226992891]}, -{"learn":[0.3271324003],"iteration":1425,"passed_time":307.7750913,"remaining_time":15.97149843,"test":[0.5226913067]}, -{"learn":[0.3270226626],"iteration":1426,"passed_time":308.0100208,"remaining_time":15.75664437,"test":[0.5227205621]}, -{"learn":[0.3269123439],"iteration":1427,"passed_time":308.2217184,"remaining_time":15.54059084,"test":[0.5226791735]}, -{"learn":[0.3268822089],"iteration":1428,"passed_time":308.4272594,"remaining_time":15.32423752,"test":[0.5226790937]}, -{"learn":[0.3267487806],"iteration":1429,"passed_time":308.6433509,"remaining_time":15.10841578,"test":[0.5226998878]}, -{"learn":[0.3266500563],"iteration":1430,"passed_time":308.8532646,"remaining_time":14.89229578,"test":[0.522676699]}, -{"learn":[0.3266102285],"iteration":1431,"passed_time":309.0607132,"remaining_time":14.67606739,"test":[0.5226823266]}, -{"learn":[0.3265353269],"iteration":1432,"passed_time":309.2724901,"remaining_time":14.46005362,"test":[0.5226981317]}, -{"learn":[0.3264585501],"iteration":1433,"passed_time":309.4764405,"remaining_time":14.24368555,"test":[0.5227310988]}, -{"learn":[0.3263594032],"iteration":1434,"passed_time":309.6848972,"remaining_time":14.0275389,"test":[0.5227474228]}, -{"learn":[0.3262604148],"iteration":1435,"passed_time":309.8930282,"remaining_time":13.81138844,"test":[0.5227040785]}, -{"learn":[0.3261962361],"iteration":1436,"passed_time":310.0991937,"remaining_time":13.59516298,"test":[0.522732376]}, -{"learn":[0.3260837516],"iteration":1437,"passed_time":310.316313,"remaining_time":13.37942379,"test":[0.5227393606]}, -{"learn":[0.3260159017],"iteration":1438,"passed_time":310.5473514,"remaining_time":13.16427272,"test":[0.5227306598]}, -{"learn":[0.3259443279],"iteration":1439,"passed_time":310.7534395,"remaining_time":12.94805998,"test":[0.5227079899]}, -{"learn":[0.3258903703],"iteration":1440,"passed_time":310.9588093,"remaining_time":12.73183189,"test":[0.5227443895]}, -{"learn":[0.3257951322],"iteration":1441,"passed_time":311.1697654,"remaining_time":12.51584355,"test":[0.5227568819]}, -{"learn":[0.3257440797],"iteration":1442,"passed_time":311.4107074,"remaining_time":12.30104666,"test":[0.5227605937]}, -{"learn":[0.3255723026],"iteration":1443,"passed_time":311.6339267,"remaining_time":12.08552624,"test":[0.5227555249]}, -{"learn":[0.3254667114],"iteration":1444,"passed_time":311.8490146,"remaining_time":11.86968567,"test":[0.5227543275]}, -{"learn":[0.3253797136],"iteration":1445,"passed_time":312.122953,"remaining_time":11.65604389,"test":[0.5227604739]}, -{"learn":[0.3253091962],"iteration":1446,"passed_time":312.3252589,"remaining_time":11.43969504,"test":[0.5227562832]}, -{"learn":[0.3252414256],"iteration":1447,"passed_time":312.5388542,"remaining_time":11.22377101,"test":[0.5227591967]}, -{"learn":[0.3251340649],"iteration":1448,"passed_time":312.7461847,"remaining_time":11.00762969,"test":[0.5227570415]}, -{"learn":[0.3250342577],"iteration":1449,"passed_time":312.9544272,"remaining_time":10.79153197,"test":[0.5227706514]}, -{"learn":[0.3249046325],"iteration":1450,"passed_time":313.1626957,"remaining_time":10.57544596,"test":[0.5227881727]}, -{"learn":[0.3248216227],"iteration":1451,"passed_time":313.3666672,"remaining_time":10.35922867,"test":[0.5227855785]}, -{"learn":[0.3247304784],"iteration":1452,"passed_time":313.5776678,"remaining_time":10.1432556,"test":[0.5228232552]}, -{"learn":[0.3246517472],"iteration":1453,"passed_time":313.7863409,"remaining_time":9.927215738,"test":[0.522807969]}, -{"learn":[0.3245258988],"iteration":1454,"passed_time":314.0031472,"remaining_time":9.711437543,"test":[0.5228229758]}, -{"learn":[0.3244441303],"iteration":1455,"passed_time":314.2116936,"remaining_time":9.495408324,"test":[0.522847801]}, -{"learn":[0.3243161954],"iteration":1456,"passed_time":314.4206246,"remaining_time":9.279400725,"test":[0.5228573399]}, -{"learn":[0.3242675464],"iteration":1457,"passed_time":314.6364749,"remaining_time":9.063602156,"test":[0.5228534285]}, -{"learn":[0.3241622457],"iteration":1458,"passed_time":314.8410742,"remaining_time":8.847487348,"test":[0.5228311178]}, -{"learn":[0.3240891929],"iteration":1459,"passed_time":315.0506468,"remaining_time":8.63152457,"test":[0.5228608921]}, -{"learn":[0.3239984711],"iteration":1460,"passed_time":315.261468,"remaining_time":8.41560387,"test":[0.5228640052]}, -{"learn":[0.3239369335],"iteration":1461,"passed_time":315.5219508,"remaining_time":8.200980937,"test":[0.5228228162]}, -{"learn":[0.3238837681],"iteration":1462,"passed_time":315.7269125,"remaining_time":7.984891156,"test":[0.5228067716]}, -{"learn":[0.3237626737],"iteration":1463,"passed_time":315.9373827,"remaining_time":7.768952033,"test":[0.5227906473]}, -{"learn":[0.3237011097],"iteration":1464,"passed_time":316.1859101,"remaining_time":7.553929592,"test":[0.5228282043]}, -{"learn":[0.3236160398],"iteration":1465,"passed_time":316.4474409,"remaining_time":7.339163022,"test":[0.5228321156]}, -{"learn":[0.3234807099],"iteration":1466,"passed_time":316.6776319,"remaining_time":7.123627712,"test":[0.5228011042]}, -{"learn":[0.3233412334],"iteration":1467,"passed_time":316.8932024,"remaining_time":6.907753731,"test":[0.5227596757]}, -{"learn":[0.3232728289],"iteration":1468,"passed_time":317.0942199,"remaining_time":6.691573054,"test":[0.5227864964]}, -{"learn":[0.3231662341],"iteration":1469,"passed_time":317.2964207,"remaining_time":6.475437157,"test":[0.522804337]}, -{"learn":[0.3230838582],"iteration":1470,"passed_time":317.5005892,"remaining_time":6.259358998,"test":[0.5227922038]}, -{"learn":[0.3229885937],"iteration":1471,"passed_time":317.7123934,"remaining_time":6.043442267,"test":[0.5227614717]}, -{"learn":[0.3229019392],"iteration":1472,"passed_time":317.9169104,"remaining_time":5.827397542,"test":[0.5227643454]}, -{"learn":[0.3227772793],"iteration":1473,"passed_time":318.1220519,"remaining_time":5.611379476,"test":[0.5227873745]}, -{"learn":[0.3227256194],"iteration":1474,"passed_time":318.3314785,"remaining_time":5.395448788,"test":[0.5227947981]}, -{"learn":[0.3225626107],"iteration":1475,"passed_time":318.5482775,"remaining_time":5.179646789,"test":[0.5227910065]}, -{"learn":[0.3224765901],"iteration":1476,"passed_time":318.756228,"remaining_time":4.963705649,"test":[0.5228127983]}, -{"learn":[0.322374538],"iteration":1477,"passed_time":318.9682749,"remaining_time":4.747836298,"test":[0.5227587178]}, -{"learn":[0.3223118383],"iteration":1478,"passed_time":319.1781755,"remaining_time":4.53194164,"test":[0.5227407575]}, -{"learn":[0.3220839906],"iteration":1479,"passed_time":319.3979737,"remaining_time":4.316188834,"test":[0.5227621103]}, -{"learn":[0.3218702464],"iteration":1480,"passed_time":319.6635298,"remaining_time":4.1010176,"test":[0.5227571213]}, -{"learn":[0.321744662],"iteration":1481,"passed_time":319.8762253,"remaining_time":3.885136339,"test":[0.522802062]}, -{"learn":[0.3216461754],"iteration":1482,"passed_time":320.0921879,"remaining_time":3.669296827,"test":[0.5227956362]}, -{"learn":[0.3215251866],"iteration":1483,"passed_time":320.3509711,"remaining_time":3.453918826,"test":[0.5228301999]}, -{"learn":[0.3214138115],"iteration":1484,"passed_time":320.6198915,"remaining_time":3.238584762,"test":[0.5228279648]}, -{"learn":[0.3213447467],"iteration":1485,"passed_time":320.8202301,"remaining_time":3.02253245,"test":[0.522830599]}, -{"learn":[0.3212964938],"iteration":1486,"passed_time":321.0234615,"remaining_time":2.806526563,"test":[0.5228628078]}, -{"learn":[0.3211394276],"iteration":1487,"passed_time":321.2396055,"remaining_time":2.59064198,"test":[0.5228485194]}, -{"learn":[0.3210096967],"iteration":1488,"passed_time":321.4532479,"remaining_time":2.374738568,"test":[0.522849158]}, -{"learn":[0.3208561432],"iteration":1489,"passed_time":321.6650031,"remaining_time":2.158825524,"test":[0.522936046]}, -{"learn":[0.3207208661],"iteration":1490,"passed_time":321.8785131,"remaining_time":1.94292865,"test":[0.5229625076]}, -{"learn":[0.3206321515],"iteration":1491,"passed_time":322.0851827,"remaining_time":1.726998299,"test":[0.5229384806]}, -{"learn":[0.3204965574],"iteration":1492,"passed_time":322.2976204,"remaining_time":1.511107396,"test":[0.5229258286]}, -{"learn":[0.3204094804],"iteration":1493,"passed_time":322.507316,"remaining_time":1.295210104,"test":[0.5229270259]}, -{"learn":[0.3202664384],"iteration":1494,"passed_time":322.7183893,"remaining_time":1.079325717,"test":[0.5229277044]}, -{"learn":[0.3201563838],"iteration":1495,"passed_time":322.9363376,"remaining_time":0.8634661432,"test":[0.5228682358]}, -{"learn":[0.3200708385],"iteration":1496,"passed_time":323.1425733,"remaining_time":0.6475803073,"test":[0.5228877926]}, -{"learn":[0.3199812524],"iteration":1497,"passed_time":323.3600994,"remaining_time":0.4317224292,"test":[0.5228538277]}, -{"learn":[0.3198767705],"iteration":1498,"passed_time":323.5670165,"remaining_time":0.2158552478,"test":[0.5228723867]}, -{"learn":[0.3197977224],"iteration":1499,"passed_time":323.8423328,"remaining_time":0,"test":[0.5228569807]} +{"learn":[0.6887138297],"iteration":0,"passed_time":0.3283017459,"remaining_time":492.1243171,"test":[0.6894516063]}, +{"learn":[0.6843872854],"iteration":1,"passed_time":0.5412330504,"remaining_time":405.3835548,"test":[0.6855813377]}, +{"learn":[0.6802627852],"iteration":2,"passed_time":0.7661538569,"remaining_time":382.3107746,"test":[0.6821273883]}, +{"learn":[0.6762009319],"iteration":3,"passed_time":0.9717496059,"remaining_time":363.4343526,"test":[0.6785411841]}, +{"learn":[0.6723192545],"iteration":4,"passed_time":1.011827525,"remaining_time":302.5364299,"test":[0.6752505378]}, +{"learn":[0.6682080654],"iteration":5,"passed_time":1.217885731,"remaining_time":303.2535469,"test":[0.6727377765]}, +{"learn":[0.6642342664],"iteration":6,"passed_time":1.441465382,"remaining_time":307.4439736,"test":[0.6695439468]}, +{"learn":[0.66040895],"iteration":7,"passed_time":1.64633775,"remaining_time":307.0419905,"test":[0.6666962384]}, +{"learn":[0.6567665034],"iteration":8,"passed_time":1.849458815,"remaining_time":306.393677,"test":[0.6635423965]}, +{"learn":[0.6530918354],"iteration":9,"passed_time":2.053251668,"remaining_time":305.9344986,"test":[0.660442949]}, +{"learn":[0.6495993504],"iteration":10,"passed_time":2.263635072,"remaining_time":306.4138747,"test":[0.6580995967]}, +{"learn":[0.6459855333],"iteration":11,"passed_time":2.472919541,"remaining_time":306.6420231,"test":[0.6556190011]}, +{"learn":[0.6426157539],"iteration":12,"passed_time":2.67784142,"remaining_time":306.3038609,"test":[0.6533186696]}, +{"learn":[0.6392258492],"iteration":13,"passed_time":2.882790995,"remaining_time":305.9876727,"test":[0.6512931438]}, +{"learn":[0.6358979576],"iteration":14,"passed_time":3.046402744,"remaining_time":301.5938717,"test":[0.6483627862]}, +{"learn":[0.6326337693],"iteration":15,"passed_time":3.264037094,"remaining_time":302.7394404,"test":[0.6462357347]}, +{"learn":[0.6296338495],"iteration":16,"passed_time":3.366605155,"remaining_time":293.6867909,"test":[0.6434692389]}, +{"learn":[0.6265263841],"iteration":17,"passed_time":3.47312979,"remaining_time":285.9543527,"test":[0.6415187001]}, +{"learn":[0.6235141039],"iteration":18,"passed_time":3.687781647,"remaining_time":287.4528747,"test":[0.6387646556]}, +{"learn":[0.6205433947],"iteration":19,"passed_time":3.900772605,"remaining_time":288.6571728,"test":[0.6368737392]}, +{"learn":[0.6175789713],"iteration":20,"passed_time":4.11289922,"remaining_time":289.6656165,"test":[0.63471105]}, +{"learn":[0.6147449654],"iteration":21,"passed_time":4.336435361,"remaining_time":291.329612,"test":[0.6322352833]}, +{"learn":[0.6119898755],"iteration":22,"passed_time":4.568176784,"remaining_time":293.3563961,"test":[0.6300870008]}, +{"learn":[0.6092233761],"iteration":23,"passed_time":4.771516576,"remaining_time":293.4482694,"test":[0.6275533277]}, +{"learn":[0.6065007718],"iteration":24,"passed_time":4.977668345,"remaining_time":293.6824324,"test":[0.6257390345]}, +{"learn":[0.6037280922],"iteration":25,"passed_time":5.183265264,"remaining_time":293.8512692,"test":[0.6242294781]}, +{"learn":[0.601134849],"iteration":26,"passed_time":5.388370956,"remaining_time":293.965571,"test":[0.6220503069]}, +{"learn":[0.5985698655],"iteration":27,"passed_time":5.594962786,"remaining_time":294.1351865,"test":[0.6199216991]}, +{"learn":[0.5959878205],"iteration":28,"passed_time":5.812528469,"remaining_time":294.8354958,"test":[0.6184262302]}, +{"learn":[0.5935677806],"iteration":29,"passed_time":6.030765446,"remaining_time":295.5075069,"test":[0.6162235133]}, +{"learn":[0.5912109686],"iteration":30,"passed_time":6.241235046,"remaining_time":295.7540091,"test":[0.6141742424]}, +{"learn":[0.5888627138],"iteration":31,"passed_time":6.453729887,"remaining_time":296.0648586,"test":[0.612787722]}, +{"learn":[0.5865621045],"iteration":32,"passed_time":6.668549586,"remaining_time":296.4473407,"test":[0.6108688302]}, +{"learn":[0.5842648229],"iteration":33,"passed_time":6.876600376,"remaining_time":296.502828,"test":[0.6096360351]}, +{"learn":[0.5820778865],"iteration":34,"passed_time":7.081681965,"remaining_time":296.4189737,"test":[0.6077157864]}, +{"learn":[0.5799317814],"iteration":35,"passed_time":7.29476106,"remaining_time":296.6536165,"test":[0.6064107181]}, +{"learn":[0.5777438942],"iteration":36,"passed_time":7.524859693,"remaining_time":297.5370198,"test":[0.6055380919]}, +{"learn":[0.5756289014],"iteration":37,"passed_time":7.731563602,"remaining_time":297.4617365,"test":[0.6043700673]}, +{"learn":[0.5736006422],"iteration":38,"passed_time":7.93719022,"remaining_time":297.3393567,"test":[0.6026869514]}, +{"learn":[0.5715183462],"iteration":39,"passed_time":8.151702311,"remaining_time":297.5371343,"test":[0.6015792676]}, +{"learn":[0.5695853779],"iteration":40,"passed_time":8.357713849,"remaining_time":297.412305,"test":[0.5999813949]}, +{"learn":[0.5676576391],"iteration":41,"passed_time":8.570072235,"remaining_time":297.5039362,"test":[0.5986109974]}, +{"learn":[0.5658429393],"iteration":42,"passed_time":8.811404962,"remaining_time":298.5631867,"test":[0.5973064079]}, +{"learn":[0.5640453538],"iteration":43,"passed_time":9.022088624,"remaining_time":298.5491145,"test":[0.59606619]}, +{"learn":[0.562331544],"iteration":44,"passed_time":9.118700355,"remaining_time":294.8379782,"test":[0.594885355]}, +{"learn":[0.5605908479],"iteration":45,"passed_time":9.336381531,"remaining_time":295.1108423,"test":[0.5939087686]}, +{"learn":[0.5587755142],"iteration":46,"passed_time":9.577714971,"remaining_time":296.0940394,"test":[0.5927287318]}, +{"learn":[0.5569407421],"iteration":47,"passed_time":9.787468675,"remaining_time":296.0709274,"test":[0.591221929]}, +{"learn":[0.5552666016],"iteration":48,"passed_time":9.993026113,"remaining_time":295.9159365,"test":[0.590284173]}, +{"learn":[0.5535532672],"iteration":49,"passed_time":10.2041229,"remaining_time":295.9195641,"test":[0.5892440533]}, +{"learn":[0.5520047375],"iteration":50,"passed_time":10.40516421,"remaining_time":295.6290772,"test":[0.5881410786]}, +{"learn":[0.5504471752],"iteration":51,"passed_time":10.61353144,"remaining_time":295.5460292,"test":[0.5866576219]}, +{"learn":[0.5489185594],"iteration":52,"passed_time":10.8183037,"remaining_time":295.3601029,"test":[0.5855571614]}, +{"learn":[0.5474294544],"iteration":53,"passed_time":11.02925288,"remaining_time":295.3388826,"test":[0.5845544753]}, +{"learn":[0.5459806526],"iteration":54,"passed_time":11.23771307,"remaining_time":295.2453706,"test":[0.583309229]}, +{"learn":[0.5445916453],"iteration":55,"passed_time":11.44450368,"remaining_time":295.1047021,"test":[0.5818972075]}, +{"learn":[0.5431495519],"iteration":56,"passed_time":11.6548216,"remaining_time":295.0510099,"test":[0.580668882]}, +{"learn":[0.5417205055],"iteration":57,"passed_time":11.86014598,"remaining_time":294.8677672,"test":[0.5798167684]}, +{"learn":[0.5403851653],"iteration":58,"passed_time":12.06903795,"remaining_time":294.77091,"test":[0.5785289403]}, +{"learn":[0.5389834808],"iteration":59,"passed_time":12.28734105,"remaining_time":294.8961853,"test":[0.5776724369]}, +{"learn":[0.5377107875],"iteration":60,"passed_time":12.504178,"remaining_time":294.9756088,"test":[0.5765606026]}, +{"learn":[0.5364798765],"iteration":61,"passed_time":12.77687786,"remaining_time":296.341135,"test":[0.5753093701]}, +{"learn":[0.5352338583],"iteration":62,"passed_time":13.01008928,"remaining_time":296.7539412,"test":[0.5742001698]}, +{"learn":[0.5339945486],"iteration":63,"passed_time":13.21914713,"remaining_time":296.6046137,"test":[0.5732021129]}, +{"learn":[0.5327745188],"iteration":64,"passed_time":13.42735441,"remaining_time":296.4346705,"test":[0.5721310646]}, +{"learn":[0.5315706526],"iteration":65,"passed_time":13.63547052,"remaining_time":296.2615867,"test":[0.5711689648]}, +{"learn":[0.5304691555],"iteration":66,"passed_time":13.87096536,"remaining_time":296.6730352,"test":[0.570040489]}, +{"learn":[0.5293499101],"iteration":67,"passed_time":14.07559059,"remaining_time":296.4153782,"test":[0.5690538059]}, +{"learn":[0.528244557],"iteration":68,"passed_time":14.28294464,"remaining_time":296.2158518,"test":[0.5685098612]}, +{"learn":[0.5271158037],"iteration":69,"passed_time":14.48864803,"remaining_time":295.9823813,"test":[0.567835218]}, +{"learn":[0.5260443622],"iteration":70,"passed_time":14.69267194,"remaining_time":295.7158902,"test":[0.5669511382]}, +{"learn":[0.5249990677],"iteration":71,"passed_time":14.90912476,"remaining_time":295.6976411,"test":[0.5659244275]}, +{"learn":[0.5239809237],"iteration":72,"passed_time":15.11450581,"remaining_time":295.4575314,"test":[0.5654294897]}, +{"learn":[0.5229378476],"iteration":73,"passed_time":15.32745061,"remaining_time":295.3641159,"test":[0.5649020668]}, +{"learn":[0.5219464315],"iteration":74,"passed_time":15.53820445,"remaining_time":295.2258846,"test":[0.564184363]}, +{"learn":[0.5208603056],"iteration":75,"passed_time":15.75581809,"remaining_time":295.2142757,"test":[0.5636825211]}, +{"learn":[0.5199106717],"iteration":76,"passed_time":15.96092236,"remaining_time":294.9661366,"test":[0.5628025917]}, +{"learn":[0.5189214741],"iteration":77,"passed_time":16.17127004,"remaining_time":294.8146924,"test":[0.5626036907]}, +{"learn":[0.5179007418],"iteration":78,"passed_time":16.3854461,"remaining_time":294.730619,"test":[0.5622698611]}, +{"learn":[0.5170257982],"iteration":79,"passed_time":16.59669052,"remaining_time":294.5912567,"test":[0.5612862909]}, +{"learn":[0.5160979269],"iteration":80,"passed_time":16.81674878,"remaining_time":294.6045248,"test":[0.5607771857]}, +{"learn":[0.5152054464],"iteration":81,"passed_time":17.08411486,"remaining_time":295.4301814,"test":[0.5598296124]}, +{"learn":[0.5143571779],"iteration":82,"passed_time":17.2847474,"remaining_time":295.0902057,"test":[0.5594330475]}, +{"learn":[0.5135479977],"iteration":83,"passed_time":17.49421614,"remaining_time":294.9025007,"test":[0.5586549232]}, +{"learn":[0.5127352784],"iteration":84,"passed_time":17.70076062,"remaining_time":294.6656033,"test":[0.5578689769]}, +{"learn":[0.511893507],"iteration":85,"passed_time":17.90903378,"remaining_time":294.4578344,"test":[0.5573709662]}, +{"learn":[0.5110974267],"iteration":86,"passed_time":18.12669175,"remaining_time":294.4024763,"test":[0.5569637459]}, +{"learn":[0.5103353109],"iteration":87,"passed_time":18.33935008,"remaining_time":294.263208,"test":[0.5566546991]}, +{"learn":[0.5094643818],"iteration":88,"passed_time":18.60457541,"remaining_time":294.9556843,"test":[0.5559996507]}, +{"learn":[0.5086953991],"iteration":89,"passed_time":18.82047814,"remaining_time":294.8541575,"test":[0.5555009615]}, +{"learn":[0.5079769143],"iteration":90,"passed_time":19.03668631,"remaining_time":294.7548463,"test":[0.5550565471]}, +{"learn":[0.5072723744],"iteration":91,"passed_time":19.2409811,"remaining_time":294.4706673,"test":[0.5546474911]}, +{"learn":[0.5064938838],"iteration":92,"passed_time":19.45755733,"remaining_time":294.3740124,"test":[0.5539547297]}, +{"learn":[0.5056995994],"iteration":93,"passed_time":19.66756889,"remaining_time":294.1766156,"test":[0.5533245839]}, +{"learn":[0.5049644228],"iteration":94,"passed_time":19.87189313,"remaining_time":293.8948406,"test":[0.5528296062]}, +{"learn":[0.5042152484],"iteration":95,"passed_time":20.07848777,"remaining_time":293.6478837,"test":[0.5525477765]}, +{"learn":[0.5035045284],"iteration":96,"passed_time":20.28909943,"remaining_time":293.4598609,"test":[0.5519693514]}, +{"learn":[0.5028365414],"iteration":97,"passed_time":20.49512857,"remaining_time":293.205819,"test":[0.5516401111]}, +{"learn":[0.5021301528],"iteration":98,"passed_time":20.70482965,"remaining_time":293.0047105,"test":[0.5510558195]}, +{"learn":[0.5014404559],"iteration":99,"passed_time":20.91493833,"remaining_time":292.8091366,"test":[0.5507846453]}, +{"learn":[0.500777487],"iteration":100,"passed_time":21.14971809,"remaining_time":292.955006,"test":[0.5506432915]}, +{"learn":[0.5001429892],"iteration":101,"passed_time":21.36933356,"remaining_time":292.8855717,"test":[0.5502156384]}, +{"learn":[0.4995491114],"iteration":102,"passed_time":21.58716298,"remaining_time":292.7889969,"test":[0.5496516599]}, +{"learn":[0.4989485253],"iteration":103,"passed_time":21.81016169,"remaining_time":292.7594781,"test":[0.5492036537]}, +{"learn":[0.4983499992],"iteration":104,"passed_time":22.01813865,"remaining_time":292.5266992,"test":[0.5488685869]}, +{"learn":[0.4977427575],"iteration":105,"passed_time":22.2309777,"remaining_time":292.3583294,"test":[0.5482614281]}, +{"learn":[0.4971949405],"iteration":106,"passed_time":22.43811073,"remaining_time":292.1148435,"test":[0.5479093605]}, +{"learn":[0.4966445881],"iteration":107,"passed_time":22.64579067,"remaining_time":291.8790797,"test":[0.5476357519]}, +{"learn":[0.4960738992],"iteration":108,"passed_time":22.8561471,"remaining_time":291.6779874,"test":[0.5473086268]}, +{"learn":[0.4954706192],"iteration":109,"passed_time":23.06363527,"remaining_time":291.4404821,"test":[0.5471436475]}, +{"learn":[0.4948638001],"iteration":110,"passed_time":23.27268242,"remaining_time":291.2230259,"test":[0.5466196967]}, +{"learn":[0.4943255439],"iteration":111,"passed_time":23.48335216,"remaining_time":291.0258285,"test":[0.5463429353]}, +{"learn":[0.4937688],"iteration":112,"passed_time":23.69308683,"remaining_time":290.8169154,"test":[0.5462688264]}, +{"learn":[0.4932566907],"iteration":113,"passed_time":23.90256435,"remaining_time":290.6048613,"test":[0.5460389967]}, +{"learn":[0.4927494411],"iteration":114,"passed_time":24.10820629,"remaining_time":290.3466584,"test":[0.5458030612]}, +{"learn":[0.4922379656],"iteration":115,"passed_time":24.31439431,"remaining_time":290.0958769,"test":[0.5455376337]}, +{"learn":[0.4917602435],"iteration":116,"passed_time":24.55630218,"remaining_time":290.2680848,"test":[0.5450453697]}, +{"learn":[0.4912688932],"iteration":117,"passed_time":24.80212849,"remaining_time":290.4791659,"test":[0.5448329]}, +{"learn":[0.4907662919],"iteration":118,"passed_time":25.01110113,"remaining_time":290.2548795,"test":[0.5444673436]}, +{"learn":[0.4903079026],"iteration":119,"passed_time":25.22473218,"remaining_time":290.0844201,"test":[0.5442106959]}, +{"learn":[0.4896477861],"iteration":120,"passed_time":25.48816229,"remaining_time":290.4807917,"test":[0.5439808263]}, +{"learn":[0.489197056],"iteration":121,"passed_time":25.72516541,"remaining_time":290.567852,"test":[0.5434537626]}, +{"learn":[0.4886972542],"iteration":122,"passed_time":25.9664879,"remaining_time":290.6979987,"test":[0.5430699683]}, +{"learn":[0.4882628989],"iteration":123,"passed_time":26.17355547,"remaining_time":290.4420349,"test":[0.5427608018]}, +{"learn":[0.4878229445],"iteration":124,"passed_time":26.38205433,"remaining_time":290.2025976,"test":[0.5426135416]}, +{"learn":[0.4874311637],"iteration":125,"passed_time":26.59233696,"remaining_time":289.983103,"test":[0.5422171364]}, +{"learn":[0.4870381152],"iteration":126,"passed_time":26.80138773,"remaining_time":289.7504358,"test":[0.5420255385]}, +{"learn":[0.4866496622],"iteration":127,"passed_time":27.01016614,"remaining_time":289.5152183,"test":[0.5418352975]}, +{"learn":[0.4862709813],"iteration":128,"passed_time":27.21670162,"remaining_time":289.256573,"test":[0.5415267296]}, +{"learn":[0.4858681607],"iteration":129,"passed_time":27.44640729,"remaining_time":289.2429076,"test":[0.5410198194]}, +{"learn":[0.4853899103],"iteration":130,"passed_time":27.68396245,"remaining_time":289.3079741,"test":[0.5406753343]}, +{"learn":[0.4849540232],"iteration":131,"passed_time":27.90148286,"remaining_time":289.1608224,"test":[0.5404109844]}, +{"learn":[0.4845096845],"iteration":132,"passed_time":28.11763031,"remaining_time":288.998501,"test":[0.5400712883]}, +{"learn":[0.4841039059],"iteration":133,"passed_time":28.32493981,"remaining_time":288.7452819,"test":[0.5399532407]}, +{"learn":[0.4836538097],"iteration":134,"passed_time":28.53715616,"remaining_time":288.5423567,"test":[0.539657563]}, +{"learn":[0.4832327127],"iteration":135,"passed_time":28.7517187,"remaining_time":288.3628258,"test":[0.539344725]}, +{"learn":[0.4828748437],"iteration":136,"passed_time":28.96152401,"remaining_time":288.1354543,"test":[0.5392009767]}, +{"learn":[0.4824942083],"iteration":137,"passed_time":29.17156026,"remaining_time":287.9106165,"test":[0.5390713558]}, +{"learn":[0.4820718964],"iteration":138,"passed_time":29.37967995,"remaining_time":287.667226,"test":[0.5387477027]}, +{"learn":[0.4817320925],"iteration":139,"passed_time":29.65072058,"remaining_time":288.0355714,"test":[0.5385680373]}, +{"learn":[0.4813566338],"iteration":140,"passed_time":29.86537745,"remaining_time":287.851404,"test":[0.5384274019]}, +{"learn":[0.48099718],"iteration":141,"passed_time":30.08600662,"remaining_time":287.7239224,"test":[0.5381120496]}, +{"learn":[0.4806665143],"iteration":142,"passed_time":30.30257312,"remaining_time":287.5565855,"test":[0.5377796167]}, +{"learn":[0.480273413],"iteration":143,"passed_time":30.50726137,"remaining_time":287.2767113,"test":[0.5376424134]}, +{"learn":[0.4799522024],"iteration":144,"passed_time":30.73843311,"remaining_time":287.2453577,"test":[0.5373759882]}, +{"learn":[0.4796210085],"iteration":145,"passed_time":30.96263978,"remaining_time":287.146673,"test":[0.5372649644]}, +{"learn":[0.4792147017],"iteration":146,"passed_time":31.17488357,"remaining_time":286.9361733,"test":[0.5369387173]}, +{"learn":[0.4789183174],"iteration":147,"passed_time":31.38011359,"remaining_time":286.6615782,"test":[0.536795847]}, +{"learn":[0.478532664],"iteration":148,"passed_time":31.59355334,"remaining_time":286.4623528,"test":[0.5366868585]}, +{"learn":[0.4782636944],"iteration":149,"passed_time":31.7972291,"remaining_time":286.1750619,"test":[0.5365283044]}, +{"learn":[0.4779824172],"iteration":150,"passed_time":32.00218754,"remaining_time":285.9003377,"test":[0.5363033834]}, +{"learn":[0.4776756799],"iteration":151,"passed_time":32.21040916,"remaining_time":285.6554707,"test":[0.5361123842]}, +{"learn":[0.4773818311],"iteration":152,"passed_time":32.41875052,"remaining_time":285.412137,"test":[0.5359008324]}, +{"learn":[0.4770647406],"iteration":153,"passed_time":32.63514375,"remaining_time":285.239633,"test":[0.5357652652]}, +{"learn":[0.4767062377],"iteration":154,"passed_time":32.84811293,"remaining_time":285.0368509,"test":[0.5357864164]}, +{"learn":[0.4764296089],"iteration":155,"passed_time":33.0567465,"remaining_time":284.7965852,"test":[0.535719012]}, +{"learn":[0.4760174917],"iteration":156,"passed_time":33.27242701,"remaining_time":284.617003,"test":[0.5356127372]}, +{"learn":[0.4756622109],"iteration":157,"passed_time":33.49206585,"remaining_time":284.4705846,"test":[0.5353806727]}, +{"learn":[0.4753690488],"iteration":158,"passed_time":33.76055951,"remaining_time":284.7352849,"test":[0.535390969]}, +{"learn":[0.4751120698],"iteration":159,"passed_time":33.97791398,"remaining_time":284.5650296,"test":[0.5351500849]}, +{"learn":[0.4748108259],"iteration":160,"passed_time":34.24523877,"remaining_time":284.8097809,"test":[0.5351811332]}, +{"learn":[0.4745126986],"iteration":161,"passed_time":34.45225547,"remaining_time":284.55011,"test":[0.5351523197]}, +{"learn":[0.4742214381],"iteration":162,"passed_time":34.69581548,"remaining_time":284.59083,"test":[0.5348433527]}, +{"learn":[0.4739676812],"iteration":163,"passed_time":34.90263593,"remaining_time":284.3287902,"test":[0.5345701033]}, +{"learn":[0.4736240741],"iteration":164,"passed_time":35.11130664,"remaining_time":284.0823901,"test":[0.5343011639]}, +{"learn":[0.4733877484],"iteration":165,"passed_time":35.31858925,"remaining_time":283.8252895,"test":[0.5340034509]}, +{"learn":[0.4731457709],"iteration":166,"passed_time":35.5215187,"remaining_time":283.5340385,"test":[0.5338239053]}, +{"learn":[0.4729062759],"iteration":167,"passed_time":35.72664687,"remaining_time":283.2612716,"test":[0.533652421]}, +{"learn":[0.4726252629],"iteration":168,"passed_time":35.93364178,"remaining_time":283.0040072,"test":[0.5334977778]}, +{"learn":[0.4723725624],"iteration":169,"passed_time":36.14603772,"remaining_time":282.7895892,"test":[0.5333416182]}, +{"learn":[0.4720965675],"iteration":170,"passed_time":36.35991691,"remaining_time":282.5867226,"test":[0.5331617932]}, +{"learn":[0.4718570197],"iteration":171,"passed_time":36.57295352,"remaining_time":282.3772225,"test":[0.5330645775]}, +{"learn":[0.4715016333],"iteration":172,"passed_time":36.81022333,"remaining_time":282.3535628,"test":[0.5329320833]}, +{"learn":[0.4712788301],"iteration":173,"passed_time":37.02094352,"remaining_time":282.1251213,"test":[0.5327248415]}, +{"learn":[0.4709921123],"iteration":174,"passed_time":37.23646649,"remaining_time":281.9332463,"test":[0.532655721]}, +{"learn":[0.4707643438],"iteration":175,"passed_time":37.45219574,"remaining_time":281.7426543,"test":[0.5324228584]}, +{"learn":[0.4704056825],"iteration":176,"passed_time":37.6691987,"remaining_time":281.5612987,"test":[0.5324790887]}, +{"learn":[0.4701234017],"iteration":177,"passed_time":37.90491523,"remaining_time":281.5185277,"test":[0.5322301032]}, +{"learn":[0.4698584465],"iteration":178,"passed_time":38.16613904,"remaining_time":281.6618418,"test":[0.5321801385]}, +{"learn":[0.4695728908],"iteration":179,"passed_time":38.37733401,"remaining_time":281.4337827,"test":[0.5319024992]}, +{"learn":[0.4693260536],"iteration":180,"passed_time":38.6330386,"remaining_time":281.5302647,"test":[0.531768249]}, +{"learn":[0.4690976513],"iteration":181,"passed_time":38.84879856,"remaining_time":281.3336072,"test":[0.5317025606]}, +{"learn":[0.4688616426],"iteration":182,"passed_time":39.05676562,"remaining_time":281.0806575,"test":[0.531470576]}, +{"learn":[0.4685305015],"iteration":183,"passed_time":39.27704777,"remaining_time":280.9162765,"test":[0.5313124609]}, +{"learn":[0.4682865695],"iteration":184,"passed_time":39.50365307,"remaining_time":280.7962367,"test":[0.5312031132]}, +{"learn":[0.4680025456],"iteration":185,"passed_time":39.72294934,"remaining_time":280.6234163,"test":[0.5313067939]}, +{"learn":[0.4677844436],"iteration":186,"passed_time":39.93898545,"remaining_time":280.427208,"test":[0.5310851454]}, +{"learn":[0.4674939226],"iteration":187,"passed_time":40.15035349,"remaining_time":280.1982116,"test":[0.5309420357]}, +{"learn":[0.4672482474],"iteration":188,"passed_time":40.36996573,"remaining_time":280.0265877,"test":[0.5308133726]}, +{"learn":[0.4669966563],"iteration":189,"passed_time":40.57890753,"remaining_time":279.7808887,"test":[0.5305983089]}, +{"learn":[0.4666803581],"iteration":190,"passed_time":40.80276763,"remaining_time":279.6378159,"test":[0.5304503703]}, +{"learn":[0.4664588227],"iteration":191,"passed_time":41.00915922,"remaining_time":279.3748972,"test":[0.5304046358]}, +{"learn":[0.4662119855],"iteration":192,"passed_time":41.21768415,"remaining_time":279.1270113,"test":[0.5304474969]}, +{"learn":[0.4660336056],"iteration":193,"passed_time":41.42537817,"remaining_time":278.8739376,"test":[0.5302670334]}, +{"learn":[0.465759565],"iteration":194,"passed_time":41.63552693,"remaining_time":278.6377571,"test":[0.530215632]}, +{"learn":[0.4655335925],"iteration":195,"passed_time":41.84387896,"remaining_time":278.3898886,"test":[0.5302616857]}, +{"learn":[0.4653787184],"iteration":196,"passed_time":42.07151485,"remaining_time":278.2699688,"test":[0.5301574862]}, +{"learn":[0.4651595599],"iteration":197,"passed_time":42.31569189,"remaining_time":278.2577315,"test":[0.5299640126]}, +{"learn":[0.4649592589],"iteration":198,"passed_time":42.52817255,"remaining_time":278.0359421,"test":[0.5298924179]}, +{"learn":[0.4647202922],"iteration":199,"passed_time":42.75850677,"remaining_time":277.930294,"test":[0.5299083411]}, +{"learn":[0.4645238472],"iteration":200,"passed_time":42.99071311,"remaining_time":277.8355041,"test":[0.5297052099]}, +{"learn":[0.4642532401],"iteration":201,"passed_time":43.20050556,"remaining_time":277.5953278,"test":[0.5296109474]}, +{"learn":[0.4640300671],"iteration":202,"passed_time":43.41431105,"remaining_time":277.3810908,"test":[0.5295602644]}, +{"learn":[0.4638038305],"iteration":203,"passed_time":43.62268492,"remaining_time":277.1323513,"test":[0.5294535905]}, +{"learn":[0.4636120338],"iteration":204,"passed_time":43.88510475,"remaining_time":277.2254178,"test":[0.5293538607]}, +{"learn":[0.4633936149],"iteration":205,"passed_time":44.09203525,"remaining_time":276.9664738,"test":[0.5292528139]}, +{"learn":[0.4631845454],"iteration":206,"passed_time":44.2987429,"remaining_time":276.7066404,"test":[0.5291430272]}, +{"learn":[0.4630175222],"iteration":207,"passed_time":44.50942467,"remaining_time":276.4720033,"test":[0.5291064317]}, +{"learn":[0.4627118941],"iteration":208,"passed_time":44.71988676,"remaining_time":276.2362383,"test":[0.5291368016]}, +{"learn":[0.462500342],"iteration":209,"passed_time":44.93071709,"remaining_time":276.0029764,"test":[0.5290519175]}, +{"learn":[0.4623026821],"iteration":210,"passed_time":45.14892317,"remaining_time":275.8149856,"test":[0.5290010349]}, +{"learn":[0.4620509325],"iteration":211,"passed_time":45.35339107,"remaining_time":275.5432439,"test":[0.528878797]}, +{"learn":[0.4618490996],"iteration":212,"passed_time":45.56580477,"remaining_time":275.3201443,"test":[0.5288099957]}, +{"learn":[0.4616663883],"iteration":213,"passed_time":45.80824569,"remaining_time":275.2775886,"test":[0.5287029228]}, +{"learn":[0.4614388839],"iteration":214,"passed_time":46.02760885,"remaining_time":275.0952436,"test":[0.5286111347]}, +{"learn":[0.4611913601],"iteration":215,"passed_time":46.30318522,"remaining_time":275.2467122,"test":[0.5286519604]}, +{"learn":[0.4609538723],"iteration":216,"passed_time":46.53420502,"remaining_time":275.1308066,"test":[0.5285690318]}, +{"learn":[0.4608258318],"iteration":217,"passed_time":46.74960881,"remaining_time":274.9220115,"test":[0.5284838683]}, +{"learn":[0.4606162869],"iteration":218,"passed_time":46.97150736,"remaining_time":274.7511458,"test":[0.5283307018]}, +{"learn":[0.4604787385],"iteration":219,"passed_time":47.17985731,"remaining_time":274.500988,"test":[0.5283035644]}, +{"learn":[0.4602659714],"iteration":220,"passed_time":47.38620008,"remaining_time":274.2395923,"test":[0.5281441723]}, +{"learn":[0.4600531516],"iteration":221,"passed_time":47.60357505,"remaining_time":274.0422023,"test":[0.5279370103]}, +{"learn":[0.4598740322],"iteration":222,"passed_time":47.81945953,"remaining_time":273.8360978,"test":[0.5279410809]}, +{"learn":[0.4596930112],"iteration":223,"passed_time":48.03154738,"remaining_time":273.6082788,"test":[0.5277739865]}, +{"learn":[0.4594828853],"iteration":224,"passed_time":48.25679383,"remaining_time":273.455165,"test":[0.5278144531]}, +{"learn":[0.4593606024],"iteration":225,"passed_time":48.47838951,"remaining_time":273.2808329,"test":[0.5277773787]}, +{"learn":[0.4590814381],"iteration":226,"passed_time":48.70127068,"remaining_time":273.1132933,"test":[0.5276907386]}, +{"learn":[0.4589115626],"iteration":227,"passed_time":48.92925623,"remaining_time":272.9737453,"test":[0.5275788768]}, +{"learn":[0.458786797],"iteration":228,"passed_time":49.13740749,"remaining_time":272.7233403,"test":[0.5274718039]}, +{"learn":[0.4586156537],"iteration":229,"passed_time":49.34267414,"remaining_time":272.4573746,"test":[0.5273879175]}, +{"learn":[0.4584218498],"iteration":230,"passed_time":49.55847402,"remaining_time":272.2497989,"test":[0.5272032237]}, +{"learn":[0.4582468505],"iteration":231,"passed_time":49.7683747,"remaining_time":272.00991,"test":[0.5271434416]}, +{"learn":[0.4580919236],"iteration":232,"passed_time":49.97549033,"remaining_time":271.7551341,"test":[0.5271729336]}, +{"learn":[0.4579602912],"iteration":233,"passed_time":50.20951486,"remaining_time":271.6463496,"test":[0.5271931669]}, +{"learn":[0.4577697094],"iteration":234,"passed_time":50.45625736,"remaining_time":271.6049598,"test":[0.5271494278]}, +{"learn":[0.4575785994],"iteration":235,"passed_time":50.72549762,"remaining_time":271.6823262,"test":[0.5270163749]}, +{"learn":[0.4574154851],"iteration":236,"passed_time":50.93444754,"remaining_time":271.4354736,"test":[0.5268986864]}, +{"learn":[0.4572040914],"iteration":237,"passed_time":51.15135621,"remaining_time":271.2311409,"test":[0.5268795306]}, +{"learn":[0.4570666486],"iteration":238,"passed_time":51.36916907,"remaining_time":271.0314737,"test":[0.5269486112]}, +{"learn":[0.4568047043],"iteration":239,"passed_time":51.59087682,"remaining_time":270.8521033,"test":[0.5269823733]}, +{"learn":[0.4566408504],"iteration":240,"passed_time":51.82182656,"remaining_time":270.7206624,"test":[0.5268644055]}, +{"learn":[0.456427608],"iteration":241,"passed_time":52.04138441,"remaining_time":270.5291801,"test":[0.5268694739]}, +{"learn":[0.4562375017],"iteration":242,"passed_time":52.24611907,"remaining_time":270.2607888,"test":[0.5267796811]}, +{"learn":[0.4559405892],"iteration":243,"passed_time":52.46606132,"remaining_time":270.0712009,"test":[0.5267057317]}, +{"learn":[0.4558015617],"iteration":244,"passed_time":52.6872576,"remaining_time":269.887789,"test":[0.5267355429]}, +{"learn":[0.4556457896],"iteration":245,"passed_time":52.8948513,"remaining_time":269.6347298,"test":[0.5266087954]}, +{"learn":[0.4554681492],"iteration":246,"passed_time":53.12432641,"remaining_time":269.4930404,"test":[0.5265850901]}, +{"learn":[0.4552844343],"iteration":247,"passed_time":53.34081813,"remaining_time":269.285098,"test":[0.5266133449]}, +{"learn":[0.4549960262],"iteration":248,"passed_time":53.5555288,"remaining_time":269.0681387,"test":[0.5264907079]}, +{"learn":[0.4547091499],"iteration":249,"passed_time":53.7669082,"remaining_time":268.834541,"test":[0.526436513]}, +{"learn":[0.4544524878],"iteration":250,"passed_time":53.9749097,"remaining_time":268.5843116,"test":[0.526419153]}, +{"learn":[0.4542734741],"iteration":251,"passed_time":54.18101643,"remaining_time":268.3250338,"test":[0.5263015844]}, +{"learn":[0.4541751195],"iteration":252,"passed_time":54.38888617,"remaining_time":268.0748658,"test":[0.5262358959]}, +{"learn":[0.4540318662],"iteration":253,"passed_time":54.60797708,"remaining_time":267.8800765,"test":[0.526113259]}, +{"learn":[0.4538242758],"iteration":254,"passed_time":54.84165749,"remaining_time":267.7563277,"test":[0.5261479788]}, +{"learn":[0.4536671832],"iteration":255,"passed_time":55.07439841,"remaining_time":267.6271548,"test":[0.5260264992]}, +{"learn":[0.4534657729],"iteration":256,"passed_time":55.28319647,"remaining_time":267.3813743,"test":[0.5259905821]}, +{"learn":[0.4533309183],"iteration":257,"passed_time":55.5104133,"remaining_time":267.2245477,"test":[0.5258837885]}, +{"learn":[0.4531104921],"iteration":258,"passed_time":55.72899607,"remaining_time":267.0258074,"test":[0.5257997824]}, +{"learn":[0.4528481781],"iteration":259,"passed_time":55.95400479,"remaining_time":266.8575613,"test":[0.525747064]}, +{"learn":[0.4526748163],"iteration":260,"passed_time":56.17438366,"remaining_time":266.6669018,"test":[0.5256947847]}, +{"learn":[0.4525394863],"iteration":261,"passed_time":56.38599992,"remaining_time":266.4346103,"test":[0.5257121047]}, +{"learn":[0.4523340087],"iteration":262,"passed_time":56.59841305,"remaining_time":266.2062241,"test":[0.5255856764]}, +{"learn":[0.452107508],"iteration":263,"passed_time":56.81347404,"remaining_time":265.9903557,"test":[0.5255532712]}, +{"learn":[0.4519560673],"iteration":264,"passed_time":57.02882367,"remaining_time":265.7758386,"test":[0.5254442029]}, +{"learn":[0.4517016766],"iteration":265,"passed_time":57.24719256,"remaining_time":265.5753219,"test":[0.5253342167]}, +{"learn":[0.451566241],"iteration":266,"passed_time":57.46008151,"remaining_time":265.3493652,"test":[0.5252585913]}, +{"learn":[0.4513973162],"iteration":267,"passed_time":57.67532472,"remaining_time":265.1343286,"test":[0.5251232236]}, +{"learn":[0.4511307236],"iteration":268,"passed_time":57.90495491,"remaining_time":264.9851282,"test":[0.5250109228]}, +{"learn":[0.4510252909],"iteration":269,"passed_time":58.1474584,"remaining_time":264.8939772,"test":[0.5251278929]}, +{"learn":[0.4507913422],"iteration":270,"passed_time":58.35251256,"remaining_time":264.6318743,"test":[0.5251599389]}, +{"learn":[0.4506708024],"iteration":271,"passed_time":58.55642793,"remaining_time":264.3650496,"test":[0.5251249397]}, +{"learn":[0.4504389667],"iteration":272,"passed_time":58.76797556,"remaining_time":264.1329891,"test":[0.5250323134]}, +{"learn":[0.4502753241],"iteration":273,"passed_time":59.04319493,"remaining_time":264.1859744,"test":[0.5249261584]}, +{"learn":[0.4500877004],"iteration":274,"passed_time":59.32124598,"remaining_time":264.2491866,"test":[0.524854404]}, +{"learn":[0.44989284],"iteration":275,"passed_time":59.53042552,"remaining_time":264.0044958,"test":[0.5247326849]}, +{"learn":[0.4497752582],"iteration":276,"passed_time":59.73013362,"remaining_time":263.7182434,"test":[0.5246913403]}, +{"learn":[0.4497071707],"iteration":277,"passed_time":59.93395611,"remaining_time":263.4506991,"test":[0.5246368261]}, +{"learn":[0.4496092387],"iteration":278,"passed_time":60.13539014,"remaining_time":263.173159,"test":[0.52460047]}, +{"learn":[0.4494378841],"iteration":279,"passed_time":60.34248402,"remaining_time":262.9208232,"test":[0.5244898054]}, +{"learn":[0.4490959673],"iteration":280,"passed_time":60.57009365,"remaining_time":262.7578084,"test":[0.5244507355]}, +{"learn":[0.4489082908],"iteration":281,"passed_time":60.77504949,"remaining_time":262.4964903,"test":[0.5244589566]}, +{"learn":[0.4487697387],"iteration":282,"passed_time":60.99505059,"remaining_time":262.3002706,"test":[0.5244354508]}, +{"learn":[0.448658654],"iteration":283,"passed_time":61.19978703,"remaining_time":262.0385248,"test":[0.5244328568]}, +{"learn":[0.4484694984],"iteration":284,"passed_time":61.4067821,"remaining_time":261.7868079,"test":[0.5243957424]}, +{"learn":[0.4483210158],"iteration":285,"passed_time":61.61940357,"remaining_time":261.5592865,"test":[0.5243398714]}, +{"learn":[0.4481748573],"iteration":286,"passed_time":61.82488658,"remaining_time":261.3016984,"test":[0.5242596964]}, +{"learn":[0.4479443949],"iteration":287,"passed_time":62.03413996,"remaining_time":261.060339,"test":[0.5241995552]}, +{"learn":[0.4477727762],"iteration":288,"passed_time":62.241505,"remaining_time":260.8112891,"test":[0.5241163073]}, +{"learn":[0.4476346467],"iteration":289,"passed_time":62.44314116,"remaining_time":260.5386235,"test":[0.5240827048]}, +{"learn":[0.4475678269],"iteration":290,"passed_time":62.6413763,"remaining_time":260.252316,"test":[0.5240546496]}, +{"learn":[0.4474215628],"iteration":291,"passed_time":62.85320449,"remaining_time":260.022846,"test":[0.5239532436]}, +{"learn":[0.4472752458],"iteration":292,"passed_time":63.08103516,"remaining_time":259.8594179,"test":[0.5238582229]}, +{"learn":[0.4470165765],"iteration":293,"passed_time":63.34423992,"remaining_time":259.8406576,"test":[0.5238159604]}, +{"learn":[0.4468634455],"iteration":294,"passed_time":63.55086079,"remaining_time":259.5891093,"test":[0.5237865882]}, +{"learn":[0.4466839564],"iteration":295,"passed_time":63.76301977,"remaining_time":259.3603912,"test":[0.5237659159]}, +{"learn":[0.4465560743],"iteration":296,"passed_time":63.97200053,"remaining_time":259.1189112,"test":[0.5237495536]}, +{"learn":[0.4463076524],"iteration":297,"passed_time":64.19045345,"remaining_time":258.9158559,"test":[0.5237665943]}, +{"learn":[0.4461113659],"iteration":298,"passed_time":64.39927163,"remaining_time":258.6739974,"test":[0.5237160709]}, +{"learn":[0.4460250547],"iteration":299,"passed_time":64.59942912,"remaining_time":258.3977165,"test":[0.5237108829]}, +{"learn":[0.4458235388],"iteration":300,"passed_time":64.8091885,"remaining_time":258.1601894,"test":[0.5236443165]}, +{"learn":[0.4456807081],"iteration":301,"passed_time":65.01937985,"remaining_time":257.9245598,"test":[0.5236073618]}, +{"learn":[0.4454037096],"iteration":302,"passed_time":65.22134624,"remaining_time":257.6566054,"test":[0.5235901215]}, +{"learn":[0.4453104787],"iteration":303,"passed_time":65.4254174,"remaining_time":257.3973658,"test":[0.5235915183]}, +{"learn":[0.4451840757],"iteration":304,"passed_time":65.64121934,"remaining_time":257.1844496,"test":[0.5234947816]}, +{"learn":[0.4450407696],"iteration":305,"passed_time":65.84752166,"remaining_time":256.9344473,"test":[0.5234583057]}, +{"learn":[0.4449429961],"iteration":306,"passed_time":66.05035229,"remaining_time":256.6712387,"test":[0.5234427417]}, +{"learn":[0.4447875938],"iteration":307,"passed_time":66.26262236,"remaining_time":256.4449541,"test":[0.5233568598]}, +{"learn":[0.4447108434],"iteration":308,"passed_time":66.46738856,"remaining_time":256.1898375,"test":[0.5233460847]}, +{"learn":[0.4446476155],"iteration":309,"passed_time":66.67338488,"remaining_time":255.9397678,"test":[0.5232778023]}, +{"learn":[0.4445679071],"iteration":310,"passed_time":66.87576787,"remaining_time":255.6761672,"test":[0.5232615997]}, +{"learn":[0.4443813398],"iteration":311,"passed_time":67.11817838,"remaining_time":255.5653715,"test":[0.5232866219]}, +{"learn":[0.4442457457],"iteration":312,"passed_time":67.35370179,"remaining_time":255.4276167,"test":[0.5232186189]}, +{"learn":[0.4441295373],"iteration":313,"passed_time":67.62310596,"remaining_time":255.4172091,"test":[0.5232710179]}, +{"learn":[0.4439701205],"iteration":314,"passed_time":67.85493005,"remaining_time":255.2637845,"test":[0.52324412]}, +{"learn":[0.4436869418],"iteration":315,"passed_time":68.06792468,"remaining_time":255.0393127,"test":[0.5232147079]}, +{"learn":[0.4436074446],"iteration":316,"passed_time":68.27243536,"remaining_time":254.7832524,"test":[0.523215945]}, +{"learn":[0.4433313969],"iteration":317,"passed_time":68.49371266,"remaining_time":254.5898376,"test":[0.5232299128]}, +{"learn":[0.4431709236],"iteration":318,"passed_time":68.70155234,"remaining_time":254.3464994,"test":[0.5231811453]}, +{"learn":[0.4430649099],"iteration":319,"passed_time":68.90937107,"remaining_time":254.1033058,"test":[0.5232248046]}, +{"learn":[0.4429951056],"iteration":320,"passed_time":69.11363136,"remaining_time":253.8472628,"test":[0.5231860141]}, +{"learn":[0.4428992073],"iteration":321,"passed_time":69.31792761,"remaining_time":253.5916731,"test":[0.5232447984]}, +{"learn":[0.4428329157],"iteration":322,"passed_time":69.52151745,"remaining_time":253.3338267,"test":[0.5232055291]}, +{"learn":[0.4427575123],"iteration":323,"passed_time":69.72620267,"remaining_time":253.0802912,"test":[0.5232274784]}, +{"learn":[0.4426940995],"iteration":324,"passed_time":69.93449947,"remaining_time":252.8401135,"test":[0.5231534093]}, +{"learn":[0.4426260119],"iteration":325,"passed_time":70.14283379,"remaining_time":252.6002665,"test":[0.5231687739]}, +{"learn":[0.4425582941],"iteration":326,"passed_time":70.34791195,"remaining_time":252.3489319,"test":[0.5231483011]}, +{"learn":[0.4424612601],"iteration":327,"passed_time":70.5554264,"remaining_time":252.1065846,"test":[0.5231146588]}, +{"learn":[0.4422838046],"iteration":328,"passed_time":70.7706177,"remaining_time":251.891773,"test":[0.5230951039]}, +{"learn":[0.4422160868],"iteration":329,"passed_time":70.97467081,"remaining_time":251.6374692,"test":[0.5230877608]}, +{"learn":[0.4421166229],"iteration":330,"passed_time":71.18393847,"remaining_time":251.4018854,"test":[0.523061701]}, +{"learn":[0.441977886],"iteration":331,"passed_time":71.41116059,"remaining_time":251.2296252,"test":[0.5230415874]}, +{"learn":[0.4418363758],"iteration":332,"passed_time":71.62956294,"remaining_time":251.026126,"test":[0.5229807677]}, +{"learn":[0.4417645907],"iteration":333,"passed_time":71.83931094,"remaining_time":250.792325,"test":[0.5229519143]}, +{"learn":[0.441594768],"iteration":334,"passed_time":72.05350908,"remaining_time":250.5741435,"test":[0.5229005928]}, +{"learn":[0.4413897658],"iteration":335,"passed_time":72.27127429,"remaining_time":250.3683431,"test":[0.5227854185]}, +{"learn":[0.4412564167],"iteration":336,"passed_time":72.48459261,"remaining_time":250.1471252,"test":[0.5227791929]}, +{"learn":[0.4411897553],"iteration":337,"passed_time":72.69149127,"remaining_time":249.9038842,"test":[0.5227785145]}, +{"learn":[0.4409984605],"iteration":338,"passed_time":72.90594307,"remaining_time":249.6867254,"test":[0.5227113096]}, +{"learn":[0.4408126062],"iteration":339,"passed_time":73.12027871,"remaining_time":249.4691862,"test":[0.5227014922]}, +{"learn":[0.4407580675],"iteration":340,"passed_time":73.32371639,"remaining_time":249.2146255,"test":[0.5226839726]}, +{"learn":[0.440634781],"iteration":341,"passed_time":73.53363207,"remaining_time":248.9822981,"test":[0.5226773878]}, +{"learn":[0.4405851283],"iteration":342,"passed_time":73.73642021,"remaining_time":248.7260588,"test":[0.5226805805]}, +{"learn":[0.4404759981],"iteration":343,"passed_time":73.95494873,"remaining_time":248.5230254,"test":[0.5226501307]}, +{"learn":[0.4403500704],"iteration":344,"passed_time":74.17107234,"remaining_time":248.3118509,"test":[0.5226338483]}, +{"learn":[0.4402948978],"iteration":345,"passed_time":74.37558119,"remaining_time":248.0619095,"test":[0.5226316933]}, +{"learn":[0.4401106547],"iteration":346,"passed_time":74.58788369,"remaining_time":247.8381265,"test":[0.522656516]}, +{"learn":[0.4397904477],"iteration":347,"passed_time":74.80778869,"remaining_time":247.6395764,"test":[0.5226600678]}, +{"learn":[0.4397326341],"iteration":348,"passed_time":75.01209471,"remaining_time":247.3894585,"test":[0.5226367217]}, +{"learn":[0.4396824532],"iteration":349,"passed_time":75.21596581,"remaining_time":247.1381734,"test":[0.5225947386]}, +{"learn":[0.439624032],"iteration":350,"passed_time":75.42224509,"remaining_time":246.8950416,"test":[0.5226150118]}, +{"learn":[0.4394675733],"iteration":351,"passed_time":75.66408973,"remaining_time":246.7681108,"test":[0.5225920647]}, +{"learn":[0.4394047943],"iteration":352,"passed_time":75.87934364,"remaining_time":246.5541279,"test":[0.5225688783]}, +{"learn":[0.4393420418],"iteration":353,"passed_time":76.09058534,"remaining_time":246.3271492,"test":[0.5225403042]}, +{"learn":[0.4392639445],"iteration":354,"passed_time":76.29449611,"remaining_time":246.0766142,"test":[0.5225377102]}, +{"learn":[0.4391883562],"iteration":355,"passed_time":76.49915018,"remaining_time":245.8287298,"test":[0.5225459711]}, +{"learn":[0.4391398392],"iteration":356,"passed_time":76.70743543,"remaining_time":245.5927134,"test":[0.5225433372]}, +{"learn":[0.4389915678],"iteration":357,"passed_time":76.92544497,"remaining_time":245.3878719,"test":[0.5225567462]}, +{"learn":[0.4387959944],"iteration":358,"passed_time":77.13400271,"remaining_time":245.1529167,"test":[0.5225509995]}, +{"learn":[0.438557371],"iteration":359,"passed_time":77.34720003,"remaining_time":244.9328001,"test":[0.5225457317]}, +{"learn":[0.4385087747],"iteration":360,"passed_time":77.55081607,"remaining_time":244.6824917,"test":[0.5225362735]}, +{"learn":[0.4383729694],"iteration":361,"passed_time":77.75979666,"remaining_time":244.4493055,"test":[0.5225390271]}, +{"learn":[0.4383069419],"iteration":362,"passed_time":77.96371269,"remaining_time":244.2003893,"test":[0.5225502413]}, +{"learn":[0.4381990265],"iteration":363,"passed_time":78.17208503,"remaining_time":243.965628,"test":[0.5225557086]}, +{"learn":[0.43801238],"iteration":364,"passed_time":78.3862752,"remaining_time":243.7491023,"test":[0.5225313249]}, +{"learn":[0.4378701568],"iteration":365,"passed_time":78.59686483,"remaining_time":243.5214336,"test":[0.5224742965]}, +{"learn":[0.4378172555],"iteration":366,"passed_time":78.80121226,"remaining_time":243.2745872,"test":[0.5224713433]}, +{"learn":[0.4377448894],"iteration":367,"passed_time":79.0218156,"remaining_time":243.0779762,"test":[0.5224824776]}, +{"learn":[0.4374820735],"iteration":368,"passed_time":79.24130691,"remaining_time":242.8778269,"test":[0.5223904899]}, +{"learn":[0.437295876],"iteration":369,"passed_time":79.45799234,"remaining_time":242.6690036,"test":[0.5223451146]}, +{"learn":[0.4372092215],"iteration":370,"passed_time":79.6758244,"remaining_time":242.4636274,"test":[0.5222921568]}, +{"learn":[0.4370238163],"iteration":371,"passed_time":79.89964997,"remaining_time":242.276358,"test":[0.5222611883]}, +{"learn":[0.436981902],"iteration":372,"passed_time":80.12221775,"remaining_time":242.0850922,"test":[0.5222393587]}, +{"learn":[0.4368016998],"iteration":373,"passed_time":80.3363049,"remaining_time":241.8681265,"test":[0.52223014]}, +{"learn":[0.4366709917],"iteration":374,"passed_time":80.54500939,"remaining_time":241.6350282,"test":[0.5222536457]}, +{"learn":[0.4365565529],"iteration":375,"passed_time":80.75362562,"remaining_time":241.4017957,"test":[0.5223180172]}, +{"learn":[0.4363945478],"iteration":376,"passed_time":80.9662181,"remaining_time":241.1805383,"test":[0.5222929151]}, +{"learn":[0.4363409599],"iteration":377,"passed_time":81.17094127,"remaining_time":240.9359685,"test":[0.5222633433]}, +{"learn":[0.4362627569],"iteration":378,"passed_time":81.3760377,"remaining_time":240.6927131,"test":[0.5222620663]}, +{"learn":[0.4361928206],"iteration":379,"passed_time":81.57966136,"remaining_time":240.4453177,"test":[0.5223006971]}, +{"learn":[0.4361403683],"iteration":380,"passed_time":81.78539885,"remaining_time":240.2043604,"test":[0.5223303886]}, +{"learn":[0.4359903539],"iteration":381,"passed_time":82.00329977,"remaining_time":239.9991862,"test":[0.5222801845]}, +{"learn":[0.4357839519],"iteration":382,"passed_time":82.22043156,"remaining_time":239.7917025,"test":[0.5223078406]}, +{"learn":[0.4357237876],"iteration":383,"passed_time":82.42314338,"remaining_time":239.5422604,"test":[0.5223389688]}, +{"learn":[0.4356793379],"iteration":384,"passed_time":82.62773229,"remaining_time":239.2984974,"test":[0.5223291515]}, +{"learn":[0.4355541498],"iteration":385,"passed_time":82.83762727,"remaining_time":239.0702507,"test":[0.5223007769]}, +{"learn":[0.4353642019],"iteration":386,"passed_time":83.05126086,"remaining_time":238.852851,"test":[0.5222951898]}, +{"learn":[0.4352438734],"iteration":387,"passed_time":83.26045745,"remaining_time":238.6227543,"test":[0.5222391192]}, +{"learn":[0.4351800644],"iteration":388,"passed_time":83.46642758,"remaining_time":238.3835502,"test":[0.5223085989]}, +{"learn":[0.4350318459],"iteration":389,"passed_time":83.68036085,"remaining_time":238.1671809,"test":[0.5222770317]}, +{"learn":[0.4348217199],"iteration":390,"passed_time":83.89177884,"remaining_time":237.9436899,"test":[0.5223066434]}, +{"learn":[0.4347826317],"iteration":391,"passed_time":84.11260227,"remaining_time":237.7468452,"test":[0.5222492159]}, +{"learn":[0.4346708867],"iteration":392,"passed_time":84.32047257,"remaining_time":237.5133922,"test":[0.52228214]}, +{"learn":[0.434634598],"iteration":393,"passed_time":84.52383669,"remaining_time":237.2674198,"test":[0.5222827785]}, +{"learn":[0.4344987662],"iteration":394,"passed_time":84.76677866,"remaining_time":237.1323808,"test":[0.5222562397]}, +{"learn":[0.4343509967],"iteration":395,"passed_time":84.97668424,"remaining_time":236.9046955,"test":[0.5222660571]}, +{"learn":[0.4342753292],"iteration":396,"passed_time":85.18881281,"remaining_time":236.6832759,"test":[0.5222762336]}, +{"learn":[0.4341274276],"iteration":397,"passed_time":85.39937454,"remaining_time":236.4575647,"test":[0.5222696488]}, +{"learn":[0.4339128118],"iteration":398,"passed_time":85.6105665,"remaining_time":236.2336685,"test":[0.5221320862]}, +{"learn":[0.4338583523],"iteration":399,"passed_time":85.81337079,"remaining_time":235.9867697,"test":[0.5221256211]}, +{"learn":[0.4336283917],"iteration":400,"passed_time":86.03224374,"remaining_time":235.7841294,"test":[0.5221399082]}, +{"learn":[0.4335961703],"iteration":401,"passed_time":86.23464097,"remaining_time":235.5364074,"test":[0.522140866]}, +{"learn":[0.4334266645],"iteration":402,"passed_time":86.45127517,"remaining_time":235.3276647,"test":[0.5221340417]}, +{"learn":[0.4333842749],"iteration":403,"passed_time":86.65311476,"remaining_time":235.078747,"test":[0.5220711868]}, +{"learn":[0.433300552],"iteration":404,"passed_time":86.85605789,"remaining_time":234.8330454,"test":[0.5221006787]}, +{"learn":[0.4332627579],"iteration":405,"passed_time":87.0611953,"remaining_time":234.5934671,"test":[0.5221415444]}, +{"learn":[0.4332207644],"iteration":406,"passed_time":87.26593982,"remaining_time":234.353003,"test":[0.5221244239]}, +{"learn":[0.4331742546],"iteration":407,"passed_time":87.47074681,"remaining_time":234.1128812,"test":[0.5221450164]}, +{"learn":[0.4331175502],"iteration":408,"passed_time":87.67623363,"remaining_time":233.8747455,"test":[0.5221361169]}, +{"learn":[0.4330016059],"iteration":409,"passed_time":87.88625562,"remaining_time":233.6488259,"test":[0.5221247831]}, +{"learn":[0.4329391703],"iteration":410,"passed_time":88.1021335,"remaining_time":233.4384997,"test":[0.5221431407]}, +{"learn":[0.4327436761],"iteration":411,"passed_time":88.33286598,"remaining_time":233.2673742,"test":[0.5221476104]}, +{"learn":[0.4326503132],"iteration":412,"passed_time":88.54745586,"remaining_time":233.0534734,"test":[0.522193704]}, +{"learn":[0.4326064445],"iteration":413,"passed_time":88.75546066,"remaining_time":232.8222953,"test":[0.5221898729]}, +{"learn":[0.4325310147],"iteration":414,"passed_time":88.95929179,"remaining_time":232.5803171,"test":[0.5222235951]}, +{"learn":[0.4322932893],"iteration":415,"passed_time":89.18501335,"remaining_time":232.3955636,"test":[0.5222830578]}, +{"learn":[0.4321530205],"iteration":416,"passed_time":89.39244899,"remaining_time":232.1631229,"test":[0.5222495751]}, +{"learn":[0.4320995646],"iteration":417,"passed_time":89.5957362,"remaining_time":231.9200636,"test":[0.5222620663]}, +{"learn":[0.4320641475],"iteration":418,"passed_time":89.79808474,"remaining_time":231.6747723,"test":[0.5222605099]}, +{"learn":[0.4318961471],"iteration":419,"passed_time":90.0087367,"remaining_time":231.4510372,"test":[0.5222401967]}, +{"learn":[0.431762032],"iteration":420,"passed_time":90.22152765,"remaining_time":231.2328464,"test":[0.5223113924]}, +{"learn":[0.4316429712],"iteration":421,"passed_time":90.429538,"remaining_time":231.0024691,"test":[0.5222913587]}, +{"learn":[0.4316029322],"iteration":422,"passed_time":90.63332669,"remaining_time":230.7614488,"test":[0.5223000985]}, +{"learn":[0.4314649611],"iteration":423,"passed_time":90.84374012,"remaining_time":230.537416,"test":[0.5222907202]}, +{"learn":[0.4313357849],"iteration":424,"passed_time":91.05443958,"remaining_time":230.3141707,"test":[0.5222583947]}, +{"learn":[0.4312889318],"iteration":425,"passed_time":91.26381978,"remaining_time":230.0876583,"test":[0.5222463426]}, +{"learn":[0.4311176301],"iteration":426,"passed_time":91.48438264,"remaining_time":229.8893269,"test":[0.5221930256]}, +{"learn":[0.4310804434],"iteration":427,"passed_time":91.68641059,"remaining_time":229.6444676,"test":[0.5221907908]}, +{"learn":[0.4309550439],"iteration":428,"passed_time":91.89042499,"remaining_time":229.4047673,"test":[0.5221801753]}, +{"learn":[0.4308267921],"iteration":429,"passed_time":92.09898827,"remaining_time":229.1765522,"test":[0.5222163318]}, +{"learn":[0.4306758797],"iteration":430,"passed_time":92.32109712,"remaining_time":228.9820251,"test":[0.5222692497]}, +{"learn":[0.430564214],"iteration":431,"passed_time":92.55081837,"remaining_time":228.8061899,"test":[0.5222568383]}, +{"learn":[0.4305215338],"iteration":432,"passed_time":92.75444592,"remaining_time":228.5658055,"test":[0.52226478]}, +{"learn":[0.4304761861],"iteration":433,"passed_time":92.95713727,"remaining_time":228.3232911,"test":[0.5222783088]}, +{"learn":[0.4303507603],"iteration":434,"passed_time":93.1708367,"remaining_time":228.1079105,"test":[0.5222840954]}, +{"learn":[0.4302473612],"iteration":435,"passed_time":93.38517138,"remaining_time":227.8940879,"test":[0.5222134984]}, +{"learn":[0.4302070316],"iteration":436,"passed_time":93.58930039,"remaining_time":227.6554378,"test":[0.52221713]}, +{"learn":[0.4301724332],"iteration":437,"passed_time":93.79648265,"remaining_time":227.4243483,"test":[0.5222277056]}, +{"learn":[0.4300275953],"iteration":438,"passed_time":94.0038674,"remaining_time":227.1938572,"test":[0.5222634631]}, +{"learn":[0.4299943702],"iteration":439,"passed_time":94.23371294,"remaining_time":227.0175812,"test":[0.5223040494]}, +{"learn":[0.4298901524],"iteration":440,"passed_time":94.44963657,"remaining_time":226.8076307,"test":[0.5222941522]}, +{"learn":[0.4298619719],"iteration":441,"passed_time":94.65202482,"remaining_time":226.565254,"test":[0.5222502934]}, +{"learn":[0.4297966311],"iteration":442,"passed_time":94.86756504,"remaining_time":226.3544385,"test":[0.5222784285]}, +{"learn":[0.4295941908],"iteration":443,"passed_time":95.09021783,"remaining_time":226.1605181,"test":[0.5222565989]}, +{"learn":[0.4293884755],"iteration":444,"passed_time":95.29992534,"remaining_time":225.9357781,"test":[0.5222131392]}, +{"learn":[0.4292060811],"iteration":445,"passed_time":95.510937,"remaining_time":225.7141874,"test":[0.5222200433]}, +{"learn":[0.4291471318],"iteration":446,"passed_time":95.71507987,"remaining_time":225.4764633,"test":[0.5222137777]}, +{"learn":[0.4290125149],"iteration":447,"passed_time":95.91936096,"remaining_time":225.2392137,"test":[0.5221952205]}, +{"learn":[0.4288033134],"iteration":448,"passed_time":96.14019167,"remaining_time":225.0408495,"test":[0.5222177685]}, +{"learn":[0.4287767175],"iteration":449,"passed_time":96.35095311,"remaining_time":224.8188906,"test":[0.5222333326]}, +{"learn":[0.4287522081],"iteration":450,"passed_time":96.5597974,"remaining_time":224.5925221,"test":[0.5222451054]}, +{"learn":[0.4287100297],"iteration":451,"passed_time":96.77169136,"remaining_time":224.3733021,"test":[0.5222368046]}, +{"learn":[0.4284893658],"iteration":452,"passed_time":96.98769612,"remaining_time":224.1636155,"test":[0.5221670056]}, +{"learn":[0.4284410865],"iteration":453,"passed_time":97.1954738,"remaining_time":223.9349462,"test":[0.5221495659]}, +{"learn":[0.4284061448],"iteration":454,"passed_time":97.40168562,"remaining_time":223.7027725,"test":[0.5221062658]}, +{"learn":[0.428283677],"iteration":455,"passed_time":97.60761641,"remaining_time":223.4700691,"test":[0.5221362366]}, +{"learn":[0.42796347],"iteration":456,"passed_time":97.83021101,"remaining_time":223.2755144,"test":[0.5221121722]}, +{"learn":[0.4279105952],"iteration":457,"passed_time":98.03536187,"remaining_time":223.0411508,"test":[0.5220806848]}, +{"learn":[0.4276986997],"iteration":458,"passed_time":98.25440598,"remaining_time":222.838424,"test":[0.5220582167]}, +{"learn":[0.4275380152],"iteration":459,"passed_time":98.46506595,"remaining_time":222.6166708,"test":[0.5221086603]}, +{"learn":[0.4274078618],"iteration":460,"passed_time":98.67278728,"remaining_time":222.3883427,"test":[0.5220843165]}, +{"learn":[0.4272547308],"iteration":461,"passed_time":98.88326351,"remaining_time":222.1662933,"test":[0.5220927769]}, +{"learn":[0.4272262598],"iteration":462,"passed_time":99.0837289,"remaining_time":221.9218723,"test":[0.5220818422]}, +{"learn":[0.4271944609],"iteration":463,"passed_time":99.28833123,"remaining_time":221.6868775,"test":[0.5220434907]}, +{"learn":[0.4271767391],"iteration":464,"passed_time":99.33595715,"remaining_time":221.1026143,"test":[0.522045526]}, +{"learn":[0.4271252641],"iteration":465,"passed_time":99.54019114,"remaining_time":220.8681494,"test":[0.5220438099]}, +{"learn":[0.4269907529],"iteration":466,"passed_time":99.74994554,"remaining_time":220.6460251,"test":[0.5220508337]}, +{"learn":[0.4269561545],"iteration":467,"passed_time":99.95657062,"remaining_time":220.4170532,"test":[0.5220992819]}, +{"learn":[0.4267656783],"iteration":468,"passed_time":100.1935219,"remaining_time":220.2548423,"test":[0.5220674753]}, +{"learn":[0.4266574461],"iteration":469,"passed_time":100.418076,"remaining_time":220.0651453,"test":[0.5220163533]}, +{"learn":[0.4266171429],"iteration":470,"passed_time":100.6502161,"remaining_time":219.8918734,"test":[0.5219874999]}, +{"learn":[0.4264591523],"iteration":471,"passed_time":100.8810043,"remaining_time":219.7154076,"test":[0.5220094492]}, +{"learn":[0.426324509],"iteration":472,"passed_time":101.0916121,"remaining_time":219.4948955,"test":[0.5219871806]}, +{"learn":[0.4262026222],"iteration":473,"passed_time":101.3004473,"remaining_time":219.2705884,"test":[0.5219403287]}, +{"learn":[0.4261693444],"iteration":474,"passed_time":101.5050295,"remaining_time":219.037169,"test":[0.521902935]}, +{"learn":[0.4259847579],"iteration":475,"passed_time":101.7234315,"remaining_time":218.8336006,"test":[0.5218628675]}, +{"learn":[0.4259156403],"iteration":476,"passed_time":101.9253522,"remaining_time":218.5946234,"test":[0.5218597946]}, +{"learn":[0.4258481602],"iteration":477,"passed_time":102.1293143,"remaining_time":218.3601658,"test":[0.5218983456]}, +{"learn":[0.4258218548],"iteration":478,"passed_time":102.3319364,"remaining_time":218.1229792,"test":[0.5219061277]}, +{"learn":[0.4257969493],"iteration":479,"passed_time":102.5347374,"remaining_time":217.886317,"test":[0.5218939558]}, +{"learn":[0.4257487756],"iteration":480,"passed_time":102.7418339,"remaining_time":217.6588955,"test":[0.5219066864]}, +{"learn":[0.4256836461],"iteration":481,"passed_time":102.9483646,"remaining_time":217.4303635,"test":[0.5219238867]}, +{"learn":[0.4256607742],"iteration":482,"passed_time":103.1606265,"remaining_time":217.21399,"test":[0.521889965]}, +{"learn":[0.4255501649],"iteration":483,"passed_time":103.3739904,"remaining_time":216.9999468,"test":[0.521844869]}, +{"learn":[0.4255061642],"iteration":484,"passed_time":103.5782457,"remaining_time":216.766844,"test":[0.5218519726]}, +{"learn":[0.4253049916],"iteration":485,"passed_time":103.7932079,"remaining_time":216.5561992,"test":[0.5218498575]}, +{"learn":[0.4251170245],"iteration":486,"passed_time":104.002997,"remaining_time":216.3347761,"test":[0.5218545267]}, +{"learn":[0.4249721602],"iteration":487,"passed_time":104.2163309,"remaining_time":216.1207518,"test":[0.5217666894]}, +{"learn":[0.4249461189],"iteration":488,"passed_time":104.4191904,"remaining_time":215.8850746,"test":[0.5217849274]}, +{"learn":[0.4249260201],"iteration":489,"passed_time":104.6301125,"remaining_time":215.6661502,"test":[0.5217765467]}, +{"learn":[0.424814645],"iteration":490,"passed_time":104.8473614,"remaining_time":215.4602599,"test":[0.5217925099]}, +{"learn":[0.4247909543],"iteration":491,"passed_time":105.0673067,"remaining_time":215.259848,"test":[0.5218065974]}, +{"learn":[0.4247375248],"iteration":492,"passed_time":105.273126,"remaining_time":215.0305027,"test":[0.5217701215]}, +{"learn":[0.4246067376],"iteration":493,"passed_time":105.482074,"remaining_time":214.8076245,"test":[0.5218237178]}, +{"learn":[0.4245252596],"iteration":494,"passed_time":105.692536,"remaining_time":214.587876,"test":[0.5218390824]}, +{"learn":[0.4243307162],"iteration":495,"passed_time":105.9059334,"remaining_time":214.3741071,"test":[0.5217997731]}, +{"learn":[0.4242090143],"iteration":496,"passed_time":106.1186945,"remaining_time":214.1590555,"test":[0.5218265513]}, +{"learn":[0.4241103428],"iteration":497,"passed_time":106.3329792,"remaining_time":213.9470786,"test":[0.5218737624]}, +{"learn":[0.4240749785],"iteration":498,"passed_time":106.5340114,"remaining_time":213.7085077,"test":[0.5218910425]}, +{"learn":[0.423876315],"iteration":499,"passed_time":106.7472701,"remaining_time":213.4945402,"test":[0.52187911]}, +{"learn":[0.4236667437],"iteration":500,"passed_time":106.9613022,"remaining_time":213.2821176,"test":[0.5218104684]}, +{"learn":[0.4235874314],"iteration":501,"passed_time":107.1683723,"remaining_time":213.0558478,"test":[0.5218612712]}, +{"learn":[0.4235353754],"iteration":502,"passed_time":107.3749381,"remaining_time":212.8286546,"test":[0.521854846]}, +{"learn":[0.4234143602],"iteration":503,"passed_time":107.5844873,"remaining_time":212.6074393,"test":[0.5218411177]}, +{"learn":[0.4233028793],"iteration":504,"passed_time":107.7910702,"remaining_time":212.3804253,"test":[0.5218925989]}, +{"learn":[0.423176714],"iteration":505,"passed_time":107.9939197,"remaining_time":212.1461584,"test":[0.5218558836]}, +{"learn":[0.4231508576],"iteration":506,"passed_time":108.2074939,"remaining_time":211.9330205,"test":[0.5218650624]}, +{"learn":[0.4229899882],"iteration":507,"passed_time":108.4167864,"remaining_time":211.7115199,"test":[0.5218238775]}, +{"learn":[0.4228718782],"iteration":508,"passed_time":108.6394747,"remaining_time":211.5161481,"test":[0.5218550455]}, +{"learn":[0.4228359329],"iteration":509,"passed_time":108.8545844,"remaining_time":211.305958,"test":[0.521825394]}, +{"learn":[0.4227991952],"iteration":510,"passed_time":109.0642878,"remaining_time":211.0852849,"test":[0.5218181706]}, +{"learn":[0.4227724144],"iteration":511,"passed_time":109.28476,"remaining_time":210.8854352,"test":[0.5218546066]}, +{"learn":[0.4225436952],"iteration":512,"passed_time":109.5214753,"remaining_time":210.7167567,"test":[0.5218829412]}, +{"learn":[0.4224996416],"iteration":513,"passed_time":109.7290791,"remaining_time":210.4919689,"test":[0.5218839788]}, +{"learn":[0.4223835653],"iteration":514,"passed_time":109.9470032,"remaining_time":210.2869867,"test":[0.5218613909]}, +{"learn":[0.4223577353],"iteration":515,"passed_time":110.1575744,"remaining_time":210.0679326,"test":[0.5218823825]}, +{"learn":[0.4222493446],"iteration":516,"passed_time":110.3645408,"remaining_time":209.8420573,"test":[0.5218802673]}, +{"learn":[0.4222281101],"iteration":517,"passed_time":110.5688433,"remaining_time":209.6112049,"test":[0.5219119143]}, +{"learn":[0.422172198],"iteration":518,"passed_time":110.7701722,"remaining_time":209.3748341,"test":[0.5218955521]}, +{"learn":[0.4221387881],"iteration":519,"passed_time":110.9724019,"remaining_time":209.1402959,"test":[0.5219027355]}, +{"learn":[0.4221057744],"iteration":520,"passed_time":111.1812834,"remaining_time":208.9183809,"test":[0.5219047309]}, +{"learn":[0.4219720291],"iteration":521,"passed_time":111.3860637,"remaining_time":208.688832,"test":[0.5218664193]}, +{"learn":[0.4218148572],"iteration":522,"passed_time":111.5987443,"remaining_time":208.4741361,"test":[0.5218799481]}, +{"learn":[0.421678867],"iteration":523,"passed_time":111.8119444,"remaining_time":208.2604155,"test":[0.5218879297]}, +{"learn":[0.4215360891],"iteration":524,"passed_time":112.0283365,"remaining_time":208.0526249,"test":[0.5218919604]}, +{"learn":[0.4214808109],"iteration":525,"passed_time":112.2347162,"remaining_time":207.8262616,"test":[0.5219174216]}, +{"learn":[0.421386418],"iteration":526,"passed_time":112.4686428,"remaining_time":207.6508338,"test":[0.521921572]}, +{"learn":[0.4212872182],"iteration":527,"passed_time":112.6744949,"remaining_time":207.423502,"test":[0.521982232]}, +{"learn":[0.4212450663],"iteration":528,"passed_time":112.8770865,"remaining_time":207.1902665,"test":[0.5220316779]}, +{"learn":[0.421218312],"iteration":529,"passed_time":113.1033054,"remaining_time":207.0003891,"test":[0.5220599726]}, +{"learn":[0.421077647],"iteration":530,"passed_time":113.3161359,"remaining_time":206.7859429,"test":[0.5220624868]}, +{"learn":[0.4209894342],"iteration":531,"passed_time":113.5325177,"remaining_time":206.5779645,"test":[0.5220547447]}, +{"learn":[0.4209177812],"iteration":532,"passed_time":113.7416202,"remaining_time":206.3567481,"test":[0.5220632451]}, +{"learn":[0.4208865898],"iteration":533,"passed_time":113.9464601,"remaining_time":206.1278661,"test":[0.5220848752]}, +{"learn":[0.4208590167],"iteration":534,"passed_time":114.1474219,"remaining_time":205.8920787,"test":[0.5220681937]}, +{"learn":[0.4207220229],"iteration":535,"passed_time":114.3558661,"remaining_time":205.6698786,"test":[0.5220366664]}, +{"learn":[0.4205735666],"iteration":536,"passed_time":114.5725608,"remaining_time":205.4625253,"test":[0.5220554231]}, +{"learn":[0.4205432204],"iteration":537,"passed_time":114.7737867,"remaining_time":205.2274773,"test":[0.5220509135]}, +{"learn":[0.4205065883],"iteration":538,"passed_time":114.9823051,"remaining_time":205.005557,"test":[0.5220928568]}, +{"learn":[0.4204169494],"iteration":539,"passed_time":115.1927305,"remaining_time":204.7870765,"test":[0.5221466526]}, +{"learn":[0.4203891914],"iteration":540,"passed_time":115.3997273,"remaining_time":204.562548,"test":[0.5221287739]}, +{"learn":[0.4202709494],"iteration":541,"passed_time":115.6195589,"remaining_time":204.3607702,"test":[0.5221223487]}, +{"learn":[0.420224017],"iteration":542,"passed_time":115.8249079,"remaining_time":204.1334012,"test":[0.5221388706]}, +{"learn":[0.4201979758],"iteration":543,"passed_time":116.0273892,"remaining_time":203.9010737,"test":[0.5221799358]}, +{"learn":[0.4201635359],"iteration":544,"passed_time":116.229706,"remaining_time":203.6685674,"test":[0.5221457746]}, +{"learn":[0.4201325029],"iteration":545,"passed_time":116.4327778,"remaining_time":203.4374909,"test":[0.5221054677]}, +{"learn":[0.4201024736],"iteration":546,"passed_time":116.636416,"remaining_time":203.2075035,"test":[0.5221112144]}, +{"learn":[0.4199849975],"iteration":547,"passed_time":116.847819,"remaining_time":202.9911017,"test":[0.5220737808]}, +{"learn":[0.4198871712],"iteration":548,"passed_time":117.0579428,"remaining_time":202.772502,"test":[0.5220705881]}, +{"learn":[0.4197798368],"iteration":549,"passed_time":117.3019895,"remaining_time":202.6125273,"test":[0.5220880678]}, +{"learn":[0.4196252004],"iteration":550,"passed_time":117.5235767,"remaining_time":202.413565,"test":[0.5220916196]}, +{"learn":[0.4195158061],"iteration":551,"passed_time":117.7338517,"remaining_time":202.1950931,"test":[0.5221136089]}, +{"learn":[0.4193934703],"iteration":552,"passed_time":117.9480233,"remaining_time":201.9833237,"test":[0.5220915797]}, +{"learn":[0.4192237533],"iteration":553,"passed_time":118.1667645,"remaining_time":201.7793487,"test":[0.5220772129]}, +{"learn":[0.4191110047],"iteration":554,"passed_time":118.3926687,"remaining_time":201.587517,"test":[0.5221100172]}, +{"learn":[0.419012386],"iteration":555,"passed_time":118.6074088,"remaining_time":201.3766078,"test":[0.5220727033]}, +{"learn":[0.4189145333],"iteration":556,"passed_time":118.8113215,"remaining_time":201.1473541,"test":[0.5220840371]}, +{"learn":[0.4188031845],"iteration":557,"passed_time":119.0142518,"remaining_time":200.9165327,"test":[0.5220930164]}, +{"learn":[0.4185742011],"iteration":558,"passed_time":119.2357886,"remaining_time":200.7171325,"test":[0.5220205436]}, +{"learn":[0.4185236769],"iteration":559,"passed_time":119.4401694,"remaining_time":200.4888557,"test":[0.5220209826]}, +{"learn":[0.4184201458],"iteration":560,"passed_time":119.6482905,"remaining_time":200.2669247,"test":[0.522004341]}, +{"learn":[0.4183944214],"iteration":561,"passed_time":119.8526739,"remaining_time":200.0388045,"test":[0.5220604515]}, +{"learn":[0.4183447688],"iteration":562,"passed_time":120.0543716,"remaining_time":199.8062988,"test":[0.5220947723]}, +{"learn":[0.4182207955],"iteration":563,"passed_time":120.2661929,"remaining_time":199.5907032,"test":[0.5220045007]}, +{"learn":[0.4180463509],"iteration":564,"passed_time":120.4836934,"remaining_time":199.3845191,"test":[0.5220480801]}, +{"learn":[0.41787703],"iteration":565,"passed_time":120.6965569,"remaining_time":199.1706434,"test":[0.522024734]}, +{"learn":[0.4177670546],"iteration":566,"passed_time":120.9066805,"remaining_time":198.9522626,"test":[0.5220192267]}, +{"learn":[0.4177384779],"iteration":567,"passed_time":121.1116605,"remaining_time":198.7254711,"test":[0.5220286848]}, +{"learn":[0.4175663046],"iteration":568,"passed_time":121.3445522,"remaining_time":198.5444254,"test":[0.5220263702]}, +{"learn":[0.4174468476],"iteration":569,"passed_time":121.5686459,"remaining_time":198.3488434,"test":[0.5220041016]}, +{"learn":[0.4172682036],"iteration":570,"passed_time":121.8164141,"remaining_time":198.1916789,"test":[0.5220519112]}, +{"learn":[0.4171848769],"iteration":571,"passed_time":122.0230116,"remaining_time":197.9674034,"test":[0.5221098974]}, +{"learn":[0.417080395],"iteration":572,"passed_time":122.2303868,"remaining_time":197.7444477,"test":[0.5221240647]}, +{"learn":[0.4170362886],"iteration":573,"passed_time":122.4282092,"remaining_time":197.5061354,"test":[0.5221256611]}, +{"learn":[0.4169296674],"iteration":574,"passed_time":122.6417976,"remaining_time":197.2933266,"test":[0.5221025145]}, +{"learn":[0.4168813353],"iteration":575,"passed_time":122.8451356,"remaining_time":197.0640716,"test":[0.5221338821]}, +{"learn":[0.4168014156],"iteration":576,"passed_time":123.0525376,"remaining_time":196.8414077,"test":[0.5221315674]}, +{"learn":[0.4166510314],"iteration":577,"passed_time":123.265679,"remaining_time":196.6279516,"test":[0.5221554324]}, +{"learn":[0.4165654861],"iteration":578,"passed_time":123.4706621,"remaining_time":196.4015196,"test":[0.5222276258]}, +{"learn":[0.4164509152],"iteration":579,"passed_time":123.6782914,"remaining_time":196.1793587,"test":[0.5222340908]}, +{"learn":[0.4163564959],"iteration":580,"passed_time":123.8844284,"remaining_time":195.9548875,"test":[0.5222625452]}, +{"learn":[0.4163250932],"iteration":581,"passed_time":124.0892174,"remaining_time":195.7283532,"test":[0.5222746772]}, +{"learn":[0.4161199854],"iteration":582,"passed_time":124.3119605,"remaining_time":195.5301334,"test":[0.522315503]}, +{"learn":[0.4160572857],"iteration":583,"passed_time":124.5317846,"remaining_time":195.3272512,"test":[0.5223301492]}, +{"learn":[0.4160180917],"iteration":584,"passed_time":124.7349994,"remaining_time":195.0983325,"test":[0.5223704561]}, +{"learn":[0.4159334181],"iteration":585,"passed_time":124.9399464,"remaining_time":194.872203,"test":[0.522333262]}, +{"learn":[0.4157927531],"iteration":586,"passed_time":125.1522334,"remaining_time":194.6575624,"test":[0.5223089182]}, +{"learn":[0.4156931836],"iteration":587,"passed_time":125.3607684,"remaining_time":194.4371102,"test":[0.5222736396]}, +{"learn":[0.4154709615],"iteration":588,"passed_time":125.5962772,"remaining_time":194.2584185,"test":[0.5223175383]}, +{"learn":[0.415443811],"iteration":589,"passed_time":125.823019,"remaining_time":194.0660124,"test":[0.5223279542]}, +{"learn":[0.4153113862],"iteration":590,"passed_time":126.0276476,"remaining_time":193.8394783,"test":[0.5223895321]}, +{"learn":[0.4152067722],"iteration":591,"passed_time":126.2372792,"remaining_time":193.6206917,"test":[0.5223692589]}, +{"learn":[0.4151275921],"iteration":592,"passed_time":126.4417727,"remaining_time":193.3940773,"test":[0.5223694984]}, +{"learn":[0.4149858178],"iteration":593,"passed_time":126.6500259,"remaining_time":193.1732719,"test":[0.5224234139]}, +{"learn":[0.4149130555],"iteration":594,"passed_time":126.8615764,"remaining_time":192.9575238,"test":[0.5224167493]}, +{"learn":[0.4146729531],"iteration":595,"passed_time":127.0853141,"remaining_time":192.7602751,"test":[0.522434229]}, +{"learn":[0.4144590504],"iteration":596,"passed_time":127.3029649,"remaining_time":192.5537308,"test":[0.5223872973]}, +{"learn":[0.4143572096],"iteration":597,"passed_time":127.5491045,"remaining_time":192.3901209,"test":[0.5224070916]}, +{"learn":[0.4143302704],"iteration":598,"passed_time":127.7491871,"remaining_time":192.1569575,"test":[0.522377879]}, +{"learn":[0.4142094401],"iteration":599,"passed_time":127.9576759,"remaining_time":191.9365139,"test":[0.5223658268]}, +{"learn":[0.4140924129],"iteration":600,"passed_time":128.1637658,"remaining_time":191.7125216,"test":[0.5223325037]}, +{"learn":[0.4139592751],"iteration":601,"passed_time":128.3722047,"remaining_time":191.4920928,"test":[0.5223590026]}, +{"learn":[0.4138737827],"iteration":602,"passed_time":128.5784023,"remaining_time":191.2683696,"test":[0.522378318]}, +{"learn":[0.4138459455],"iteration":603,"passed_time":128.7837067,"remaining_time":191.0433795,"test":[0.5223461123]}, +{"learn":[0.4136362686],"iteration":604,"passed_time":129.0077605,"remaining_time":190.8461912,"test":[0.5223434784]}, +{"learn":[0.4136080088],"iteration":605,"passed_time":129.2101526,"remaining_time":190.6169578,"test":[0.5223463917]}, +{"learn":[0.4135243916],"iteration":606,"passed_time":129.4151721,"remaining_time":190.3916783,"test":[0.5223482274]}, +{"learn":[0.4133501054],"iteration":607,"passed_time":129.6246748,"remaining_time":190.1730426,"test":[0.5223358959]}, +{"learn":[0.4132487135],"iteration":608,"passed_time":129.8907793,"remaining_time":190.0372486,"test":[0.5223317854]}, +{"learn":[0.4131160511],"iteration":609,"passed_time":130.1383303,"remaining_time":189.8739574,"test":[0.5223568476]}, +{"learn":[0.4130051249],"iteration":610,"passed_time":130.380929,"remaining_time":189.7031847,"test":[0.5223685805]}, +{"learn":[0.4129740391],"iteration":611,"passed_time":130.6005907,"remaining_time":189.4988963,"test":[0.5223942812]}, +{"learn":[0.4128680782],"iteration":612,"passed_time":130.8083957,"remaining_time":189.2774012,"test":[0.5223829473]}, +{"learn":[0.412837415],"iteration":613,"passed_time":131.0093857,"remaining_time":189.0461169,"test":[0.5224129182]}, +{"learn":[0.4127119892],"iteration":614,"passed_time":131.2143968,"remaining_time":188.8207174,"test":[0.5223948]}, +{"learn":[0.4126791075],"iteration":615,"passed_time":131.4163495,"remaining_time":188.590995,"test":[0.5224285221]}, +{"learn":[0.4125751802],"iteration":616,"passed_time":131.6329015,"remaining_time":188.3822561,"test":[0.522424691]}, +{"learn":[0.4124947851],"iteration":617,"passed_time":131.8399089,"remaining_time":188.15987,"test":[0.52240777]}, +{"learn":[0.4123330706],"iteration":618,"passed_time":132.0549863,"remaining_time":187.9490192,"test":[0.5224196227]}, +{"learn":[0.4123064483],"iteration":619,"passed_time":132.2530748,"remaining_time":187.7140416,"test":[0.5223986311]}, +{"learn":[0.4121374971],"iteration":620,"passed_time":132.4636872,"remaining_time":187.4969099,"test":[0.5224034201]}, +{"learn":[0.4120678249],"iteration":621,"passed_time":132.6701686,"remaining_time":187.273968,"test":[0.5223694584]}, +{"learn":[0.4119360076],"iteration":622,"passed_time":132.8863661,"remaining_time":187.0647561,"test":[0.5223874569]}, +{"learn":[0.4118715384],"iteration":623,"passed_time":133.1017828,"remaining_time":186.8544258,"test":[0.5223998284]}, +{"learn":[0.4117428904],"iteration":624,"passed_time":133.345456,"remaining_time":186.6836384,"test":[0.5223842244]}, +{"learn":[0.4116109146],"iteration":625,"passed_time":133.5735411,"remaining_time":186.4908544,"test":[0.5223773203]}, +{"learn":[0.4115017844],"iteration":626,"passed_time":133.7875189,"remaining_time":186.2783158,"test":[0.5223327831]}, +{"learn":[0.411481131],"iteration":627,"passed_time":134.0320529,"remaining_time":186.1082009,"test":[0.5223507416]}, +{"learn":[0.4113286075],"iteration":628,"passed_time":134.259815,"remaining_time":185.9146246,"test":[0.5223174584]}, +{"learn":[0.4112463108],"iteration":629,"passed_time":134.4791466,"remaining_time":185.7092977,"test":[0.5223235244]}, +{"learn":[0.4110173538],"iteration":630,"passed_time":134.6993694,"remaining_time":185.5051538,"test":[0.5222586342]}, +{"learn":[0.4108394229],"iteration":631,"passed_time":134.9136933,"remaining_time":185.2928573,"test":[0.5222450655]}, +{"learn":[0.4105907634],"iteration":632,"passed_time":135.1327197,"remaining_time":185.0869952,"test":[0.5222296211]}, +{"learn":[0.4105139073],"iteration":633,"passed_time":135.3308854,"remaining_time":184.8525974,"test":[0.5222177685]}, +{"learn":[0.4101629052],"iteration":634,"passed_time":135.5548357,"remaining_time":184.6534376,"test":[0.5222282244]}, +{"learn":[0.4099986023],"iteration":635,"passed_time":135.7676373,"remaining_time":184.4390545,"test":[0.5222375628]}, +{"learn":[0.4098852727],"iteration":636,"passed_time":135.9874716,"remaining_time":184.2342041,"test":[0.5222393188]}, +{"learn":[0.4097632803],"iteration":637,"passed_time":136.2035831,"remaining_time":184.0242769,"test":[0.5222374032]}, +{"learn":[0.4096657973],"iteration":638,"passed_time":136.4274339,"remaining_time":183.8247583,"test":[0.5222169703]}, +{"learn":[0.4095620549],"iteration":639,"passed_time":136.6503039,"remaining_time":183.6238459,"test":[0.5222457838]}, +{"learn":[0.409416187],"iteration":640,"passed_time":136.8604854,"remaining_time":183.4058611,"test":[0.5221768629]}, +{"learn":[0.4093790267],"iteration":641,"passed_time":137.0676429,"remaining_time":183.1838592,"test":[0.5221749473]}, +{"learn":[0.4092723527],"iteration":642,"passed_time":137.2835737,"remaining_time":182.9735966,"test":[0.5221539957]}, +{"learn":[0.4091630639],"iteration":643,"passed_time":137.5339751,"remaining_time":182.8091346,"test":[0.5221308092]}, +{"learn":[0.4090574199],"iteration":644,"passed_time":137.7443969,"remaining_time":182.5914098,"test":[0.5220681139]}, +{"learn":[0.4089596992],"iteration":645,"passed_time":137.951932,"remaining_time":182.3698915,"test":[0.5220853541]}, +{"learn":[0.4088231016],"iteration":646,"passed_time":138.2272476,"remaining_time":182.2377777,"test":[0.5221375536]}, +{"learn":[0.4088041913],"iteration":647,"passed_time":138.4764773,"remaining_time":182.0709239,"test":[0.5221546741]}, +{"learn":[0.4086547843],"iteration":648,"passed_time":138.7071683,"remaining_time":181.8795073,"test":[0.5221431008]}, +{"learn":[0.4084877347],"iteration":649,"passed_time":138.9137598,"remaining_time":181.6564551,"test":[0.5221245436]}, +{"learn":[0.4084118559],"iteration":650,"passed_time":139.125069,"remaining_time":181.4396061,"test":[0.5221498852]}, +{"learn":[0.4082863508],"iteration":651,"passed_time":139.3525396,"remaining_time":181.2437939,"test":[0.5221640126]}, +{"learn":[0.4082518316],"iteration":652,"passed_time":139.5735289,"remaining_time":181.0394777,"test":[0.5221665667]}, +{"learn":[0.4080320657],"iteration":653,"passed_time":139.8499072,"remaining_time":180.9067606,"test":[0.5221492865]}, +{"learn":[0.4078376807],"iteration":654,"passed_time":140.06257,"remaining_time":180.691407,"test":[0.5221784991]}, +{"learn":[0.4076548902],"iteration":655,"passed_time":140.2845456,"remaining_time":180.4880434,"test":[0.5222281046]}, +{"learn":[0.407535354],"iteration":656,"passed_time":140.4986467,"remaining_time":180.2745192,"test":[0.522238361]}, +{"learn":[0.4074433909],"iteration":657,"passed_time":140.7095101,"remaining_time":180.0568504,"test":[0.5222958284]}, +{"learn":[0.4072420335],"iteration":658,"passed_time":140.9230402,"remaining_time":179.8426052,"test":[0.5223166204]}, +{"learn":[0.4071415924],"iteration":659,"passed_time":141.1291726,"remaining_time":179.6189469,"test":[0.5223578053]}, +{"learn":[0.407027312],"iteration":660,"passed_time":141.3330653,"remaining_time":179.392499,"test":[0.5223855812]}, +{"learn":[0.4069112621],"iteration":661,"passed_time":141.541929,"remaining_time":179.1724117,"test":[0.5223741676]}, +{"learn":[0.406769752],"iteration":662,"passed_time":141.7542664,"remaining_time":178.9567436,"test":[0.5223762827]}, +{"learn":[0.4065997444],"iteration":663,"passed_time":141.9643081,"remaining_time":178.7381952,"test":[0.5223555705]}, +{"learn":[0.40648932],"iteration":664,"passed_time":142.1758804,"remaining_time":178.5215942,"test":[0.5223429596]}, +{"learn":[0.4062134835],"iteration":665,"passed_time":142.4511564,"remaining_time":178.3847815,"test":[0.5222660172]}, +{"learn":[0.4061617443],"iteration":666,"passed_time":142.6826811,"remaining_time":178.1929135,"test":[0.5222825789]}, +{"learn":[0.4060348659],"iteration":667,"passed_time":142.8918509,"remaining_time":177.9730838,"test":[0.5222708061]}, +{"learn":[0.4060129712],"iteration":668,"passed_time":143.0936843,"remaining_time":177.7441729,"test":[0.5222718038]}, +{"learn":[0.4059170464],"iteration":669,"passed_time":143.3098167,"remaining_time":177.5330565,"test":[0.5222055966]}, +{"learn":[0.4058050638],"iteration":670,"passed_time":143.5473802,"remaining_time":177.3484027,"test":[0.5222149749]}, +{"learn":[0.4056596976],"iteration":671,"passed_time":143.7759889,"remaining_time":177.1525577,"test":[0.5221594231]}, +{"learn":[0.4055702172],"iteration":672,"passed_time":143.9796453,"remaining_time":176.9259534,"test":[0.5221519205]}, +{"learn":[0.4054526882],"iteration":673,"passed_time":144.1902858,"remaining_time":176.7079764,"test":[0.5221677639]}, +{"learn":[0.4053703651],"iteration":674,"passed_time":144.3944495,"remaining_time":176.4821049,"test":[0.5221557915]}, +{"learn":[0.4052619744],"iteration":675,"passed_time":144.6467866,"remaining_time":176.315018,"test":[0.5221788583]}, +{"learn":[0.4051706716],"iteration":676,"passed_time":144.8546189,"remaining_time":176.0935766,"test":[0.5222169703]}, +{"learn":[0.4050839379],"iteration":677,"passed_time":145.0660124,"remaining_time":175.876493,"test":[0.522211064]}, +{"learn":[0.4050310102],"iteration":678,"passed_time":145.2776509,"remaining_time":175.6597222,"test":[0.5221965375]}, +{"learn":[0.4049275583],"iteration":679,"passed_time":145.4921491,"remaining_time":175.4464151,"test":[0.5221970164]}, +{"learn":[0.4048025022],"iteration":680,"passed_time":145.7177777,"remaining_time":175.2464904,"test":[0.5221466127]}, +{"learn":[0.4047124407],"iteration":681,"passed_time":145.9219866,"remaining_time":175.0207992,"test":[0.5221535966]}, +{"learn":[0.4045690818],"iteration":682,"passed_time":146.1331153,"remaining_time":174.8034483,"test":[0.5221871192]}, +{"learn":[0.4044315333],"iteration":683,"passed_time":146.3658115,"remaining_time":174.6118453,"test":[0.5221479297]}, +{"learn":[0.4042882801],"iteration":684,"passed_time":146.5858038,"remaining_time":174.4050075,"test":[0.5220778514]}, +{"learn":[0.404154482],"iteration":685,"passed_time":146.860049,"remaining_time":174.2625071,"test":[0.5220881077]}, +{"learn":[0.4039425865],"iteration":686,"passed_time":147.074552,"remaining_time":174.0489239,"test":[0.522129572]}, +{"learn":[0.4038427529],"iteration":687,"passed_time":147.2836436,"remaining_time":173.8289514,"test":[0.522132605]}, +{"learn":[0.4037263068],"iteration":688,"passed_time":147.4908254,"remaining_time":173.6067625,"test":[0.5221517608]}, +{"learn":[0.4036760467],"iteration":689,"passed_time":147.6926819,"remaining_time":173.3783657,"test":[0.5221073034]}, +{"learn":[0.403583212],"iteration":690,"passed_time":147.9012553,"remaining_time":173.1579096,"test":[0.522141704]}, +{"learn":[0.4034757985],"iteration":691,"passed_time":148.1069277,"remaining_time":172.9341005,"test":[0.5221258207]}, +{"learn":[0.4033589826],"iteration":692,"passed_time":148.3422279,"remaining_time":172.7448454,"test":[0.5221208721]}, +{"learn":[0.403220589],"iteration":693,"passed_time":148.600155,"remaining_time":172.5817362,"test":[0.5220776918]}, +{"learn":[0.4030926277],"iteration":694,"passed_time":148.8164159,"remaining_time":172.3700932,"test":[0.5221266987]}, +{"learn":[0.4029039211],"iteration":695,"passed_time":149.0310233,"remaining_time":172.1565269,"test":[0.5221319665]}, +{"learn":[0.4028226545],"iteration":696,"passed_time":149.2492295,"remaining_time":171.9471037,"test":[0.5221535567]}, +{"learn":[0.402755148],"iteration":697,"passed_time":149.4537521,"remaining_time":171.721933,"test":[0.5221580264]}, +{"learn":[0.4025953614],"iteration":698,"passed_time":149.6627615,"remaining_time":171.5019628,"test":[0.5221366756]}, +{"learn":[0.402450814],"iteration":699,"passed_time":149.8704369,"remaining_time":171.2804993,"test":[0.5221112543]}, +{"learn":[0.4023101754],"iteration":700,"passed_time":150.0890848,"remaining_time":171.0715817,"test":[0.5220847555]}, +{"learn":[0.4022780597],"iteration":701,"passed_time":150.2922142,"remaining_time":170.8449956,"test":[0.5220865513]}, +{"learn":[0.402171729],"iteration":702,"passed_time":150.5351074,"remaining_time":170.663557,"test":[0.5220447278]}, +{"learn":[0.4020247253],"iteration":703,"passed_time":150.7484191,"remaining_time":170.4484966,"test":[0.5220336733]}, +{"learn":[0.4019478165],"iteration":704,"passed_time":150.9927499,"remaining_time":170.2684201,"test":[0.5220583364]}, +{"learn":[0.4017364493],"iteration":705,"passed_time":151.212166,"remaining_time":170.0601414,"test":[0.5220547048]}, +{"learn":[0.4016885397],"iteration":706,"passed_time":151.4225735,"remaining_time":169.8417267,"test":[0.5220721845]}, +{"learn":[0.4015977387],"iteration":707,"passed_time":151.6499997,"remaining_time":169.6423725,"test":[0.5220880678]}, +{"learn":[0.401570641],"iteration":708,"passed_time":151.8604156,"remaining_time":169.4239615,"test":[0.5221017163]}, +{"learn":[0.4015012065],"iteration":709,"passed_time":152.0680343,"remaining_time":169.2024607,"test":[0.522074978]}, +{"learn":[0.4013771276],"iteration":710,"passed_time":152.2754725,"remaining_time":168.9807986,"test":[0.5220769734]}, +{"learn":[0.4013263657],"iteration":711,"passed_time":152.4935658,"remaining_time":168.7709689,"test":[0.5220693909]}, +{"learn":[0.4012401074],"iteration":712,"passed_time":152.7012907,"remaining_time":168.5496715,"test":[0.5220553034]}, +{"learn":[0.4011601349],"iteration":713,"passed_time":152.9073379,"remaining_time":168.3265653,"test":[0.5220848752]}, +{"learn":[0.4010814037],"iteration":714,"passed_time":153.1136096,"remaining_time":168.1037532,"test":[0.5222718038]}, +{"learn":[0.400944938],"iteration":715,"passed_time":153.3255004,"remaining_time":167.8871401,"test":[0.5222876073]}, +{"learn":[0.4008109286],"iteration":716,"passed_time":153.5403852,"remaining_time":167.6738098,"test":[0.5222551223]}, +{"learn":[0.4006492141],"iteration":717,"passed_time":153.7554547,"remaining_time":167.4606762,"test":[0.522198932]}, +{"learn":[0.400531421],"iteration":718,"passed_time":153.9723799,"remaining_time":167.2495531,"test":[0.5222487769]}, +{"learn":[0.4003784749],"iteration":719,"passed_time":154.2031363,"remaining_time":167.0533977,"test":[0.5222378821]}, +{"learn":[0.400226374],"iteration":720,"passed_time":154.4232553,"remaining_time":166.8456531,"test":[0.5222573571]}, +{"learn":[0.4001478805],"iteration":721,"passed_time":154.6482571,"remaining_time":166.6431357,"test":[0.5222718836]}, +{"learn":[0.4000406254],"iteration":722,"passed_time":154.8667259,"remaining_time":166.4335353,"test":[0.5222899619]}, +{"learn":[0.3999716927],"iteration":723,"passed_time":155.1077696,"remaining_time":166.2481066,"test":[0.5223036503]}, +{"learn":[0.3998336424],"iteration":724,"passed_time":155.3163561,"remaining_time":166.027829,"test":[0.5223023733]}, +{"learn":[0.3997517683],"iteration":725,"passed_time":155.5307444,"remaining_time":165.8137688,"test":[0.5222796657]}, +{"learn":[0.3997031721],"iteration":726,"passed_time":155.7329776,"remaining_time":165.5867836,"test":[0.5222763533]}, +{"learn":[0.3994946836],"iteration":727,"passed_time":155.9483645,"remaining_time":165.3738151,"test":[0.522278229]}, +{"learn":[0.3994120436],"iteration":728,"passed_time":156.1582118,"remaining_time":165.1549812,"test":[0.5222687309]}, +{"learn":[0.3992452581],"iteration":729,"passed_time":156.3750468,"remaining_time":164.9435425,"test":[0.5222255106]}, +{"learn":[0.3991151311],"iteration":730,"passed_time":156.5936813,"remaining_time":164.7339821,"test":[0.5222417931]}, +{"learn":[0.3989169694],"iteration":731,"passed_time":156.8156456,"remaining_time":164.5278904,"test":[0.5222338514]}, +{"learn":[0.3988042473],"iteration":732,"passed_time":157.0246963,"remaining_time":164.308243,"test":[0.5221923472]}, +{"learn":[0.3987856803],"iteration":733,"passed_time":157.2314275,"remaining_time":164.0862036,"test":[0.5222242336]}, +{"learn":[0.398664269],"iteration":734,"passed_time":157.4558596,"remaining_time":163.8826294,"test":[0.5222261891]}, +{"learn":[0.3985673142],"iteration":735,"passed_time":157.6964397,"remaining_time":163.6957608,"test":[0.5221915889]}, +{"learn":[0.3984359195],"iteration":736,"passed_time":157.9060141,"remaining_time":163.4766468,"test":[0.5222121814]}, +{"learn":[0.3983484991],"iteration":737,"passed_time":158.1206387,"remaining_time":163.2627732,"test":[0.5222113832]}, +{"learn":[0.3983241217],"iteration":738,"passed_time":158.3249152,"remaining_time":163.0382415,"test":[0.5222260294]}, +{"learn":[0.3982504614],"iteration":739,"passed_time":158.5475578,"remaining_time":162.8326269,"test":[0.5222252313]}, +{"learn":[0.39816246],"iteration":740,"passed_time":158.7565127,"remaining_time":162.6129463,"test":[0.5222304592]}, +{"learn":[0.3980996282],"iteration":741,"passed_time":159.0412735,"remaining_time":162.4707349,"test":[0.5222567186]}, +{"learn":[0.3980129473],"iteration":742,"passed_time":159.2630401,"remaining_time":162.2639588,"test":[0.5222550824]}, +{"learn":[0.3979900754],"iteration":743,"passed_time":159.4631843,"remaining_time":162.0351712,"test":[0.522232295]}, +{"learn":[0.3978655475],"iteration":744,"passed_time":159.6717654,"remaining_time":161.8150105,"test":[0.5222211208]}, +{"learn":[0.3977282896],"iteration":745,"passed_time":159.8882712,"remaining_time":161.6028907,"test":[0.5222276258]}, +{"learn":[0.3976407635],"iteration":746,"passed_time":160.0964123,"remaining_time":161.3823272,"test":[0.522253087]}, +{"learn":[0.3974670848],"iteration":747,"passed_time":160.3229802,"remaining_time":161.1803224,"test":[0.5223028522]}, +{"learn":[0.3973722165],"iteration":748,"passed_time":160.5372521,"remaining_time":160.965923,"test":[0.5223244024]}, +{"learn":[0.3972935645],"iteration":749,"passed_time":160.7726673,"remaining_time":160.7726673,"test":[0.5223264776]}, +{"learn":[0.3971188557],"iteration":750,"passed_time":161.0082771,"remaining_time":160.5794934,"test":[0.5223473894]}, +{"learn":[0.3969426415],"iteration":751,"passed_time":161.2238827,"remaining_time":160.3663088,"test":[0.5223455536]}, +{"learn":[0.3967768069],"iteration":752,"passed_time":161.4322937,"remaining_time":160.1459806,"test":[0.522416031]}, +{"learn":[0.396643088],"iteration":753,"passed_time":161.6482718,"remaining_time":159.9331707,"test":[0.5224128782]}, +{"learn":[0.3965085768],"iteration":754,"passed_time":161.8715411,"remaining_time":159.7275472,"test":[0.522426846]}, +{"learn":[0.3964347052],"iteration":755,"passed_time":162.0788692,"remaining_time":159.5061888,"test":[0.5224367831]}, +{"learn":[0.3963336303],"iteration":756,"passed_time":162.2888827,"remaining_time":159.2875031,"test":[0.5224471192]}, +{"learn":[0.3962246849],"iteration":757,"passed_time":162.4995078,"remaining_time":159.069439,"test":[0.5224621246]}, +{"learn":[0.3961006589],"iteration":758,"passed_time":162.7186162,"remaining_time":158.8596767,"test":[0.5224556994]}, +{"learn":[0.3959192945],"iteration":759,"passed_time":162.9493859,"remaining_time":158.6612442,"test":[0.5223899711]}, +{"learn":[0.3958587605],"iteration":760,"passed_time":163.1924839,"remaining_time":158.4746986,"test":[0.5224011852]}, +{"learn":[0.3958067044],"iteration":761,"passed_time":163.42247,"remaining_time":158.2753056,"test":[0.5224501123]}, +{"learn":[0.3956605196],"iteration":762,"passed_time":163.6836505,"remaining_time":158.1059638,"test":[0.5224237332]}, +{"learn":[0.3956133759],"iteration":763,"passed_time":163.9060287,"remaining_time":157.8990015,"test":[0.5224197823]}, +{"learn":[0.3955843238],"iteration":764,"passed_time":164.1046845,"remaining_time":157.6692067,"test":[0.5223828675]}, +{"learn":[0.3954913571],"iteration":765,"passed_time":164.3171052,"remaining_time":157.452683,"test":[0.5224311561]}, +{"learn":[0.3954052044],"iteration":766,"passed_time":164.5317985,"remaining_time":157.238342,"test":[0.5224181062]}, +{"learn":[0.3952515981],"iteration":767,"passed_time":164.7493181,"remaining_time":157.0266938,"test":[0.5223989504]}, +{"learn":[0.3951503911],"iteration":768,"passed_time":164.9537031,"remaining_time":156.8025448,"test":[0.5223784377]}, +{"learn":[0.3950491577],"iteration":769,"passed_time":165.1590578,"remaining_time":156.5793665,"test":[0.5223923656]}, +{"learn":[0.3949205362],"iteration":770,"passed_time":165.3738974,"remaining_time":156.3652026,"test":[0.5223688598]}, +{"learn":[0.3948132283],"iteration":771,"passed_time":165.5875269,"remaining_time":156.1498959,"test":[0.5223993495]}, +{"learn":[0.3946939298],"iteration":772,"passed_time":165.7971437,"remaining_time":155.9308195,"test":[0.5224052558]}, +{"learn":[0.3946074866],"iteration":773,"passed_time":166.0075065,"remaining_time":155.7124673,"test":[0.5224538637]}, +{"learn":[0.3945200398],"iteration":774,"passed_time":166.2217218,"remaining_time":155.4977398,"test":[0.522461526]}, +{"learn":[0.3944517409],"iteration":775,"passed_time":166.4421512,"remaining_time":155.2888112,"test":[0.5224400156]}, +{"learn":[0.394347708],"iteration":776,"passed_time":166.6616416,"remaining_time":155.0789792,"test":[0.52247713]}, +{"learn":[0.39426314],"iteration":777,"passed_time":166.8694324,"remaining_time":154.858265,"test":[0.522503988]}, +{"learn":[0.3941691696],"iteration":778,"passed_time":167.0933716,"remaining_time":154.6525301,"test":[0.5224891423]}, +{"learn":[0.3941472485],"iteration":779,"passed_time":167.3103325,"remaining_time":154.4403069,"test":[0.5224936918]}, +{"learn":[0.3940587452],"iteration":780,"passed_time":167.5542806,"remaining_time":154.2529164,"test":[0.5225751438]}, +{"learn":[0.3939841342],"iteration":781,"passed_time":167.7656995,"remaining_time":154.0355144,"test":[0.5225697562]}, +{"learn":[0.3938982192],"iteration":782,"passed_time":167.970744,"remaining_time":153.8122905,"test":[0.5226010839]}, +{"learn":[0.3937222427],"iteration":783,"passed_time":168.1923053,"remaining_time":153.6041972,"test":[0.5226017624]}, +{"learn":[0.3936012803],"iteration":784,"passed_time":168.417801,"remaining_time":153.3996532,"test":[0.522541701]}, +{"learn":[0.3935053556],"iteration":785,"passed_time":168.62665,"remaining_time":153.179934,"test":[0.5225556288]}, +{"learn":[0.393446327],"iteration":786,"passed_time":168.8363504,"remaining_time":152.9610138,"test":[0.5225448138]}, +{"learn":[0.3932816016],"iteration":787,"passed_time":169.0507547,"remaining_time":152.7463672,"test":[0.522550361]} ]} \ No newline at end of file diff --git a/main/train/catboost_info/learn/events.out.tfevents b/main/train/catboost_info/learn/events.out.tfevents index bbb52e4..ff1c270 100644 Binary files a/main/train/catboost_info/learn/events.out.tfevents and b/main/train/catboost_info/learn/events.out.tfevents differ diff --git a/main/train/catboost_info/learn_error.tsv b/main/train/catboost_info/learn_error.tsv index 5ef0ff4..d094c51 100644 --- a/main/train/catboost_info/learn_error.tsv +++ b/main/train/catboost_info/learn_error.tsv @@ -1,1501 +1,789 @@ iter Logloss -0 0.6886094006 -1 0.6842840712 -2 0.6801700826 -3 0.6761092858 -4 0.6722299853 -5 0.668121543 -6 0.6641551391 -7 0.6603305622 -8 0.6566888023 -9 0.6530217934 -10 0.6494780711 -11 0.6458671064 -12 0.6425007076 -13 0.6391117537 -14 0.6357860278 -15 0.6325226318 -16 0.6295236628 -17 0.6263974456 -18 0.6232680591 -19 0.6203073332 -20 0.6173680002 -21 0.6144953286 -22 0.6116808668 -23 0.6088264188 -24 0.6060673673 -25 0.6033653635 -26 0.6007803605 -27 0.5983245601 -28 0.5958047923 -29 0.5933361561 -30 0.5908417429 -31 0.5885609946 -32 0.5862544163 -33 0.5840255392 -34 0.5818528647 -35 0.5797131512 -36 0.5775249999 -37 0.5754249556 -38 0.5734558571 -39 0.5714098498 -40 0.5694267007 -41 0.5674763011 -42 0.5655860659 -43 0.5637778104 -44 0.5620264442 -45 0.5602958898 -46 0.5586157805 -47 0.5569170778 -48 0.5552938578 -49 0.5536610241 -50 0.5520403923 -51 0.5505269364 -52 0.5489814704 -53 0.5474507945 -54 0.5460741475 -55 0.5446328993 -56 0.5432053319 -57 0.5417448564 -58 0.5403179229 -59 0.538951946 -60 0.5376593917 -61 0.5363245798 -62 0.5350903938 -63 0.5339010008 -64 0.5327094421 -65 0.5315422344 -66 0.5303893415 -67 0.5292133125 -68 0.5280834499 -69 0.5269904571 -70 0.5259452682 -71 0.5249150279 -72 0.5238462804 -73 0.5228017782 -74 0.5217467115 -75 0.5206653924 -76 0.519690985 -77 0.5188082765 -78 0.5178517758 -79 0.517003296 -80 0.5160910601 -81 0.5152263111 -82 0.5142879283 -83 0.5133673465 -84 0.5125676214 -85 0.511806879 -86 0.5109763058 -87 0.5102151408 -88 0.5093848846 -89 0.5086172754 -90 0.5078550539 -91 0.5071185039 -92 0.5064200915 -93 0.5056497882 -94 0.5049258627 -95 0.504269972 -96 0.5034799661 -97 0.5028081231 -98 0.5020622765 -99 0.5014704588 -100 0.5008064863 -101 0.5001531838 -102 0.4995469985 -103 0.4989194204 -104 0.4983277611 -105 0.4978244203 -106 0.4972450686 -107 0.4966463841 -108 0.4960494427 -109 0.49544368 -110 0.4949225909 -111 0.4944312407 -112 0.4938673659 -113 0.4932931379 -114 0.4927523991 -115 0.4922124526 -116 0.4916421335 -117 0.4911280698 -118 0.4905679981 -119 0.490077493 -120 0.4895810719 -121 0.4891463997 -122 0.4887393533 -123 0.4882983953 -124 0.4878777737 -125 0.487388325 -126 0.4869629495 -127 0.4865456557 -128 0.4861641752 -129 0.485755914 -130 0.4853674082 -131 0.4850003481 -132 0.4845859067 -133 0.4842318936 -134 0.4838624566 -135 0.4835127749 -136 0.4831545361 -137 0.4827900644 -138 0.4824663183 -139 0.4821112488 -140 0.4817231128 -141 0.4812918212 -142 0.4809127177 -143 0.4805652546 -144 0.4801548276 -145 0.4798612429 -146 0.4795304188 -147 0.4791973232 -148 0.4787542523 -149 0.478443342 -150 0.478118117 -151 0.477766164 -152 0.4773950894 -153 0.4770596697 -154 0.4766443304 -155 0.4763934259 -156 0.4760888014 -157 0.4757386972 -158 0.4754284208 -159 0.4752018672 -160 0.4748744764 -161 0.4745125401 -162 0.4741907485 -163 0.4739415871 -164 0.4736589366 -165 0.473393506 -166 0.4731260683 -167 0.4728718888 -168 0.4725338808 -169 0.4722885755 -170 0.4718623547 -171 0.4716504857 -172 0.4714240906 -173 0.4711224242 -174 0.4708753757 -175 0.4705578626 -176 0.470318579 -177 0.4700258923 -178 0.4697032555 -179 0.4694980949 -180 0.4692407461 -181 0.4690375399 -182 0.4687665102 -183 0.4685097953 -184 0.4682683987 -185 0.4679814696 -186 0.4677498452 -187 0.4675479595 -188 0.4673429573 -189 0.4670665926 -190 0.4668145788 -191 0.4666169189 -192 0.4663742546 -193 0.4661475426 -194 0.4658186729 -195 0.4655949189 -196 0.4654052879 -197 0.4650987618 -198 0.4647930809 -199 0.4645638863 -200 0.4643999268 -201 0.4641465396 -202 0.4639578595 -203 0.4637831771 -204 0.4635943385 -205 0.4632829528 -206 0.4630655902 -207 0.4628626481 -208 0.4626137509 -209 0.4624257574 -210 0.4621862096 -211 0.4620176546 -212 0.4618566003 -213 0.4616117703 -214 0.4613963622 -215 0.4611555996 -216 0.4609431495 -217 0.4606419056 -218 0.4604990749 -219 0.4602662356 -220 0.4601193376 -221 0.4598976965 -222 0.4596782739 -223 0.4594982037 -224 0.4593121118 -225 0.4591613578 -226 0.4589852492 -227 0.4587977311 -228 0.4585018223 -229 0.4583266117 -230 0.4581678816 -231 0.4579662072 -232 0.4578352087 -233 0.457673679 -234 0.4574698389 -235 0.457183438 -236 0.4570205878 -237 0.4568795531 -238 0.4567206645 -239 0.4565087954 -240 0.4562582079 -241 0.4560229387 -242 0.4558351565 -243 0.4556336406 -244 0.4553961528 -245 0.4552254321 -246 0.4550482672 -247 0.454885681 -248 0.454700223 -249 0.4545273366 -250 0.4544055819 -251 0.454199893 -252 0.4540775045 -253 0.4538600891 -254 0.4536116144 -255 0.4534992092 -256 0.4533003872 -257 0.4531977541 -258 0.4530556629 -259 0.45287105 -260 0.4525722359 -261 0.4524406035 -262 0.452250233 -263 0.4521208719 -264 0.4518656889 -265 0.451704212 -266 0.4515996773 -267 0.4513194037 -268 0.4511126056 -269 0.4509529775 -270 0.4507664102 -271 0.4505616722 -272 0.4503905817 -273 0.4502793914 -274 0.4501244645 -275 0.4499517894 -276 0.4497570875 -277 0.4496612684 -278 0.4495419963 -279 0.4494077228 -280 0.449301709 -281 0.4491572937 -282 0.4490279854 -283 0.4488724246 -284 0.4486344087 -285 0.4484893595 -286 0.4484240187 -287 0.4481634477 -288 0.4479560686 -289 0.4477917922 -290 0.4476275686 -291 0.4474951438 -292 0.447323261 -293 0.447158562 -294 0.4470886257 -295 0.4470127205 -296 0.4468302205 -297 0.4467086242 -298 0.4465980678 -299 0.4465148203 -300 0.4464396018 -301 0.4463183225 -302 0.4461492921 -303 0.446020829 -304 0.4458343673 -305 0.4456622204 -306 0.445596774 -307 0.4454220916 -308 0.4450990851 -309 0.444992279 -310 0.4447645634 -311 0.4446559085 -312 0.4444993441 -313 0.444352499 -314 0.4442798159 -315 0.4441964628 -316 0.4440341408 -317 0.4439694866 -318 0.4439021914 -319 0.4437099193 -320 0.4436455821 -321 0.4434661458 -322 0.4432080575 -323 0.4430162872 -324 0.4429581038 -325 0.4428937138 -326 0.4427885716 -327 0.4427152547 -328 0.44249364 -329 0.4424281407 -330 0.4422756436 -331 0.4421993422 -332 0.4421153288 -333 0.4420295723 -334 0.4418158281 -335 0.4417356971 -336 0.4416540343 -337 0.4415295857 -338 0.4412303226 -339 0.4410611602 -340 0.4409150281 -341 0.4407749442 -342 0.4405557593 -343 0.44040107 -344 0.4402975653 -345 0.4401624731 -346 0.4399556749 -347 0.4398478388 -348 0.4397832375 -349 0.4397173421 -350 0.439509778 -351 0.4393479578 -352 0.4392969582 -353 0.4392013504 -354 0.4391486076 -355 0.4389969557 -356 0.4388265783 -357 0.4386331705 -358 0.4385288735 -359 0.4383196456 -360 0.4382746412 -361 0.4382349455 -362 0.4381737776 -363 0.4379406477 -364 0.4378149842 -365 0.43767424 -366 0.4376312429 -367 0.4375809035 -368 0.4373529766 -369 0.4372716835 -370 0.437206686 -371 0.4369936549 -372 0.436909932 -373 0.4368650333 -374 0.436660665 -375 0.4366189092 -376 0.4365230373 -377 0.4364827605 -378 0.4363414089 -379 0.4362572634 -380 0.4360898441 -381 0.4359583701 -382 0.4357939088 -383 0.4356719428 -384 0.4354242341 -385 0.4353074446 -386 0.4350243187 -387 0.4349750358 -388 0.4348339746 -389 0.4346901139 -390 0.4345142167 -391 0.4344513057 -392 0.4343266193 -393 0.4342603806 -394 0.4341046613 -395 0.4340624037 -396 0.433915585 -397 0.433756221 -398 0.4336769087 -399 0.4335894619 -400 0.433471933 -401 0.4334123762 -402 0.4333829279 -403 0.4333428624 -404 0.4332305364 -405 0.4330941236 -406 0.4330649923 -407 0.4329271269 -408 0.4326923859 -409 0.4325448541 -410 0.432499929 -411 0.4323177723 -412 0.4320929883 -413 0.432058205 -414 0.4319379293 -415 0.4317621641 -416 0.4316120704 -417 0.4315593276 -418 0.4314243674 -419 0.4313901916 -420 0.4311070657 -421 0.4310475353 -422 0.431018985 -423 0.430816439 -424 0.430703532 -425 0.4306646814 -426 0.4306214202 -427 0.4305729824 -428 0.4305362183 -429 0.4303169278 -430 0.4301751535 -431 0.4300101904 -432 0.4299042823 -433 0.4298305428 -434 0.4296876593 -435 0.4295342114 -436 0.42950199 -437 0.4293759303 -438 0.429199584 -439 0.4291747841 -440 0.4289956383 -441 0.4289693065 -442 0.4289362663 -443 0.4287428058 -444 0.4285975717 -445 0.4284043488 -446 0.4282537269 -447 0.4282239617 -448 0.4280819233 -449 0.4280580214 -450 0.4278186057 -451 0.4277642254 -452 0.4277265105 -453 0.4276279182 -454 0.4275099139 -455 0.4274100011 -456 0.4270585235 -457 0.4269455637 -458 0.4268328151 -459 0.4267528954 -460 0.4266029338 -461 0.4264877026 -462 0.4264385781 -463 0.4262895672 -464 0.4262548632 -465 0.4262294822 -466 0.4262004565 -467 0.4261561917 -468 0.4259361088 -469 0.4257916671 -470 0.4257394525 -471 0.4254953885 -472 0.4254622691 -473 0.4254261917 -474 0.425293133 -475 0.4252466761 -476 0.4251952803 -477 0.4251056414 -478 0.4249928928 -479 0.4248955683 -480 0.4248150147 -481 0.4247213349 -482 0.4246937882 -483 0.4245429286 -484 0.4244326627 -485 0.4241665983 -486 0.4240887386 -487 0.4238527828 -488 0.4237342238 -489 0.4235270295 -490 0.4233882397 -491 0.4232716879 -492 0.4232206883 -493 0.4230846981 -494 0.4230572306 -495 0.4229158525 -496 0.4228947502 -497 0.4227387668 -498 0.4225079347 -499 0.4224208312 -500 0.422350842 -501 0.4222371955 -502 0.4222099658 -503 0.4219659545 -504 0.4219492892 -505 0.4219165924 -506 0.4217989578 -507 0.4217040895 -508 0.4216258865 -509 0.4215985247 -510 0.4214814712 -511 0.4214580182 -512 0.4213440283 -513 0.4213161647 -514 0.4211270355 -515 0.4210071296 -516 0.4209019082 -517 0.4208812284 -518 0.4208323416 -519 0.4208045044 -520 0.4207619827 -521 0.420640677 -522 0.420474182 -523 0.420325224 -524 0.4201793032 -525 0.4200712558 -526 0.419971343 -527 0.4199164081 -528 0.4198784555 -529 0.4197912464 -530 0.4195674132 -531 0.419458415 -532 0.4194369693 -533 0.4192974399 -534 0.4190451621 -535 0.4188749696 -536 0.4186943976 -537 0.4186515589 -538 0.4183546201 -539 0.4182880908 -540 0.4181779833 -541 0.4180091378 -542 0.4179237774 -543 0.4177213107 -544 0.4175728017 -545 0.4174015527 -546 0.4173581066 -547 0.4171991917 -548 0.4171664156 -549 0.4170447137 -550 0.4168904471 -551 0.4167184586 -552 0.4165827325 -553 0.4165529409 -554 0.416382273 -555 0.4163037795 -556 0.416267438 -557 0.4161516258 -558 0.4159738533 -559 0.4158370443 -560 0.415724375 -561 0.4155583819 -562 0.4154293906 -563 0.4152592773 -564 0.4150933898 -565 0.4149931865 -566 0.4148317889 -567 0.4147933609 -568 0.414666324 -569 0.4145690258 -570 0.4143404915 -571 0.4142584061 -572 0.4141421713 -573 0.4140006083 -574 0.4138716698 -575 0.4138337964 -576 0.4138146749 -577 0.4136360044 -578 0.4135483463 -579 0.4134781987 -580 0.4133906991 -581 0.4132962269 -582 0.4132042638 -583 0.4130792342 -584 0.413046643 -585 0.4130256198 -586 0.4130014009 -587 0.4129758087 -588 0.4127330124 -589 0.4126291379 -590 0.4125800663 -591 0.4123417334 -592 0.4122409754 -593 0.411888283 -594 0.4117402229 -595 0.411514805 -596 0.4114420427 -597 0.411346699 -598 0.4113182543 -599 0.4112403419 -600 0.4112103918 -601 0.4110535369 -602 0.4110251451 -603 0.4109839703 -604 0.4109038129 -605 0.4108756324 -606 0.4108519417 -607 0.4107468524 -608 0.4106109149 -609 0.4105870922 -610 0.4105503545 -611 0.4105113191 -612 0.4103531436 -613 0.4102633462 -614 0.4102406856 -615 0.4101803364 -616 0.4100715759 -617 0.4100329895 -618 0.4100085065 -619 0.409977051 -620 0.4098961012 -621 0.4098370462 -622 0.4097284442 -623 0.4096754373 -624 0.409616937 -625 0.4095200614 -626 0.4094847499 -627 0.4093862897 -628 0.4093056041 -629 0.4092387579 -630 0.4092014127 -631 0.4090089558 -632 0.408898188 -633 0.4088724901 -634 0.4087240339 -635 0.4086902278 -636 0.4085883078 -637 0.4084600295 -638 0.408364501 -639 0.4082498772 -640 0.4081061486 -641 0.4080852575 -642 0.4080110161 -643 0.407881972 -644 0.4077751659 -645 0.4075843728 -646 0.4073488924 -647 0.4072274546 -648 0.4070840957 -649 0.4068929857 -650 0.4067916731 -651 0.4067024303 -652 0.4066307245 -653 0.4065174741 -654 0.4064330117 -655 0.4063061333 -656 0.4061701695 -657 0.4061058323 -658 0.4060142125 -659 0.405792228 -660 0.4056412892 -661 0.4055080985 -662 0.4054061256 -663 0.405253787 -664 0.4050393825 -665 0.4048894737 -666 0.4047538532 -667 0.4046765482 -668 0.4045781408 -669 0.4043456712 -670 0.4043171737 -671 0.4041254563 -672 0.4039945105 -673 0.4038426473 -674 0.4036126867 -675 0.4035745756 -676 0.4035122721 -677 0.4034046473 -678 0.4033447471 -679 0.4031923028 -680 0.403123687 -681 0.4030560749 -682 0.4029534681 -683 0.4028241863 -684 0.4027304008 -685 0.4026478401 -686 0.4025439128 -687 0.4023881671 -688 0.4022772937 -689 0.4021326143 -690 0.401997522 -691 0.401858204 -692 0.4017396714 -693 0.4016806693 -694 0.4015834768 -695 0.4014522141 -696 0.401294963 -697 0.4012343498 -698 0.4011175603 -699 0.4009536537 -700 0.400831133 -701 0.400691683 -702 0.4005758707 -703 0.4004488866 -704 0.400335425 -705 0.4002290151 -706 0.4000014843 -707 0.3999130339 -708 0.3998857777 -709 0.3998205954 -710 0.3997079524 -711 0.3996026518 -712 0.3995276181 -713 0.3993842328 -714 0.3992326337 -715 0.3991446586 -716 0.3990109926 -717 0.3988556695 -718 0.398705523 -719 0.3985037957 -720 0.3984158735 -721 0.398388723 -722 0.3981767219 -723 0.3981073138 -724 0.3980124455 -725 0.3979056658 -726 0.3977599035 -727 0.397652173 -728 0.3974028796 -729 0.3972820229 -730 0.3971923311 -731 0.3970427128 -732 0.3969815978 -733 0.3969509346 -734 0.3968253767 -735 0.3966863492 -736 0.3965898962 -737 0.396401665 -738 0.3963686777 -739 0.3962630073 -740 0.3962051144 -741 0.3960346314 -742 0.3959875934 -743 0.39590255 -744 0.3957626245 -745 0.3957432652 -746 0.395606377 -747 0.3955399533 -748 0.3954245109 -749 0.3952730174 -750 0.3951517645 -751 0.3950575564 -752 0.3949702417 -753 0.3949202721 -754 0.3946860857 -755 0.3945830828 -756 0.3944809779 -757 0.394384789 -758 0.3942265607 -759 0.3941514214 -760 0.3940130278 -761 0.3938855947 -762 0.3937863686 -763 0.3936499558 -764 0.3934777033 -765 0.3933875097 -766 0.3933341331 -767 0.3930968566 -768 0.3929859568 -769 0.3928818447 -770 0.3927987029 -771 0.3926696851 -772 0.3925721757 -773 0.3924765679 -774 0.3923689431 -775 0.3923019384 -776 0.3922111373 -777 0.3921330136 -778 0.3920802973 -779 0.3919959141 -780 0.3918737368 -781 0.3917405726 -782 0.3916381507 -783 0.3914880042 -784 0.3913821225 -785 0.3912784065 -786 0.3911938385 -787 0.3911118851 -788 0.39095849 -789 0.3908507596 -790 0.3907657162 -791 0.3905791489 -792 0.3904356051 -793 0.3903660385 -794 0.3902386318 -795 0.3901565729 -796 0.3899930624 -797 0.3899004654 -798 0.3897640262 -799 0.389706054 -800 0.3896595971 -801 0.3895810508 -802 0.3895170041 -803 0.3893874317 -804 0.389266707 -805 0.3891872363 -806 0.3890630518 -807 0.3888924896 -808 0.3887323333 -809 0.3886538662 -810 0.3885185098 -811 0.3883717967 -812 0.3883075652 -813 0.3882100822 -814 0.3881361842 -815 0.3880302761 -816 0.3878564389 -817 0.3877110992 -818 0.3875246639 -819 0.3873748871 -820 0.3872878101 -821 0.387244047 -822 0.387153114 -823 0.3870743035 -824 0.3869800691 -825 0.3868912489 -826 0.3868699352 -827 0.3866831566 -828 0.3866126657 -829 0.3864292677 -830 0.3863339504 -831 0.3862723599 -832 0.3861423386 -833 0.3860811443 -834 0.3859714066 -835 0.3858774363 -836 0.385788035 -837 0.3857161971 -838 0.385601098 -839 0.3855223668 -840 0.3854583465 -841 0.3853565585 -842 0.3851537221 -843 0.3850419507 -844 0.3849328205 -845 0.3848402499 -846 0.3846764225 -847 0.384490938 -848 0.3843220397 -849 0.3841868154 -850 0.3840635024 -851 0.3840131366 -852 0.3838962415 -853 0.3837903598 -854 0.3837085121 -855 0.3835712806 -856 0.3834753558 -857 0.3832889998 -858 0.3831362386 -859 0.3830139557 -860 0.3828592929 -861 0.3827558146 -862 0.3826881496 -863 0.3825099282 -864 0.3824270769 -865 0.3823122946 -866 0.3821204451 -867 0.3820351112 -868 0.3819018941 -869 0.3818172469 -870 0.3817131083 -871 0.3816451264 -872 0.3816026575 -873 0.3814867924 -874 0.3814064766 -875 0.3812512591 -876 0.3811269162 -877 0.3809351723 -878 0.3809117986 -879 0.3807909947 -880 0.3807601466 -881 0.3806211455 -882 0.3804656375 -883 0.3804158 -884 0.3803325261 -885 0.3802163177 -886 0.3801171444 -887 0.379954796 -888 0.3798679566 -889 0.3797358752 -890 0.3796585438 -891 0.3795713875 -892 0.3794183094 -893 0.3793026556 -894 0.3792277804 -895 0.3790288527 -896 0.3789600785 -897 0.378870466 -898 0.3787758882 -899 0.3786803068 -900 0.378490755 -901 0.3782728907 -902 0.3781796335 -903 0.3780963596 -904 0.3780401042 -905 0.3779341696 -906 0.3778110944 -907 0.3777207688 -908 0.3776341935 -909 0.3775205734 -910 0.3774297195 -911 0.3773887297 -912 0.3771895379 -913 0.377059094 -914 0.3769735487 -915 0.3767859514 -916 0.3766662832 -917 0.3765442379 -918 0.3764072969 -919 0.3763070672 -920 0.3760766576 -921 0.3759803895 -922 0.3758646829 -923 0.3756695585 -924 0.3755853866 -925 0.375455286 -926 0.3752258008 -927 0.375161939 -928 0.3749880754 -929 0.3749237911 -930 0.3747906796 -931 0.3747345562 -932 0.3746972903 -933 0.3746012599 -934 0.3745170881 -935 0.3744314636 -936 0.3743783247 -937 0.3742938359 -938 0.3741377733 -939 0.374108325 -940 0.3739925128 -941 0.3738371633 -942 0.3737582208 -943 0.3736916387 -944 0.3735721025 -945 0.3734448279 -946 0.3733377313 -947 0.3732737903 -948 0.3731410222 -949 0.3731100685 -950 0.3730120837 -951 0.3729871253 -952 0.3728805833 -953 0.3728039914 -954 0.372728139 -955 0.3726554823 -956 0.372607969 -957 0.372522186 -958 0.3723003336 -959 0.3722247982 -960 0.3721584537 -961 0.3720815185 -962 0.3719817377 -963 0.3718679063 -964 0.3717649827 -965 0.3717168354 -966 0.3716290188 -967 0.3713768202 -968 0.3712956328 -969 0.3712129928 -970 0.3711150608 -971 0.3709856469 -972 0.370919276 -973 0.3707053734 -974 0.3705584226 -975 0.3704944287 -976 0.3704255224 -977 0.370362004 -978 0.3702698032 -979 0.3701812471 -980 0.3701202112 -981 0.3700575379 -982 0.3698672467 -983 0.369781992 -984 0.3696331132 -985 0.3695535897 -986 0.369406586 -987 0.3691954301 -988 0.3691112582 -989 0.3690500904 -990 0.3689075502 -991 0.3688160625 -992 0.368679861 -993 0.3686532915 -994 0.3685900372 -995 0.3684272398 -996 0.3683541605 -997 0.3681510599 -998 0.368094197 -999 0.3680558483 -1000 0.367993307 -1001 0.3679084221 -1002 0.3677388635 -1003 0.3676849586 -1004 0.3676106909 -1005 0.367461099 -1006 0.3674003537 -1007 0.3672810024 -1008 0.3671352136 -1009 0.3670708236 -1010 0.3669081583 -1011 0.3668888518 -1012 0.3667959644 -1013 0.366736117 -1014 0.3665828276 -1015 0.3665613554 -1016 0.3663577795 -1017 0.3662789162 -1018 0.3661279245 -1019 0.3660209072 -1020 0.3659825584 -1021 0.365871685 -1022 0.3656501231 -1023 0.3655259386 -1024 0.3654622617 -1025 0.3653981094 -1026 0.3652841723 -1027 0.365221948 -1028 0.3650262161 -1029 0.3647673883 -1030 0.364646109 -1031 0.3645739277 -1032 0.3645454302 -1033 0.3644716643 -1034 0.3644073271 -1035 0.3643612663 -1036 0.364343254 -1037 0.3642708087 -1038 0.3641713977 -1039 0.3641001408 -1040 0.3640005977 -1041 0.3639340684 -1042 0.3637593068 -1043 0.363644868 -1044 0.3635717095 -1045 0.3634735398 -1046 0.3633955746 -1047 0.3633414056 -1048 0.3632657381 -1049 0.3632202055 -1050 0.3630583061 -1051 0.3629922786 -1052 0.3629469573 -1053 0.3627624501 -1054 0.3627421664 -1055 0.3627005955 -1056 0.3625106212 -1057 0.362401174 -1058 0.3623106899 -1059 0.3621572684 -1060 0.3621187084 -1061 0.3618698639 -1062 0.3617479243 -1063 0.3616873903 -1064 0.3616666841 -1065 0.361489836 -1066 0.3614341352 -1067 0.361220391 -1068 0.3611753603 -1069 0.3610790922 -1070 0.3609966899 -1071 0.360933726 -1072 0.3608361902 -1073 0.3607590437 -1074 0.3606524753 -1075 0.3605963783 -1076 0.3604486616 -1077 0.3604083056 -1078 0.3602384565 -1079 0.3601371439 -1080 0.3600734405 -1081 0.359975667 -1082 0.3598768899 -1083 0.3597882282 -1084 0.3596489365 -1085 0.3595070302 -1086 0.3594236771 -1087 0.3593062538 -1088 0.3592398302 -1089 0.3591712144 -1090 0.3589635975 -1091 0.358914341 -1092 0.3587902621 -1093 0.3586495707 -1094 0.3583883923 -1095 0.3582232444 -1096 0.3580444947 -1097 0.3579685895 -1098 0.3578222197 -1099 0.357727325 -1100 0.3576691416 -1101 0.3575913084 -1102 0.3574220667 -1103 0.3573666564 -1104 0.3572650269 -1105 0.3571120544 -1106 0.3570259545 -1107 0.3568969104 -1108 0.3567895761 -1109 0.3567679455 -1110 0.3566135468 -1111 0.3565158261 -1112 0.3563395062 -1113 0.3562944755 -1114 0.3562287385 -1115 0.3560953101 -1116 0.3559713897 -1117 0.355911965 -1118 0.3558743557 -1119 0.3557724621 -1120 0.3557243148 -1121 0.3556553293 -1122 0.3556107475 -1123 0.3555511115 -1124 0.3554895474 -1125 0.3554307829 -1126 0.3553907439 -1127 0.3553201473 -1128 0.3551664617 -1129 0.3550973441 -1130 0.3550310261 -1131 0.3549639949 -1132 0.3547969454 -1133 0.3547689233 -1134 0.354723602 -1135 0.3546701726 -1136 0.3545605405 -1137 0.3544628726 -1138 0.354329365 -1139 0.3542345231 -1140 0.3540737594 -1141 0.3539656592 -1142 0.3539201794 -1143 0.353898496 -1144 0.3538379091 -1145 0.3537080463 -1146 0.3535884044 -1147 0.3535536211 -1148 0.3534339793 -1149 0.3533821609 -1150 0.3533180614 -1151 0.3532425524 -1152 0.353185848 -1153 0.3531209297 -1154 0.3530387651 -1155 0.352939988 -1156 0.3528662221 -1157 0.3528122116 -1158 0.3527410603 -1159 0.3526548284 -1160 0.3525551005 -1161 0.3524496678 -1162 0.3523390321 -1163 0.3522470426 -1164 0.3521805397 -1165 0.3520193269 -1166 0.3519884525 -1167 0.3519121511 -1168 0.3518350046 -1169 0.3517706674 -1170 0.351707281 -1171 0.3516247994 -1172 0.3515422386 -1173 0.3514245248 -1174 0.3513319278 -1175 0.3512806377 -1176 0.3511702661 -1177 0.351109468 -1178 0.3510220476 -1179 0.3509819293 -1180 0.3508707126 -1181 0.35081657 -1182 0.3507096583 -1183 0.3505858699 -1184 0.3504076749 -1185 0.3501920291 -1186 0.3500326915 -1187 0.34997913 -1188 0.3498853182 -1189 0.3497534216 -1190 0.3496579194 -1191 0.3496068406 -1192 0.3495561579 -1193 0.3494295964 -1194 0.3492731376 -1195 0.3491270319 -1196 0.3490965801 -1197 0.3489798963 -1198 0.3488902045 -1199 0.3487869111 -1200 0.3486699896 -1201 0.3485725858 -1202 0.3485040493 -1203 0.348428012 -1204 0.3483484357 -1205 0.3482645807 -1206 0.3482475985 -1207 0.3481676788 -1208 0.3480407211 -1209 0.3479134201 -1210 0.3478303839 -1211 0.3477605532 -1212 0.3477263246 -1213 0.3475753065 -1214 0.3474492204 -1215 0.3473390337 -1216 0.3472799259 -1217 0.3472254136 -1218 0.3471532059 -1219 0.3470847486 -1220 0.3469542782 -1221 0.3468893336 -1222 0.3467616364 -1223 0.3466169834 -1224 0.3465490278 -1225 0.3464336118 -1226 0.3463022435 -1227 0.3462382496 -1228 0.3461630839 -1229 0.3460831642 -1230 0.3460061762 -1231 0.3459881374 -1232 0.3459353154 -1233 0.3458377268 -1234 0.3456172742 -1235 0.3455547329 -1236 0.3455043143 -1237 0.3454320538 -1238 0.3453458483 -1239 0.3452301418 -1240 0.3450607152 -1241 0.3449794221 -1242 0.3449037282 -1243 0.3447377615 -1244 0.344598734 -1245 0.3444494326 -1246 0.3443445809 -1247 0.3442595903 -1248 0.3441718794 -1249 0.3440871793 -1250 0.3438821507 -1251 0.3438117918 -1252 0.3437252166 -1253 0.3436605096 -1254 0.3436000813 -1255 0.3435104423 -1256 0.3433409894 -1257 0.3431781391 -1258 0.3430472198 -1259 0.3429976728 -1260 0.3428691833 -1261 0.3427937534 -1262 0.3426756434 -1263 0.3426158225 -1264 0.3425187621 -1265 0.3424641706 -1266 0.3423682986 -1267 0.3422603569 -1268 0.3422038902 -1269 0.3421232574 -1270 0.3419796872 -1271 0.3419036235 -1272 0.341863426 -1273 0.3417600797 -1274 0.3416898529 -1275 0.341629134 -1276 0.3415635555 -1277 0.3415005124 -1278 0.3413679292 -1279 0.3413072367 -1280 0.341213821 -1281 0.3411239444 -1282 0.3410302382 -1283 0.3409716057 -1284 0.3408919238 -1285 0.3408205348 -1286 0.3407168452 -1287 0.3406713391 -1288 0.3405330511 -1289 0.3404472418 -1290 0.3403912504 -1291 0.340241817 -1292 0.340131287 -1293 0.3399558915 -1294 0.3398570087 -1295 0.3397680037 -1296 0.3396487316 -1297 0.3395986035 -1298 0.339428728 -1299 0.3393526379 -1300 0.3392952996 -1301 0.3392205301 -1302 0.3391168141 -1303 0.3389963799 -1304 0.3388871704 -1305 0.3387812887 -1306 0.3386707851 -1307 0.3386314591 -1308 0.3385645336 -1309 0.3384171339 -1310 0.3383085846 -1311 0.3382448285 -1312 0.3381088118 -1313 0.337922984 -1314 0.337836356 -1315 0.3377290745 -1316 0.337671657 -1317 0.3376403599 -1318 0.3374833465 -1319 0.3374192206 -1320 0.3373553588 -1321 0.3372769446 -1322 0.3371770318 -1323 0.3370968744 -1324 0.3369890647 -1325 0.3369427398 -1326 0.3368575379 -1327 0.3367710683 -1328 0.3366422618 -1329 0.3365308602 -1330 0.3364610296 -1331 0.3363111207 -1332 0.3362267112 -1333 0.336146633 -1334 0.3360918302 -1335 0.3359925248 -1336 0.3359524065 -1337 0.3358285918 -1338 0.3357373418 -1339 0.3356392777 -1340 0.3355216431 -1341 0.3354703266 -1342 0.3354137278 -1343 0.3352910223 -1344 0.3352410263 -1345 0.3351337184 -1346 0.3350811605 -1347 0.3350021124 -1348 0.3349181254 -1349 0.3347808674 -1350 0.33467385 -1351 0.3346003218 -1352 0.3344930667 -1353 0.3343413091 -1354 0.3342185244 -1355 0.3340889784 -1356 0.3340138392 -1357 0.333896363 -1358 0.3338261098 -1359 0.3337807093 -1360 0.3336794495 -1361 0.3335516731 -1362 0.3334976362 -1363 0.3334466365 -1364 0.3332702903 -1365 0.3331880728 -1366 0.3331237356 -1367 0.3330643109 -1368 0.3330009509 -1369 0.3329285319 -1370 0.3328636137 -1371 0.3327922776 -1372 0.3326889314 -1373 0.3326080873 -1374 0.3325447273 -1375 0.3325160449 -1376 0.3324560127 -1377 0.3323354994 -1378 0.3322758897 -1379 0.3322166763 -1380 0.3320972985 -1381 0.3320257511 -1382 0.3319777095 -1383 0.3318514121 -1384 0.3317970319 -1385 0.3317440514 -1386 0.3316090384 -1387 0.3314799678 -1388 0.3313398839 -1389 0.3312634769 -1390 0.3311515735 -1391 0.3310364743 -1392 0.3309221675 -1393 0.330857936 -1394 0.3307400373 -1395 0.3304451585 -1396 0.3302972833 -1397 0.3301715141 -1398 0.3301201447 -1399 0.3299773668 -1400 0.3298368339 -1401 0.329678632 -1402 0.3295973918 -1403 0.3294485658 -1404 0.3293563914 -1405 0.3292805918 -1406 0.3291836371 -1407 0.32907831 -1408 0.328999658 -1409 0.3288077557 -1410 0.3286868197 -1411 0.3285791685 -1412 0.3284545614 -1413 0.3283906204 -1414 0.3282693411 -1415 0.3282179981 -1416 0.3280556233 -1417 0.3279876413 -1418 0.3279144301 -1419 0.3278193769 -1420 0.3277440527 -1421 0.3276547835 -1422 0.3274946536 -1423 0.3273700201 -1424 0.327228959 -1425 0.3271324003 -1426 0.3270226626 -1427 0.3269123439 -1428 0.3268822089 -1429 0.3267487806 -1430 0.3266500563 -1431 0.3266102285 -1432 0.3265353269 -1433 0.3264585501 -1434 0.3263594032 -1435 0.3262604148 -1436 0.3261962361 -1437 0.3260837516 -1438 0.3260159017 -1439 0.3259443279 -1440 0.3258903703 -1441 0.3257951322 -1442 0.3257440797 -1443 0.3255723026 -1444 0.3254667114 -1445 0.3253797136 -1446 0.3253091962 -1447 0.3252414256 -1448 0.3251340649 -1449 0.3250342577 -1450 0.3249046325 -1451 0.3248216227 -1452 0.3247304784 -1453 0.3246517472 -1454 0.3245258988 -1455 0.3244441303 -1456 0.3243161954 -1457 0.3242675464 -1458 0.3241622457 -1459 0.3240891929 -1460 0.3239984711 -1461 0.3239369335 -1462 0.3238837681 -1463 0.3237626737 -1464 0.3237011097 -1465 0.3236160398 -1466 0.3234807099 -1467 0.3233412334 -1468 0.3232728289 -1469 0.3231662341 -1470 0.3230838582 -1471 0.3229885937 -1472 0.3229019392 -1473 0.3227772793 -1474 0.3227256194 -1475 0.3225626107 -1476 0.3224765901 -1477 0.322374538 -1478 0.3223118383 -1479 0.3220839906 -1480 0.3218702464 -1481 0.321744662 -1482 0.3216461754 -1483 0.3215251866 -1484 0.3214138115 -1485 0.3213447467 -1486 0.3212964938 -1487 0.3211394276 -1488 0.3210096967 -1489 0.3208561432 -1490 0.3207208661 -1491 0.3206321515 -1492 0.3204965574 -1493 0.3204094804 -1494 0.3202664384 -1495 0.3201563838 -1496 0.3200708385 -1497 0.3199812524 -1498 0.3198767705 -1499 0.3197977224 +0 0.6887138297 +1 0.6843872854 +2 0.6802627852 +3 0.6762009319 +4 0.6723192545 +5 0.6682080654 +6 0.6642342664 +7 0.66040895 +8 0.6567665034 +9 0.6530918354 +10 0.6495993504 +11 0.6459855333 +12 0.6426157539 +13 0.6392258492 +14 0.6358979576 +15 0.6326337693 +16 0.6296338495 +17 0.6265263841 +18 0.6235141039 +19 0.6205433947 +20 0.6175789713 +21 0.6147449654 +22 0.6119898755 +23 0.6092233761 +24 0.6065007718 +25 0.6037280922 +26 0.601134849 +27 0.5985698655 +28 0.5959878205 +29 0.5935677806 +30 0.5912109686 +31 0.5888627138 +32 0.5865621045 +33 0.5842648229 +34 0.5820778865 +35 0.5799317814 +36 0.5777438942 +37 0.5756289014 +38 0.5736006422 +39 0.5715183462 +40 0.5695853779 +41 0.5676576391 +42 0.5658429393 +43 0.5640453538 +44 0.562331544 +45 0.5605908479 +46 0.5587755142 +47 0.5569407421 +48 0.5552666016 +49 0.5535532672 +50 0.5520047375 +51 0.5504471752 +52 0.5489185594 +53 0.5474294544 +54 0.5459806526 +55 0.5445916453 +56 0.5431495519 +57 0.5417205055 +58 0.5403851653 +59 0.5389834808 +60 0.5377107875 +61 0.5364798765 +62 0.5352338583 +63 0.5339945486 +64 0.5327745188 +65 0.5315706526 +66 0.5304691555 +67 0.5293499101 +68 0.528244557 +69 0.5271158037 +70 0.5260443622 +71 0.5249990677 +72 0.5239809237 +73 0.5229378476 +74 0.5219464315 +75 0.5208603056 +76 0.5199106717 +77 0.5189214741 +78 0.5179007418 +79 0.5170257982 +80 0.5160979269 +81 0.5152054464 +82 0.5143571779 +83 0.5135479977 +84 0.5127352784 +85 0.511893507 +86 0.5110974267 +87 0.5103353109 +88 0.5094643818 +89 0.5086953991 +90 0.5079769143 +91 0.5072723744 +92 0.5064938838 +93 0.5056995994 +94 0.5049644228 +95 0.5042152484 +96 0.5035045284 +97 0.5028365414 +98 0.5021301528 +99 0.5014404559 +100 0.500777487 +101 0.5001429892 +102 0.4995491114 +103 0.4989485253 +104 0.4983499992 +105 0.4977427575 +106 0.4971949405 +107 0.4966445881 +108 0.4960738992 +109 0.4954706192 +110 0.4948638001 +111 0.4943255439 +112 0.4937688 +113 0.4932566907 +114 0.4927494411 +115 0.4922379656 +116 0.4917602435 +117 0.4912688932 +118 0.4907662919 +119 0.4903079026 +120 0.4896477861 +121 0.489197056 +122 0.4886972542 +123 0.4882628989 +124 0.4878229445 +125 0.4874311637 +126 0.4870381152 +127 0.4866496622 +128 0.4862709813 +129 0.4858681607 +130 0.4853899103 +131 0.4849540232 +132 0.4845096845 +133 0.4841039059 +134 0.4836538097 +135 0.4832327127 +136 0.4828748437 +137 0.4824942083 +138 0.4820718964 +139 0.4817320925 +140 0.4813566338 +141 0.48099718 +142 0.4806665143 +143 0.480273413 +144 0.4799522024 +145 0.4796210085 +146 0.4792147017 +147 0.4789183174 +148 0.478532664 +149 0.4782636944 +150 0.4779824172 +151 0.4776756799 +152 0.4773818311 +153 0.4770647406 +154 0.4767062377 +155 0.4764296089 +156 0.4760174917 +157 0.4756622109 +158 0.4753690488 +159 0.4751120698 +160 0.4748108259 +161 0.4745126986 +162 0.4742214381 +163 0.4739676812 +164 0.4736240741 +165 0.4733877484 +166 0.4731457709 +167 0.4729062759 +168 0.4726252629 +169 0.4723725624 +170 0.4720965675 +171 0.4718570197 +172 0.4715016333 +173 0.4712788301 +174 0.4709921123 +175 0.4707643438 +176 0.4704056825 +177 0.4701234017 +178 0.4698584465 +179 0.4695728908 +180 0.4693260536 +181 0.4690976513 +182 0.4688616426 +183 0.4685305015 +184 0.4682865695 +185 0.4680025456 +186 0.4677844436 +187 0.4674939226 +188 0.4672482474 +189 0.4669966563 +190 0.4666803581 +191 0.4664588227 +192 0.4662119855 +193 0.4660336056 +194 0.465759565 +195 0.4655335925 +196 0.4653787184 +197 0.4651595599 +198 0.4649592589 +199 0.4647202922 +200 0.4645238472 +201 0.4642532401 +202 0.4640300671 +203 0.4638038305 +204 0.4636120338 +205 0.4633936149 +206 0.4631845454 +207 0.4630175222 +208 0.4627118941 +209 0.462500342 +210 0.4623026821 +211 0.4620509325 +212 0.4618490996 +213 0.4616663883 +214 0.4614388839 +215 0.4611913601 +216 0.4609538723 +217 0.4608258318 +218 0.4606162869 +219 0.4604787385 +220 0.4602659714 +221 0.4600531516 +222 0.4598740322 +223 0.4596930112 +224 0.4594828853 +225 0.4593606024 +226 0.4590814381 +227 0.4589115626 +228 0.458786797 +229 0.4586156537 +230 0.4584218498 +231 0.4582468505 +232 0.4580919236 +233 0.4579602912 +234 0.4577697094 +235 0.4575785994 +236 0.4574154851 +237 0.4572040914 +238 0.4570666486 +239 0.4568047043 +240 0.4566408504 +241 0.456427608 +242 0.4562375017 +243 0.4559405892 +244 0.4558015617 +245 0.4556457896 +246 0.4554681492 +247 0.4552844343 +248 0.4549960262 +249 0.4547091499 +250 0.4544524878 +251 0.4542734741 +252 0.4541751195 +253 0.4540318662 +254 0.4538242758 +255 0.4536671832 +256 0.4534657729 +257 0.4533309183 +258 0.4531104921 +259 0.4528481781 +260 0.4526748163 +261 0.4525394863 +262 0.4523340087 +263 0.452107508 +264 0.4519560673 +265 0.4517016766 +266 0.451566241 +267 0.4513973162 +268 0.4511307236 +269 0.4510252909 +270 0.4507913422 +271 0.4506708024 +272 0.4504389667 +273 0.4502753241 +274 0.4500877004 +275 0.44989284 +276 0.4497752582 +277 0.4497071707 +278 0.4496092387 +279 0.4494378841 +280 0.4490959673 +281 0.4489082908 +282 0.4487697387 +283 0.448658654 +284 0.4484694984 +285 0.4483210158 +286 0.4481748573 +287 0.4479443949 +288 0.4477727762 +289 0.4476346467 +290 0.4475678269 +291 0.4474215628 +292 0.4472752458 +293 0.4470165765 +294 0.4468634455 +295 0.4466839564 +296 0.4465560743 +297 0.4463076524 +298 0.4461113659 +299 0.4460250547 +300 0.4458235388 +301 0.4456807081 +302 0.4454037096 +303 0.4453104787 +304 0.4451840757 +305 0.4450407696 +306 0.4449429961 +307 0.4447875938 +308 0.4447108434 +309 0.4446476155 +310 0.4445679071 +311 0.4443813398 +312 0.4442457457 +313 0.4441295373 +314 0.4439701205 +315 0.4436869418 +316 0.4436074446 +317 0.4433313969 +318 0.4431709236 +319 0.4430649099 +320 0.4429951056 +321 0.4428992073 +322 0.4428329157 +323 0.4427575123 +324 0.4426940995 +325 0.4426260119 +326 0.4425582941 +327 0.4424612601 +328 0.4422838046 +329 0.4422160868 +330 0.4421166229 +331 0.441977886 +332 0.4418363758 +333 0.4417645907 +334 0.441594768 +335 0.4413897658 +336 0.4412564167 +337 0.4411897553 +338 0.4409984605 +339 0.4408126062 +340 0.4407580675 +341 0.440634781 +342 0.4405851283 +343 0.4404759981 +344 0.4403500704 +345 0.4402948978 +346 0.4401106547 +347 0.4397904477 +348 0.4397326341 +349 0.4396824532 +350 0.439624032 +351 0.4394675733 +352 0.4394047943 +353 0.4393420418 +354 0.4392639445 +355 0.4391883562 +356 0.4391398392 +357 0.4389915678 +358 0.4387959944 +359 0.438557371 +360 0.4385087747 +361 0.4383729694 +362 0.4383069419 +363 0.4381990265 +364 0.43801238 +365 0.4378701568 +366 0.4378172555 +367 0.4377448894 +368 0.4374820735 +369 0.437295876 +370 0.4372092215 +371 0.4370238163 +372 0.436981902 +373 0.4368016998 +374 0.4366709917 +375 0.4365565529 +376 0.4363945478 +377 0.4363409599 +378 0.4362627569 +379 0.4361928206 +380 0.4361403683 +381 0.4359903539 +382 0.4357839519 +383 0.4357237876 +384 0.4356793379 +385 0.4355541498 +386 0.4353642019 +387 0.4352438734 +388 0.4351800644 +389 0.4350318459 +390 0.4348217199 +391 0.4347826317 +392 0.4346708867 +393 0.434634598 +394 0.4344987662 +395 0.4343509967 +396 0.4342753292 +397 0.4341274276 +398 0.4339128118 +399 0.4338583523 +400 0.4336283917 +401 0.4335961703 +402 0.4334266645 +403 0.4333842749 +404 0.433300552 +405 0.4332627579 +406 0.4332207644 +407 0.4331742546 +408 0.4331175502 +409 0.4330016059 +410 0.4329391703 +411 0.4327436761 +412 0.4326503132 +413 0.4326064445 +414 0.4325310147 +415 0.4322932893 +416 0.4321530205 +417 0.4320995646 +418 0.4320641475 +419 0.4318961471 +420 0.431762032 +421 0.4316429712 +422 0.4316029322 +423 0.4314649611 +424 0.4313357849 +425 0.4312889318 +426 0.4311176301 +427 0.4310804434 +428 0.4309550439 +429 0.4308267921 +430 0.4306758797 +431 0.430564214 +432 0.4305215338 +433 0.4304761861 +434 0.4303507603 +435 0.4302473612 +436 0.4302070316 +437 0.4301724332 +438 0.4300275953 +439 0.4299943702 +440 0.4298901524 +441 0.4298619719 +442 0.4297966311 +443 0.4295941908 +444 0.4293884755 +445 0.4292060811 +446 0.4291471318 +447 0.4290125149 +448 0.4288033134 +449 0.4287767175 +450 0.4287522081 +451 0.4287100297 +452 0.4284893658 +453 0.4284410865 +454 0.4284061448 +455 0.428283677 +456 0.42796347 +457 0.4279105952 +458 0.4276986997 +459 0.4275380152 +460 0.4274078618 +461 0.4272547308 +462 0.4272262598 +463 0.4271944609 +464 0.4271767391 +465 0.4271252641 +466 0.4269907529 +467 0.4269561545 +468 0.4267656783 +469 0.4266574461 +470 0.4266171429 +471 0.4264591523 +472 0.426324509 +473 0.4262026222 +474 0.4261693444 +475 0.4259847579 +476 0.4259156403 +477 0.4258481602 +478 0.4258218548 +479 0.4257969493 +480 0.4257487756 +481 0.4256836461 +482 0.4256607742 +483 0.4255501649 +484 0.4255061642 +485 0.4253049916 +486 0.4251170245 +487 0.4249721602 +488 0.4249461189 +489 0.4249260201 +490 0.424814645 +491 0.4247909543 +492 0.4247375248 +493 0.4246067376 +494 0.4245252596 +495 0.4243307162 +496 0.4242090143 +497 0.4241103428 +498 0.4240749785 +499 0.423876315 +500 0.4236667437 +501 0.4235874314 +502 0.4235353754 +503 0.4234143602 +504 0.4233028793 +505 0.423176714 +506 0.4231508576 +507 0.4229899882 +508 0.4228718782 +509 0.4228359329 +510 0.4227991952 +511 0.4227724144 +512 0.4225436952 +513 0.4224996416 +514 0.4223835653 +515 0.4223577353 +516 0.4222493446 +517 0.4222281101 +518 0.422172198 +519 0.4221387881 +520 0.4221057744 +521 0.4219720291 +522 0.4218148572 +523 0.421678867 +524 0.4215360891 +525 0.4214808109 +526 0.421386418 +527 0.4212872182 +528 0.4212450663 +529 0.421218312 +530 0.421077647 +531 0.4209894342 +532 0.4209177812 +533 0.4208865898 +534 0.4208590167 +535 0.4207220229 +536 0.4205735666 +537 0.4205432204 +538 0.4205065883 +539 0.4204169494 +540 0.4203891914 +541 0.4202709494 +542 0.420224017 +543 0.4201979758 +544 0.4201635359 +545 0.4201325029 +546 0.4201024736 +547 0.4199849975 +548 0.4198871712 +549 0.4197798368 +550 0.4196252004 +551 0.4195158061 +552 0.4193934703 +553 0.4192237533 +554 0.4191110047 +555 0.419012386 +556 0.4189145333 +557 0.4188031845 +558 0.4185742011 +559 0.4185236769 +560 0.4184201458 +561 0.4183944214 +562 0.4183447688 +563 0.4182207955 +564 0.4180463509 +565 0.41787703 +566 0.4177670546 +567 0.4177384779 +568 0.4175663046 +569 0.4174468476 +570 0.4172682036 +571 0.4171848769 +572 0.417080395 +573 0.4170362886 +574 0.4169296674 +575 0.4168813353 +576 0.4168014156 +577 0.4166510314 +578 0.4165654861 +579 0.4164509152 +580 0.4163564959 +581 0.4163250932 +582 0.4161199854 +583 0.4160572857 +584 0.4160180917 +585 0.4159334181 +586 0.4157927531 +587 0.4156931836 +588 0.4154709615 +589 0.415443811 +590 0.4153113862 +591 0.4152067722 +592 0.4151275921 +593 0.4149858178 +594 0.4149130555 +595 0.4146729531 +596 0.4144590504 +597 0.4143572096 +598 0.4143302704 +599 0.4142094401 +600 0.4140924129 +601 0.4139592751 +602 0.4138737827 +603 0.4138459455 +604 0.4136362686 +605 0.4136080088 +606 0.4135243916 +607 0.4133501054 +608 0.4132487135 +609 0.4131160511 +610 0.4130051249 +611 0.4129740391 +612 0.4128680782 +613 0.412837415 +614 0.4127119892 +615 0.4126791075 +616 0.4125751802 +617 0.4124947851 +618 0.4123330706 +619 0.4123064483 +620 0.4121374971 +621 0.4120678249 +622 0.4119360076 +623 0.4118715384 +624 0.4117428904 +625 0.4116109146 +626 0.4115017844 +627 0.411481131 +628 0.4113286075 +629 0.4112463108 +630 0.4110173538 +631 0.4108394229 +632 0.4105907634 +633 0.4105139073 +634 0.4101629052 +635 0.4099986023 +636 0.4098852727 +637 0.4097632803 +638 0.4096657973 +639 0.4095620549 +640 0.409416187 +641 0.4093790267 +642 0.4092723527 +643 0.4091630639 +644 0.4090574199 +645 0.4089596992 +646 0.4088231016 +647 0.4088041913 +648 0.4086547843 +649 0.4084877347 +650 0.4084118559 +651 0.4082863508 +652 0.4082518316 +653 0.4080320657 +654 0.4078376807 +655 0.4076548902 +656 0.407535354 +657 0.4074433909 +658 0.4072420335 +659 0.4071415924 +660 0.407027312 +661 0.4069112621 +662 0.406769752 +663 0.4065997444 +664 0.40648932 +665 0.4062134835 +666 0.4061617443 +667 0.4060348659 +668 0.4060129712 +669 0.4059170464 +670 0.4058050638 +671 0.4056596976 +672 0.4055702172 +673 0.4054526882 +674 0.4053703651 +675 0.4052619744 +676 0.4051706716 +677 0.4050839379 +678 0.4050310102 +679 0.4049275583 +680 0.4048025022 +681 0.4047124407 +682 0.4045690818 +683 0.4044315333 +684 0.4042882801 +685 0.404154482 +686 0.4039425865 +687 0.4038427529 +688 0.4037263068 +689 0.4036760467 +690 0.403583212 +691 0.4034757985 +692 0.4033589826 +693 0.403220589 +694 0.4030926277 +695 0.4029039211 +696 0.4028226545 +697 0.402755148 +698 0.4025953614 +699 0.402450814 +700 0.4023101754 +701 0.4022780597 +702 0.402171729 +703 0.4020247253 +704 0.4019478165 +705 0.4017364493 +706 0.4016885397 +707 0.4015977387 +708 0.401570641 +709 0.4015012065 +710 0.4013771276 +711 0.4013263657 +712 0.4012401074 +713 0.4011601349 +714 0.4010814037 +715 0.400944938 +716 0.4008109286 +717 0.4006492141 +718 0.400531421 +719 0.4003784749 +720 0.400226374 +721 0.4001478805 +722 0.4000406254 +723 0.3999716927 +724 0.3998336424 +725 0.3997517683 +726 0.3997031721 +727 0.3994946836 +728 0.3994120436 +729 0.3992452581 +730 0.3991151311 +731 0.3989169694 +732 0.3988042473 +733 0.3987856803 +734 0.398664269 +735 0.3985673142 +736 0.3984359195 +737 0.3983484991 +738 0.3983241217 +739 0.3982504614 +740 0.39816246 +741 0.3980996282 +742 0.3980129473 +743 0.3979900754 +744 0.3978655475 +745 0.3977282896 +746 0.3976407635 +747 0.3974670848 +748 0.3973722165 +749 0.3972935645 +750 0.3971188557 +751 0.3969426415 +752 0.3967768069 +753 0.396643088 +754 0.3965085768 +755 0.3964347052 +756 0.3963336303 +757 0.3962246849 +758 0.3961006589 +759 0.3959192945 +760 0.3958587605 +761 0.3958067044 +762 0.3956605196 +763 0.3956133759 +764 0.3955843238 +765 0.3954913571 +766 0.3954052044 +767 0.3952515981 +768 0.3951503911 +769 0.3950491577 +770 0.3949205362 +771 0.3948132283 +772 0.3946939298 +773 0.3946074866 +774 0.3945200398 +775 0.3944517409 +776 0.394347708 +777 0.39426314 +778 0.3941691696 +779 0.3941472485 +780 0.3940587452 +781 0.3939841342 +782 0.3938982192 +783 0.3937222427 +784 0.3936012803 +785 0.3935053556 +786 0.393446327 +787 0.3932816016 diff --git a/main/train/catboost_info/test/events.out.tfevents b/main/train/catboost_info/test/events.out.tfevents index 87b5d33..c28526d 100644 Binary files a/main/train/catboost_info/test/events.out.tfevents and b/main/train/catboost_info/test/events.out.tfevents differ diff --git a/main/train/catboost_info/test_error.tsv b/main/train/catboost_info/test_error.tsv index fa37aea..9055f37 100644 --- a/main/train/catboost_info/test_error.tsv +++ b/main/train/catboost_info/test_error.tsv @@ -1,1501 +1,789 @@ iter Logloss -0 0.6894541077 -1 0.6855832199 -2 0.6821220668 -3 0.6785342336 -4 0.675241269 -5 0.6727295383 -6 0.6695484864 -7 0.6667001793 -8 0.6635442319 -9 0.6604540991 -10 0.6580433454 -11 0.6555645419 -12 0.6532769959 -13 0.6512511917 -14 0.6483123646 -15 0.6461847852 -16 0.643417539 -17 0.6414505249 -18 0.6387744772 -19 0.6367427261 -20 0.634672021 -21 0.6329852278 -22 0.6312399637 -23 0.6291118654 -24 0.6273949387 -25 0.6254813266 -26 0.6230177695 -27 0.6206095301 -28 0.6190039175 -29 0.6169711287 -30 0.6155199748 -31 0.6141367508 -32 0.6124635276 -33 0.611132189 -34 0.6091998981 -35 0.6078234592 -36 0.6061353488 -37 0.6049632584 -38 0.6032521588 -39 0.6016046787 -40 0.5999589946 -41 0.5988397474 -42 0.5970643499 -43 0.5954772165 -44 0.5943097159 -45 0.5932678178 -46 0.5917338469 -47 0.5907270712 -48 0.5891976503 -49 0.5881479295 -50 0.5872138332 -51 0.5857426436 -52 0.5847088876 -53 0.5837608222 -54 0.5824919456 -55 0.5810779496 -56 0.5801092498 -57 0.5792040497 -58 0.5779750451 -59 0.577159008 -60 0.5761436114 -61 0.5748410891 -62 0.5741973114 -63 0.5731644733 -64 0.5722342885 -65 0.5711859247 -66 0.5700398967 -67 0.5689985174 -68 0.5685869867 -69 0.5681149895 -70 0.5671515181 -71 0.5661324895 -72 0.5657845383 -73 0.565092627 -74 0.5644229465 -75 0.563980045 -76 0.5630679003 -77 0.5625441375 -78 0.5622948882 -79 0.5617445042 -80 0.5611259508 -81 0.5602181564 -82 0.5593856358 -83 0.5586139806 -84 0.5577438231 -85 0.5573124562 -86 0.556940917 -87 0.5564853236 -88 0.5560559522 -89 0.5556498894 -90 0.5550825029 -91 0.554764286 -92 0.5544176119 -93 0.5537595458 -94 0.5534369785 -95 0.5531940751 -96 0.5525149755 -97 0.5521479065 -98 0.551840785 -99 0.5513785663 -100 0.5507428907 -101 0.5504985904 -102 0.5498629947 -103 0.5495887606 -104 0.5489601893 -105 0.5487091839 -106 0.5484093663 -107 0.548056466 -108 0.5477675443 -109 0.5474838112 -110 0.546970625 -111 0.5466213566 -112 0.5459944218 -113 0.5457387466 -114 0.5455292894 -115 0.5449328472 -116 0.5443990665 -117 0.5442677965 -118 0.5440104451 -119 0.543743874 -120 0.5434209076 -121 0.543206182 -122 0.5428123721 -123 0.5423325122 -124 0.5420352889 -125 0.5417448905 -126 0.5415824494 -127 0.5413982164 -128 0.5410186949 -129 0.5405840153 -130 0.5400429308 -131 0.5396564247 -132 0.5394588612 -133 0.5393060388 -134 0.5388860467 -135 0.5386006373 -136 0.5382334885 -137 0.5382419897 -138 0.5381403742 -139 0.5378730049 -140 0.5376378045 -141 0.5373320002 -142 0.5370232822 -143 0.5367278549 -144 0.5364668316 -145 0.5361811428 -146 0.5358966514 -147 0.5356389807 -148 0.5356706706 -149 0.5354533109 -150 0.5354791737 -151 0.5354239358 -152 0.5351100293 -153 0.5350417003 -154 0.5349833093 -155 0.5348715562 -156 0.5346331629 -157 0.5344197544 -158 0.5343285958 -159 0.5342445814 -160 0.5339958509 -161 0.5338577959 -162 0.5335452864 -163 0.5333889917 -164 0.5333351906 -165 0.5330863005 -166 0.5330717326 -167 0.5330295059 -168 0.5328613973 -169 0.5327863631 -170 0.532462798 -171 0.5323185567 -172 0.5322493097 -173 0.5321949099 -174 0.5321501687 -175 0.5318850744 -176 0.5318113173 -177 0.5317642613 -178 0.5315113002 -179 0.5313999861 -180 0.531258379 -181 0.531088195 -182 0.5308870394 -183 0.5306738704 -184 0.5305879003 -185 0.5306117676 -186 0.5304378718 -187 0.530306083 -188 0.5303453163 -189 0.5301496685 -190 0.529982877 -191 0.5297919788 -192 0.5297191796 -193 0.5296563983 -194 0.529535266 -195 0.5293826432 -196 0.529236965 -197 0.5290585592 -198 0.5290010462 -199 0.5290082304 -200 0.5288512971 -201 0.5286590818 -202 0.5284484671 -203 0.5282372537 -204 0.5281120104 -205 0.5280276369 -206 0.5279043492 -207 0.5279763901 -208 0.5277915185 -209 0.5277201562 -210 0.527805807 -211 0.5277612654 -212 0.5277774696 -213 0.5277155264 -214 0.5276143899 -215 0.5275091424 -216 0.5273555218 -217 0.5273034768 -218 0.5272039367 -219 0.5270597353 -220 0.5269038796 -221 0.5267533323 -222 0.5266567856 -223 0.5265556091 -224 0.5265692589 -225 0.526538886 -226 0.526435714 -227 0.5263467106 -228 0.5263170561 -229 0.526298577 -230 0.5262108508 -231 0.5262104517 -232 0.5261221268 -233 0.5260186355 -234 0.5258674096 -235 0.5256993409 -236 0.5256229497 -237 0.5254896442 -238 0.5255100791 -239 0.5253485559 -240 0.5251955739 -241 0.525201401 -242 0.5251467218 -243 0.5250919229 -244 0.5251040162 -245 0.5251262072 -246 0.5250505344 -247 0.5250028397 -248 0.5248889713 -249 0.5248956765 -250 0.5247977329 -251 0.5247529917 -252 0.524670494 -253 0.5246514561 -254 0.5244733296 -255 0.5243745878 -256 0.5243039838 -257 0.5244688595 -258 0.5245450511 -259 0.5244637907 -260 0.5243809337 -261 0.5243914305 -262 0.5242310249 -263 0.5241210679 -264 0.5239771858 -265 0.5239547154 -266 0.5238165008 -267 0.5236885834 -268 0.5236250438 -269 0.5236230482 -270 0.5235145679 -271 0.5233660161 -272 0.5233280998 -273 0.5232822811 -274 0.5232123955 -275 0.523155561 -276 0.52314243 -277 0.523102638 -278 0.5230515109 -279 0.5230513912 -280 0.523002579 -281 0.5229601927 -282 0.5228612912 -283 0.5227504161 -284 0.5228104036 -285 0.5226840827 -286 0.5226614128 -287 0.5226812889 -288 0.5226106849 -289 0.522569895 -290 0.5225533316 -291 0.5225332559 -292 0.5225249144 -293 0.5224744658 -294 0.5224637694 -295 0.522384744 -296 0.5224226204 -297 0.5223818305 -298 0.5222914302 -299 0.5222959802 -300 0.5222638112 -301 0.5222312831 -302 0.5221857836 -303 0.522149863 -304 0.5221769631 -305 0.5221064788 -306 0.5220758266 -307 0.5220174755 -308 0.5220429791 -309 0.5220126062 -310 0.5219440776 -311 0.5218769859 -312 0.5218586264 -313 0.521794528 -314 0.5217505452 -315 0.5217173386 -316 0.5217161412 -317 0.5217222078 -318 0.5217046466 -319 0.5216551959 -320 0.5216333641 -321 0.5216336435 -322 0.5216289738 -323 0.5216116521 -324 0.5215553764 -325 0.5215919756 -326 0.5215249636 -327 0.5215122716 -328 0.5214512465 -329 0.5214193569 -330 0.5214139688 -331 0.5214042703 -332 0.5214492908 -333 0.5214255832 -334 0.5214452198 -335 0.5214269402 -336 0.5213244067 -337 0.5212698872 -338 0.5211978862 -339 0.5211577349 -340 0.5211128341 -341 0.5210809446 -342 0.5209546237 -343 0.5208835008 -344 0.5208267462 -345 0.520855802 -346 0.5208142937 -347 0.520786116 -348 0.5207108822 -349 0.5206722077 -350 0.5206926026 -351 0.5206879728 -352 0.5206462251 -353 0.5206983499 -354 0.5206852189 -355 0.52067568 -356 0.5206148943 -357 0.5206184065 -358 0.5205935814 -359 0.5205935814 -360 0.5205976524 -361 0.5206694537 -362 0.5206845005 -363 0.5206001668 -364 0.5205752618 -365 0.5205704325 -366 0.5205585388 -367 0.5205341128 -368 0.5204625109 -369 0.5204397213 -370 0.520347964 -371 0.5202713333 -372 0.5203832062 -373 0.5203872373 -374 0.5203436136 -375 0.5203308019 -376 0.5203397023 -377 0.5203498399 -378 0.5202615948 -379 0.5202774398 -380 0.5202466678 -381 0.5202159357 -382 0.520237089 -383 0.5202604374 -384 0.5201882768 -385 0.5201937847 -386 0.5202097893 -387 0.5202151375 -388 0.520131642 -389 0.5200898942 -390 0.5200576454 -391 0.5200576055 -392 0.5200681023 -393 0.5200805947 -394 0.5200674238 -395 0.5200692199 -396 0.5200981959 -397 0.5201238991 -398 0.5201292073 -399 0.5201031449 -400 0.520052417 -401 0.5200121061 -402 0.5199880791 -403 0.519927493 -404 0.5199221847 -405 0.5199680434 -406 0.5199661276 -407 0.5199203887 -408 0.5199692008 -409 0.5199173953 -410 0.5198898561 -411 0.5198764458 -412 0.5197944669 -413 0.519793509 -414 0.5197798592 -415 0.519885865 -416 0.5198682639 -417 0.5199132844 -418 0.5199031069 -419 0.5199104506 -420 0.519926575 -421 0.5199218654 -422 0.519938828 -423 0.5199363534 -424 0.5199619369 -425 0.5199521585 -426 0.5199667662 -427 0.5199761056 -428 0.5199664868 -429 0.5199745889 -430 0.5199711166 -431 0.5200000128 -432 0.5199679237 -433 0.5200088333 -434 0.5200194897 -435 0.5199837287 -436 0.5199968597 -437 0.5199699592 -438 0.5200188512 -439 0.5199947444 -440 0.5199776622 -441 0.5199651698 -442 0.5199538348 -443 0.5199529567 -444 0.5199578659 -445 0.5199937067 -446 0.5200144209 -447 0.5200216849 -448 0.5199705578 -449 0.5199875204 -450 0.5199454533 -451 0.5199908331 -452 0.5200136626 -453 0.5200052013 -454 0.5200637919 -455 0.5200609581 -456 0.5199847665 -457 0.5199773429 -458 0.519973192 -459 0.5199794981 -460 0.5199991347 -461 0.5199552716 -462 0.5199895958 -463 0.5200350953 -464 0.5200508604 -465 0.5200206871 -466 0.5200187713 -467 0.5200414013 -468 0.5200267537 -469 0.5199988553 -470 0.5199964207 -471 0.5200036048 -472 0.52002392 -473 0.5200445544 -474 0.5200434368 -475 0.520013503 -476 0.5200027667 -477 0.5199612185 -478 0.5199244597 -479 0.5198940868 -480 0.5198775234 -481 0.5199081358 -482 0.5199373113 -483 0.5199887976 -484 0.5199453735 -485 0.5199990948 -486 0.520009432 -487 0.520004882 -488 0.5199634535 -489 0.5199306859 -490 0.5199287702 -491 0.5199335995 -492 0.5199494046 -493 0.5199841279 -494 0.5199897953 -495 0.5199431783 -496 0.5199535554 -497 0.519960101 -498 0.5199666066 -499 0.5200086337 -500 0.5200445544 -501 0.5200366119 -502 0.5200776812 -503 0.5201466089 -504 0.5201616157 -505 0.5201815317 -506 0.5201858422 -507 0.5201896737 -508 0.5201390656 -509 0.5201187105 -510 0.5200924485 -511 0.5201084931 -512 0.5201131229 -513 0.5201197482 -514 0.5201213447 -515 0.5201227416 -516 0.5201209456 -517 0.5201347551 -518 0.5201500812 -519 0.5201858821 -520 0.5201573851 -521 0.5201469681 -522 0.5201292472 -523 0.5200983954 -524 0.5200661866 -525 0.5201342362 -526 0.5200893753 -527 0.520094045 -528 0.5200934064 -529 0.5201197881 -530 0.5201802146 -531 0.5201709152 -532 0.5201437751 -533 0.5201276907 -534 0.5201376287 -535 0.5201646889 -536 0.5201266131 -537 0.520132999 -538 0.5201444137 -539 0.5201345156 -540 0.5201387063 -541 0.5200985151 -542 0.5201492431 -543 0.5202024455 -544 0.5201879176 -545 0.5201683209 -546 0.5201845251 -547 0.520125735 -548 0.5201832879 -549 0.5202263128 -550 0.5202586813 -551 0.52025473 -552 0.5202184103 -553 0.5202456301 -554 0.5202739675 -555 0.5202816306 -556 0.5202893735 -557 0.5203027838 -558 0.5203118837 -559 0.5203420172 -560 0.5203212231 -561 0.5203345537 -562 0.5202938835 -563 0.5202580427 -564 0.5202353329 -565 0.5202075941 -566 0.520212663 -567 0.5202100288 -568 0.5202300645 -569 0.5202381666 -570 0.5202658654 -571 0.5202797946 -572 0.5202670229 -573 0.5202421977 -574 0.5202740473 -575 0.5203150368 -576 0.5202987527 -577 0.5203086908 -578 0.5203692769 -579 0.520348882 -580 0.5203541504 -581 0.5203645673 -582 0.5203621327 -583 0.5203313607 -584 0.5203426957 -585 0.5203563854 -586 0.5203516758 -587 0.5203908293 -588 0.5203867184 -589 0.5204073129 -590 0.5204325372 -591 0.5203874368 -592 0.5203395426 -593 0.5203482035 -594 0.5203930245 -595 0.5204131799 -596 0.5204463067 -597 0.520445748 -598 0.5204443112 -599 0.5204419164 -600 0.5204277078 -601 0.5204198851 -602 0.5204318188 -603 0.5204229583 -604 0.5204171711 -605 0.5204160137 -606 0.5203927052 -607 0.5204610342 -608 0.5204563645 -609 0.5204928439 -610 0.5204986311 -611 0.5205117621 -612 0.5205105249 -613 0.5205219396 -614 0.5205329154 -615 0.5205818872 -616 0.5205612129 -617 0.5205876744 -618 0.5205704724 -619 0.5205443302 -620 0.5205513147 -621 0.520565244 -622 0.5205961357 -623 0.5206138167 -624 0.5206345708 -625 0.5206739239 -626 0.5206234354 -627 0.5205827253 -628 0.5205668404 -629 0.5206188056 -630 0.5206294222 -631 0.5206458658 -632 0.5205848008 -633 0.520566601 -634 0.5205558248 -635 0.5205707119 -636 0.5205835236 -637 0.520596016 -638 0.5206205218 -639 0.5206716489 -640 0.5207238935 -641 0.5207303193 -642 0.5207254899 -643 0.5207040972 -644 0.5206793519 -645 0.5206736844 -646 0.520633573 -647 0.5206248722 -648 0.5205260107 -649 0.5205286847 -650 0.520519505 -651 0.5205392215 -652 0.5205486407 -653 0.5205624501 -654 0.5205954572 -655 0.52054441 -656 0.5205577406 -657 0.5205856788 -658 0.5205488801 -659 0.5205664014 -660 0.5205728272 -661 0.5205408179 -662 0.5205439311 -663 0.5205122411 -664 0.5205037798 -665 0.5205251326 -666 0.5205099661 -667 0.5205040592 -668 0.5205219796 -669 0.520555705 -670 0.520546685 -671 0.5205513946 -672 0.5205479622 -673 0.5205465253 -674 0.5205144362 -675 0.5205578204 -676 0.5205761399 -677 0.5206204819 -678 0.5206112224 -679 0.5205604546 -680 0.5205915459 -681 0.5206318169 -682 0.5206347704 -683 0.5206549258 -684 0.520700585 -685 0.5206742831 -686 0.5206455466 -687 0.5206472628 -688 0.5206453869 -689 0.5206270275 -690 0.5206409567 -691 0.5207035783 -692 0.5206809084 -693 0.5206687752 -694 0.5206365265 -695 0.5206251516 -696 0.5205623304 -697 0.5205912665 -698 0.5205262501 -699 0.5204902497 -700 0.5204807506 -701 0.520533115 -702 0.5205052166 -703 0.5204971544 -704 0.5204580408 -705 0.520445748 -706 0.5204842629 -707 0.5205302014 -708 0.5204859791 -709 0.5204877751 -710 0.5204985513 -711 0.5204836243 -712 0.5205089683 -713 0.5205148353 -714 0.52053084 -715 0.5205283655 -716 0.5205759004 -717 0.5206002067 -718 0.5205989295 -719 0.5205526318 -720 0.5205573414 -721 0.5205696343 -722 0.5205459666 -723 0.5205692352 -724 0.5205620909 -725 0.5205626497 -726 0.5206092667 -727 0.5205688759 -728 0.52059873 -729 0.5205825258 -730 0.5206172092 -731 0.5206132978 -732 0.5206499369 -733 0.5206802698 -734 0.5206485399 -735 0.5206590767 -736 0.520645347 -737 0.5206840216 -738 0.5207120396 -739 0.5206870548 -740 0.5206786734 -741 0.5207279645 -742 0.5207478006 -743 0.5207316763 -744 0.5207505546 -745 0.5207410955 -746 0.5207485191 -747 0.5207350289 -748 0.5207113611 -749 0.5206989885 -750 0.5207013433 -751 0.5207391797 -752 0.5207498361 -753 0.5207558628 -754 0.5207812867 -755 0.5207514725 -756 0.5207433305 -757 0.5207252505 -758 0.520707809 -759 0.5207047358 -760 0.520660713 -761 0.5206760392 -762 0.5206904474 -763 0.5207452064 -764 0.5207463239 -765 0.5207513927 -766 0.5207789718 -767 0.520758058 -768 0.5207602531 -769 0.5207775349 -770 0.5207818454 -771 0.5208001649 -772 0.5208457842 -773 0.5207989277 -774 0.5208158902 -775 0.5208247905 -776 0.5208451456 -777 0.5208688532 -778 0.5208460635 -779 0.5208294203 -780 0.520844068 -781 0.5208552832 -782 0.5208543253 -783 0.5208273449 -784 0.5208089455 -785 0.5208142139 -786 0.5208445868 -787 0.5208542455 -788 0.5208386799 -789 0.5208122582 -790 0.5207883111 -791 0.5207503151 -792 0.5208063114 -793 0.5208297795 -794 0.5208032382 -795 0.5207970518 -796 0.5208036772 -797 0.5207925019 -798 0.5207576589 -799 0.52075263 -800 0.5207645636 -801 0.5207865949 -802 0.5207816858 -803 0.5207970119 -804 0.5207964531 -805 0.5208260278 -806 0.5208259081 -807 0.5208352873 -808 0.5207972115 -809 0.5208293006 -810 0.5208185244 -811 0.5208113802 -812 0.5207896681 -813 0.5207760183 -814 0.5207791713 -815 0.5207660004 -816 0.5207927813 -817 0.52078428 -818 0.5207887502 -819 0.5207878322 -820 0.5207691136 -821 0.5207654816 -822 0.5207442485 -823 0.5207950163 -824 0.5207791713 -825 0.5208097837 -826 0.5208107416 -827 0.5207984487 -828 0.5207885107 -829 0.5208219169 -830 0.5208155709 -831 0.5208341698 -832 0.520822755 -833 0.5207928212 -834 0.520771189 -835 0.5207582575 -836 0.5207779341 -837 0.520784759 -838 0.5207683552 -839 0.5207654417 -840 0.5207413748 -841 0.5207353082 -842 0.5207311175 -843 0.5207350688 -844 0.5207838809 -845 0.5207970518 -846 0.5207546655 -847 0.5207718276 -848 0.5207792512 -849 0.5207821647 -850 0.5207896681 -851 0.520789748 -852 0.5207778143 -853 0.5207721468 -854 0.5207908655 -855 0.5207709894 -856 0.5207798897 -857 0.5207644838 -858 0.5207748609 -859 0.5207832423 -860 0.5208197617 -861 0.5208267861 -862 0.5208670572 -863 0.5208782325 -864 0.5208908845 -865 0.5208806671 -866 0.5209153505 -867 0.5209112795 -868 0.5208622278 -869 0.5208837004 -870 0.5208981884 -871 0.5208566801 -872 0.5208603919 -873 0.520827305 -874 0.5208720062 -875 0.5208907249 -876 0.5209121575 -877 0.5209412532 -878 0.5209240113 -879 0.5208987072 -880 0.5208905253 -881 0.5208882902 -882 0.5209654797 -883 0.5209779322 -884 0.521004713 -885 0.5210394363 -886 0.5210071476 -887 0.5210001232 -888 0.5209691915 -889 0.5209936575 -890 0.5209807659 -891 0.5209650806 -892 0.5209377011 -893 0.5209417322 -894 0.5209623666 -895 0.5209284415 -896 0.5209447256 -897 0.5209372221 -898 0.5209489562 -899 0.5209339893 -900 0.5209676349 -901 0.5209991653 -902 0.5209918215 -903 0.5209928991 -904 0.5210184826 -905 0.5209855154 -906 0.5210304961 -907 0.5210201988 -908 0.5210099415 -909 0.5210049126 -910 0.5210138528 -911 0.5210173651 -912 0.5209933382 -913 0.5209859146 -914 0.5209742603 -915 0.520937741 -916 0.5209219359 -917 0.520895195 -918 0.5209067295 -919 0.5208787912 -920 0.5208475004 -921 0.5208389193 -922 0.5208194424 -923 0.5208652611 -924 0.5208945564 -925 0.5209136742 -926 0.5208968713 -927 0.5208845784 -928 0.5208632655 -929 0.5208824232 -930 0.5209207785 -931 0.5209282021 -932 0.5208960331 -933 0.520878432 -934 0.5208734031 -935 0.5208538463 -936 0.5208716869 -937 0.5208699707 -938 0.520877554 -939 0.5208624673 -940 0.5208382807 -941 0.5208289813 -942 0.5208389592 -943 0.520848578 -944 0.5208118192 -945 0.5207976505 -946 0.5207563418 -947 0.5207597343 -948 0.520781566 -949 0.5208499749 -950 0.5208657401 -951 0.5208645826 -952 0.520889328 -953 0.5208899266 -954 0.5208848179 -955 0.5208852569 -956 0.5208797491 -957 0.5208957538 -958 0.5208442675 -959 0.5208396377 -960 0.5208198415 -961 0.5208139345 -962 0.5207988878 -963 0.5208145731 -964 0.5208130565 -965 0.5208156507 -966 0.5208170077 -967 0.5208644629 -968 0.5208628664 -969 0.5208665782 -970 0.5208716869 -971 0.5209948149 -972 0.5210389574 -973 0.5209841984 -974 0.5210424696 -975 0.5210295781 -976 0.5210114581 -977 0.5210460218 -978 0.5210378797 -979 0.5210524077 -980 0.5210503322 -981 0.5210658978 -982 0.5210412723 -983 0.5210088239 -984 0.5209735419 -985 0.5209825221 -986 0.5209818036 -987 0.5209459628 -988 0.5209387388 -989 0.5209321134 -990 0.5209414927 -991 0.520959453 -992 0.5209747393 -993 0.5209689121 -994 0.5209637236 -995 0.5208955542 -996 0.5209167873 -997 0.5209247697 -998 0.5209497944 -999 0.5209367432 -1000 0.5209080466 -1001 0.5208963923 -1002 0.5209097229 -1003 0.5208945963 -1004 0.5209064102 -1005 0.520863944 -1006 0.5209064102 -1007 0.5209242907 -1008 0.5209080865 -1009 0.5208776737 -1010 0.5208607511 -1011 0.5208856162 -1012 0.5209123172 -1013 0.5209222951 -1014 0.5209469207 -1015 0.5209724244 -1016 0.5209695906 -1017 0.5209926197 -1018 0.5210012407 -1019 0.5210192808 -1020 0.5210260659 -1021 0.5210407534 -1022 0.5210770732 -1023 0.5211190604 -1024 0.5211071667 -1025 0.5211064083 -1026 0.5211000624 -1027 0.5210992641 -1028 0.521073521 -1029 0.5210112187 -1030 0.5210245492 -1031 0.5210273829 -1032 0.521059472 -1033 0.5210469796 -1034 0.5210749179 -1035 0.521089805 -1036 0.521111996 -1037 0.5211555398 -1038 0.5211429277 -1039 0.5211575753 -1040 0.5211365418 -1041 0.5211657173 -1042 0.5211348655 -1043 0.5211828395 -1044 0.5211624445 -1045 0.5211199385 -1046 0.521148196 -1047 0.5211158275 -1048 0.5211246081 -1049 0.5211289984 -1050 0.5211381382 -1051 0.5211600897 -1052 0.5211766931 -1053 0.5212257048 -1054 0.5212518869 -1055 0.5212286583 -1056 0.521274477 -1057 0.5212937544 -1058 0.5213091604 -1059 0.521308442 -1060 0.5213249655 -1061 0.5213545401 -1062 0.5213264422 -1063 0.5213149077 -1064 0.5213183401 -1065 0.5213724206 -1066 0.5213284777 -1067 0.5213454003 -1068 0.5213692277 -1069 0.5213791258 -1070 0.5214370778 -1071 0.5214350423 -1072 0.5213883454 -1073 0.5213784872 -1074 0.5213639992 -1075 0.521388984 -1076 0.521362762 -1077 0.5213588905 -1078 0.5213640391 -1079 0.521364558 -1080 0.5213606067 -1081 0.5213580923 -1082 0.5213207747 -1083 0.5213402118 -1084 0.5213499104 -1085 0.5213154265 -1086 0.5212945128 -1087 0.521275395 -1088 0.5212614658 -1089 0.5212766722 -1090 0.5213198967 -1091 0.5213265619 -1092 0.5212738384 -1093 0.5212720025 -1094 0.5212376384 -1095 0.5213529037 -1096 0.5213671124 -1097 0.5213969265 -1098 0.521412093 -1099 0.5214048689 -1100 0.521402594 -1101 0.5213626821 -1102 0.5213355022 -1103 0.52133199 -1104 0.5213266817 -1105 0.5213296352 -1106 0.5213631212 -1107 0.5213943721 -1108 0.5213891038 -1109 0.5213875472 -1110 0.5213343048 -1111 0.5213331474 -1112 0.5213612852 -1113 0.5214025141 -1114 0.5214190376 -1115 0.5214575525 -1116 0.5214474149 -1117 0.5214081417 -1118 0.5214244656 -1119 0.5214290156 -1120 0.521441947 -1121 0.5214466566 -1122 0.5214589495 -1123 0.5214417874 -1124 0.5214508074 -1125 0.5214019554 -1126 0.5214282972 -1127 0.5214755528 -1128 0.5214911982 -1129 0.5214584705 -1130 0.5214698853 -1131 0.5214861294 -1132 0.5215495892 -1133 0.5215529019 -1134 0.5215577711 -1135 0.5215716604 -1136 0.5215812792 -1137 0.5215941308 -1138 0.5216019535 -1139 0.5216271379 -1140 0.5216787439 -1141 0.5216932318 -1142 0.5217007353 -1143 0.5217192144 -1144 0.5217498667 -1145 0.5217505053 -1146 0.5217782839 -1147 0.5218048253 -1148 0.521828932 -1149 0.5218128875 -1150 0.5218179563 -1151 0.5218637351 -1152 0.5218940681 -1153 0.5219257581 -1154 0.5219308269 -1155 0.5218781433 -1156 0.5218438591 -1157 0.5218273356 -1158 0.5218074196 -1159 0.5217854681 -1160 0.5218083375 -1161 0.5218412249 -1162 0.521819912 -1163 0.5218140848 -1164 0.5218226659 -1165 0.5218112112 -1166 0.521790936 -1167 0.5217758493 -1168 0.5217833527 -1169 0.5217927719 -1170 0.521804945 -1171 0.5218032288 -1172 0.5217769668 -1173 0.5217643547 -1174 0.5217356581 -1175 0.5217420041 -1176 0.521764674 -1177 0.5217622394 -1178 0.5217839115 -1179 0.521775969 -1180 0.5217974416 -1181 0.5218461739 -1182 0.5218596242 -1183 0.5218575089 -1184 0.5218413845 -1185 0.5218552339 -1186 0.5217772063 -1187 0.5218165993 -1188 0.5218594247 -1189 0.5218685246 -1190 0.5218689636 -1191 0.5218824139 -1192 0.5219070794 -1193 0.5219050838 -1194 0.5218853274 -1195 0.5219426408 -1196 0.5219371729 -1197 0.5219283524 -1198 0.5219230441 -1199 0.5219811956 -1200 0.5220332806 -1201 0.5220025085 -1202 0.5219879407 -1203 0.5219500644 -1204 0.5219792799 -1205 0.5220027879 -1206 0.5220069787 -1207 0.5220037059 -1208 0.5219982779 -1209 0.5220081361 -1210 0.5220035862 -1211 0.5219960827 -1212 0.5220019897 -1213 0.5220316841 -1214 0.522045773 -1215 0.5220681635 -1216 0.5220699196 -1217 0.5220693209 -1218 0.5220479681 -1219 0.5220445756 -1220 0.5220535158 -1221 0.5220678442 -1222 0.5220607399 -1223 0.52207427 -1224 0.5220816936 -1225 0.5221177739 -1226 0.5220721547 -1227 0.5220621767 -1228 0.5220753476 -1229 0.5221078358 -1230 0.5220926693 -1231 0.5220992947 -1232 0.5221269137 -1233 0.5220990153 -1234 0.5221084345 -1235 0.5220854852 -1236 0.5221093525 -1237 0.5221230821 -1238 0.5221144213 -1239 0.5221205677 -1240 0.5221606791 -1241 0.5221733311 -1242 0.5221965199 -1243 0.5222069768 -1244 0.5221865819 -1245 0.522153455 -1246 0.5221449937 -1247 0.5221960809 -1248 0.5222445737 -1249 0.5222437755 -1250 0.5222642902 -1251 0.5222604187 -1252 0.5222529552 -1253 0.5223144593 -1254 0.5223488234 -1255 0.5223727306 -1256 0.5223960391 -1257 0.5224503591 -1258 0.5224876766 -1259 0.5224826876 -1260 0.5224706742 -1261 0.5224641686 -1262 0.522417791 -1263 0.5224382658 -1264 0.5223804336 -1265 0.5223896931 -1266 0.5223926865 -1267 0.5223582027 -1268 0.5223638302 -1269 0.5223421581 -1270 0.5223780389 -1271 0.5223708946 -1272 0.5223709346 -1273 0.5224034627 -1274 0.522403782 -1275 0.5223825888 -1276 0.5223837862 -1277 0.5223907308 -1278 0.5224157954 -1279 0.5224107665 -1280 0.5224256137 -1281 0.5224228598 -1282 0.5224507582 -1283 0.5224904305 -1284 0.5225057567 -1285 0.5225224797 -1286 0.5225299832 -1287 0.5225037611 -1288 0.5224944217 -1289 0.5224848828 -1290 0.5224814903 -1291 0.5225165728 -1292 0.5225226793 -1293 0.522518728 -1294 0.5225469457 -1295 0.5225301428 -1296 0.5225059562 -1297 0.5225126614 -1298 0.5225290652 -1299 0.5225134597 -1300 0.5225152956 -1301 0.5225192469 -1302 0.5225120228 -1303 0.5225123022 -1304 0.5225166127 -1305 0.5224720312 -1306 0.5224480841 -1307 0.5224393833 -1308 0.5224219818 -1309 0.5223980347 -1310 0.5223830278 -1311 0.5223801143 -1312 0.5224185893 -1313 0.5223885756 -1314 0.5223995513 -1315 0.5224151568 -1316 0.5224277291 -1317 0.5224325584 -1318 0.5224520354 -1319 0.5224646475 -1320 0.5224745057 -1321 0.5224886345 -1322 0.5225155351 -1323 0.5224937033 -1324 0.5225292647 -1325 0.5225556065 -1326 0.5225476242 -1327 0.5225774383 -1328 0.5225951592 -1329 0.5225939219 -1330 0.522584383 -1331 0.5225664226 -1332 0.5225569236 -1333 0.5226093678 -1334 0.5225747243 -1335 0.5225727287 -1336 0.5225611144 -1337 0.5225889329 -1338 0.5226014652 -1339 0.5226008266 -1340 0.5226172703 -1341 0.5226396209 -1342 0.5226857989 -1343 0.5226770582 -1344 0.5227019233 -1345 0.5227172095 -1346 0.5226976128 -1347 0.5227091074 -1348 0.5226950584 -1349 0.5226820073 -1350 0.5226631689 -1351 0.5226591777 -1352 0.5226456476 -1353 0.5225884141 -1354 0.5225520544 -1355 0.5225166925 -1356 0.5225146171 -1357 0.5224650466 -1358 0.5224844837 -1359 0.5224537516 -1360 0.5224488823 -1361 0.5224673615 -1362 0.5224695167 -1363 0.522469836 -1364 0.5224326781 -1365 0.5224494012 -1366 0.5224741864 -1367 0.5224976546 -1368 0.5224852819 -1369 0.5225218012 -1370 0.5224939428 -1371 0.5224878363 -1372 0.5225030427 -1373 0.5225407194 -1374 0.5225311406 -1375 0.5225275884 -1376 0.5225325774 -1377 0.5225284266 -1378 0.5225334555 -1379 0.5225407993 -1380 0.5225504579 -1381 0.5225496996 -1382 0.5225269499 -1383 0.5225244354 -1384 0.522530502 -1385 0.5225093487 -1386 0.5224567051 -1387 0.5224365895 -1388 0.5223975956 -1389 0.5223981943 -1390 0.5224040614 -1391 0.5224112455 -1392 0.5224052188 -1393 0.5224212234 -1394 0.5224439333 -1395 0.5225019251 -1396 0.522484803 -1397 0.5224358312 -1398 0.5224543902 -1399 0.5224473258 -1400 0.5224643681 -1401 0.5224336759 -1402 0.5224694768 -1403 0.5224529134 -1404 0.5224777386 -1405 0.5224812508 -1406 0.5224984528 -1407 0.5225105461 -1408 0.5225276284 -1409 0.5225290253 -1410 0.5225562052 -1411 0.5224901911 -1412 0.5225068742 -1413 0.522521442 -1414 0.522530981 -1415 0.5225297836 -1416 0.5225751633 -1417 0.5225968355 -1418 0.5225970749 -1419 0.5226357096 -1420 0.5226497585 -1421 0.5226541887 -1422 0.5226263702 -1423 0.5226520734 -1424 0.5226992891 -1425 0.5226913067 -1426 0.5227205621 -1427 0.5226791735 -1428 0.5226790937 -1429 0.5226998878 -1430 0.522676699 -1431 0.5226823266 -1432 0.5226981317 -1433 0.5227310988 -1434 0.5227474228 -1435 0.5227040785 -1436 0.522732376 -1437 0.5227393606 -1438 0.5227306598 -1439 0.5227079899 -1440 0.5227443895 -1441 0.5227568819 -1442 0.5227605937 -1443 0.5227555249 -1444 0.5227543275 -1445 0.5227604739 -1446 0.5227562832 -1447 0.5227591967 -1448 0.5227570415 -1449 0.5227706514 -1450 0.5227881727 -1451 0.5227855785 -1452 0.5228232552 -1453 0.522807969 -1454 0.5228229758 -1455 0.522847801 -1456 0.5228573399 -1457 0.5228534285 -1458 0.5228311178 -1459 0.5228608921 -1460 0.5228640052 -1461 0.5228228162 -1462 0.5228067716 -1463 0.5227906473 -1464 0.5228282043 -1465 0.5228321156 -1466 0.5228011042 -1467 0.5227596757 -1468 0.5227864964 -1469 0.522804337 -1470 0.5227922038 -1471 0.5227614717 -1472 0.5227643454 -1473 0.5227873745 -1474 0.5227947981 -1475 0.5227910065 -1476 0.5228127983 -1477 0.5227587178 -1478 0.5227407575 -1479 0.5227621103 -1480 0.5227571213 -1481 0.522802062 -1482 0.5227956362 -1483 0.5228301999 -1484 0.5228279648 -1485 0.522830599 -1486 0.5228628078 -1487 0.5228485194 -1488 0.522849158 -1489 0.522936046 -1490 0.5229625076 -1491 0.5229384806 -1492 0.5229258286 -1493 0.5229270259 -1494 0.5229277044 -1495 0.5228682358 -1496 0.5228877926 -1497 0.5228538277 -1498 0.5228723867 -1499 0.5228569807 +0 0.6894516063 +1 0.6855813377 +2 0.6821273883 +3 0.6785411841 +4 0.6752505378 +5 0.6727377765 +6 0.6695439468 +7 0.6666962384 +8 0.6635423965 +9 0.660442949 +10 0.6580995967 +11 0.6556190011 +12 0.6533186696 +13 0.6512931438 +14 0.6483627862 +15 0.6462357347 +16 0.6434692389 +17 0.6415187001 +18 0.6387646556 +19 0.6368737392 +20 0.63471105 +21 0.6322352833 +22 0.6300870008 +23 0.6275533277 +24 0.6257390345 +25 0.6242294781 +26 0.6220503069 +27 0.6199216991 +28 0.6184262302 +29 0.6162235133 +30 0.6141742424 +31 0.612787722 +32 0.6108688302 +33 0.6096360351 +34 0.6077157864 +35 0.6064107181 +36 0.6055380919 +37 0.6043700673 +38 0.6026869514 +39 0.6015792676 +40 0.5999813949 +41 0.5986109974 +42 0.5973064079 +43 0.59606619 +44 0.594885355 +45 0.5939087686 +46 0.5927287318 +47 0.591221929 +48 0.590284173 +49 0.5892440533 +50 0.5881410786 +51 0.5866576219 +52 0.5855571614 +53 0.5845544753 +54 0.583309229 +55 0.5818972075 +56 0.580668882 +57 0.5798167684 +58 0.5785289403 +59 0.5776724369 +60 0.5765606026 +61 0.5753093701 +62 0.5742001698 +63 0.5732021129 +64 0.5721310646 +65 0.5711689648 +66 0.570040489 +67 0.5690538059 +68 0.5685098612 +69 0.567835218 +70 0.5669511382 +71 0.5659244275 +72 0.5654294897 +73 0.5649020668 +74 0.564184363 +75 0.5636825211 +76 0.5628025917 +77 0.5626036907 +78 0.5622698611 +79 0.5612862909 +80 0.5607771857 +81 0.5598296124 +82 0.5594330475 +83 0.5586549232 +84 0.5578689769 +85 0.5573709662 +86 0.5569637459 +87 0.5566546991 +88 0.5559996507 +89 0.5555009615 +90 0.5550565471 +91 0.5546474911 +92 0.5539547297 +93 0.5533245839 +94 0.5528296062 +95 0.5525477765 +96 0.5519693514 +97 0.5516401111 +98 0.5510558195 +99 0.5507846453 +100 0.5506432915 +101 0.5502156384 +102 0.5496516599 +103 0.5492036537 +104 0.5488685869 +105 0.5482614281 +106 0.5479093605 +107 0.5476357519 +108 0.5473086268 +109 0.5471436475 +110 0.5466196967 +111 0.5463429353 +112 0.5462688264 +113 0.5460389967 +114 0.5458030612 +115 0.5455376337 +116 0.5450453697 +117 0.5448329 +118 0.5444673436 +119 0.5442106959 +120 0.5439808263 +121 0.5434537626 +122 0.5430699683 +123 0.5427608018 +124 0.5426135416 +125 0.5422171364 +126 0.5420255385 +127 0.5418352975 +128 0.5415267296 +129 0.5410198194 +130 0.5406753343 +131 0.5404109844 +132 0.5400712883 +133 0.5399532407 +134 0.539657563 +135 0.539344725 +136 0.5392009767 +137 0.5390713558 +138 0.5387477027 +139 0.5385680373 +140 0.5384274019 +141 0.5381120496 +142 0.5377796167 +143 0.5376424134 +144 0.5373759882 +145 0.5372649644 +146 0.5369387173 +147 0.536795847 +148 0.5366868585 +149 0.5365283044 +150 0.5363033834 +151 0.5361123842 +152 0.5359008324 +153 0.5357652652 +154 0.5357864164 +155 0.535719012 +156 0.5356127372 +157 0.5353806727 +158 0.535390969 +159 0.5351500849 +160 0.5351811332 +161 0.5351523197 +162 0.5348433527 +163 0.5345701033 +164 0.5343011639 +165 0.5340034509 +166 0.5338239053 +167 0.533652421 +168 0.5334977778 +169 0.5333416182 +170 0.5331617932 +171 0.5330645775 +172 0.5329320833 +173 0.5327248415 +174 0.532655721 +175 0.5324228584 +176 0.5324790887 +177 0.5322301032 +178 0.5321801385 +179 0.5319024992 +180 0.531768249 +181 0.5317025606 +182 0.531470576 +183 0.5313124609 +184 0.5312031132 +185 0.5313067939 +186 0.5310851454 +187 0.5309420357 +188 0.5308133726 +189 0.5305983089 +190 0.5304503703 +191 0.5304046358 +192 0.5304474969 +193 0.5302670334 +194 0.530215632 +195 0.5302616857 +196 0.5301574862 +197 0.5299640126 +198 0.5298924179 +199 0.5299083411 +200 0.5297052099 +201 0.5296109474 +202 0.5295602644 +203 0.5294535905 +204 0.5293538607 +205 0.5292528139 +206 0.5291430272 +207 0.5291064317 +208 0.5291368016 +209 0.5290519175 +210 0.5290010349 +211 0.528878797 +212 0.5288099957 +213 0.5287029228 +214 0.5286111347 +215 0.5286519604 +216 0.5285690318 +217 0.5284838683 +218 0.5283307018 +219 0.5283035644 +220 0.5281441723 +221 0.5279370103 +222 0.5279410809 +223 0.5277739865 +224 0.5278144531 +225 0.5277773787 +226 0.5276907386 +227 0.5275788768 +228 0.5274718039 +229 0.5273879175 +230 0.5272032237 +231 0.5271434416 +232 0.5271729336 +233 0.5271931669 +234 0.5271494278 +235 0.5270163749 +236 0.5268986864 +237 0.5268795306 +238 0.5269486112 +239 0.5269823733 +240 0.5268644055 +241 0.5268694739 +242 0.5267796811 +243 0.5267057317 +244 0.5267355429 +245 0.5266087954 +246 0.5265850901 +247 0.5266133449 +248 0.5264907079 +249 0.526436513 +250 0.526419153 +251 0.5263015844 +252 0.5262358959 +253 0.526113259 +254 0.5261479788 +255 0.5260264992 +256 0.5259905821 +257 0.5258837885 +258 0.5257997824 +259 0.525747064 +260 0.5256947847 +261 0.5257121047 +262 0.5255856764 +263 0.5255532712 +264 0.5254442029 +265 0.5253342167 +266 0.5252585913 +267 0.5251232236 +268 0.5250109228 +269 0.5251278929 +270 0.5251599389 +271 0.5251249397 +272 0.5250323134 +273 0.5249261584 +274 0.524854404 +275 0.5247326849 +276 0.5246913403 +277 0.5246368261 +278 0.52460047 +279 0.5244898054 +280 0.5244507355 +281 0.5244589566 +282 0.5244354508 +283 0.5244328568 +284 0.5243957424 +285 0.5243398714 +286 0.5242596964 +287 0.5241995552 +288 0.5241163073 +289 0.5240827048 +290 0.5240546496 +291 0.5239532436 +292 0.5238582229 +293 0.5238159604 +294 0.5237865882 +295 0.5237659159 +296 0.5237495536 +297 0.5237665943 +298 0.5237160709 +299 0.5237108829 +300 0.5236443165 +301 0.5236073618 +302 0.5235901215 +303 0.5235915183 +304 0.5234947816 +305 0.5234583057 +306 0.5234427417 +307 0.5233568598 +308 0.5233460847 +309 0.5232778023 +310 0.5232615997 +311 0.5232866219 +312 0.5232186189 +313 0.5232710179 +314 0.52324412 +315 0.5232147079 +316 0.523215945 +317 0.5232299128 +318 0.5231811453 +319 0.5232248046 +320 0.5231860141 +321 0.5232447984 +322 0.5232055291 +323 0.5232274784 +324 0.5231534093 +325 0.5231687739 +326 0.5231483011 +327 0.5231146588 +328 0.5230951039 +329 0.5230877608 +330 0.523061701 +331 0.5230415874 +332 0.5229807677 +333 0.5229519143 +334 0.5229005928 +335 0.5227854185 +336 0.5227791929 +337 0.5227785145 +338 0.5227113096 +339 0.5227014922 +340 0.5226839726 +341 0.5226773878 +342 0.5226805805 +343 0.5226501307 +344 0.5226338483 +345 0.5226316933 +346 0.522656516 +347 0.5226600678 +348 0.5226367217 +349 0.5225947386 +350 0.5226150118 +351 0.5225920647 +352 0.5225688783 +353 0.5225403042 +354 0.5225377102 +355 0.5225459711 +356 0.5225433372 +357 0.5225567462 +358 0.5225509995 +359 0.5225457317 +360 0.5225362735 +361 0.5225390271 +362 0.5225502413 +363 0.5225557086 +364 0.5225313249 +365 0.5224742965 +366 0.5224713433 +367 0.5224824776 +368 0.5223904899 +369 0.5223451146 +370 0.5222921568 +371 0.5222611883 +372 0.5222393587 +373 0.52223014 +374 0.5222536457 +375 0.5223180172 +376 0.5222929151 +377 0.5222633433 +378 0.5222620663 +379 0.5223006971 +380 0.5223303886 +381 0.5222801845 +382 0.5223078406 +383 0.5223389688 +384 0.5223291515 +385 0.5223007769 +386 0.5222951898 +387 0.5222391192 +388 0.5223085989 +389 0.5222770317 +390 0.5223066434 +391 0.5222492159 +392 0.52228214 +393 0.5222827785 +394 0.5222562397 +395 0.5222660571 +396 0.5222762336 +397 0.5222696488 +398 0.5221320862 +399 0.5221256211 +400 0.5221399082 +401 0.522140866 +402 0.5221340417 +403 0.5220711868 +404 0.5221006787 +405 0.5221415444 +406 0.5221244239 +407 0.5221450164 +408 0.5221361169 +409 0.5221247831 +410 0.5221431407 +411 0.5221476104 +412 0.522193704 +413 0.5221898729 +414 0.5222235951 +415 0.5222830578 +416 0.5222495751 +417 0.5222620663 +418 0.5222605099 +419 0.5222401967 +420 0.5223113924 +421 0.5222913587 +422 0.5223000985 +423 0.5222907202 +424 0.5222583947 +425 0.5222463426 +426 0.5221930256 +427 0.5221907908 +428 0.5221801753 +429 0.5222163318 +430 0.5222692497 +431 0.5222568383 +432 0.52226478 +433 0.5222783088 +434 0.5222840954 +435 0.5222134984 +436 0.52221713 +437 0.5222277056 +438 0.5222634631 +439 0.5223040494 +440 0.5222941522 +441 0.5222502934 +442 0.5222784285 +443 0.5222565989 +444 0.5222131392 +445 0.5222200433 +446 0.5222137777 +447 0.5221952205 +448 0.5222177685 +449 0.5222333326 +450 0.5222451054 +451 0.5222368046 +452 0.5221670056 +453 0.5221495659 +454 0.5221062658 +455 0.5221362366 +456 0.5221121722 +457 0.5220806848 +458 0.5220582167 +459 0.5221086603 +460 0.5220843165 +461 0.5220927769 +462 0.5220818422 +463 0.5220434907 +464 0.522045526 +465 0.5220438099 +466 0.5220508337 +467 0.5220992819 +468 0.5220674753 +469 0.5220163533 +470 0.5219874999 +471 0.5220094492 +472 0.5219871806 +473 0.5219403287 +474 0.521902935 +475 0.5218628675 +476 0.5218597946 +477 0.5218983456 +478 0.5219061277 +479 0.5218939558 +480 0.5219066864 +481 0.5219238867 +482 0.521889965 +483 0.521844869 +484 0.5218519726 +485 0.5218498575 +486 0.5218545267 +487 0.5217666894 +488 0.5217849274 +489 0.5217765467 +490 0.5217925099 +491 0.5218065974 +492 0.5217701215 +493 0.5218237178 +494 0.5218390824 +495 0.5217997731 +496 0.5218265513 +497 0.5218737624 +498 0.5218910425 +499 0.52187911 +500 0.5218104684 +501 0.5218612712 +502 0.521854846 +503 0.5218411177 +504 0.5218925989 +505 0.5218558836 +506 0.5218650624 +507 0.5218238775 +508 0.5218550455 +509 0.521825394 +510 0.5218181706 +511 0.5218546066 +512 0.5218829412 +513 0.5218839788 +514 0.5218613909 +515 0.5218823825 +516 0.5218802673 +517 0.5219119143 +518 0.5218955521 +519 0.5219027355 +520 0.5219047309 +521 0.5218664193 +522 0.5218799481 +523 0.5218879297 +524 0.5218919604 +525 0.5219174216 +526 0.521921572 +527 0.521982232 +528 0.5220316779 +529 0.5220599726 +530 0.5220624868 +531 0.5220547447 +532 0.5220632451 +533 0.5220848752 +534 0.5220681937 +535 0.5220366664 +536 0.5220554231 +537 0.5220509135 +538 0.5220928568 +539 0.5221466526 +540 0.5221287739 +541 0.5221223487 +542 0.5221388706 +543 0.5221799358 +544 0.5221457746 +545 0.5221054677 +546 0.5221112144 +547 0.5220737808 +548 0.5220705881 +549 0.5220880678 +550 0.5220916196 +551 0.5221136089 +552 0.5220915797 +553 0.5220772129 +554 0.5221100172 +555 0.5220727033 +556 0.5220840371 +557 0.5220930164 +558 0.5220205436 +559 0.5220209826 +560 0.522004341 +561 0.5220604515 +562 0.5220947723 +563 0.5220045007 +564 0.5220480801 +565 0.522024734 +566 0.5220192267 +567 0.5220286848 +568 0.5220263702 +569 0.5220041016 +570 0.5220519112 +571 0.5221098974 +572 0.5221240647 +573 0.5221256611 +574 0.5221025145 +575 0.5221338821 +576 0.5221315674 +577 0.5221554324 +578 0.5222276258 +579 0.5222340908 +580 0.5222625452 +581 0.5222746772 +582 0.522315503 +583 0.5223301492 +584 0.5223704561 +585 0.522333262 +586 0.5223089182 +587 0.5222736396 +588 0.5223175383 +589 0.5223279542 +590 0.5223895321 +591 0.5223692589 +592 0.5223694984 +593 0.5224234139 +594 0.5224167493 +595 0.522434229 +596 0.5223872973 +597 0.5224070916 +598 0.522377879 +599 0.5223658268 +600 0.5223325037 +601 0.5223590026 +602 0.522378318 +603 0.5223461123 +604 0.5223434784 +605 0.5223463917 +606 0.5223482274 +607 0.5223358959 +608 0.5223317854 +609 0.5223568476 +610 0.5223685805 +611 0.5223942812 +612 0.5223829473 +613 0.5224129182 +614 0.5223948 +615 0.5224285221 +616 0.522424691 +617 0.52240777 +618 0.5224196227 +619 0.5223986311 +620 0.5224034201 +621 0.5223694584 +622 0.5223874569 +623 0.5223998284 +624 0.5223842244 +625 0.5223773203 +626 0.5223327831 +627 0.5223507416 +628 0.5223174584 +629 0.5223235244 +630 0.5222586342 +631 0.5222450655 +632 0.5222296211 +633 0.5222177685 +634 0.5222282244 +635 0.5222375628 +636 0.5222393188 +637 0.5222374032 +638 0.5222169703 +639 0.5222457838 +640 0.5221768629 +641 0.5221749473 +642 0.5221539957 +643 0.5221308092 +644 0.5220681139 +645 0.5220853541 +646 0.5221375536 +647 0.5221546741 +648 0.5221431008 +649 0.5221245436 +650 0.5221498852 +651 0.5221640126 +652 0.5221665667 +653 0.5221492865 +654 0.5221784991 +655 0.5222281046 +656 0.522238361 +657 0.5222958284 +658 0.5223166204 +659 0.5223578053 +660 0.5223855812 +661 0.5223741676 +662 0.5223762827 +663 0.5223555705 +664 0.5223429596 +665 0.5222660172 +666 0.5222825789 +667 0.5222708061 +668 0.5222718038 +669 0.5222055966 +670 0.5222149749 +671 0.5221594231 +672 0.5221519205 +673 0.5221677639 +674 0.5221557915 +675 0.5221788583 +676 0.5222169703 +677 0.522211064 +678 0.5221965375 +679 0.5221970164 +680 0.5221466127 +681 0.5221535966 +682 0.5221871192 +683 0.5221479297 +684 0.5220778514 +685 0.5220881077 +686 0.522129572 +687 0.522132605 +688 0.5221517608 +689 0.5221073034 +690 0.522141704 +691 0.5221258207 +692 0.5221208721 +693 0.5220776918 +694 0.5221266987 +695 0.5221319665 +696 0.5221535567 +697 0.5221580264 +698 0.5221366756 +699 0.5221112543 +700 0.5220847555 +701 0.5220865513 +702 0.5220447278 +703 0.5220336733 +704 0.5220583364 +705 0.5220547048 +706 0.5220721845 +707 0.5220880678 +708 0.5221017163 +709 0.522074978 +710 0.5220769734 +711 0.5220693909 +712 0.5220553034 +713 0.5220848752 +714 0.5222718038 +715 0.5222876073 +716 0.5222551223 +717 0.522198932 +718 0.5222487769 +719 0.5222378821 +720 0.5222573571 +721 0.5222718836 +722 0.5222899619 +723 0.5223036503 +724 0.5223023733 +725 0.5222796657 +726 0.5222763533 +727 0.522278229 +728 0.5222687309 +729 0.5222255106 +730 0.5222417931 +731 0.5222338514 +732 0.5221923472 +733 0.5222242336 +734 0.5222261891 +735 0.5221915889 +736 0.5222121814 +737 0.5222113832 +738 0.5222260294 +739 0.5222252313 +740 0.5222304592 +741 0.5222567186 +742 0.5222550824 +743 0.522232295 +744 0.5222211208 +745 0.5222276258 +746 0.522253087 +747 0.5223028522 +748 0.5223244024 +749 0.5223264776 +750 0.5223473894 +751 0.5223455536 +752 0.522416031 +753 0.5224128782 +754 0.522426846 +755 0.5224367831 +756 0.5224471192 +757 0.5224621246 +758 0.5224556994 +759 0.5223899711 +760 0.5224011852 +761 0.5224501123 +762 0.5224237332 +763 0.5224197823 +764 0.5223828675 +765 0.5224311561 +766 0.5224181062 +767 0.5223989504 +768 0.5223784377 +769 0.5223923656 +770 0.5223688598 +771 0.5223993495 +772 0.5224052558 +773 0.5224538637 +774 0.522461526 +775 0.5224400156 +776 0.52247713 +777 0.522503988 +778 0.5224891423 +779 0.5224936918 +780 0.5225751438 +781 0.5225697562 +782 0.5226010839 +783 0.5226017624 +784 0.522541701 +785 0.5225556288 +786 0.5225448138 +787 0.522550361 diff --git a/main/train/catboost_info/time_left.tsv b/main/train/catboost_info/time_left.tsv index 9686285..6d5801b 100644 --- a/main/train/catboost_info/time_left.tsv +++ b/main/train/catboost_info/time_left.tsv @@ -1,1501 +1,789 @@ iter Passed Remaining -0 254 382001 -1 461 345452 -2 689 344290 -3 893 334009 -4 937 280452 -5 1143 284770 -6 1350 288054 -7 1558 290708 -8 1764 292312 -9 1970 293565 -10 2178 294946 -11 2384 295693 -12 2590 296277 -13 2796 296876 -14 2958 292872 -15 3164 293473 -16 3259 284333 -17 3468 285535 -18 3672 286263 -19 3897 288434 -20 4110 289521 -21 4314 289865 -22 4520 290283 -23 4745 291838 -24 4971 293331 -25 5178 293564 -26 5387 293941 -27 5591 293960 -28 5797 294096 -29 6002 294108 -30 6210 294291 -31 6419 294488 -32 6634 294918 -33 6839 294912 -34 7041 294736 -35 7245 294643 -36 7449 294557 -37 7654 294490 -38 7856 294306 -39 8072 294647 -40 8279 294637 -41 8486 294591 -42 8691 294488 -43 8916 295046 -44 9130 295227 -45 9345 295407 -46 9550 295247 -47 9758 295183 -48 9965 295108 -49 10175 295077 -50 10381 294954 -51 10589 294864 -52 10795 294726 -53 10998 294524 -54 11205 294398 -55 11411 294265 -56 11620 294190 -57 11829 294103 -58 12039 294044 -59 12259 294236 -60 12463 294022 -61 12674 293968 -62 12879 293782 -63 13114 294246 -64 13328 294249 -65 13534 294069 -66 13746 294016 -67 13953 293835 -68 14156 293586 -69 14361 293391 -70 14564 293139 -71 14768 292899 -72 14972 292689 -73 15183 292590 -74 15386 292342 -75 15600 292303 -76 15806 292119 -77 16012 291919 -78 16221 291785 -79 16447 291945 -80 16653 291747 -81 16862 291594 -82 17068 291395 -83 17297 291579 -84 17503 291377 -85 17706 291124 -86 17911 290908 -87 18121 290764 -88 18332 290643 -89 18538 290432 -90 18749 290306 -91 18957 290130 -92 19164 289938 -93 19371 289752 -94 19604 289940 -95 19812 289761 -96 20023 289619 -97 20233 289464 -98 20450 289401 -99 20689 289653 -100 20895 289436 -101 21103 289246 -102 21308 289011 -103 21533 289047 -104 21740 288840 -105 21946 288611 -106 22149 288360 -107 22351 288088 -108 22556 287858 -109 22767 287692 -110 22970 287443 -111 23178 287247 -112 23390 287103 -113 23599 286924 -114 23807 286731 -115 24018 286564 -116 24223 286333 -117 24434 286173 -118 24648 286041 -119 24891 286252 -120 25098 286035 -121 25305 285829 -122 25517 285669 -123 25769 285958 -124 25976 285745 -125 26183 285527 -126 26389 285295 -127 26590 285017 -128 26798 284816 -129 27008 284626 -130 27217 284428 -131 27419 284168 -132 27622 283910 -133 27825 283650 -134 28033 283446 -135 28234 283175 -136 28443 282980 -137 28598 282259 -138 28819 282180 -139 29058 282282 -140 29270 282121 -141 29476 281897 -142 29700 281844 -143 29920 281750 -144 30126 281524 -145 30331 281295 -146 30538 281076 -147 30748 280894 -148 30955 280678 -149 31163 280472 -150 31369 280244 -151 31574 280018 -152 31797 279944 -153 32010 279780 -154 32224 279623 -155 32430 279403 -156 32634 279156 -157 32841 278947 -158 33070 278911 -159 33276 278691 -160 33483 278471 -161 33692 278276 -162 33933 278341 -163 34138 278105 -164 34342 277862 -165 34548 277640 -166 34766 277510 -167 35016 277628 -168 35227 277442 -169 35438 277253 -170 35655 277109 -171 35861 276881 -172 36089 276827 -173 36302 276649 -174 36520 276514 -175 36729 276306 -176 36937 276089 -177 37196 276255 -178 37442 276321 -179 37666 276219 -180 37899 276183 -181 38127 276111 -182 38350 275996 -183 38590 276006 -184 38817 275917 -185 39028 275720 -186 39238 275507 -187 39440 275245 -188 39651 275045 -189 39860 274827 -190 40073 274637 -191 40275 274374 -192 40492 274216 -193 40700 273993 -194 40913 273804 -195 41120 273577 -196 41346 273472 -197 41569 273349 -198 41782 273161 -199 41992 272950 -200 42219 272852 -201 42434 272670 -202 42631 272377 -203 42840 272163 -204 43049 271949 -205 43259 271739 -206 43474 271556 -207 43683 271341 -208 43893 271130 -209 44099 270899 -210 44308 270678 -211 44513 270439 -212 44718 270198 -213 44933 270022 -214 45143 269811 -215 45360 269641 -216 45593 269570 -217 45802 269352 -218 46009 269126 -219 46220 268920 -220 46453 268840 -221 46660 268611 -222 46867 268383 -223 47067 268113 -224 47270 267864 -225 47475 267628 -226 47685 267415 -227 47948 267499 -228 48163 267316 -229 48367 267073 -230 48648 267252 -231 48857 267029 -232 49061 266787 -233 49272 266575 -234 49480 266351 -235 49744 266425 -236 49950 266193 -237 50159 265970 -238 50367 265748 -239 50639 265859 -240 50866 265728 -241 51073 265496 -242 51280 265267 -243 51495 265073 -244 51701 264840 -245 51910 264615 -246 52113 264365 -247 52321 264140 -248 52537 263952 -249 52741 263709 -250 52949 263480 -251 53154 263242 -252 53358 262994 -253 53566 262770 -254 53854 262936 -255 54060 262698 -256 54277 262516 -257 54482 262274 -258 54738 262278 -259 54949 262065 -260 55161 261860 -261 55374 261653 -262 55585 261440 -263 55790 261199 -264 56006 261009 -265 56211 260772 -266 56416 260532 -267 56637 260361 -268 56856 260189 -269 57063 259957 -270 57278 259761 -271 57487 259539 -272 57697 259323 -273 57924 259179 -274 58162 259085 -275 58372 258867 -276 58582 258649 -277 58871 258780 -278 59028 258329 -279 59236 258103 -280 59443 257871 -281 59651 257641 -282 59861 257425 -283 60067 257190 -284 60274 256961 -285 60482 256732 -286 60683 256478 -287 60900 256287 -288 61110 256070 -289 61318 255844 -290 61528 255627 -291 61730 255378 -292 61936 255144 -293 62212 255198 -294 62415 254950 -295 62618 254704 -296 62836 254519 -297 63100 254521 -298 63303 254272 -299 63503 254015 -300 63705 253764 -301 63913 253537 -302 64119 253301 -303 64323 253060 -304 64527 252820 -305 64733 252588 -306 64935 252337 -307 65137 252091 -308 65358 251915 -309 65562 251674 -310 65775 251470 -311 65990 251272 -312 66255 251261 -313 66498 251168 -314 66699 250918 -315 66905 250683 -316 67185 250727 -317 67388 250480 -318 67591 250236 -319 67797 250001 -320 68033 249878 -321 68239 249647 -322 68451 249433 -323 68717 249420 -324 68920 249174 -325 69124 248933 -326 69328 248691 -327 69529 248440 -328 69736 248211 -329 69938 247964 -330 70149 247748 -331 70414 247723 -332 70653 247604 -333 70857 247364 -334 71075 247173 -335 71336 247130 -336 71538 246881 -337 71748 246663 -338 71975 246501 -339 72187 246287 -340 72392 246050 -341 72603 245832 -342 72825 245652 -343 73032 245421 -344 73244 245209 -345 73451 244980 -346 73663 244767 -347 73869 244533 -348 74067 244275 -349 74267 244020 -350 74526 243964 -351 74813 243993 -352 75012 243736 -353 75219 243508 -354 75497 243506 -355 75701 243265 -356 75909 243036 -357 76117 242811 -358 76326 242585 -359 76540 242376 -360 76748 242151 -361 76948 241900 -362 77159 241680 -363 77371 241467 -364 77571 241214 -365 77839 241175 -366 78035 240910 -367 78238 240666 -368 78448 240447 -369 78682 240300 -370 78953 240265 -371 79167 240056 -372 79374 239825 -373 79650 239802 -374 79861 239585 -375 80062 239334 -376 80269 239106 -377 80470 238856 -378 80679 238632 -379 80884 238395 -380 81114 238233 -381 81369 238144 -382 81579 237921 -383 81788 237696 -384 82007 237501 -385 82235 237332 -386 82445 237109 -387 82674 236944 -388 82955 236924 -389 83167 236706 -390 83378 236488 -391 83581 236245 -392 83832 236138 -393 84037 235902 -394 84244 235670 -395 84445 235423 -396 84651 235191 -397 84866 234983 -398 85067 234734 -399 85269 234490 -400 85472 234249 -401 85671 233997 -402 85881 233777 -403 86085 233537 -404 86285 233290 -405 86489 233053 -406 86688 232802 -407 86902 232593 -408 87148 232465 -409 87363 232259 -410 87563 232011 -411 87770 231781 -412 88043 231726 -413 88240 231471 -414 88451 231253 -415 88660 231028 -416 88867 230799 -417 89068 230554 -418 89274 230325 -419 89475 230080 -420 89701 229900 -421 89900 229650 -422 90099 229402 -423 90315 229197 -424 90516 228954 -425 90714 228703 -426 90916 228462 -427 91134 228261 -428 91425 228245 -429 91637 228028 -430 91841 227792 -431 92118 227736 -432 92328 227516 -433 92535 227287 -434 92745 227067 -435 92958 226851 -436 93157 226604 -437 93364 226377 -438 93568 226142 -439 93769 225900 -440 93976 225671 -441 94179 225434 -442 94378 225187 -443 94617 225036 -444 94849 224867 -445 95070 224674 -446 95312 224528 -447 95561 224399 -448 95777 224192 -449 95977 223947 -450 96218 223797 -451 96469 223671 -452 96668 223426 -453 96870 223185 -454 97074 222951 -455 97280 222722 -456 97501 222525 -457 97723 222332 -458 97928 222100 -459 98139 221881 -460 98381 221732 -461 98592 221513 -462 98791 221267 -463 99033 221118 -464 99244 220899 -465 99454 220678 -466 99713 220565 -467 99911 220316 -468 100132 220121 -469 100401 220029 -470 100630 219849 -471 100841 219629 -472 101043 219389 -473 101248 219159 -474 101454 218927 -475 101654 218685 -476 101854 218442 -477 102058 218208 -478 102269 217990 -479 102468 217746 -480 102674 217515 -481 102875 217276 -482 103080 217044 -483 103285 216814 -484 103490 216582 -485 103737 216440 -486 103943 216211 -487 104157 215999 -488 104370 215783 -489 104636 215678 -490 104837 215440 -491 105065 215256 -492 105288 215062 -493 105497 214839 -494 105695 214593 -495 105903 214369 -496 106103 214127 -497 106310 213902 -498 106524 213690 -499 106730 213461 -500 106935 213229 -501 107141 213003 -502 107340 212761 -503 107554 212548 -504 107616 212035 -505 107888 211938 -506 108096 211716 -507 108301 211485 -508 108501 211247 -509 108793 211187 -510 109009 210979 -511 109211 210743 -512 109424 210530 -513 109639 210319 -514 109852 210106 -515 110059 209879 -516 110263 209649 -517 110463 209411 -518 110662 209171 -519 110869 208945 -520 111072 208714 -521 111284 208498 -522 111492 208274 -523 111697 208047 -524 111933 207877 -525 112176 207717 -526 112384 207494 -527 112598 207283 -528 112814 207075 -529 113117 207027 -530 113332 206815 -531 113537 206586 -532 113740 206354 -533 113947 206129 -534 114161 205916 -535 114385 205722 -536 114628 205562 -537 114838 205343 -538 115055 205136 -539 115261 204909 -540 115465 204679 -541 115670 204451 -542 115872 204216 -543 116166 204145 -544 116397 203963 -545 116611 203749 -546 116811 203512 -547 117081 203397 -548 117286 203168 -549 117497 202950 -550 117752 202807 -551 117959 202582 -552 118171 202366 -553 118371 202129 -554 118605 201950 -555 118809 201720 -556 119025 201509 -557 119236 201291 -558 119447 201073 -559 119687 200903 -560 119899 200686 -561 120113 200474 -562 120384 200356 -563 120594 200135 -564 120807 199919 -565 121013 199693 -566 121295 199592 -567 121500 199363 -568 121715 199151 -569 121917 198917 -570 122126 198696 -571 122327 198461 -572 122547 198258 -573 122757 198038 -574 122961 197808 -575 123162 197573 -576 123359 197331 -577 123565 197106 -578 123768 196875 -579 123971 196645 -580 124191 196441 -581 124413 196239 -582 124653 196067 -583 124903 195909 -584 125146 195741 -585 125415 195613 -586 125630 195401 -587 125833 195170 -588 126049 194959 -589 126255 194732 -590 126453 194494 -591 126689 194314 -592 126901 194097 -593 127125 193898 -594 127331 193672 -595 127543 193455 -596 127751 193232 -597 127957 193006 -598 128156 192770 -599 128363 192545 -600 128597 192361 -601 128838 192187 -602 129038 191952 -603 129240 191720 -604 129456 191509 -605 129711 191357 -606 129902 191108 -607 130108 190883 -608 130317 190661 -609 130520 190431 -610 130721 190198 -611 130922 189966 -612 131141 189758 -613 131354 189544 -614 131556 189312 -615 131768 189097 -616 131981 188880 -617 132183 188650 -618 132385 188418 -619 132583 188183 -620 132876 188080 -621 133070 187838 -622 133278 187616 -623 133482 187388 -624 133738 187233 -625 133943 187007 -626 134140 186769 -627 134341 186538 -628 134546 186312 -629 134753 186088 -630 134959 185863 -631 135175 185652 -632 135392 185442 -633 135591 185208 -634 135804 184993 -635 136004 184760 -636 136218 184547 -637 136427 184326 -638 136634 184103 -639 136846 183887 -640 137132 183769 -641 137344 183553 -642 137544 183321 -643 137812 183179 -644 138043 182987 -645 138260 182777 -646 138471 182560 -647 138686 182346 -648 138897 182129 -649 139116 181922 -650 139338 181717 -651 139546 181495 -652 139748 181266 -653 139951 181037 -654 140152 180807 -655 140362 180588 -656 140567 180362 -657 140777 180143 -658 140984 179920 -659 141274 179803 -660 141477 179575 -661 141686 179355 -662 141939 179190 -663 142204 179040 -664 142418 178826 -665 142628 178607 -666 142844 178395 -667 143052 178173 -668 143261 177952 -669 143483 177747 -670 143678 177510 -671 143891 177294 -672 144101 177075 -673 144310 176855 -674 144523 176639 -675 144722 176407 -676 144924 176178 -677 145153 175982 -678 145431 175845 -679 145645 175630 -680 145850 175405 -681 146117 175255 -682 146359 175073 -683 146564 174848 -684 146770 174624 -685 146975 174399 -686 147188 174184 -687 147400 173966 -688 147619 173757 -689 147823 173532 -690 148034 173314 -691 148248 173099 -692 148454 172875 -693 148656 172646 -694 148865 172427 -695 149075 172208 -696 149282 171985 -697 149527 171806 -698 149736 171586 -699 149946 171367 -700 150158 171150 -701 150430 171002 -702 150634 170776 -703 150841 170553 -704 151112 170402 -705 151317 170178 -706 151530 169962 -707 151737 169740 -708 151934 169507 -709 152141 169284 -710 152351 169065 -711 152554 168838 -712 152762 168617 -713 152968 168394 -714 153184 168181 -715 153385 167953 -716 153676 167822 -717 153889 167606 -718 154104 167392 -719 154389 167255 -720 154648 167088 -721 154872 166884 -722 155086 166669 -723 155340 166497 -724 155558 166287 -725 155788 166088 -726 155996 165866 -727 156223 165666 -728 156439 165452 -729 156673 165258 -730 156883 165038 -731 157113 164840 -732 157316 164613 -733 157516 164383 -734 157780 164220 -735 157991 164002 -736 158200 163781 -737 158411 163562 -738 158635 163358 -739 158842 163135 -740 159044 162907 -741 159267 162701 -742 159468 162473 -743 159673 162248 -744 159879 162025 -745 160075 161792 -746 160290 161577 -747 160501 161360 -748 160742 161171 -749 160957 160957 -750 161161 160731 -751 161368 160509 -752 161572 160284 -753 161873 160156 -754 162087 159940 -755 162301 159725 -756 162537 159531 -757 162791 159355 -758 163002 159136 -759 163221 158926 -760 163429 158705 -761 163638 158484 -762 163861 158277 -763 164072 158059 -764 164288 157845 -765 164498 157626 -766 164705 157403 -767 164937 157206 -768 165143 156982 -769 165352 156762 -770 165559 156540 -771 165770 156322 -772 166053 156171 -773 166271 155960 -774 166481 155740 -775 166694 155524 -776 166970 155365 -777 167170 155137 -778 167372 154910 -779 167580 154689 -780 167795 154475 -781 168002 154253 -782 168209 154031 -783 168426 153817 -784 168636 153598 -785 168845 153378 -786 169053 153157 -787 169255 152931 -788 169467 152713 -789 169674 152492 -790 169883 152272 -791 170173 152125 -792 170424 151941 -793 170639 151727 -794 170851 151510 -795 171112 151335 -796 171329 151122 -797 171540 150904 -798 171750 150684 -799 171951 150457 -800 172152 150230 -801 172351 150001 -802 172551 149773 -803 172760 149553 -804 172968 149333 -805 173175 149111 -806 173388 148895 -807 173620 148694 -808 173832 148477 -809 174038 148255 -810 174306 148084 -811 174526 147875 -812 174735 147654 -813 174942 147433 -814 175216 147268 -815 175423 147046 -816 175649 146840 -817 175861 146623 -818 176081 146412 -819 176293 146194 -820 176526 145994 -821 176729 145769 -822 176973 145578 -823 177178 145355 -824 177387 145135 -825 177592 144912 -826 177707 144615 -827 177921 144400 -828 178124 144175 -829 178367 143983 -830 178609 143790 -831 178808 143562 -832 179018 143344 -833 179306 143187 -834 179576 143016 -835 179787 142797 -836 179987 142570 -837 180192 142347 -838 180404 142130 -839 180610 141908 -840 180818 141687 -841 181030 141470 -842 181245 141255 -843 181453 141035 -844 181667 140818 -845 181882 140603 -846 182090 140383 -847 182303 140167 -848 182543 139971 -849 182782 139774 -850 182989 139553 -851 183191 139328 -852 183495 139181 -853 183712 138967 -854 183921 138748 -855 184133 138530 -856 184386 138343 -857 184600 138127 -858 184813 137910 -859 185026 137694 -860 185255 137489 -861 185462 137268 -862 185667 137045 -863 185906 136847 -864 186110 136624 -865 186341 136420 -866 186565 136212 -867 186835 136036 -868 187050 135821 -869 187263 135604 -870 187490 135397 -871 187782 135238 -872 187985 135013 -873 188196 134794 -874 188399 134571 -875 188653 134382 -876 188875 134172 -877 189083 133951 -878 189282 133725 -879 189492 133506 -880 189693 133280 -881 189906 133063 -882 190126 132851 -883 190346 132639 -884 190556 132420 -885 190764 132200 -886 191048 132032 -887 191261 131815 -888 191477 131600 -889 191739 131416 -890 192048 131265 -891 192318 131087 -892 192581 130903 -893 192789 130682 -894 192991 130457 -895 193221 130252 -896 193429 130030 -897 193636 129809 -898 193845 129589 -899 194058 129372 -900 194272 129155 -901 194515 128957 -902 194725 128738 -903 194936 128520 -904 195196 128333 -905 195412 128117 -906 195625 127900 -907 195839 127684 -908 196074 127480 -909 196310 127278 -910 196570 127091 -911 196774 126867 -912 197007 126663 -913 197224 126447 -914 197431 126226 -915 197644 126008 -916 197852 125788 -917 198056 125565 -918 198269 125348 -919 198484 125131 -920 198710 124922 -921 198915 124699 -922 199149 124495 -923 199429 124319 -924 199633 124096 -925 199849 123880 -926 200167 123728 -927 200372 123505 -928 200610 123303 -929 200818 123082 -930 201035 122866 -931 201241 122644 -932 201447 122423 -933 201659 122204 -934 201861 121980 -935 202076 121764 -936 202288 121545 -937 202494 121324 -938 202703 121103 -939 202902 120877 -940 203116 120661 -941 203375 120470 -942 203652 120290 -943 203851 120064 -944 204062 119846 -945 204326 119658 -946 204541 119441 -947 204743 119217 -948 204958 119001 -949 205162 118778 -950 205371 118558 -951 205574 118334 -952 205783 118114 -953 205990 117893 -954 206217 117684 -955 206424 117463 -956 206625 117238 -957 206825 117013 -958 207037 116796 -959 207240 116572 -960 207443 116349 -961 207745 116182 -962 207962 115966 -963 208174 115748 -964 208459 115571 -965 208661 115346 -966 208868 115126 -967 209096 114916 -968 209303 114695 -969 209508 114473 -970 209721 114255 -971 209927 114034 -972 210131 113812 -973 210366 113606 -974 210585 113392 -975 210802 113176 -976 211012 112957 -977 211225 112740 -978 211437 112521 -979 211696 112328 -980 211941 112128 -981 212145 111905 -982 212358 111688 -983 212619 111495 -984 212836 111280 -985 213038 111056 -986 213246 110836 -987 213457 110617 -988 213660 110394 -989 213867 110174 -990 214085 109959 -991 214314 109749 -992 214546 109541 -993 214756 109322 -994 214966 109103 -995 215177 108885 -996 215400 108672 -997 215615 108455 -998 215863 108255 -999 216086 108043 -1000 216292 107822 -1001 216507 107605 -1002 216771 107413 -1003 216967 107186 -1004 217169 106964 -1005 217394 106752 -1006 217599 106530 -1007 217813 106313 -1008 218024 106095 -1009 218229 105873 -1010 218454 105661 -1011 218654 105438 -1012 218859 105216 -1013 219067 104996 -1014 219290 104784 -1015 219502 104566 -1016 219720 104351 -1017 219966 104149 -1018 220222 103952 -1019 220437 103735 -1020 220646 103515 -1021 220917 103325 -1022 221145 103114 -1023 221351 102893 -1024 221576 102681 -1025 221785 102462 -1026 221992 102242 -1027 222200 102022 -1028 222415 101805 -1029 222633 101590 -1030 222843 101371 -1031 223074 101161 -1032 223279 100940 -1033 223488 100721 -1034 223688 100497 -1035 223902 100280 -1036 224107 100059 -1037 224348 99854 -1038 224578 99644 -1039 224793 99427 -1040 225050 99229 -1041 225256 99008 -1042 225486 98798 -1043 225701 98582 -1044 225943 98377 -1045 226189 98174 -1046 226397 97954 -1047 226604 97733 -1048 226811 97513 -1049 227020 97294 -1050 227228 97074 -1051 227448 96860 -1052 227657 96640 -1053 227874 96424 -1054 228073 96201 -1055 228303 95991 -1056 228537 95782 -1057 228745 95562 -1058 228948 95340 -1059 229172 95128 -1060 229378 94907 -1061 229596 94692 -1062 229803 94472 -1063 230004 94249 -1064 230206 94027 -1065 230418 93810 -1066 230621 93588 -1067 230833 93370 -1068 231039 93150 -1069 231255 92934 -1070 231460 92713 -1071 231669 92494 -1072 231875 92274 -1073 232082 92054 -1074 232294 91837 -1075 232543 91634 -1076 232765 91420 -1077 232969 91199 -1078 233198 90988 -1079 233458 90789 -1080 233668 90571 -1081 233883 90354 -1082 234097 90137 -1083 234308 89919 -1084 234515 89699 -1085 234729 89482 -1086 234938 89263 -1087 235147 89044 -1088 235356 88826 -1089 235563 88606 -1090 235781 88391 -1091 235983 88169 -1092 236199 87953 -1093 236407 87734 -1094 236651 87528 -1095 236863 87310 -1096 237078 87094 -1097 237291 86877 -1098 237553 86678 -1099 237763 86459 -1100 237972 86240 -1101 238175 86019 -1102 238381 85800 -1103 238588 85580 -1104 238802 85363 -1105 239015 85146 -1106 239224 84927 -1107 239436 84710 -1108 239645 84491 -1109 239845 84270 -1110 240053 84051 -1111 240257 83830 -1112 240475 83615 -1113 240684 83397 -1114 240938 83194 -1115 241150 82976 -1116 241361 82758 -1117 241577 82542 -1118 241783 82323 -1119 241993 82104 -1120 242197 81884 -1121 242398 81663 -1122 242605 81444 -1123 242818 81227 -1124 243044 81014 -1125 243246 80794 -1126 243451 80574 -1127 243655 80354 -1128 243861 80135 -1129 244067 79916 -1130 244275 79697 -1131 244483 79478 -1132 244706 79265 -1133 244916 79047 -1134 245122 78827 -1135 245324 78607 -1136 245537 78390 -1137 245781 78183 -1138 245999 77968 -1139 246214 77751 -1140 246429 77535 -1141 246641 77318 -1142 246845 77098 -1143 247045 76877 -1144 247250 76658 -1145 247460 76440 -1146 247671 76223 -1147 247872 76002 -1148 248081 75784 -1149 248285 75565 -1150 248487 75345 -1151 248692 75125 -1152 248899 74907 -1153 249122 74693 -1154 249330 74475 -1155 249540 74257 -1156 249747 74039 -1157 249966 73824 -1158 250175 73606 -1159 250383 73388 -1160 250594 73171 -1161 250805 72953 -1162 251012 72735 -1163 251227 72519 -1164 251437 72301 -1165 251649 72084 -1166 251849 71864 -1167 252055 71645 -1168 252261 71427 -1169 252471 71209 -1170 252680 70992 -1171 252892 70775 -1172 253110 70560 -1173 253340 70348 -1174 253552 70131 -1175 253762 69914 -1176 253975 69697 -1177 254198 69483 -1178 254411 69267 -1179 254615 69048 -1180 254824 68830 -1181 255028 68611 -1182 255233 68393 -1183 255450 68177 -1184 255664 67961 -1185 255883 67746 -1186 256094 67529 -1187 256300 67311 -1188 256511 67094 -1189 256728 66878 -1190 256935 66660 -1191 257140 66442 -1192 257388 66234 -1193 257594 66016 -1194 257806 65799 -1195 258014 65582 -1196 258249 65371 -1197 258463 65155 -1198 258673 64938 -1199 258882 64720 -1200 259091 64503 -1201 259299 64285 -1202 259506 64067 -1203 259712 63849 -1204 259927 63633 -1205 260135 63416 -1206 260335 63196 -1207 260544 62979 -1208 260757 62763 -1209 260966 62545 -1210 261178 62329 -1211 261385 62111 -1212 261617 61899 -1213 261827 61682 -1214 262050 61468 -1215 262265 61252 -1216 262487 61038 -1217 262690 60819 -1218 262902 60603 -1219 263110 60386 -1220 263322 60169 -1221 263537 59953 -1222 263741 59735 -1223 263951 59518 -1224 264160 59301 -1225 264366 59083 -1226 264579 58867 -1227 264787 58649 -1228 264996 58432 -1229 265205 58215 -1230 265409 57997 -1231 265618 57780 -1232 265854 57569 -1233 266063 57352 -1234 266278 57136 -1235 266508 56924 -1236 266715 56706 -1237 266924 56489 -1238 267132 56272 -1239 267342 56055 -1240 267554 55839 -1241 267759 55621 -1242 267967 55404 -1243 268181 55188 -1244 268396 54972 -1245 268610 54756 -1246 268819 54540 -1247 269025 54322 -1248 269235 54105 -1249 269449 53889 -1250 269668 53675 -1251 269913 53465 -1252 270128 53249 -1253 270336 53032 -1254 270548 52816 -1255 270788 52605 -1256 271003 52389 -1257 271214 52173 -1258 271424 51956 -1259 271631 51739 -1260 271849 51524 -1261 272061 51307 -1262 272274 51091 -1263 272479 50874 -1264 272692 50658 -1265 272906 50442 -1266 273117 50225 -1267 273321 50008 -1268 273526 49790 -1269 273734 49573 -1270 273991 49365 -1271 274196 49148 -1272 274403 48931 -1273 274613 48714 -1274 274848 48502 -1275 275059 48286 -1276 275265 48069 -1277 275472 47852 -1278 275717 47641 -1279 275929 47425 -1280 276141 47209 -1281 276348 46992 -1282 276555 46775 -1283 276761 46558 -1284 276964 46340 -1285 277174 46123 -1286 277381 45906 -1287 277584 45689 -1288 277799 45473 -1289 278014 45258 -1290 278252 45046 -1291 278470 44831 -1292 278680 44614 -1293 278916 44402 -1294 279127 44186 -1295 279337 43969 -1296 279564 43755 -1297 279767 43538 -1298 279982 43322 -1299 280194 43106 -1300 280402 42890 -1301 280608 42673 -1302 280818 42456 -1303 281030 42240 -1304 281246 42025 -1305 281454 41808 -1306 281668 41592 -1307 281873 41375 -1308 282078 41158 -1309 282322 40947 -1310 282537 40731 -1311 282747 40515 -1312 282963 40300 -1313 283211 40089 -1314 283422 39873 -1315 283633 39656 -1316 283837 39439 -1317 284043 39223 -1318 284298 39012 -1319 284508 38796 -1320 284725 38581 -1321 284956 38367 -1322 285169 38151 -1323 285376 37935 -1324 285593 37719 -1325 285797 37502 -1326 286007 37286 -1327 286217 37070 -1328 286463 36858 -1329 286675 36642 -1330 286873 36424 -1331 287111 36212 -1332 287354 36000 -1333 287563 35783 -1334 287769 35567 -1335 287987 35351 -1336 288189 35134 -1337 288409 34919 -1338 288615 34702 -1339 288828 34487 -1340 289043 34271 -1341 289248 34054 -1342 289455 33838 -1343 289674 33622 -1344 289875 33405 -1345 290082 33189 -1346 290288 32972 -1347 290576 32765 -1348 290794 32550 -1349 291008 32334 -1350 291234 32119 -1351 291526 31912 -1352 291737 31696 -1353 291974 31483 -1354 292187 31267 -1355 292393 31050 -1356 292606 30834 -1357 292817 30618 -1358 293026 30402 -1359 293229 30185 -1360 293441 29969 -1361 293649 29753 -1362 293853 29536 -1363 294062 29320 -1364 294291 29105 -1365 294501 28889 -1366 294779 28680 -1367 294989 28463 -1368 295197 28247 -1369 295436 28034 -1370 295698 27822 -1371 295912 27606 -1372 296127 27391 -1373 296334 27174 -1374 296541 26958 -1375 296752 26742 -1376 296999 26529 -1377 297210 26313 -1378 297420 26097 -1379 297623 25880 -1380 297846 25665 -1381 298066 25449 -1382 298268 25233 -1383 298483 25017 -1384 298712 24802 -1385 298979 24591 -1386 299199 24376 -1387 299411 24159 -1388 299696 23949 -1389 299909 23733 -1390 300129 23518 -1391 300345 23302 -1392 300562 23086 -1393 300763 22870 -1394 300981 22654 -1395 301216 22440 -1396 301439 22224 -1397 301650 22008 -1398 301853 21792 -1399 302069 21576 -1400 302281 21360 -1401 302494 21144 -1402 302704 20928 -1403 302954 20714 -1404 303202 20501 -1405 303412 20285 -1406 303621 20068 -1407 303860 19854 -1408 304069 19638 -1409 304322 19424 -1410 304531 19208 -1411 304744 18992 -1412 304971 18777 -1413 305174 18560 -1414 305385 18344 -1415 305597 18128 -1416 305812 17912 -1417 306017 17696 -1418 306223 17480 -1419 306435 17263 -1420 306643 17047 -1421 306851 16831 -1422 307096 16617 -1423 307340 16403 -1424 307555 16187 -1425 307775 15971 -1426 308010 15756 -1427 308221 15540 -1428 308427 15324 -1429 308643 15108 -1430 308853 14892 -1431 309060 14676 -1432 309272 14460 -1433 309476 14243 -1434 309684 14027 -1435 309893 13811 -1436 310099 13595 -1437 310316 13379 -1438 310547 13164 -1439 310753 12948 -1440 310958 12731 -1441 311169 12515 -1442 311410 12301 -1443 311633 12085 -1444 311849 11869 -1445 312122 11656 -1446 312325 11439 -1447 312538 11223 -1448 312746 11007 -1449 312954 10791 -1450 313162 10575 -1451 313366 10359 -1452 313577 10143 -1453 313786 9927 -1454 314003 9711 -1455 314211 9495 -1456 314420 9279 -1457 314636 9063 -1458 314841 8847 -1459 315050 8631 -1460 315261 8415 -1461 315521 8200 -1462 315726 7984 -1463 315937 7768 -1464 316185 7553 -1465 316447 7339 -1466 316677 7123 -1467 316893 6907 -1468 317094 6691 -1469 317296 6475 -1470 317500 6259 -1471 317712 6043 -1472 317916 5827 -1473 318122 5611 -1474 318331 5395 -1475 318548 5179 -1476 318756 4963 -1477 318968 4747 -1478 319178 4531 -1479 319397 4316 -1480 319663 4101 -1481 319876 3885 -1482 320092 3669 -1483 320350 3453 -1484 320619 3238 -1485 320820 3022 -1486 321023 2806 -1487 321239 2590 -1488 321453 2374 -1489 321665 2158 -1490 321878 1942 -1491 322085 1726 -1492 322297 1511 -1493 322507 1295 -1494 322718 1079 -1495 322936 863 -1496 323142 647 -1497 323360 431 -1498 323567 215 -1499 323842 0 +0 328 492124 +1 541 405383 +2 766 382310 +3 971 363434 +4 1011 302536 +5 1217 303253 +6 1441 307443 +7 1646 307041 +8 1849 306393 +9 2053 305934 +10 2263 306413 +11 2472 306642 +12 2677 306303 +13 2882 305987 +14 3046 301593 +15 3264 302739 +16 3366 293686 +17 3473 285954 +18 3687 287452 +19 3900 288657 +20 4112 289665 +21 4336 291329 +22 4568 293356 +23 4771 293448 +24 4977 293682 +25 5183 293851 +26 5388 293965 +27 5594 294135 +28 5812 294835 +29 6030 295507 +30 6241 295754 +31 6453 296064 +32 6668 296447 +33 6876 296502 +34 7081 296418 +35 7294 296653 +36 7524 297537 +37 7731 297461 +38 7937 297339 +39 8151 297537 +40 8357 297412 +41 8570 297503 +42 8811 298563 +43 9022 298549 +44 9118 294837 +45 9336 295110 +46 9577 296094 +47 9787 296070 +48 9993 295915 +49 10204 295919 +50 10405 295629 +51 10613 295546 +52 10818 295360 +53 11029 295338 +54 11237 295245 +55 11444 295104 +56 11654 295051 +57 11860 294867 +58 12069 294770 +59 12287 294896 +60 12504 294975 +61 12776 296341 +62 13010 296753 +63 13219 296604 +64 13427 296434 +65 13635 296261 +66 13870 296673 +67 14075 296415 +68 14282 296215 +69 14488 295982 +70 14692 295715 +71 14909 295697 +72 15114 295457 +73 15327 295364 +74 15538 295225 +75 15755 295214 +76 15960 294966 +77 16171 294814 +78 16385 294730 +79 16596 294591 +80 16816 294604 +81 17084 295430 +82 17284 295090 +83 17494 294902 +84 17700 294665 +85 17909 294457 +86 18126 294402 +87 18339 294263 +88 18604 294955 +89 18820 294854 +90 19036 294754 +91 19240 294470 +92 19457 294374 +93 19667 294176 +94 19871 293894 +95 20078 293647 +96 20289 293459 +97 20495 293205 +98 20704 293004 +99 20914 292809 +100 21149 292955 +101 21369 292885 +102 21587 292788 +103 21810 292759 +104 22018 292526 +105 22230 292358 +106 22438 292114 +107 22645 291879 +108 22856 291677 +109 23063 291440 +110 23272 291223 +111 23483 291025 +112 23693 290816 +113 23902 290604 +114 24108 290346 +115 24314 290095 +116 24556 290268 +117 24802 290479 +118 25011 290254 +119 25224 290084 +120 25488 290480 +121 25725 290567 +122 25966 290697 +123 26173 290442 +124 26382 290202 +125 26592 289983 +126 26801 289750 +127 27010 289515 +128 27216 289256 +129 27446 289242 +130 27683 289307 +131 27901 289160 +132 28117 288998 +133 28324 288745 +134 28537 288542 +135 28751 288362 +136 28961 288135 +137 29171 287910 +138 29379 287667 +139 29650 288035 +140 29865 287851 +141 30086 287723 +142 30302 287556 +143 30507 287276 +144 30738 287245 +145 30962 287146 +146 31174 286936 +147 31380 286661 +148 31593 286462 +149 31797 286175 +150 32002 285900 +151 32210 285655 +152 32418 285412 +153 32635 285239 +154 32848 285036 +155 33056 284796 +156 33272 284617 +157 33492 284470 +158 33760 284735 +159 33977 284565 +160 34245 284809 +161 34452 284550 +162 34695 284590 +163 34902 284328 +164 35111 284082 +165 35318 283825 +166 35521 283534 +167 35726 283261 +168 35933 283004 +169 36146 282789 +170 36359 282586 +171 36572 282377 +172 36810 282353 +173 37020 282125 +174 37236 281933 +175 37452 281742 +176 37669 281561 +177 37904 281518 +178 38166 281661 +179 38377 281433 +180 38633 281530 +181 38848 281333 +182 39056 281080 +183 39277 280916 +184 39503 280796 +185 39722 280623 +186 39938 280427 +187 40150 280198 +188 40369 280026 +189 40578 279780 +190 40802 279637 +191 41009 279374 +192 41217 279127 +193 41425 278873 +194 41635 278637 +195 41843 278389 +196 42071 278269 +197 42315 278257 +198 42528 278035 +199 42758 277930 +200 42990 277835 +201 43200 277595 +202 43414 277381 +203 43622 277132 +204 43885 277225 +205 44092 276966 +206 44298 276706 +207 44509 276472 +208 44719 276236 +209 44930 276002 +210 45148 275814 +211 45353 275543 +212 45565 275320 +213 45808 275277 +214 46027 275095 +215 46303 275246 +216 46534 275130 +217 46749 274922 +218 46971 274751 +219 47179 274500 +220 47386 274239 +221 47603 274042 +222 47819 273836 +223 48031 273608 +224 48256 273455 +225 48478 273280 +226 48701 273113 +227 48929 272973 +228 49137 272723 +229 49342 272457 +230 49558 272249 +231 49768 272009 +232 49975 271755 +233 50209 271646 +234 50456 271604 +235 50725 271682 +236 50934 271435 +237 51151 271231 +238 51369 271031 +239 51590 270852 +240 51821 270720 +241 52041 270529 +242 52246 270260 +243 52466 270071 +244 52687 269887 +245 52894 269634 +246 53124 269493 +247 53340 269285 +248 53555 269068 +249 53766 268834 +250 53974 268584 +251 54181 268325 +252 54388 268074 +253 54607 267880 +254 54841 267756 +255 55074 267627 +256 55283 267381 +257 55510 267224 +258 55728 267025 +259 55954 266857 +260 56174 266666 +261 56385 266434 +262 56598 266206 +263 56813 265990 +264 57028 265775 +265 57247 265575 +266 57460 265349 +267 57675 265134 +268 57904 264985 +269 58147 264893 +270 58352 264631 +271 58556 264365 +272 58767 264132 +273 59043 264185 +274 59321 264249 +275 59530 264004 +276 59730 263718 +277 59933 263450 +278 60135 263173 +279 60342 262920 +280 60570 262757 +281 60775 262496 +282 60995 262300 +283 61199 262038 +284 61406 261786 +285 61619 261559 +286 61824 261301 +287 62034 261060 +288 62241 260811 +289 62443 260538 +290 62641 260252 +291 62853 260022 +292 63081 259859 +293 63344 259840 +294 63550 259589 +295 63763 259360 +296 63972 259118 +297 64190 258915 +298 64399 258673 +299 64599 258397 +300 64809 258160 +301 65019 257924 +302 65221 257656 +303 65425 257397 +304 65641 257184 +305 65847 256934 +306 66050 256671 +307 66262 256444 +308 66467 256189 +309 66673 255939 +310 66875 255676 +311 67118 255565 +312 67353 255427 +313 67623 255417 +314 67854 255263 +315 68067 255039 +316 68272 254783 +317 68493 254589 +318 68701 254346 +319 68909 254103 +320 69113 253847 +321 69317 253591 +322 69521 253333 +323 69726 253080 +324 69934 252840 +325 70142 252600 +326 70347 252348 +327 70555 252106 +328 70770 251891 +329 70974 251637 +330 71183 251401 +331 71411 251229 +332 71629 251026 +333 71839 250792 +334 72053 250574 +335 72271 250368 +336 72484 250147 +337 72691 249903 +338 72905 249686 +339 73120 249469 +340 73323 249214 +341 73533 248982 +342 73736 248726 +343 73954 248523 +344 74171 248311 +345 74375 248061 +346 74587 247838 +347 74807 247639 +348 75012 247389 +349 75215 247138 +350 75422 246895 +351 75664 246768 +352 75879 246554 +353 76090 246327 +354 76294 246076 +355 76499 245828 +356 76707 245592 +357 76925 245387 +358 77134 245152 +359 77347 244932 +360 77550 244682 +361 77759 244449 +362 77963 244200 +363 78172 243965 +364 78386 243749 +365 78596 243521 +366 78801 243274 +367 79021 243077 +368 79241 242877 +369 79457 242669 +370 79675 242463 +371 79899 242276 +372 80122 242085 +373 80336 241868 +374 80545 241635 +375 80753 241401 +376 80966 241180 +377 81170 240935 +378 81376 240692 +379 81579 240445 +380 81785 240204 +381 82003 239999 +382 82220 239791 +383 82423 239542 +384 82627 239298 +385 82837 239070 +386 83051 238852 +387 83260 238622 +388 83466 238383 +389 83680 238167 +390 83891 237943 +391 84112 237746 +392 84320 237513 +393 84523 237267 +394 84766 237132 +395 84976 236904 +396 85188 236683 +397 85399 236457 +398 85610 236233 +399 85813 235986 +400 86032 235784 +401 86234 235536 +402 86451 235327 +403 86653 235078 +404 86856 234833 +405 87061 234593 +406 87265 234353 +407 87470 234112 +408 87676 233874 +409 87886 233648 +410 88102 233438 +411 88332 233267 +412 88547 233053 +413 88755 232822 +414 88959 232580 +415 89185 232395 +416 89392 232163 +417 89595 231920 +418 89798 231674 +419 90008 231451 +420 90221 231232 +421 90429 231002 +422 90633 230761 +423 90843 230537 +424 91054 230314 +425 91263 230087 +426 91484 229889 +427 91686 229644 +428 91890 229404 +429 92098 229176 +430 92321 228982 +431 92550 228806 +432 92754 228565 +433 92957 228323 +434 93170 228107 +435 93385 227894 +436 93589 227655 +437 93796 227424 +438 94003 227193 +439 94233 227017 +440 94449 226807 +441 94652 226565 +442 94867 226354 +443 95090 226160 +444 95299 225935 +445 95510 225714 +446 95715 225476 +447 95919 225239 +448 96140 225040 +449 96350 224818 +450 96559 224592 +451 96771 224373 +452 96987 224163 +453 97195 223934 +454 97401 223702 +455 97607 223470 +456 97830 223275 +457 98035 223041 +458 98254 222838 +459 98465 222616 +460 98672 222388 +461 98883 222166 +462 99083 221921 +463 99288 221686 +464 99335 221102 +465 99540 220868 +466 99749 220646 +467 99956 220417 +468 100193 220254 +469 100418 220065 +470 100650 219891 +471 100881 219715 +472 101091 219494 +473 101300 219270 +474 101505 219037 +475 101723 218833 +476 101925 218594 +477 102129 218360 +478 102331 218122 +479 102534 217886 +480 102741 217658 +481 102948 217430 +482 103160 217213 +483 103373 216999 +484 103578 216766 +485 103793 216556 +486 104002 216334 +487 104216 216120 +488 104419 215885 +489 104630 215666 +490 104847 215460 +491 105067 215259 +492 105273 215030 +493 105482 214807 +494 105692 214587 +495 105905 214374 +496 106118 214159 +497 106332 213947 +498 106534 213708 +499 106747 213494 +500 106961 213282 +501 107168 213055 +502 107374 212828 +503 107584 212607 +504 107791 212380 +505 107993 212146 +506 108207 211933 +507 108416 211711 +508 108639 211516 +509 108854 211305 +510 109064 211085 +511 109284 210885 +512 109521 210716 +513 109729 210491 +514 109947 210286 +515 110157 210067 +516 110364 209842 +517 110568 209611 +518 110770 209374 +519 110972 209140 +520 111181 208918 +521 111386 208688 +522 111598 208474 +523 111811 208260 +524 112028 208052 +525 112234 207826 +526 112468 207650 +527 112674 207423 +528 112877 207190 +529 113103 207000 +530 113316 206785 +531 113532 206577 +532 113741 206356 +533 113946 206127 +534 114147 205892 +535 114355 205669 +536 114572 205462 +537 114773 205227 +538 114982 205005 +539 115192 204787 +540 115399 204562 +541 115619 204360 +542 115824 204133 +543 116027 203901 +544 116229 203668 +545 116432 203437 +546 116636 203207 +547 116847 202991 +548 117057 202772 +549 117301 202612 +550 117523 202413 +551 117733 202195 +552 117948 201983 +553 118166 201779 +554 118392 201587 +555 118607 201376 +556 118811 201147 +557 119014 200916 +558 119235 200717 +559 119440 200488 +560 119648 200266 +561 119852 200038 +562 120054 199806 +563 120266 199590 +564 120483 199384 +565 120696 199170 +566 120906 198952 +567 121111 198725 +568 121344 198544 +569 121568 198348 +570 121816 198191 +571 122023 197967 +572 122230 197744 +573 122428 197506 +574 122641 197293 +575 122845 197064 +576 123052 196841 +577 123265 196627 +578 123470 196401 +579 123678 196179 +580 123884 195954 +581 124089 195728 +582 124311 195530 +583 124531 195327 +584 124734 195098 +585 124939 194872 +586 125152 194657 +587 125360 194437 +588 125596 194258 +589 125823 194066 +590 126027 193839 +591 126237 193620 +592 126441 193394 +593 126650 193173 +594 126861 192957 +595 127085 192760 +596 127302 192553 +597 127549 192390 +598 127749 192156 +599 127957 191936 +600 128163 191712 +601 128372 191492 +602 128578 191268 +603 128783 191043 +604 129007 190846 +605 129210 190616 +606 129415 190391 +607 129624 190173 +608 129890 190037 +609 130138 189873 +610 130380 189703 +611 130600 189498 +612 130808 189277 +613 131009 189046 +614 131214 188820 +615 131416 188590 +616 131632 188382 +617 131839 188159 +618 132054 187949 +619 132253 187714 +620 132463 187496 +621 132670 187273 +622 132886 187064 +623 133101 186854 +624 133345 186683 +625 133573 186490 +626 133787 186278 +627 134032 186108 +628 134259 185914 +629 134479 185709 +630 134699 185505 +631 134913 185292 +632 135132 185086 +633 135330 184852 +634 135554 184653 +635 135767 184439 +636 135987 184234 +637 136203 184024 +638 136427 183824 +639 136650 183623 +640 136860 183405 +641 137067 183183 +642 137283 182973 +643 137533 182809 +644 137744 182591 +645 137951 182369 +646 138227 182237 +647 138476 182070 +648 138707 181879 +649 138913 181656 +650 139125 181439 +651 139352 181243 +652 139573 181039 +653 139849 180906 +654 140062 180691 +655 140284 180488 +656 140498 180274 +657 140709 180056 +658 140923 179842 +659 141129 179618 +660 141333 179392 +661 141541 179172 +662 141754 178956 +663 141964 178738 +664 142175 178521 +665 142451 178384 +666 142682 178192 +667 142891 177973 +668 143093 177744 +669 143309 177533 +670 143547 177348 +671 143775 177152 +672 143979 176925 +673 144190 176707 +674 144394 176482 +675 144646 176315 +676 144854 176093 +677 145066 175876 +678 145277 175659 +679 145492 175446 +680 145717 175246 +681 145921 175020 +682 146133 174803 +683 146365 174611 +684 146585 174405 +685 146860 174262 +686 147074 174048 +687 147283 173828 +688 147490 173606 +689 147692 173378 +690 147901 173157 +691 148106 172934 +692 148342 172744 +693 148600 172581 +694 148816 172370 +695 149031 172156 +696 149249 171947 +697 149453 171721 +698 149662 171501 +699 149870 171280 +700 150089 171071 +701 150292 170844 +702 150535 170663 +703 150748 170448 +704 150992 170268 +705 151212 170060 +706 151422 169841 +707 151649 169642 +708 151860 169423 +709 152068 169202 +710 152275 168980 +711 152493 168770 +712 152701 168549 +713 152907 168326 +714 153113 168103 +715 153325 167887 +716 153540 167673 +717 153755 167460 +718 153972 167249 +719 154203 167053 +720 154423 166845 +721 154648 166643 +722 154866 166433 +723 155107 166248 +724 155316 166027 +725 155530 165813 +726 155732 165586 +727 155948 165373 +728 156158 165154 +729 156375 164943 +730 156593 164733 +731 156815 164527 +732 157024 164308 +733 157231 164086 +734 157455 163882 +735 157696 163695 +736 157906 163476 +737 158120 163262 +738 158324 163038 +739 158547 162832 +740 158756 162612 +741 159041 162470 +742 159263 162263 +743 159463 162035 +744 159671 161815 +745 159888 161602 +746 160096 161382 +747 160322 161180 +748 160537 160965 +749 160772 160772 +750 161008 160579 +751 161223 160366 +752 161432 160145 +753 161648 159933 +754 161871 159727 +755 162078 159506 +756 162288 159287 +757 162499 159069 +758 162718 158859 +759 162949 158661 +760 163192 158474 +761 163422 158275 +762 163683 158105 +763 163906 157899 +764 164104 157669 +765 164317 157452 +766 164531 157238 +767 164749 157026 +768 164953 156802 +769 165159 156579 +770 165373 156365 +771 165587 156149 +772 165797 155930 +773 166007 155712 +774 166221 155497 +775 166442 155288 +776 166661 155078 +777 166869 154858 +778 167093 154652 +779 167310 154440 +780 167554 154252 +781 167765 154035 +782 167970 153812 +783 168192 153604 +784 168417 153399 +785 168626 153179 +786 168836 152961 +787 169050 152746 diff --git a/main/train/catboost_info/tmp/cat_feature_index.574dcb96-dc9ebe4e-fec52066-4d735471.tmp b/main/train/catboost_info/tmp/cat_feature_index.574dcb96-dc9ebe4e-fec52066-4d735471.tmp new file mode 100644 index 0000000..0050fb5 Binary files /dev/null and b/main/train/catboost_info/tmp/cat_feature_index.574dcb96-dc9ebe4e-fec52066-4d735471.tmp differ diff --git a/main/train/catboost_info/tmp/cat_feature_index.6e271dc5-5022da26-a9883518-dbceac3f.tmp b/main/train/catboost_info/tmp/cat_feature_index.6e271dc5-5022da26-a9883518-dbceac3f.tmp new file mode 100644 index 0000000..92f654c Binary files /dev/null and b/main/train/catboost_info/tmp/cat_feature_index.6e271dc5-5022da26-a9883518-dbceac3f.tmp differ diff --git a/main/train/predictions_test.tsv b/main/train/predictions_test.tsv index e49ddd7..f6569f4 100644 --- a/main/train/predictions_test.tsv +++ b/main/train/predictions_test.tsv @@ -1,1133 +1,1153 @@ trade_date,score,ts_code -2023-01-03,0.4239400768669203,600355.SH -2023-01-03,0.42970635952866365,002199.SZ -2023-01-04,0.42724112458711677,600455.SH -2023-01-04,0.6141097521413383,000691.SZ -2023-01-05,0.43631300785896426,600455.SH -2023-01-05,0.43905633508133696,000691.SZ -2023-01-06,0.40685595355089693,000691.SZ -2023-01-06,0.4473346079425937,002494.SZ -2023-01-09,0.39304974062488474,600898.SH -2023-01-09,0.6044320101965897,603499.SH -2023-01-10,0.39400882935808845,002828.SZ -2023-01-10,0.5125287743498478,603499.SH -2023-01-11,0.3836761645580643,002828.SZ -2023-01-11,0.4037232376536899,603316.SH -2023-01-12,0.42886671430706863,002494.SZ -2023-01-12,0.5000121663327353,603316.SH -2023-01-13,0.3788144781055324,000691.SZ -2023-01-13,0.39034441366283046,603316.SH -2023-01-16,0.37396533044956176,603316.SH -2023-01-16,0.5251875671465198,603499.SH -2023-01-17,0.3753853391815763,603316.SH -2023-01-17,0.4430728938261208,002209.SZ -2023-01-18,0.42003654308545174,603268.SH -2023-01-18,0.5296870135356659,002816.SZ -2023-01-19,0.508031285176912,600455.SH -2023-01-19,0.6168948195513843,002848.SZ -2023-01-20,0.3900722355558213,600455.SH -2023-01-20,0.391090281306091,002494.SZ -2023-01-30,0.5663251322946142,600250.SH -2023-01-30,0.5980765140143323,002058.SZ -2023-01-31,0.4146360368744556,600250.SH -2023-01-31,0.5842631000166625,600768.SH -2023-02-01,0.5419976791400637,002899.SZ -2023-02-01,0.6070700759584229,600768.SH -2023-02-02,0.5052785933821907,600898.SH -2023-02-02,0.5943516298827024,600768.SH -2023-02-03,0.4921964469412592,002830.SZ -2023-02-03,0.598275325341373,600768.SH -2023-02-06,0.4412772823034977,600768.SH -2023-02-06,0.46510360335467077,600355.SH -2023-02-07,0.43692480625891766,600898.SH -2023-02-07,0.5118672434795938,600768.SH -2023-02-08,0.3785567924709705,600898.SH -2023-02-08,0.394165151703738,600768.SH -2023-02-09,0.4216709728294096,603269.SH -2023-02-09,0.5098933796931774,600768.SH -2023-02-10,0.37251067286580014,600355.SH -2023-02-10,0.4827936569005276,600768.SH -2023-02-13,0.4176030275880078,002199.SZ -2023-02-13,0.4206561229744506,600768.SH -2023-02-14,0.3705144993096547,600768.SH -2023-02-14,0.4239004482623613,603709.SH -2023-02-15,0.3606711097356446,002848.SZ -2023-02-15,0.46016953851842973,600355.SH -2023-02-16,0.41608446220831474,002848.SZ -2023-02-16,0.4505464175347961,603709.SH -2023-02-17,0.38021921185976665,002861.SZ -2023-02-17,0.38539727071942115,600355.SH -2023-02-20,0.341809942673105,002921.SZ -2023-02-20,0.3639580130643985,002861.SZ -2023-02-21,0.3249162891800052,002861.SZ -2023-02-21,0.35854733202329103,600355.SH -2023-02-22,0.33486266464936565,600768.SH -2023-02-22,0.3986625984875961,600243.SH -2023-02-23,0.32208670991576843,600355.SH -2023-02-23,0.3507312968290255,600898.SH -2023-02-24,0.42641791444521143,603269.SH -2023-02-24,0.5824895014572357,002633.SZ -2023-02-27,0.4163404772440078,002633.SZ -2023-02-27,0.44811308697139507,603559.SH -2023-02-28,0.35262564865500723,600898.SH -2023-02-28,0.36370494097615197,600137.SH -2023-03-01,0.3236726505705463,600898.SH -2023-03-01,0.3661756054201265,000692.SZ -2023-03-02,0.3575587881851425,600898.SH -2023-03-02,0.6572279209359144,603860.SH -2023-03-03,0.3219340553957944,603685.SH -2023-03-03,0.3588725035725592,002848.SZ -2023-03-06,0.3406797378619459,002848.SZ -2023-03-06,0.5457601826721713,603685.SH -2023-03-07,0.31700228822285265,002848.SZ -2023-03-07,0.34849072196018055,603559.SH -2023-03-08,0.32406255378127596,002856.SZ -2023-03-08,0.47353545231801025,603729.SH -2023-03-09,0.32126539217469524,603729.SH -2023-03-09,0.3465858147694663,002856.SZ -2023-03-10,0.3152355785282847,603729.SH -2023-03-10,0.3428221199609417,603269.SH -2023-03-13,0.30021320630222675,002848.SZ -2023-03-13,0.3002712074993745,002629.SZ -2023-03-14,0.3521922555641345,002816.SZ -2023-03-14,0.37754974459438245,603813.SH -2023-03-15,0.2976730313222094,603316.SH -2023-03-15,0.3003649985420522,002629.SZ -2023-03-16,0.3476879987501991,002816.SZ -2023-03-16,0.38819744330153566,600768.SH -2023-03-17,0.34845357108303204,002830.SZ -2023-03-17,0.3634014324339053,603269.SH -2023-03-20,0.37082385911844773,603559.SH -2023-03-20,0.3732154880075055,603269.SH -2023-03-21,0.3663705461969566,002629.SZ -2023-03-21,0.5694345879271865,600539.SH -2023-03-22,0.36809265596021207,002856.SZ -2023-03-22,0.3846947030655162,603729.SH -2023-03-23,0.3253727313669242,002830.SZ -2023-03-23,0.43388163783745914,600539.SH -2023-03-24,0.399747371408324,600539.SH -2023-03-24,0.40894047851243304,000702.SZ -2023-03-27,0.3808016772375393,600539.SH -2023-03-27,0.3932171671713684,000702.SZ -2023-03-28,0.3747912756973511,600539.SH -2023-03-28,0.37626090520962474,000702.SZ -2023-03-29,0.3651262432070006,600539.SH -2023-03-29,0.3979552082350666,000702.SZ -2023-03-30,0.3561213274405149,600539.SH -2023-03-30,0.35865934031839275,600355.SH -2023-03-31,0.29645021106429026,002856.SZ -2023-03-31,0.34331302943577136,000702.SZ -2023-04-03,0.32642081481248386,000702.SZ -2023-04-03,0.34388493845230067,603030.SH -2023-04-04,0.3391057453724967,000702.SZ -2023-04-04,0.3471948082724002,603030.SH -2023-04-06,0.3421414932796906,600455.SH -2023-04-06,0.3653223178569048,002816.SZ -2023-04-07,0.38185331536284495,000692.SZ -2023-04-07,0.38610869068697473,600234.SH -2023-04-10,0.33963240485329854,600539.SH -2023-04-10,0.36822555723788114,603030.SH -2023-04-11,0.3286107206836759,600355.SH -2023-04-11,0.3556230114130875,603030.SH -2023-04-12,0.3188751604846469,002816.SZ -2023-04-12,0.3455993486021411,603030.SH -2023-04-13,0.3765261126565487,002816.SZ -2023-04-13,0.5515981950472629,603030.SH -2023-04-14,0.33684675319643526,600543.SH -2023-04-14,0.5052666709241068,603030.SH -2023-04-17,0.33729305553364,603729.SH -2023-04-17,0.43190685768583875,603030.SH -2023-04-18,0.34394881287582113,603729.SH -2023-04-18,0.39960979338632924,603030.SH -2023-04-19,0.3404445130440016,603536.SH -2023-04-19,0.4173032654734418,603030.SH -2023-04-20,0.45004313302100246,000416.SZ -2023-04-20,0.478064654227024,603030.SH -2023-04-21,0.49583739260723597,603030.SH -2023-04-21,0.49631699740297563,000416.SZ -2023-04-24,0.4147675629029992,000609.SZ -2023-04-24,0.5000571832402045,603030.SH -2023-04-25,0.43377184754979836,000691.SZ -2023-04-25,0.5081318326530003,002816.SZ -2023-04-26,0.45639808622537237,603030.SH -2023-04-26,0.458149445098202,002652.SZ -2023-04-27,0.49315626123103984,603030.SH -2023-04-27,0.494786849608341,002652.SZ -2023-04-28,0.3651120565041773,600539.SH -2023-04-28,0.5631137900335828,603030.SH -2023-05-04,0.3899993900895036,002652.SZ -2023-05-04,0.3918908811671188,000609.SZ -2023-05-05,0.44750268116993425,000609.SZ -2023-05-05,0.4806697383189579,603725.SH -2023-05-08,0.3643102634189475,603729.SH -2023-05-08,0.3654824972584156,002652.SZ -2023-05-09,0.34445991030877215,603729.SH -2023-05-09,0.39374076833991944,603725.SH -2023-05-10,0.3305996622582533,002856.SZ -2023-05-10,0.34850323362101093,002652.SZ -2023-05-11,0.5682576998481914,603729.SH -2023-05-11,0.5780336571997453,603958.SH -2023-05-12,0.47712981567764634,603729.SH -2023-05-12,0.568640596111845,603958.SH -2023-05-15,0.4493631861876303,603958.SH -2023-05-15,0.4744634453790671,603729.SH -2023-05-16,0.44217227637734197,002652.SZ -2023-05-16,0.44234461951018844,603729.SH -2023-05-17,0.44918287315203587,600539.SH -2023-05-17,0.4796344827565927,603729.SH -2023-05-18,0.44466636157225237,002316.SZ -2023-05-18,0.5071360248976321,603958.SH -2023-05-19,0.44580353807867795,002719.SZ -2023-05-19,0.5161874625058558,603958.SH -2023-05-22,0.4312070482482675,002719.SZ -2023-05-22,0.4974174616583446,603958.SH -2023-05-23,0.48055536556502426,002316.SZ -2023-05-23,0.5981258133142335,603958.SH -2023-05-24,0.4297286191240215,002719.SZ -2023-05-24,0.508354365861134,603958.SH -2023-05-25,0.4138961697427337,603958.SH -2023-05-25,0.4517982885563264,002719.SZ -2023-05-26,0.42963298571080866,002719.SZ -2023-05-26,0.5279706417908434,002316.SZ -2023-05-29,0.4164719366631263,002719.SZ -2023-05-29,0.5462596386040748,603958.SH -2023-05-30,0.468266123615298,603958.SH -2023-05-30,0.5391973624302929,600083.SH -2023-05-31,0.47267676565417316,603608.SH -2023-05-31,0.5065014711002823,002316.SZ -2023-06-01,0.38829691358892426,603608.SH -2023-06-01,0.47575100867582737,002719.SZ -2023-06-02,0.38974583871089713,000622.SZ -2023-06-02,0.45794542584246245,002719.SZ -2023-06-05,0.41065752118759064,000622.SZ -2023-06-05,0.5149700409829883,603729.SH -2023-06-06,0.42210524631239016,000622.SZ -2023-06-06,0.44283759178182086,603729.SH -2023-06-07,0.4230370273052575,603389.SH -2023-06-07,0.4700517913726384,002652.SZ -2023-06-08,0.4233278695251684,002652.SZ -2023-06-08,0.46569298180116697,600137.SH -2023-06-09,0.432078990640576,600137.SH -2023-06-09,0.4980037961047778,002719.SZ -2023-06-12,0.4727318447792117,002719.SZ -2023-06-12,0.6272094607995022,603286.SH -2023-06-13,0.43951649854101554,002652.SZ -2023-06-13,0.4433754411476202,603286.SH -2023-06-14,0.4498050817306008,603286.SH -2023-06-14,0.5087773954825299,002719.SZ -2023-06-15,0.43346372291847857,603286.SH -2023-06-15,0.44287170151456534,002848.SZ -2023-06-16,0.42898885686953936,603286.SH -2023-06-16,0.4356405368359997,002719.SZ -2023-06-19,0.4330804090692767,002719.SZ -2023-06-19,0.5648715453145741,603286.SH -2023-06-20,0.3970142745037804,002848.SZ -2023-06-20,0.5573858152437493,002247.SZ -2023-06-21,0.48354858762000114,002058.SZ -2023-06-21,0.5066885197750491,002247.SZ -2023-06-26,0.4982522626742216,002247.SZ -2023-06-26,0.5657014008205177,000691.SZ -2023-06-27,0.44652508838335137,002211.SZ -2023-06-27,0.5091532954383562,000609.SZ -2023-06-28,0.41785315708532744,002211.SZ -2023-06-28,0.588159666732166,000609.SZ -2023-06-29,0.44660047455707497,000609.SZ -2023-06-29,0.4502916281044666,002211.SZ -2023-06-30,0.4274285724523175,603709.SH -2023-06-30,0.4767344722315726,002211.SZ -2023-07-03,0.4119233142062097,603389.SH -2023-07-03,0.6246383315011875,002211.SZ -2023-07-04,0.4334515265656731,603709.SH -2023-07-04,0.6061812853137967,000691.SZ -2023-07-05,0.5165244320683238,000691.SZ -2023-07-05,0.5697628926861594,002211.SZ -2023-07-06,0.4594839057380401,000702.SZ -2023-07-06,0.6358046952979427,000691.SZ -2023-07-07,0.41263480610233627,000702.SZ -2023-07-07,0.5903572230896269,000691.SZ -2023-07-10,0.4007885663722387,000702.SZ -2023-07-10,0.4862992415929783,000691.SZ -2023-07-11,0.429205772818444,000691.SZ -2023-07-11,0.6259686855164271,600493.SH -2023-07-12,0.41739667979357237,000691.SZ -2023-07-12,0.482845877352182,600493.SH -2023-07-13,0.42173527228853835,002211.SZ -2023-07-13,0.43549849818186626,000691.SZ -2023-07-14,0.3788765108249654,000691.SZ -2023-07-14,0.5686937108553185,000609.SZ -2023-07-17,0.4208056555850574,603729.SH -2023-07-17,0.4731669966830037,000609.SZ -2023-07-18,0.4088701143127906,000609.SZ -2023-07-18,0.5599854902241823,603709.SH -2023-07-19,0.4500091126558886,603709.SH -2023-07-19,0.6271822632727398,000609.SZ -2023-07-20,0.5266062946918455,000691.SZ -2023-07-20,0.5906684869049804,000609.SZ -2023-07-21,0.4945071284644432,000691.SZ -2023-07-21,0.5711585355178147,000609.SZ -2023-07-24,0.4778997114945385,000609.SZ -2023-07-24,0.48730169159320297,000691.SZ -2023-07-25,0.4323022652799092,603709.SH -2023-07-25,0.5403922980602941,000609.SZ -2023-07-26,0.5119168746100982,000691.SZ -2023-07-26,0.5698554434064911,000609.SZ -2023-07-27,0.4557444883900644,000609.SZ -2023-07-27,0.511962359880953,000691.SZ -2023-07-28,0.4451861501950426,000702.SZ -2023-07-28,0.4785884626550739,000691.SZ -2023-07-31,0.4421886299389137,603729.SH -2023-07-31,0.6352420390011941,002652.SZ -2023-08-01,0.4272084245563631,002652.SZ -2023-08-01,0.49023462751208136,000609.SZ -2023-08-02,0.39728466810880075,002058.SZ -2023-08-02,0.437216286121051,002652.SZ -2023-08-03,0.4388253230436788,002652.SZ -2023-08-03,0.4817331470681723,000609.SZ -2023-08-04,0.3962505404869625,002211.SZ -2023-08-04,0.40850915871525517,600355.SH -2023-08-07,0.39047609646077985,600355.SH -2023-08-07,0.4689199267969053,002652.SZ -2023-08-08,0.4378717574534052,002652.SZ -2023-08-08,0.44249194687155097,000609.SZ -2023-08-09,0.38471842322445876,002652.SZ -2023-08-09,0.43192274669816033,000609.SZ -2023-08-10,0.3707904677702575,000691.SZ -2023-08-10,0.586455818175355,002652.SZ -2023-08-11,0.3672800802322459,000609.SZ -2023-08-11,0.5412509721642739,002652.SZ -2023-08-14,0.41682130885658136,000691.SZ -2023-08-14,0.4701590146337131,002652.SZ -2023-08-15,0.3726383737115371,000609.SZ -2023-08-15,0.44213909075645574,002652.SZ -2023-08-16,0.37894196261709534,600355.SH -2023-08-16,0.5808005718678985,002652.SZ -2023-08-17,0.48266247884824826,000609.SZ -2023-08-17,0.5322352594930587,002652.SZ -2023-08-18,0.42879775573836293,605081.SH -2023-08-18,0.46678327709301204,603729.SH -2023-08-21,0.43211128366558405,603729.SH -2023-08-21,0.5439688714288338,600455.SH -2023-08-22,0.46202109014480425,600539.SH -2023-08-22,0.5106860422247953,002652.SZ -2023-08-23,0.4621791609111499,600539.SH -2023-08-23,0.5245334187250577,002652.SZ -2023-08-24,0.47423650017534996,600355.SH -2023-08-24,0.5464810666146934,002652.SZ -2023-08-25,0.49322767586689437,002652.SZ -2023-08-25,0.499530890398595,600455.SH -2023-08-28,0.4716039449282722,002193.SZ -2023-08-28,0.4742347861777619,002861.SZ -2023-08-29,0.45136275963240263,002652.SZ -2023-08-29,0.45268789449167485,603729.SH -2023-08-30,0.4926161207814646,002856.SZ -2023-08-30,0.5176356665643723,603389.SH -2023-08-31,0.4961236898610121,002856.SZ -2023-08-31,0.5178825426258422,603389.SH -2023-09-01,0.40680122511981043,002652.SZ -2023-09-01,0.46732225180093284,002856.SZ -2023-09-04,0.39959429117961315,002856.SZ -2023-09-04,0.4533483465132477,603729.SH -2023-09-05,0.42703866665640783,603729.SH -2023-09-05,0.47729380393602044,603389.SH -2023-09-06,0.41726041920559703,603389.SH -2023-09-06,0.43705382264957615,603709.SH -2023-09-07,0.40769328961845086,002652.SZ -2023-09-07,0.42333145169734954,002856.SZ -2023-09-08,0.42926798383274695,603709.SH -2023-09-08,0.45257187082322464,603389.SH -2023-09-11,0.4272842043529076,002652.SZ -2023-09-11,0.482156834646067,603389.SH -2023-09-12,0.3829014131433474,002652.SZ -2023-09-12,0.4172395874153806,603389.SH -2023-09-13,0.4040916731399645,603389.SH -2023-09-13,0.41481337473228524,002652.SZ -2023-09-14,0.4221507077971606,603389.SH -2023-09-14,0.42233670906275744,002652.SZ -2023-09-15,0.36194428582467825,000609.SZ -2023-09-15,0.37826489387378504,600355.SH -2023-09-18,0.40396831728362664,600355.SH -2023-09-18,0.5661708057521575,603389.SH -2023-09-19,0.461970420489531,600355.SH -2023-09-19,0.5240064916777292,603389.SH -2023-09-20,0.43501117605588313,002652.SZ -2023-09-20,0.4914974835477427,603389.SH -2023-09-21,0.456774699171377,600137.SH -2023-09-21,0.4790729071244043,603389.SH -2023-09-22,0.41474273137881446,600137.SH -2023-09-22,0.47900477087651633,603389.SH -2023-09-25,0.41688949737874204,603389.SH -2023-09-25,0.518247533389929,603286.SH -2023-09-26,0.5279869001216223,603286.SH -2023-09-26,0.5377802385122387,000622.SZ -2023-09-27,0.44494048605408676,603389.SH -2023-09-27,0.46046286085772276,002652.SZ -2023-09-28,0.4957785863203202,002848.SZ -2023-09-28,0.49885812418632514,002652.SZ -2023-10-09,0.47178555329467553,002652.SZ -2023-10-09,0.5263036111853828,002629.SZ -2023-10-10,0.46797099953661525,600083.SH -2023-10-10,0.4831733848485745,002652.SZ -2023-10-11,0.43573298238712244,600083.SH -2023-10-11,0.44735371559403475,603389.SH -2023-10-12,0.4399578403308182,600083.SH -2023-10-12,0.5048701662061897,002629.SZ -2023-10-13,0.4372433282177664,600083.SH -2023-10-13,0.4534091002105628,603286.SH -2023-10-16,0.43463476002959384,603286.SH -2023-10-16,0.5142059905932445,002652.SZ -2023-10-17,0.47323660411720925,002652.SZ -2023-10-17,0.5543913903395311,600493.SH -2023-10-18,0.44548075305614554,002652.SZ -2023-10-18,0.4911684566581345,600561.SH -2023-10-19,0.4639606933830024,002652.SZ -2023-10-19,0.4842811880995768,600083.SH -2023-10-20,0.4665024237119457,603729.SH -2023-10-20,0.4685140125314998,600083.SH -2023-10-23,0.5048077942577743,002652.SZ -2023-10-23,0.5143307400746697,603729.SH -2023-10-24,0.483695098275165,000691.SZ -2023-10-24,0.5413821518356626,603729.SH -2023-10-25,0.4843664431235271,002856.SZ -2023-10-25,0.4968609600939318,603729.SH -2023-10-26,0.48177645636286837,603389.SH -2023-10-26,0.5085138385316688,603729.SH -2023-10-27,0.4858108195555423,603389.SH -2023-10-27,0.5220179084799392,603729.SH -2023-10-30,0.49849144568767184,001211.SZ -2023-10-30,0.5401596272175021,603729.SH -2023-10-31,0.5020109889518393,603729.SH -2023-10-31,0.5565585450490748,600493.SH -2023-11-01,0.49060294135889676,603729.SH -2023-11-01,0.4925741866367385,002652.SZ -2023-11-02,0.5253631233148371,002652.SZ -2023-11-02,0.5264918248793256,001211.SZ -2023-11-03,0.4629920002821688,002652.SZ -2023-11-03,0.471933593944416,001211.SZ -2023-11-06,0.37503132754465845,002719.SZ -2023-11-06,0.42983508895076117,600493.SH -2023-11-07,0.39145316081948484,002652.SZ -2023-11-07,0.5600300713273196,600493.SH -2023-11-08,0.3805652264319053,002848.SZ -2023-11-08,0.4023880068168781,600561.SH -2023-11-09,0.41478240748388584,600561.SH -2023-11-09,0.4357041613701173,600493.SH -2023-11-10,0.4208921483313048,002848.SZ -2023-11-10,0.42601946392919454,600493.SH -2023-11-13,0.43443257284761577,603729.SH -2023-11-13,0.6101129041357813,002193.SZ -2023-11-14,0.43787133028879716,002193.SZ -2023-11-14,0.48964432246414014,002719.SZ -2023-11-15,0.3924687556519695,002193.SZ -2023-11-15,0.4327225348133687,603860.SH -2023-11-16,0.39683759277571073,600493.SH -2023-11-16,0.4328888685177573,002193.SZ -2023-11-17,0.46006244487135345,603729.SH -2023-11-17,0.5883830968126275,603860.SH -2023-11-20,0.4723054821955186,002856.SZ -2023-11-20,0.6258881569369192,600455.SH -2023-11-21,0.46612743199333473,600539.SH -2023-11-21,0.4682729218667257,002856.SZ -2023-11-22,0.458835077535624,603389.SH -2023-11-22,0.48051264608155997,600455.SH -2023-11-23,0.4238273350350992,600493.SH -2023-11-23,0.4646074445689886,603021.SH -2023-11-24,0.443923671689662,603021.SH -2023-11-24,0.446812697932895,603389.SH -2023-11-27,0.4160373142275392,603021.SH -2023-11-27,0.6091776177066897,002856.SZ -2023-11-28,0.441617765394031,603021.SH -2023-11-28,0.6082008186988751,002856.SZ -2023-11-29,0.47151051680065703,002830.SZ -2023-11-29,0.6127373986934872,002856.SZ -2023-11-30,0.40322165131243753,603021.SH -2023-11-30,0.43360197891193614,002058.SZ -2023-12-01,0.5298562022137442,002193.SZ -2023-12-01,0.5892123512375013,002856.SZ -2023-12-04,0.47084376753584506,002193.SZ -2023-12-04,0.5231651688003744,600493.SH -2023-12-05,0.4443644671186078,002193.SZ -2023-12-05,0.47735331849608953,600561.SH -2023-12-06,0.4839009031823865,600847.SH -2023-12-06,0.5546674659445703,600083.SH -2023-12-07,0.4334290463768298,603272.SH -2023-12-07,0.5708262079163896,600083.SH -2023-12-08,0.43835937891091525,600083.SH -2023-12-08,0.4397403078483133,600847.SH -2023-12-11,0.42917492128032536,002856.SZ -2023-12-11,0.49270875087515026,600561.SH -2023-12-12,0.47167421421855193,002883.SZ -2023-12-12,0.5022998874766298,600455.SH -2023-12-13,0.46430539058880793,002058.SZ -2023-12-13,0.5245181013231762,002856.SZ -2023-12-14,0.5272393087119033,002856.SZ -2023-12-14,0.5729905894646173,600561.SH -2023-12-15,0.44726574532314783,002883.SZ -2023-12-15,0.5162609286188806,002856.SZ -2023-12-18,0.5299678095969353,603813.SH -2023-12-18,0.5582443413879342,603389.SH -2023-12-19,0.45736510656796364,603813.SH -2023-12-19,0.48533167093156804,603389.SH -2023-12-20,0.4899595041119455,600083.SH -2023-12-20,0.49826825920593243,603813.SH -2023-12-21,0.46551869663758294,600561.SH -2023-12-21,0.4793466556065357,000929.SZ -2023-12-22,0.4920620705410867,002719.SZ -2023-12-22,0.5179425536035591,603709.SH -2023-12-25,0.4753804331800375,603709.SH -2023-12-25,0.4994958234953016,002591.SZ -2023-12-26,0.47326745720481694,002719.SZ -2023-12-26,0.507773396294008,603389.SH -2023-12-27,0.48311983738158776,600156.SH -2023-12-27,0.5457506449327214,603389.SH -2023-12-28,0.4957303884159298,600847.SH -2023-12-28,0.5500311729076457,603389.SH -2023-12-29,0.5308444874636237,603389.SH -2023-12-29,0.588965687049459,002633.SZ -2024-01-02,0.4716126968471984,000691.SZ -2024-01-02,0.5385664936531077,600768.SH -2024-01-03,0.4188798635823068,603389.SH -2024-01-03,0.45755456648287773,000691.SZ -2024-01-04,0.444436459560208,002778.SZ -2024-01-04,0.6415793075194715,000691.SZ -2024-01-05,0.46492150645204944,603389.SH -2024-01-05,0.578634808765654,000691.SZ -2024-01-08,0.4802209100234918,603389.SH -2024-01-08,0.5558298614520459,000691.SZ -2024-01-09,0.5098678214891852,603709.SH -2024-01-09,0.5368634419307761,000691.SZ -2024-01-10,0.5115468927297419,603709.SH -2024-01-10,0.5645289220259226,000691.SZ -2024-01-11,0.5360980665472341,000691.SZ -2024-01-11,0.6202530151499441,605081.SH -2024-01-12,0.5392963501632181,000691.SZ -2024-01-12,0.563025995610043,605081.SH -2024-01-15,0.53867772850151,603389.SH -2024-01-15,0.5428061177193358,605081.SH -2024-01-16,0.5389948226341168,605081.SH -2024-01-16,0.5501661778118805,603389.SH -2024-01-17,0.6017124542714841,603389.SH -2024-01-17,0.6051571111748923,605081.SH -2024-01-18,0.556926794813392,002629.SZ -2024-01-18,0.5740221586318376,605081.SH -2024-01-19,0.5375088436814978,603389.SH -2024-01-19,0.548812951712089,002719.SZ -2024-01-22,0.5650383166040991,603316.SH -2024-01-22,0.5844611463633029,002629.SZ -2024-01-23,0.5649312301418767,002856.SZ -2024-01-23,0.5885900023396923,002633.SZ -2024-01-24,0.5457710077969259,000691.SZ -2024-01-24,0.5489690465862636,002856.SZ -2024-01-25,0.522740337545792,002193.SZ -2024-01-25,0.5320872575040606,002629.SZ -2024-01-26,0.5375585408440442,002629.SZ -2024-01-26,0.554917952303145,603389.SH -2024-01-29,0.5162586800182588,603813.SH -2024-01-29,0.535614204708226,000691.SZ -2024-01-30,0.5417207189071137,000691.SZ -2024-01-30,0.5552329614847895,002633.SZ -2024-01-31,0.600102971518103,000691.SZ -2024-01-31,0.6310713509572046,002633.SZ -2024-02-01,0.5322928568836361,000691.SZ -2024-02-01,0.5370240371470036,603389.SH -2024-02-02,0.6068088349043048,002890.SZ -2024-02-02,0.6235269198356095,600778.SH -2024-02-05,0.543461132161742,600883.SH -2024-02-05,0.5851782173596515,002231.SZ -2024-02-06,0.536165286002158,000608.SZ -2024-02-06,0.5667349789089532,600355.SH -2024-02-07,0.5025142581711933,000632.SZ -2024-02-07,0.5538244550602496,600355.SH -2024-02-08,0.518249043515133,002856.SZ -2024-02-08,0.5201063964823015,002621.SZ -2024-02-19,0.47611786472538564,600539.SH -2024-02-19,0.47764140795475607,002211.SZ -2024-02-20,0.49230189148942166,600083.SH -2024-02-20,0.5086120229883566,002494.SZ -2024-02-21,0.4970943871146709,002856.SZ -2024-02-21,0.5387917955475975,603389.SH -2024-02-22,0.49184777084132936,600539.SH -2024-02-22,0.531884338293139,603389.SH -2024-02-23,0.5563305736676932,002633.SZ -2024-02-23,0.5585150407625614,002856.SZ -2024-02-26,0.5227694763127961,002633.SZ -2024-02-26,0.5308340080872641,002856.SZ -2024-02-27,0.5105060973492758,603389.SH -2024-02-27,0.5258733832129021,002856.SZ -2024-02-28,0.5078924585849767,600539.SH -2024-02-28,0.523178179177843,000691.SZ -2024-02-29,0.5004947253703326,600539.SH -2024-02-29,0.5015143308019092,002856.SZ -2024-03-01,0.4851722065808591,002193.SZ -2024-03-01,0.5305675676569799,002856.SZ -2024-03-04,0.5063639087649111,002193.SZ -2024-03-04,0.5377761539840873,002856.SZ -2024-03-05,0.5281367968824495,600539.SH -2024-03-05,0.5375091424017862,002856.SZ -2024-03-06,0.508866894609493,600847.SH -2024-03-06,0.5119286838273792,603316.SH -2024-03-07,0.4892539875731558,603021.SH -2024-03-07,0.5083582758459935,600234.SH -2024-03-08,0.520768338000592,603021.SH -2024-03-08,0.5278212138612421,002719.SZ -2024-03-11,0.4702094265266814,002652.SZ -2024-03-11,0.48663400249807476,600234.SH -2024-03-12,0.5219192863287991,002188.SZ -2024-03-12,0.5453393692331033,000929.SZ -2024-03-13,0.5059328904450502,600234.SH -2024-03-13,0.5645941473058825,600455.SH -2024-03-14,0.5293625451063441,603021.SH -2024-03-14,0.5360681436871625,600455.SH -2024-03-15,0.5633278670861533,605081.SH -2024-03-15,0.6086659232217287,000691.SZ -2024-03-18,0.5558571695597289,002652.SZ -2024-03-18,0.5831885476460588,603021.SH -2024-03-19,0.5441859669840967,002652.SZ -2024-03-19,0.5583201052732929,603021.SH -2024-03-20,0.5580747371482794,002856.SZ -2024-03-20,0.5703319886877287,002633.SZ -2024-03-21,0.5667230843409601,600847.SH -2024-03-21,0.5669176895379062,002652.SZ -2024-03-22,0.5364023030213002,002652.SZ -2024-03-22,0.537723899731015,600455.SH -2024-03-25,0.5100080245910709,002629.SZ -2024-03-25,0.5545370153882068,002247.SZ -2024-03-26,0.5406131493588243,603316.SH -2024-03-26,0.5460321607702638,002247.SZ -2024-03-27,0.5508975677120421,002652.SZ -2024-03-27,0.5674492855087464,000668.SZ -2024-03-28,0.5118403764607578,000622.SZ -2024-03-28,0.587592249064774,000691.SZ -2024-03-29,0.5277723092867765,002652.SZ -2024-03-29,0.5624297622360632,000691.SZ -2024-04-01,0.5202212897095367,605081.SH -2024-04-01,0.6241744501358746,000622.SZ -2024-04-02,0.5464378613887018,002188.SZ -2024-04-02,0.598787486862349,000691.SZ -2024-04-03,0.5576997372799609,600768.SH -2024-04-03,0.5577569425096746,002652.SZ -2024-04-08,0.5474095856038419,002856.SZ -2024-04-08,0.5662526821846976,600539.SH -2024-04-09,0.5336151985030706,600539.SH -2024-04-09,0.5377877374150458,000691.SZ -2024-04-10,0.5730779821538243,600539.SH -2024-04-10,0.5895641405027385,002856.SZ -2024-04-11,0.529408079849592,600847.SH -2024-04-11,0.5643634012296147,600539.SH -2024-04-12,0.5473177363564403,002652.SZ -2024-04-12,0.6032088497429159,600234.SH -2024-04-15,0.5954261964488585,002856.SZ -2024-04-15,0.6212974453683562,600539.SH -2024-04-16,0.49355317377552294,000809.SZ -2024-04-16,0.49523929502187963,002193.SZ -2024-04-17,0.5888791979382331,002633.SZ -2024-04-17,0.6078434602637058,002856.SZ -2024-04-18,0.5918529581980252,002193.SZ -2024-04-18,0.6019199706809306,002856.SZ -2024-04-19,0.5974350462877165,002856.SZ -2024-04-19,0.6261772435393442,002193.SZ -2024-04-22,0.47512243978627344,002193.SZ -2024-04-22,0.47516930046289274,002856.SZ -2024-04-23,0.6009731947064981,002856.SZ -2024-04-23,0.6496304038249922,002193.SZ -2024-04-24,0.586366187552793,002193.SZ -2024-04-24,0.6082639042211726,002856.SZ -2024-04-25,0.5712821980956124,002856.SZ -2024-04-25,0.6598650532162132,002193.SZ -2024-04-26,0.5443614155308989,002633.SZ -2024-04-26,0.5617901694637116,002856.SZ -2024-04-29,0.5265371385921828,002856.SZ -2024-04-29,0.5548104181999941,002193.SZ -2024-04-30,0.5208172992054894,002856.SZ -2024-04-30,0.5830000016208252,002193.SZ -2024-05-06,0.5355775937723427,002633.SZ -2024-05-06,0.5968930017528501,002193.SZ -2024-05-07,0.5485203878149175,002856.SZ -2024-05-07,0.5516102051445807,002193.SZ -2024-05-08,0.5098599986837974,002193.SZ -2024-05-08,0.5119675231832482,002247.SZ -2024-05-09,0.5101019861510814,002633.SZ -2024-05-09,0.5739365646583732,600847.SH -2024-05-10,0.4966923679261847,603021.SH -2024-05-10,0.49677343145898717,002193.SZ -2024-05-13,0.5180014522950213,002193.SZ -2024-05-13,0.5182219531554857,002856.SZ -2024-05-14,0.5225205022552722,002193.SZ -2024-05-14,0.5278845687368762,600539.SH -2024-05-15,0.4939507921878348,600539.SH -2024-05-15,0.5126034294877005,002193.SZ -2024-05-16,0.5537451463699943,600847.SH -2024-05-16,0.5847677944589917,002856.SZ -2024-05-17,0.5466996667763234,002856.SZ -2024-05-17,0.5540369416775613,000668.SZ -2024-05-20,0.5174518418008277,002193.SZ -2024-05-20,0.5282038806142408,002856.SZ -2024-05-21,0.5231136409897259,002193.SZ -2024-05-21,0.5310809590535567,002856.SZ -2024-05-22,0.5365022347307938,002856.SZ -2024-05-22,0.5461316154600443,002193.SZ -2024-05-23,0.5612165924593806,002856.SZ -2024-05-23,0.5698546344353884,600539.SH -2024-05-24,0.527499799696182,002629.SZ -2024-05-24,0.5507040546785352,002856.SZ -2024-05-27,0.5639901169759187,600539.SH -2024-05-27,0.5916311577833195,600321.SH -2024-05-28,0.5118309859358575,002629.SZ -2024-05-28,0.5209160569297022,600321.SH -2024-05-29,0.5420574887251733,600321.SH -2024-05-29,0.5488498996501723,002629.SZ -2024-05-30,0.5362981806829276,600321.SH -2024-05-30,0.5521708001461101,002629.SZ -2024-05-31,0.4956027878598296,600539.SH -2024-05-31,0.5569288642181919,002629.SZ -2024-06-03,0.523306628345906,600539.SH -2024-06-03,0.5680012023669292,002629.SZ -2024-06-04,0.5547449512053687,600539.SH -2024-06-04,0.6211211749892137,002629.SZ -2024-06-05,0.5952522999725453,002193.SZ -2024-06-05,0.6358580626278169,002629.SZ -2024-06-06,0.4904269357119238,002633.SZ -2024-06-06,0.5068013231327483,002629.SZ -2024-06-07,0.4802387586463284,002193.SZ -2024-06-07,0.5187644224049984,002629.SZ -2024-06-11,0.45969026766603077,002193.SZ -2024-06-11,0.4929138517945066,002629.SZ -2024-06-12,0.5457671417877488,002193.SZ -2024-06-12,0.6394531391098803,002629.SZ -2024-06-13,0.45327595021191597,603021.SH -2024-06-13,0.47849428974699193,002629.SZ -2024-06-14,0.45049320006248944,002629.SZ -2024-06-14,0.4524386799826225,000679.SZ -2024-06-17,0.4277718447771621,603021.SH -2024-06-17,0.4410412466865587,002629.SZ -2024-06-18,0.5227822011291517,603021.SH -2024-06-18,0.5837142018005371,002629.SZ -2024-06-19,0.43624925479721766,000982.SZ -2024-06-19,0.4593182886847125,002629.SZ -2024-06-20,0.43108014553084173,603021.SH -2024-06-20,0.4387557586566808,002629.SZ -2024-06-21,0.43427708073899945,000982.SZ -2024-06-21,0.49835811793477,002629.SZ -2024-06-24,0.5094251037340226,002629.SZ -2024-06-24,0.5185537234896287,603021.SH -2024-06-25,0.5094721241873643,603021.SH -2024-06-25,0.5413747395772202,002629.SZ -2024-06-26,0.5173684983212611,603021.SH -2024-06-26,0.5323970242289838,002629.SZ -2024-06-27,0.47158548449625903,603021.SH -2024-06-27,0.4847735947561616,002629.SZ -2024-06-28,0.478589519455732,000679.SZ -2024-06-28,0.4894122238616306,002629.SZ -2024-07-01,0.4763820255328559,002629.SZ -2024-07-01,0.4850420387126388,000679.SZ -2024-07-02,0.47116471013912137,002629.SZ -2024-07-02,0.47168414052649826,000679.SZ -2024-07-03,0.5363769208777169,002629.SZ -2024-07-03,0.578714499284351,600539.SH -2024-07-04,0.4771665371691081,000890.SZ -2024-07-04,0.49333840270245666,002629.SZ -2024-07-05,0.5011133474930776,002622.SZ -2024-07-05,0.5533325022121648,002629.SZ -2024-07-08,0.4838988115349704,002622.SZ -2024-07-08,0.5207821315849569,002629.SZ -2024-07-09,0.4952245017256642,603021.SH -2024-07-09,0.5167683052597815,002629.SZ -2024-07-10,0.48704722603580564,603021.SH -2024-07-10,0.51333502358458,002629.SZ -2024-07-11,0.4957293795729458,603021.SH -2024-07-11,0.5241424770565968,002629.SZ -2024-07-12,0.46196423002335096,002629.SZ -2024-07-12,0.46500950872556657,002193.SZ -2024-07-15,0.4600445209687199,603021.SH -2024-07-15,0.48660182100033245,002629.SZ -2024-07-16,0.4861380095880161,002193.SZ -2024-07-16,0.4945659738364069,002629.SZ -2024-07-17,0.4833632524937079,002713.SZ -2024-07-17,0.49523569563150516,002629.SZ -2024-07-18,0.4949019524606191,002629.SZ -2024-07-18,0.49651823331053907,002713.SZ -2024-07-19,0.4611522645742196,002629.SZ -2024-07-19,0.47680215576895246,002713.SZ -2024-07-22,0.4139284256504252,002629.SZ -2024-07-22,0.5433451839446516,002193.SZ -2024-07-23,0.42760616031477533,002193.SZ -2024-07-23,0.49701022977566844,002629.SZ -2024-07-24,0.48211710170534,002629.SZ -2024-07-24,0.48279999256285056,002713.SZ -2024-07-25,0.45559866523032083,002193.SZ -2024-07-25,0.4732637387166546,002713.SZ -2024-07-26,0.4755973910350186,002193.SZ -2024-07-26,0.48524813127490596,002713.SZ -2024-07-29,0.4991602834087739,002713.SZ -2024-07-29,0.5112969335944911,000608.SZ -2024-07-30,0.4304299118076381,002622.SZ -2024-07-30,0.6119022700142297,002629.SZ -2024-07-31,0.48710649095299585,002193.SZ -2024-07-31,0.48739583407947856,002629.SZ -2024-08-01,0.4853649667674052,603021.SH -2024-08-01,0.5402909570383135,002629.SZ -2024-08-02,0.5714664916518158,002633.SZ -2024-08-02,0.6074729046090376,002193.SZ -2024-08-05,0.5401274264531633,002193.SZ -2024-08-05,0.6422104254694095,002629.SZ -2024-08-06,0.5523631781606299,002633.SZ -2024-08-06,0.6065168664757029,002193.SZ -2024-08-07,0.5270574949769135,002620.SZ -2024-08-07,0.5680614434503507,600455.SH -2024-08-08,0.5158821315120603,600768.SH -2024-08-08,0.539279353900595,002629.SZ -2024-08-09,0.5735447459442765,000890.SZ -2024-08-09,0.5839521741403281,002633.SZ -2024-08-12,0.4334210191400187,603316.SH -2024-08-12,0.5161186240062761,000608.SZ -2024-08-13,0.4900715130105902,600768.SH -2024-08-13,0.5817189629935925,002629.SZ -2024-08-14,0.4492059059452955,600768.SH -2024-08-14,0.5270743261293696,002629.SZ -2024-08-15,0.47287852262540075,002193.SZ -2024-08-15,0.553876557229398,002629.SZ -2024-08-16,0.4565968442412595,002713.SZ -2024-08-16,0.4920748904710057,002629.SZ -2024-08-19,0.4759391770586973,002629.SZ -2024-08-19,0.5404000451215579,000608.SZ -2024-08-20,0.43258797680876504,002633.SZ -2024-08-20,0.4433818651368298,002629.SZ -2024-08-21,0.4129989145932912,000890.SZ -2024-08-21,0.49025882680744026,000608.SZ -2024-08-22,0.4910466353385468,000608.SZ -2024-08-22,0.5169339607770022,002193.SZ -2024-08-23,0.43172470019453757,002713.SZ -2024-08-23,0.5194581131133598,000608.SZ -2024-08-26,0.4614509212330428,002633.SZ -2024-08-26,0.4735418664254023,002629.SZ -2024-08-27,0.5131987542600938,603021.SH -2024-08-27,0.5550830005332598,000608.SZ -2024-08-28,0.43904655612156124,002629.SZ -2024-08-28,0.4396870024855032,603021.SH -2024-08-29,0.4073491419575398,002629.SZ -2024-08-29,0.47418308087010214,000608.SZ -2024-08-30,0.5182642458094211,000679.SZ -2024-08-30,0.5538807216449092,000608.SZ -2024-09-02,0.47792838107453467,000638.SZ -2024-09-02,0.49756700933766684,000608.SZ -2024-09-03,0.471180707887278,000608.SZ -2024-09-03,0.49530947728252556,002622.SZ -2024-09-04,0.40782431058075547,002193.SZ -2024-09-04,0.4937551847727473,000608.SZ -2024-09-05,0.46475344997450985,002193.SZ -2024-09-05,0.47091414443329443,000608.SZ -2024-09-06,0.425101922385006,000608.SZ -2024-09-06,0.4576568027077908,000679.SZ -2024-09-09,0.4421776372300118,002629.SZ -2024-09-09,0.45364367772827874,000608.SZ -2024-09-10,0.46599196780807445,002629.SZ -2024-09-10,0.5358486831873519,600539.SH -2024-09-11,0.39120612290815415,603021.SH -2024-09-11,0.5592849907663509,000668.SZ -2024-09-12,0.43543470631767056,000668.SZ -2024-09-12,0.46910268927240767,002629.SZ -2024-09-13,0.4439194296738088,002629.SZ -2024-09-13,0.45140544883645595,600193.SH -2024-09-18,0.4346845341856611,002629.SZ -2024-09-18,0.43558473854398727,002816.SZ -2024-09-19,0.473337135911478,600193.SH -2024-09-19,0.6219759588549268,002856.SZ -2024-09-20,0.43758099450931437,002856.SZ -2024-09-20,0.4950328717984523,600193.SH -2024-09-23,0.45153595175314687,600193.SH -2024-09-23,0.5371075001149358,002856.SZ -2024-09-24,0.5333386747072845,002193.SZ -2024-09-24,0.5508733946113304,000679.SZ -2024-09-25,0.5177589338838003,000679.SZ -2024-09-25,0.5315387255509956,002193.SZ -2024-09-26,0.5812196331015667,603316.SH -2024-09-26,0.6044265078128153,002856.SZ -2024-09-27,0.5550883710958542,603021.SH -2024-09-27,0.5802835943981313,002629.SZ -2024-09-30,0.5604279468058333,603880.SH -2024-09-30,0.5615381106317379,603955.SH -2024-10-08,0.5556539212149241,603880.SH -2024-10-08,0.5572475019630666,600455.SH -2024-10-09,0.5414047512607851,002856.SZ -2024-10-09,0.5473388803039944,603880.SH -2024-10-10,0.5406486912966556,600539.SH -2024-10-10,0.5414460867578,002629.SZ -2024-10-11,0.5135303573756509,002620.SZ -2024-10-11,0.5230411790354794,002629.SZ -2024-10-14,0.5251509444092186,002620.SZ -2024-10-14,0.5400553876024697,603880.SH -2024-10-15,0.5343812211047725,002620.SZ -2024-10-15,0.5394153141951775,600539.SH -2024-10-16,0.5824592022368733,002620.SZ -2024-10-16,0.6229410167442195,600455.SH -2024-10-17,0.5303878236085985,002856.SZ -2024-10-17,0.5312496423248194,002620.SZ -2024-10-18,0.5320098886543024,002620.SZ -2024-10-18,0.5938109654683429,603021.SH -2024-10-21,0.5179193544996472,002620.SZ -2024-10-21,0.5279876432827139,600539.SH -2024-10-22,0.5118164847662943,002620.SZ -2024-10-22,0.514107974041647,603880.SH -2024-10-23,0.521644988239213,002856.SZ -2024-10-23,0.5754720793563672,002629.SZ -2024-10-24,0.5292793601807857,600539.SH -2024-10-24,0.5438478789943405,002629.SZ -2024-10-25,0.5594491363468824,600539.SH -2024-10-25,0.5628030064961427,001211.SZ -2024-10-28,0.5497554729726547,603729.SH -2024-10-28,0.550378688060216,002494.SZ -2024-10-29,0.5123025795526183,603272.SH -2024-10-29,0.5179867780852563,002719.SZ -2024-10-30,0.5116293575967736,600539.SH -2024-10-30,0.5142835526889888,605303.SH -2024-10-31,0.5193751453505457,002856.SZ -2024-10-31,0.5606057225359103,002620.SZ -2024-11-01,0.4965356585507009,603880.SH -2024-11-01,0.5062651935736007,600539.SH -2024-11-04,0.49165501384664057,603880.SH -2024-11-04,0.5013713766486165,002629.SZ -2024-11-05,0.505863843501169,603272.SH -2024-11-05,0.5409675266515755,002629.SZ -2024-11-06,0.5166338195505714,002620.SZ -2024-11-06,0.5245566761012221,603272.SH -2024-11-07,0.5297025183386359,002629.SZ -2024-11-07,0.5418761591036972,002620.SZ -2024-11-08,0.5115302355278277,002629.SZ -2024-11-08,0.5239258160919383,603272.SH -2024-11-11,0.5121154883384261,002620.SZ -2024-11-11,0.512637328365029,603272.SH -2024-11-12,0.5245122394054748,603272.SH -2024-11-12,0.5509707428631784,002494.SZ -2024-11-13,0.5420322205451799,603272.SH -2024-11-13,0.5477911577800111,002629.SZ -2024-11-14,0.5112202221250431,002188.SZ -2024-11-14,0.5244604891397023,002193.SZ -2024-11-15,0.5140204568255583,002193.SZ -2024-11-15,0.5175494372286917,603316.SH -2024-11-18,0.5171613827279683,002188.SZ -2024-11-18,0.5283541854276267,002193.SZ -2024-11-19,0.4926377754767687,603272.SH -2024-11-19,0.503695035565781,002193.SZ -2024-11-20,0.4968363322354983,600561.SH -2024-11-20,0.5001118041722759,002848.SZ -2024-11-21,0.5091908273343746,600539.SH -2024-11-21,0.5120929031035745,603729.SH -2024-11-22,0.5160483769731012,603880.SH -2024-11-22,0.5465767642188517,002798.SZ -2024-11-25,0.5442096551938743,600193.SH -2024-11-25,0.5539559882665904,603272.SH -2024-11-26,0.5304163103769999,603272.SH -2024-11-26,0.5326254895854508,600539.SH -2024-11-27,0.5334352402911791,002494.SZ -2024-11-27,0.5754995991801888,001211.SZ -2024-11-28,0.5490195987865677,001211.SZ -2024-11-28,0.5577485611101966,603272.SH -2024-11-29,0.5419835057398561,001211.SZ -2024-11-29,0.5599598663946254,002193.SZ -2024-12-02,0.5583210752110036,603272.SH -2024-12-02,0.5691690208521779,603880.SH -2024-12-03,0.519139584528328,000890.SZ -2024-12-03,0.5246108235077802,603272.SH -2024-12-04,0.5142195365985924,603316.SH -2024-12-04,0.5809882685521347,002629.SZ -2024-12-05,0.4811902831656211,002188.SZ -2024-12-05,0.4917642058755787,002620.SZ -2024-12-06,0.5279287794306781,002620.SZ -2024-12-06,0.5372428693309116,002629.SZ -2024-12-09,0.5043942165123921,002188.SZ -2024-12-09,0.5158339915477027,002620.SZ -2024-12-10,0.4972591585446785,002620.SZ -2024-12-10,0.5328337785523358,603880.SH -2024-12-11,0.5212111009376401,002620.SZ -2024-12-11,0.5660034362439921,603880.SH -2024-12-12,0.5475393479405306,603813.SH -2024-12-12,0.6139259840382347,603880.SH -2024-12-13,0.5335287832854363,605303.SH -2024-12-13,0.5658234764690181,002620.SZ -2024-12-16,0.5419894320937376,603709.SH -2024-12-16,0.5636038404271005,002856.SZ -2024-12-17,0.471242884310032,605081.SH -2024-12-17,0.4856219437877366,603880.SH -2024-12-18,0.49476845186623847,002856.SZ -2024-12-18,0.5062358169120582,600768.SH -2024-12-19,0.45358142531761875,002856.SZ -2024-12-19,0.4844691234853314,002620.SZ -2024-12-20,0.4948432094561801,002620.SZ -2024-12-20,0.6388463420228228,002856.SZ -2024-12-23,0.5017911547118549,603813.SH -2024-12-23,0.527165384802317,605081.SH -2024-12-24,0.4984523536849863,000668.SZ -2024-12-24,0.5169764222148188,605081.SH -2024-12-25,0.49997138592110274,000668.SZ -2024-12-25,0.5028376679972295,000691.SZ -2024-12-26,0.5052443464422329,000668.SZ -2024-12-26,0.5250830388024871,000691.SZ -2024-12-27,0.46493565731963266,603709.SH -2024-12-27,0.49778785137969156,605081.SH -2024-12-30,0.4757070523637699,605081.SH -2024-12-30,0.5087563402467068,000668.SZ -2024-12-31,0.47473763402373187,000691.SZ -2024-12-31,0.49383834309143254,002848.SZ -2025-01-02,0.494212679935717,000691.SZ -2025-01-02,0.5117775362575804,000668.SZ -2025-01-03,0.5158509716824912,000668.SZ -2025-01-03,0.5509866145013926,000691.SZ -2025-01-06,0.5311299381271796,000668.SZ -2025-01-06,0.562567550094817,000691.SZ -2025-01-07,0.4718833922755129,000668.SZ -2025-01-07,0.531822470207934,000691.SZ -2025-01-08,0.4848178241066843,000668.SZ -2025-01-08,0.5380692949375655,000691.SZ -2025-01-09,0.485461093377531,000668.SZ -2025-01-09,0.5178570540251147,000691.SZ -2025-01-10,0.5480453032779994,002848.SZ -2025-01-10,0.5716316413442833,000691.SZ -2025-01-13,0.5344527970349647,000691.SZ -2025-01-13,0.5735045749045391,002848.SZ -2025-01-14,0.5277379475948669,000691.SZ -2025-01-14,0.5630369833110043,000890.SZ -2025-01-15,0.5002010479106934,600421.SH -2025-01-15,0.5454632004422018,000890.SZ -2025-01-16,0.5110686410486213,600421.SH -2025-01-16,0.5385442663067544,000890.SZ -2025-01-17,0.49148663999998904,002848.SZ -2025-01-17,0.5365266094055063,600421.SH -2025-01-20,0.4983457583698393,603316.SH -2025-01-20,0.5160402874971325,002848.SZ -2025-01-21,0.5059332793278501,600421.SH -2025-01-21,0.5179344979474739,002848.SZ -2025-01-22,0.528908504220629,002620.SZ -2025-01-22,0.5337987745298991,600421.SH -2025-01-23,0.48889712789906326,002856.SZ -2025-01-23,0.530017469097685,600421.SH -2025-01-24,0.4900610326086425,002789.SZ -2025-01-24,0.49418311844580703,600421.SH -2025-01-27,0.5200912901022433,002848.SZ -2025-01-27,0.5254034638832071,605081.SH -2025-02-05,0.49270036360000863,605081.SH -2025-02-05,0.5090511266169605,002848.SZ -2025-02-06,0.4892223234495616,600753.SH -2025-02-06,0.5059868428119864,600421.SH -2025-02-07,0.4734128017520148,603021.SH -2025-02-07,0.5030150224259599,600421.SH -2025-02-10,0.5229676013272563,600421.SH -2025-02-10,0.528707126870701,603021.SH -2025-02-11,0.4989128491565126,600421.SH -2025-02-11,0.5166826856142659,603021.SH -2025-02-12,0.5246816847500646,603021.SH -2025-02-12,0.535176425586156,603880.SH -2025-02-13,0.46255794939133466,002856.SZ -2025-02-13,0.5075079599720626,002719.SZ -2025-02-14,0.4657095747726058,002856.SZ -2025-02-14,0.5126343330152118,002719.SZ -2025-02-17,0.5101362921071338,603021.SH -2025-02-17,0.6086582953175024,600421.SH -2025-02-18,0.4998561900792183,002848.SZ -2025-02-18,0.5445772259759384,002719.SZ -2025-02-19,0.49783042968209745,002856.SZ -2025-02-19,0.5432135602150102,603813.SH -2025-02-20,0.45998669846677487,002789.SZ -2025-02-20,0.5842810326778065,603813.SH -2025-02-21,0.46197196680555047,002789.SZ -2025-02-21,0.47573048264913165,002856.SZ -2025-02-24,0.481126691514834,002719.SZ -2025-02-24,0.5186504354987588,002856.SZ -2025-02-25,0.48230800094633697,002789.SZ -2025-02-25,0.4833298855853261,002848.SZ -2025-02-26,0.47440111482024516,002789.SZ -2025-02-26,0.49160740334224556,603021.SH -2025-02-27,0.47679182041862955,002789.SZ -2025-02-27,0.5294453353840147,603021.SH -2025-02-28,0.5001164038609647,002789.SZ -2025-02-28,0.5055035375601594,600243.SH -2025-03-03,0.43079193477981964,002789.SZ -2025-03-03,0.4572369622830483,002848.SZ -2025-03-04,0.410137341533731,002848.SZ -2025-03-04,0.44511984403799215,002620.SZ -2025-03-05,0.4049521311094684,600243.SH -2025-03-05,0.4757798387538036,002789.SZ -2025-03-06,0.40409485478569257,600753.SH -2025-03-06,0.4273570188281869,002789.SZ -2025-03-07,0.39458395404696234,600753.SH -2025-03-07,0.4068219781610727,002789.SZ -2025-03-10,0.4692160421828783,000668.SZ -2025-03-10,0.5605629554553234,605081.SH -2025-03-11,0.44617340208162326,002620.SZ -2025-03-11,0.5381527675833004,000929.SZ -2025-03-12,0.417965831513051,002789.SZ -2025-03-12,0.43606483342686103,000929.SZ -2025-03-13,0.40228972797285767,002789.SZ -2025-03-13,0.4680389993190967,002620.SZ -2025-03-14,0.4079744683306118,000929.SZ -2025-03-14,0.5950661425476799,002719.SZ -2025-03-17,0.4374383889746739,605081.SH -2025-03-17,0.6262553785915511,002789.SZ -2025-03-18,0.4861508270240735,002719.SZ -2025-03-18,0.5770976694774831,002789.SZ -2025-03-19,0.5664996446697315,600243.SH -2025-03-19,0.6008183805856895,002789.SZ -2025-03-20,0.44923622180342965,002620.SZ -2025-03-20,0.5376937421705834,002789.SZ -2025-03-21,0.4417122785941335,002207.SZ -2025-03-21,0.44347378109799807,002620.SZ -2025-03-24,0.4006189856135425,002848.SZ -2025-03-24,0.40170593072949506,002856.SZ -2025-03-25,0.4045223701236651,002848.SZ -2025-03-25,0.47311100858865607,605081.SH -2025-03-26,0.4086847456389167,000691.SZ -2025-03-26,0.5056455810011589,002856.SZ -2025-03-27,0.3758006367387984,000691.SZ -2025-03-27,0.3810802056546629,600753.SH -2025-03-28,0.3585967162116407,002848.SZ -2025-03-28,0.35978201886334427,605081.SH -2025-03-31,0.33933271253443686,000691.SZ -2025-03-31,0.4076547794419167,002848.SZ -2025-04-01,0.3428007168163387,000691.SZ -2025-04-01,0.36202113910748157,002848.SZ -2025-04-02,0.3367882114691813,600193.SH -2025-04-02,0.36969648481546946,002848.SZ -2025-04-03,0.531751616027359,002058.SZ -2025-04-03,0.5990070241400174,002800.SZ -2025-04-07,0.3866954376948542,000668.SZ -2025-04-07,0.4117655015417475,002848.SZ -2025-04-08,0.4998048590396879,002848.SZ -2025-04-08,0.5025814070890804,000691.SZ -2025-04-09,0.4845655820455639,000691.SZ -2025-04-09,0.4953377946291949,000668.SZ -2025-04-10,0.42013545341642694,000668.SZ -2025-04-10,0.421587985348137,000691.SZ -2025-04-11,0.44759669880412734,000691.SZ -2025-04-11,0.4548591374334355,002848.SZ -2025-04-14,0.4260254905735645,002848.SZ -2025-04-14,0.4460402286315155,000668.SZ -2025-04-15,0.4216174310537979,000691.SZ -2025-04-15,0.4669054355595649,002848.SZ -2025-04-16,0.44847462308133784,002848.SZ -2025-04-16,0.5510990520956223,000668.SZ -2025-04-17,0.4887767482438633,002848.SZ -2025-04-17,0.5539871384919275,000668.SZ -2025-04-18,0.4614565479964634,002848.SZ -2025-04-18,0.5046607788481158,000668.SZ -2025-04-21,0.41395727692894047,000691.SZ -2025-04-21,0.43041511885705774,002848.SZ -2025-04-22,0.4283117198433198,002848.SZ -2025-04-22,0.5548864622620038,000691.SZ -2025-04-23,0.41788012001896724,002848.SZ -2025-04-23,0.4248425407760571,000691.SZ -2025-04-24,0.39465669235891115,000691.SZ -2025-04-24,0.42118063287282664,002848.SZ -2025-04-25,0.3919790094855263,600421.SH -2025-04-25,0.4409270482320473,000691.SZ -2025-04-28,0.4096105140064638,002620.SZ -2025-04-28,0.580120817869272,000691.SZ -2025-04-29,0.40372539496293863,600107.SH -2025-04-29,0.5850471711627188,002856.SZ -2025-04-30,0.5011128868320309,002856.SZ -2025-04-30,0.5114317761308451,600768.SH -2025-05-06,0.534777792845743,002856.SZ -2025-05-06,0.5546608230458895,600768.SH -2025-05-07,0.4831199500984134,600768.SH -2025-05-07,0.578194034636967,002856.SZ -2025-05-08,0.5069760070023791,600768.SH -2025-05-08,0.5450922783361325,002856.SZ -2025-05-09,0.5361008486240122,002856.SZ -2025-05-09,0.5378808529624807,603616.SH +2023-01-03,10.788430821182187,603682.SH +2023-01-03,10.891678233139501,001283.SZ +2023-01-04,10.83772700804698,603838.SH +2023-01-04,10.860585048434013,603272.SH +2023-01-05,10.934403352835334,605162.SH +2023-01-05,10.93956098120105,603551.SH +2023-01-06,10.825430046179418,001211.SZ +2023-01-06,10.902917947452966,002718.SZ +2023-01-09,10.984696035113915,603950.SH +2023-01-09,11.04080362065344,603729.SH +2023-01-10,11.146138872132932,603729.SH +2023-01-10,11.159449658186404,002718.SZ +2023-01-11,11.080587195438184,001211.SZ +2023-01-11,11.11175543527529,605158.SH +2023-01-12,11.039105723239272,002921.SZ +2023-01-12,11.073331693571971,603038.SH +2023-01-13,10.98120922131589,603729.SH +2023-01-13,11.006513456316501,002921.SZ +2023-01-16,10.706422864654956,603037.SH +2023-01-16,10.72232806653068,603950.SH +2023-01-17,10.879480197311779,605155.SH +2023-01-17,10.889691792480168,605158.SH +2023-01-18,10.857162447847063,001319.SZ +2023-01-18,10.87701952713728,002631.SZ +2023-01-19,11.148208285649941,605158.SH +2023-01-19,11.164729546934527,002842.SZ +2023-01-20,11.740973313284291,601616.SH +2023-01-20,11.879795907716211,000908.SZ +2023-01-30,11.775136364675129,600558.SH +2023-01-30,11.784317554732903,002983.SZ +2023-01-31,11.31796756611631,600218.SH +2023-01-31,11.359761039950923,603618.SH +2023-02-01,10.562649695615413,603012.SH +2023-02-01,10.591138885132974,002743.SZ +2023-02-02,10.64936830115362,002676.SZ +2023-02-02,10.699759059381545,002418.SZ +2023-02-03,10.545328442229112,000558.SZ +2023-02-03,10.555139724451728,002418.SZ +2023-02-06,10.897123391491398,600626.SH +2023-02-06,10.903167589079452,600722.SH +2023-02-07,10.93062034724658,002040.SZ +2023-02-07,10.940229963460133,002282.SZ +2023-02-08,11.05980720051982,000777.SZ +2023-02-08,11.117118394443624,002105.SZ +2023-02-09,10.695351762204162,600822.SH +2023-02-09,10.710535781302886,600292.SH +2023-02-10,10.892879256001763,002040.SZ +2023-02-10,10.898948873998187,002448.SZ +2023-02-13,10.850751763671939,600076.SH +2023-02-13,10.858343346875973,002448.SZ +2023-02-14,10.991156442640772,002165.SZ +2023-02-14,11.062765536069499,600530.SH +2023-02-15,10.895267366539816,002165.SZ +2023-02-15,10.970454025739363,600530.SH +2023-02-16,10.557985613866267,600889.SH +2023-02-16,10.644222838153393,600076.SH +2023-02-17,10.228172286866448,603889.SH +2023-02-17,10.2374173838653,000677.SZ +2023-02-20,10.197777894425716,002652.SZ +2023-02-20,10.282780272732554,002671.SZ +2023-02-21,10.27194349845233,600889.SH +2023-02-21,10.337322401948777,603725.SH +2023-02-22,10.643285389541777,000545.SZ +2023-02-22,10.716495015179412,600844.SH +2023-02-23,10.815824254661784,600678.SH +2023-02-23,10.8714841868254,002521.SZ +2023-02-24,10.5852905708198,002521.SZ +2023-02-24,10.655006874548445,000890.SZ +2023-02-27,10.868420555670857,002671.SZ +2023-02-27,10.8690899849723,002521.SZ +2023-02-28,10.760309855897198,000757.SZ +2023-02-28,10.874091420858747,002521.SZ +2023-03-01,10.831138788421661,002627.SZ +2023-03-01,10.851991822089843,603615.SH +2023-03-02,10.969252772396295,603389.SH +2023-03-02,10.992182576463742,601996.SH +2023-03-03,11.06364139101252,601996.SH +2023-03-03,11.067920825575433,603898.SH +2023-03-06,10.753277037050951,002743.SZ +2023-03-06,10.767113333030979,601188.SH +2023-03-07,10.007917140143313,002443.SZ +2023-03-07,10.01004842600086,603600.SH +2023-03-08,10.440348641382858,603608.SH +2023-03-08,10.47435722672067,600829.SH +2023-03-09,10.411598449445119,000548.SZ +2023-03-09,10.439822965626318,002521.SZ +2023-03-10,10.758990106647358,600802.SH +2023-03-10,10.927909989925967,600593.SH +2023-03-13,10.21090998407788,603758.SH +2023-03-13,10.21388956684075,600512.SH +2023-03-14,10.695861192674236,002652.SZ +2023-03-14,10.709045199093293,002247.SZ +2023-03-15,10.091979937834688,603717.SH +2023-03-15,10.162576356911146,603239.SH +2023-03-16,10.961629937942293,605336.SH +2023-03-16,11.065380015335954,603030.SH +2023-03-17,10.580309552059262,603183.SH +2023-03-17,10.651568114725588,603637.SH +2023-03-20,10.787665124862311,001299.SZ +2023-03-20,10.838278117922515,603717.SH +2023-03-21,10.505083433604831,603316.SH +2023-03-21,10.71466864736691,002775.SZ +2023-03-22,11.012431915415299,600368.SH +2023-03-22,11.185361201617322,603685.SH +2023-03-23,10.924561328371961,603999.SH +2023-03-23,10.969097215462206,002775.SZ +2023-03-24,10.979894773304078,600368.SH +2023-03-24,10.98986090297771,002775.SZ +2023-03-27,10.95072518018769,002295.SZ +2023-03-27,11.126265503296318,000509.SZ +2023-03-28,11.097704035087546,603637.SH +2023-03-28,11.133746386486237,002199.SZ +2023-03-29,10.81021806709067,600543.SH +2023-03-29,10.912160990647347,600355.SH +2023-03-30,11.105125010144338,600088.SH +2023-03-30,11.14467880139616,603626.SH +2023-03-31,10.943266419073089,603320.SH +2023-03-31,10.957785324534331,603095.SH +2023-04-03,10.711413542169428,000530.SZ +2023-04-03,10.741909098367811,600593.SH +2023-04-04,10.910840892483158,603015.SH +2023-04-04,10.94954985135128,600898.SH +2023-04-06,10.880971569783016,600355.SH +2023-04-06,10.980494742538637,600689.SH +2023-04-07,11.080467738997479,603836.SH +2023-04-07,11.227187806154209,600689.SH +2023-04-10,11.212222768092223,600692.SH +2023-04-10,11.278676695737852,603626.SH +2023-04-11,11.329132380401568,600692.SH +2023-04-11,11.354084928315075,603626.SH +2023-04-12,11.562935167381557,600692.SH +2023-04-12,11.601747808594656,600676.SH +2023-04-13,11.268578785951036,600067.SH +2023-04-13,11.358778519084412,000788.SZ +2023-04-14,11.622594283440755,002133.SZ +2023-04-14,11.685715046162876,000897.SZ +2023-04-17,11.668468794846358,000897.SZ +2023-04-17,11.791022937762676,600052.SH +2023-04-18,11.816221732162841,000520.SZ +2023-04-18,11.848186637676358,600408.SH +2023-04-19,11.476082957016013,000908.SZ +2023-04-19,11.487737892546555,000520.SZ +2023-04-20,11.349428048697696,000520.SZ +2023-04-20,11.435332433243637,002663.SZ +2023-04-21,11.382782836558487,002207.SZ +2023-04-21,11.520931025872361,002775.SZ +2023-04-24,11.460194717652879,000897.SZ +2023-04-24,11.518335381316188,600692.SH +2023-04-25,11.608602771078019,600692.SH +2023-04-25,11.783165809012496,002370.SZ +2023-04-26,11.713838401352795,000514.SZ +2023-04-26,11.904371123361752,000558.SZ +2023-04-27,11.768780487528137,002133.SZ +2023-04-27,11.907904616689304,000909.SZ +2023-04-28,11.986879690708257,600533.SH +2023-04-28,12.077842366844783,600503.SH +2023-05-04,11.924584947339206,600503.SH +2023-05-04,12.064860375300496,000926.SZ +2023-05-05,11.41848579531686,600692.SH +2023-05-05,11.560054670730484,600716.SH +2023-05-08,11.261638228186552,600189.SH +2023-05-08,11.285270331463423,000017.SZ +2023-05-09,11.29263882730421,600355.SH +2023-05-09,11.34935536857744,600561.SH +2023-05-10,10.98154748837052,000638.SZ +2023-05-10,11.041322449660735,600355.SH +2023-05-11,11.151371196079504,605208.SH +2023-05-11,11.15990832359922,002828.SZ +2023-05-12,11.286514119972765,002775.SZ +2023-05-12,11.325186638945755,002629.SZ +2023-05-15,10.87183619069401,001230.SZ +2023-05-15,10.947161382460218,600847.SH +2023-05-16,11.695383608462091,000608.SZ +2023-05-16,11.7777475339435,600082.SH +2023-05-17,11.701914125919854,600791.SH +2023-05-17,11.934713787184368,600322.SH +2023-05-18,12.359961947956002,000608.SZ +2023-05-18,12.40845138064781,600159.SH +2023-05-19,12.484085285147433,600082.SH +2023-05-19,12.713273817285756,600159.SH +2023-05-22,12.228179605566792,600322.SH +2023-05-22,12.42658539703527,600082.SH +2023-05-23,12.072630748962087,600322.SH +2023-05-23,12.133942678773327,600082.SH +2023-05-24,11.56436708633816,600173.SH +2023-05-24,11.584339618983647,600082.SH +2023-05-25,11.674728499458189,600791.SH +2023-05-25,11.701320619419112,000514.SZ +2023-05-26,11.530126492080674,600159.SH +2023-05-26,11.669309611419358,600082.SH +2023-05-29,11.589849471388359,600159.SH +2023-05-29,11.590615855161507,603022.SH +2023-05-30,11.32797737613378,603037.SH +2023-05-30,11.369310658279373,003041.SZ +2023-05-31,11.474058993951882,000897.SZ +2023-05-31,11.476834508013955,000608.SZ +2023-06-01,11.5852275705038,000608.SZ +2023-06-01,11.703971212298939,600791.SH +2023-06-02,11.300732078089428,000926.SZ +2023-06-02,11.40848137512511,002347.SZ +2023-06-05,11.45134644635169,000926.SZ +2023-06-05,11.561814797085948,600082.SH +2023-06-06,11.835975059965566,000926.SZ +2023-06-06,11.841571144250809,600463.SH +2023-06-07,11.314608205203111,000573.SZ +2023-06-07,11.385265419293864,600716.SH +2023-06-08,11.305126325698383,603320.SH +2023-06-08,11.378185364393058,600716.SH +2023-06-09,11.281803394466554,600716.SH +2023-06-09,11.298850127657285,600768.SH +2023-06-12,12.311184424783164,000608.SZ +2023-06-12,12.43118909229752,600716.SH +2023-06-13,11.936477250932667,600716.SH +2023-06-13,12.085396438508635,000608.SZ +2023-06-14,11.81694123436501,002133.SZ +2023-06-14,11.875863567651228,600082.SH +2023-06-15,11.570838221317212,002133.SZ +2023-06-15,11.601541042010322,000608.SZ +2023-06-16,11.355893766685906,002133.SZ +2023-06-16,11.490920174322705,600082.SH +2023-06-19,11.308251779886058,000558.SZ +2023-06-19,11.444535537209585,600082.SH +2023-06-20,11.606236925128918,000558.SZ +2023-06-20,11.634841880104226,600082.SH +2023-06-21,11.136790679649767,600173.SH +2023-06-21,11.145198347789721,600463.SH +2023-06-26,10.735405603636607,600173.SH +2023-06-26,10.762330130057217,603320.SH +2023-06-27,10.882163715714398,603048.SH +2023-06-27,11.0059967500998,600463.SH +2023-06-28,11.063491649869654,600082.SH +2023-06-28,11.06832838451217,600743.SH +2023-06-29,11.008284706136974,605158.SH +2023-06-29,11.08477396185227,600463.SH +2023-06-30,11.233824863708486,000573.SZ +2023-06-30,11.263925522206575,600082.SH +2023-07-03,11.230441173075818,605155.SH +2023-07-03,11.290087414363274,605378.SH +2023-07-04,11.292404899274183,000514.SZ +2023-07-04,11.29817961390965,605500.SH +2023-07-05,11.41636727688791,600235.SH +2023-07-05,11.461331249878784,605500.SH +2023-07-06,11.114636696631361,600526.SH +2023-07-06,11.128848430591779,605500.SH +2023-07-07,11.114361081521839,603928.SH +2023-07-07,11.13633270490315,002828.SZ +2023-07-10,10.801855364287078,603626.SH +2023-07-10,10.83208069645482,002836.SZ +2023-07-11,11.002201956777963,600638.SH +2023-07-11,11.065322648633803,600173.SH +2023-07-12,11.01941375886698,000926.SZ +2023-07-12,11.105400311977702,000573.SZ +2023-07-13,11.250718411759445,600448.SH +2023-07-13,11.386825549576427,000573.SZ +2023-07-14,11.286151069886692,000573.SZ +2023-07-14,11.29849394971934,600082.SH +2023-07-17,10.951749195747826,000573.SZ +2023-07-17,10.970230542524957,002133.SZ +2023-07-18,11.271018045530692,600082.SH +2023-07-18,11.271675464444654,600448.SH +2023-07-19,11.0920481935321,600768.SH +2023-07-19,11.105599308558931,002696.SZ +2023-07-20,11.002219548674173,603038.SH +2023-07-20,11.00659468378128,603172.SH +2023-07-21,11.072752218454546,002809.SZ +2023-07-21,11.136202328909528,002666.SZ +2023-07-24,10.903059349085238,002591.SZ +2023-07-24,10.994218213012493,002666.SZ +2023-07-25,11.080812149908992,002207.SZ +2023-07-25,11.218651980737173,600854.SH +2023-07-26,10.992396846987404,002666.SZ +2023-07-26,11.034182879869402,003017.SZ +2023-07-27,11.006096947612573,001218.SZ +2023-07-27,11.025316925444063,002591.SZ +2023-07-28,11.036990213853315,600463.SH +2023-07-28,11.099177565176573,600692.SH +2023-07-31,11.04087951538002,002566.SZ +2023-07-31,11.073456060762647,002295.SZ +2023-08-01,10.88134126203379,002492.SZ +2023-08-01,10.907207605923045,002566.SZ +2023-08-02,11.16788245454828,002836.SZ +2023-08-02,11.206194270424831,603022.SH +2023-08-03,11.173896848694438,603022.SH +2023-08-03,11.225332670640785,002836.SZ +2023-08-04,11.064205436483375,002842.SZ +2023-08-04,11.06827624201802,600119.SH +2023-08-07,11.289498503556592,600463.SH +2023-08-07,11.713034524313324,600173.SH +2023-08-08,11.113218396427989,600692.SH +2023-08-08,11.271299964715636,600119.SH +2023-08-09,11.268326567926948,603022.SH +2023-08-09,11.476265869417233,600173.SH +2023-08-10,11.066240892982949,002295.SZ +2023-08-10,11.35700396139104,600692.SH +2023-08-11,10.703945682364584,600448.SH +2023-08-11,10.868011702694359,600692.SH +2023-08-14,11.50925305160374,002133.SZ +2023-08-14,11.592490315906591,600692.SH +2023-08-15,11.41907908666991,002133.SZ +2023-08-15,11.56442096209652,600082.SH +2023-08-16,10.665274879696977,600854.SH +2023-08-16,10.73022647577549,600082.SH +2023-08-17,11.097795235472109,600716.SH +2023-08-17,11.290779944807227,600173.SH +2023-08-18,11.695971078219781,600173.SH +2023-08-18,11.821502042029039,600692.SH +2023-08-21,11.429062712618007,600173.SH +2023-08-21,11.47621055144856,600692.SH +2023-08-22,11.707870786056791,600638.SH +2023-08-22,11.894777493975738,600692.SH +2023-08-23,11.661286049711617,000558.SZ +2023-08-23,11.927781821295238,600503.SH +2023-08-24,11.574393491917657,600854.SH +2023-08-24,11.771442739305979,600503.SH +2023-08-25,11.16030808184577,000558.SZ +2023-08-25,11.341690489643588,600854.SH +2023-08-28,10.680714253658158,603121.SH +2023-08-28,10.721205061966495,000880.SZ +2023-08-29,10.658738449476525,603602.SH +2023-08-29,10.696735242790924,000809.SZ +2023-08-30,10.790771516613102,600692.SH +2023-08-30,10.885250669835884,600854.SH +2023-08-31,10.862721199225536,000017.SZ +2023-08-31,10.908580448080272,600854.SH +2023-09-01,10.76107727127504,002666.SZ +2023-09-01,10.845576229603179,600854.SH +2023-09-04,11.452760434381151,000558.SZ +2023-09-04,11.587809522681624,600692.SH +2023-09-05,11.345855310866868,600302.SH +2023-09-05,11.448010645098304,603838.SH +2023-09-06,11.319607714110266,600232.SH +2023-09-06,11.42286623238228,603838.SH +2023-09-07,11.244046114105046,600503.SH +2023-09-07,11.261313216796943,600854.SH +2023-09-08,11.283260786398584,002571.SZ +2023-09-08,11.348657145072801,002494.SZ +2023-09-11,11.334846739246485,003016.SZ +2023-09-11,11.35189792009412,600854.SH +2023-09-12,11.153684329359168,600319.SH +2023-09-12,11.160286265834188,002098.SZ +2023-09-13,11.075916501520739,600281.SH +2023-09-13,11.15527067702282,600302.SH +2023-09-14,11.182122094451799,600082.SH +2023-09-14,11.186153669545963,605208.SH +2023-09-15,11.44447489420356,603332.SH +2023-09-15,11.623388283007722,003041.SZ +2023-09-18,11.482495801460685,600082.SH +2023-09-18,11.483077950187855,000608.SZ +2023-09-19,11.245226621929621,002842.SZ +2023-09-19,11.271010720805648,600099.SH +2023-09-20,11.274874991056643,603021.SH +2023-09-20,11.301743222140818,000017.SZ +2023-09-21,11.224056646149336,000514.SZ +2023-09-21,11.235527231136755,600506.SH +2023-09-22,11.248515672218803,600692.SH +2023-09-22,11.355127625130532,600082.SH +2023-09-25,11.017083388587059,002806.SZ +2023-09-25,11.198775469894382,600692.SH +2023-09-26,11.20249534393984,600082.SH +2023-09-26,11.213974693325044,600854.SH +2023-09-27,11.31813430257092,600099.SH +2023-09-27,11.340601590000478,002040.SZ +2023-09-28,11.268130892878798,002524.SZ +2023-09-28,11.35835531044741,600692.SH +2023-10-09,11.002468250672312,601956.SH +2023-10-09,11.181927816779247,600854.SH +2023-10-10,11.43884950390956,600082.SH +2023-10-10,11.496586924522742,000897.SZ +2023-10-11,11.277057930348695,001206.SZ +2023-10-11,11.325411586067048,000880.SZ +2023-10-12,11.363827897275865,000886.SZ +2023-10-12,11.398790270983241,002296.SZ +2023-10-13,11.32523416625218,600386.SH +2023-10-13,11.327859187459044,600538.SH +2023-10-16,11.09395433983654,000599.SZ +2023-10-16,11.105500074724935,000788.SZ +2023-10-17,11.307716409013988,000599.SZ +2023-10-17,11.480171256426905,000953.SZ +2023-10-18,11.128118087447707,000953.SZ +2023-10-18,11.219812503525135,000880.SZ +2023-10-19,11.07274461278588,002763.SZ +2023-10-19,11.086584148832822,000953.SZ +2023-10-20,10.869206185338996,000952.SZ +2023-10-20,11.035204818478455,000908.SZ +2023-10-23,11.078647110400663,000710.SZ +2023-10-23,11.21545207009972,600288.SH +2023-10-24,10.952095288049435,003020.SZ +2023-10-24,11.020085162975137,002560.SZ +2023-10-25,11.024501188263644,002660.SZ +2023-10-25,11.041390977644518,002900.SZ +2023-10-26,11.363074243469239,000014.SZ +2023-10-26,11.530866224020455,600082.SH +2023-10-27,11.815216388032377,002495.SZ +2023-10-27,11.873293678686874,000890.SZ +2023-10-30,11.612590787698723,600250.SH +2023-10-30,11.666563195020991,002825.SZ +2023-10-31,11.267512038087325,002825.SZ +2023-10-31,11.510453014914862,000558.SZ +2023-11-01,11.454987465028376,600082.SH +2023-11-01,11.464394787644808,000558.SZ +2023-11-02,11.261004016080856,000863.SZ +2023-11-02,11.412307682819893,000558.SZ +2023-11-03,11.47421392391364,001222.SZ +2023-11-03,11.649726638036245,600082.SH +2023-11-06,11.349009908622122,000926.SZ +2023-11-06,11.455062568841884,000608.SZ +2023-11-07,11.52636822939901,000926.SZ +2023-11-07,11.647018759720133,600082.SH +2023-11-08,11.350932714830098,600067.SH +2023-11-08,11.64206632436361,600082.SH +2023-11-09,11.162574484024509,000926.SZ +2023-11-09,11.365839589936721,600082.SH +2023-11-10,11.263642152002038,000926.SZ +2023-11-10,11.307377301681907,600791.SH +2023-11-13,11.153670701769968,603090.SH +2023-11-13,11.269235319476516,000608.SZ +2023-11-14,11.031758091481924,002633.SZ +2023-11-14,11.051104461952093,002890.SZ +2023-11-15,10.92878397296684,002209.SZ +2023-11-15,11.059840269503127,600082.SH +2023-11-16,11.170907830430906,002890.SZ +2023-11-16,11.30247782144998,600082.SH +2023-11-17,11.327077726183383,000608.SZ +2023-11-17,11.394225369131368,002133.SZ +2023-11-20,11.165463831711406,600082.SH +2023-11-20,11.22779843737252,600665.SH +2023-11-21,10.945555510458387,002890.SZ +2023-11-21,10.97406218603051,000880.SZ +2023-11-22,10.968612910301516,002633.SZ +2023-11-22,11.059291940083433,002871.SZ +2023-11-23,11.116992973221084,000886.SZ +2023-11-23,11.130542240253616,002890.SZ +2023-11-24,11.464607435749633,000622.SZ +2023-11-24,11.538456022198872,600082.SH +2023-11-27,11.766052041439393,000573.SZ +2023-11-27,11.81801372682414,600082.SH +2023-11-28,11.471995221254627,002133.SZ +2023-11-28,11.537291762554851,600854.SH +2023-11-29,11.416752711014315,002133.SZ +2023-11-29,11.569674021296601,600082.SH +2023-11-30,11.39632114950641,000573.SZ +2023-11-30,11.605884400580436,600082.SH +2023-12-01,11.566156989145748,600082.SH +2023-12-01,11.581984294126435,600665.SH +2023-12-04,11.85167467033587,000573.SZ +2023-12-04,11.898769995571968,600067.SH +2023-12-05,11.487513108257884,600665.SH +2023-12-05,11.491323630282398,000573.SZ +2023-12-06,11.389222763198553,000573.SZ +2023-12-06,11.390315715813552,000558.SZ +2023-12-07,11.24850281343224,600854.SH +2023-12-07,11.296660366786785,000622.SZ +2023-12-08,11.687515207417064,600082.SH +2023-12-08,11.692186599444318,600716.SH +2023-12-11,11.79274509602265,600082.SH +2023-12-11,11.879776267924408,600854.SH +2023-12-12,11.262092021841225,605580.SH +2023-12-12,11.264541058488577,002688.SZ +2023-12-13,11.189839517189169,002133.SZ +2023-12-13,11.294322197535037,600854.SH +2023-12-14,11.102331320855146,600067.SH +2023-12-14,11.147183757346742,000573.SZ +2023-12-15,11.27258610113104,600854.SH +2023-12-15,11.3131608665732,000573.SZ +2023-12-18,11.19503208374806,000809.SZ +2023-12-18,11.229531825056709,000573.SZ +2023-12-19,11.09868206106028,600082.SH +2023-12-19,11.127199151454453,002133.SZ +2023-12-20,11.328990213821015,000608.SZ +2023-12-20,11.510333877383255,600082.SH +2023-12-21,11.061954908391685,000608.SZ +2023-12-21,11.096837890011635,600716.SH +2023-12-22,11.263098905987071,002133.SZ +2023-12-22,11.302478831584082,600082.SH +2023-12-25,11.194632997815933,000558.SZ +2023-12-25,11.280709604274339,600082.SH +2023-12-26,11.121822055461987,600683.SH +2023-12-26,11.270981162089694,000014.SZ +2023-12-27,11.237919310950534,600082.SH +2023-12-27,11.345146223738887,000558.SZ +2023-12-28,10.720452632409797,000608.SZ +2023-12-28,10.761757216021271,002133.SZ +2023-12-29,11.122538237528012,000608.SZ +2023-12-29,11.383276494939203,000573.SZ +2024-01-02,11.341166074027697,600082.SH +2024-01-02,11.397114402632983,000573.SZ +2024-01-03,11.095522618288411,600067.SH +2024-01-03,11.289935582841593,000573.SZ +2024-01-04,11.41371759097271,600082.SH +2024-01-04,11.547787543279876,000573.SZ +2024-01-05,11.047784422715015,002879.SZ +2024-01-05,11.06925285903078,000573.SZ +2024-01-08,11.137414348054458,000573.SZ +2024-01-08,11.335199143873801,000886.SZ +2024-01-09,11.067373363282899,000573.SZ +2024-01-09,11.173513789522419,000609.SZ +2024-01-10,10.91604319627379,000809.SZ +2024-01-10,11.103263540872543,000609.SZ +2024-01-11,10.742017604481484,600533.SH +2024-01-11,10.82644098417917,000609.SZ +2024-01-12,10.841330393349136,600665.SH +2024-01-12,10.868367166576117,600082.SH +2024-01-15,10.981910295112282,000926.SZ +2024-01-15,11.133706478619457,000809.SZ +2024-01-16,11.20059821930973,000809.SZ +2024-01-16,11.247858572235195,000926.SZ +2024-01-17,11.070700618595268,600791.SH +2024-01-17,11.093478530481887,600322.SH +2024-01-18,10.895643070605471,600692.SH +2024-01-18,10.907384213516096,600791.SH +2024-01-19,11.419202757523767,000609.SZ +2024-01-19,11.566359865736262,600791.SH +2024-01-22,11.83534209380928,000926.SZ +2024-01-22,11.904021135095865,600791.SH +2024-01-23,12.214291695382768,600791.SH +2024-01-23,12.333471852223974,600322.SH +2024-01-24,11.777165142320094,600791.SH +2024-01-24,11.798954739628641,000608.SZ +2024-01-25,10.926772202972847,600716.SH +2024-01-25,11.220082275801618,600854.SH +2024-01-26,10.8873395414631,000558.SZ +2024-01-26,11.234913460483348,600854.SH +2024-01-29,11.350956633730824,000558.SZ +2024-01-29,11.708214631694755,600854.SH +2024-01-30,12.067641211768697,000558.SZ +2024-01-30,12.254464351876683,600854.SH +2024-01-31,12.873224030780195,000573.SZ +2024-01-31,13.073065151234378,600743.SH +2024-02-01,13.36738645623177,600743.SH +2024-02-01,13.527945104460002,600067.SH +2024-02-02,12.775341460072317,600173.SH +2024-02-02,13.0749138372215,600854.SH +2024-02-05,13.693259182565082,000965.SZ +2024-02-05,13.74916235783122,600173.SH +2024-02-06,11.933883475215604,600743.SH +2024-02-06,12.399706214620018,600397.SH +2024-02-07,12.015093477436318,000520.SZ +2024-02-07,12.523925851423407,600503.SH +2024-02-08,11.824912156390733,600533.SH +2024-02-08,11.982620203641504,002305.SZ +2024-02-19,11.807590941640564,600173.SH +2024-02-19,11.95571347178906,600503.SH +2024-02-20,11.345370125984672,000965.SZ +2024-02-20,11.357385057114183,002305.SZ +2024-02-21,11.211199125353108,600503.SH +2024-02-21,11.351997271381475,000558.SZ +2024-02-22,11.857479605013818,600503.SH +2024-02-22,12.023816505129755,000558.SZ +2024-02-23,11.556270434121055,600854.SH +2024-02-23,11.696301977425138,000558.SZ +2024-02-26,11.448523065074426,600503.SH +2024-02-26,11.552792446419833,000558.SZ +2024-02-27,11.797821604827034,600503.SH +2024-02-27,12.282433655603548,000558.SZ +2024-02-28,11.061169821436414,000558.SZ +2024-02-28,11.134751158574675,600503.SH +2024-02-29,11.806486543602,000558.SZ +2024-02-29,11.863569431102293,000897.SZ +2024-03-01,11.635055357654036,000897.SZ +2024-03-01,11.844701013801703,000558.SZ +2024-03-04,10.954574124860706,000558.SZ +2024-03-04,11.082793257979956,603115.SH +2024-03-05,11.180661596708248,000558.SZ +2024-03-05,11.256882656479481,600503.SH +2024-03-06,11.270547864451553,000558.SZ +2024-03-06,11.362799655709532,600503.SH +2024-03-07,11.027021743813902,000782.SZ +2024-03-07,11.175621011034453,603115.SH +2024-03-08,10.963657598676381,603956.SH +2024-03-08,11.066950279233819,002890.SZ +2024-03-11,11.354804544170223,603311.SH +2024-03-11,11.436130254087587,000558.SZ +2024-03-12,11.173357004231882,603339.SH +2024-03-12,11.199679863372811,603351.SH +2024-03-13,11.109985758241514,600503.SH +2024-03-13,11.331166270393485,000558.SZ +2024-03-14,11.009137862468585,600638.SH +2024-03-14,11.096720421869168,600503.SH +2024-03-15,11.177835963061494,002133.SZ +2024-03-15,11.252141325682665,600173.SH +2024-03-18,11.49170715816279,600638.SH +2024-03-18,11.600416371909581,000926.SZ +2024-03-19,11.395373320364861,000558.SZ +2024-03-19,11.437016707862478,000926.SZ +2024-03-20,11.118754673748768,002305.SZ +2024-03-20,11.28333786518741,600503.SH +2024-03-21,11.007344502144887,600533.SH +2024-03-21,11.009168389401648,603012.SH +2024-03-22,11.050765554529137,600503.SH +2024-03-22,11.154188310859201,600533.SH +2024-03-25,11.04877937761547,603115.SH +2024-03-25,11.078302460471944,002562.SZ +2024-03-26,11.12037976060016,600503.SH +2024-03-26,11.328147976211831,600854.SH +2024-03-27,11.476323712270572,600716.SH +2024-03-27,11.575962826772923,600503.SH +2024-03-28,11.1470738665637,600665.SH +2024-03-28,11.218002876271088,600503.SH +2024-03-29,11.387698904604903,000608.SZ +2024-03-29,11.448001746328897,600067.SH +2024-04-01,11.063087127797301,600067.SH +2024-04-01,11.07073798011394,600533.SH +2024-04-02,10.649871680173383,600533.SH +2024-04-02,10.739035572535403,002133.SZ +2024-04-03,10.88277653083264,000573.SZ +2024-04-03,10.919932721035634,600533.SH +2024-04-08,10.729960650269707,002887.SZ +2024-04-08,10.737929617433641,603182.SH +2024-04-09,10.791359837688123,002133.SZ +2024-04-09,10.976326194564876,000608.SZ +2024-04-10,10.672286300737763,600356.SH +2024-04-10,10.75807316736313,603022.SH +2024-04-11,10.765460499622286,600356.SH +2024-04-11,10.785122651465365,000573.SZ +2024-04-12,10.746644687099247,002105.SZ +2024-04-12,10.747491518904749,600082.SH +2024-04-15,10.622050073910652,603359.SH +2024-04-15,10.622793485867316,002775.SZ +2024-04-16,11.686124978442336,600665.SH +2024-04-16,11.971240670989975,002305.SZ +2024-04-17,10.868841838326837,000863.SZ +2024-04-17,11.004610845116968,600533.SH +2024-04-18,10.897055547259669,600638.SH +2024-04-18,10.925818211646508,600533.SH +2024-04-19,11.249500705589266,600743.SH +2024-04-19,11.488595909258272,002305.SZ +2024-04-22,11.377110641266572,002133.SZ +2024-04-22,11.416514101837894,600322.SH +2024-04-23,11.189903972216246,600533.SH +2024-04-23,11.30507793533614,600743.SH +2024-04-24,11.19947574852436,600638.SH +2024-04-24,11.50204662177013,002305.SZ +2024-04-25,10.916706100560795,600322.SH +2024-04-25,11.002372477144036,000926.SZ +2024-04-26,10.768962209623226,603811.SH +2024-04-26,10.922395079494363,600743.SH +2024-04-29,10.618298263123531,002788.SZ +2024-04-29,10.651811876564393,002462.SZ +2024-04-30,10.695391131896384,603922.SH +2024-04-30,10.712768061389575,603040.SH +2024-05-06,10.669758912866547,002133.SZ +2024-05-06,11.088183603255104,002208.SZ +2024-05-07,10.620027223165701,000782.SZ +2024-05-07,10.748954504681626,002462.SZ +2024-05-08,10.795425294664334,000782.SZ +2024-05-08,10.837478787090847,002133.SZ +2024-05-09,11.007291442256061,002462.SZ +2024-05-09,11.071868596737293,603856.SH +2024-05-10,10.660864977044486,600668.SH +2024-05-10,10.733462255752611,002462.SZ +2024-05-13,10.840767131275982,000558.SZ +2024-05-13,10.878454511157729,600503.SH +2024-05-14,10.95955889908351,603856.SH +2024-05-14,11.171013800176638,600503.SH +2024-05-15,10.960309847080115,603856.SH +2024-05-15,10.969091972312738,002462.SZ +2024-05-16,10.770602596123474,002040.SZ +2024-05-16,10.773466185493394,603987.SH +2024-05-17,10.62333555943787,603150.SH +2024-05-17,10.627304958098062,001222.SZ +2024-05-20,10.810583561314655,002694.SZ +2024-05-20,10.85295904809948,002666.SZ +2024-05-21,10.912559491355989,600668.SH +2024-05-21,10.937834493721176,002040.SZ +2024-05-22,10.946169027190534,001218.SZ +2024-05-22,11.017190226644397,002492.SZ +2024-05-23,10.878529175763795,001218.SZ +2024-05-23,10.90324986075177,002492.SZ +2024-05-24,10.797160580533495,600802.SH +2024-05-24,10.943311720126237,600082.SH +2024-05-27,10.692887362156323,000558.SZ +2024-05-27,10.716389603037449,600503.SH +2024-05-28,10.701309494752712,600052.SH +2024-05-28,10.972450123325636,000558.SZ +2024-05-29,10.815631169600307,600082.SH +2024-05-29,10.867749106684219,600854.SH +2024-05-30,11.062442668257335,600082.SH +2024-05-30,11.148212456132105,000573.SZ +2024-05-31,10.91132545310171,600082.SH +2024-05-31,11.004703839573903,000573.SZ +2024-06-03,11.218065569890657,000573.SZ +2024-06-03,11.242292367977152,600716.SH +2024-06-04,10.958672611155748,600503.SH +2024-06-04,11.10731618427156,000573.SZ +2024-06-05,11.562621354217608,600716.SH +2024-06-05,11.729419748496067,000573.SZ +2024-06-06,11.745167427917874,000608.SZ +2024-06-06,11.768074074644058,600533.SH +2024-06-07,11.464120083812857,000014.SZ +2024-06-07,11.507800051016176,600533.SH +2024-06-11,11.706439268590564,000014.SZ +2024-06-11,11.803788166819247,000608.SZ +2024-06-12,11.337559000862205,000014.SZ +2024-06-12,11.388342979174748,600067.SH +2024-06-13,11.289817275219796,000014.SZ +2024-06-13,11.386354185951793,600082.SH +2024-06-14,10.648131496098811,600854.SH +2024-06-14,10.67087713183554,600082.SH +2024-06-17,11.04905243209748,002471.SZ +2024-06-17,11.225068705886914,000608.SZ +2024-06-18,10.694538810095235,600503.SH +2024-06-18,10.716479180679304,600082.SH +2024-06-19,10.908155481143428,600854.SH +2024-06-19,11.092774589507883,000608.SZ +2024-06-20,11.148407165433355,000720.SZ +2024-06-20,11.345300922253895,000608.SZ +2024-06-21,10.827892888148252,000608.SZ +2024-06-21,10.862359152941014,000720.SZ +2024-06-24,11.296898632950601,000637.SZ +2024-06-24,11.342651257450264,600665.SH +2024-06-25,11.031470266667268,002917.SZ +2024-06-25,11.1243281536177,002022.SZ +2024-06-26,10.579848910715151,600692.SH +2024-06-26,10.629153941163114,600791.SH +2024-06-27,11.060517741001062,000608.SZ +2024-06-27,11.086009276437041,000573.SZ +2024-06-28,11.032745586888499,600665.SH +2024-06-28,11.287655295421146,000608.SZ +2024-07-01,11.03660733718224,600854.SH +2024-07-01,11.150606930141018,600791.SH +2024-07-02,10.573159448682642,000014.SZ +2024-07-02,10.608420053194202,600854.SH +2024-07-03,10.740068400628461,603201.SH +2024-07-03,10.984860420531874,000637.SZ +2024-07-04,10.974169918141955,000014.SZ +2024-07-04,10.998735684017497,000637.SZ +2024-07-05,10.74423268997953,600791.SH +2024-07-05,10.771159344535416,603201.SH +2024-07-08,10.94083420978322,600665.SH +2024-07-08,10.97302432328556,603633.SH +2024-07-09,10.463198908929389,002547.SZ +2024-07-09,10.577006895228344,000637.SZ +2024-07-10,10.809244414394016,000573.SZ +2024-07-10,10.885645403272324,600082.SH +2024-07-11,10.920655968112127,000978.SZ +2024-07-11,11.142999874084433,000558.SZ +2024-07-12,11.134402566095542,600716.SH +2024-07-12,11.551001558795573,000558.SZ +2024-07-15,11.236027099778465,000573.SZ +2024-07-15,11.416579881304534,000558.SZ +2024-07-16,10.915228642937354,600082.SH +2024-07-16,11.200702638388263,600716.SH +2024-07-17,11.046874479166295,002133.SZ +2024-07-17,11.048849004311174,000558.SZ +2024-07-18,11.295813504378774,600716.SH +2024-07-18,11.31134626443969,002133.SZ +2024-07-19,11.46022743729021,600322.SH +2024-07-19,11.71373766186377,000558.SZ +2024-07-22,11.19571619766834,000897.SZ +2024-07-22,11.277844408854996,600716.SH +2024-07-23,10.942860373244057,600716.SH +2024-07-23,11.006116610373542,002133.SZ +2024-07-24,11.392508607025832,000573.SZ +2024-07-24,11.575146000960615,000558.SZ +2024-07-25,10.794418017137714,000573.SZ +2024-07-25,10.852314456189758,600159.SH +2024-07-26,11.516638252854387,600716.SH +2024-07-26,11.573434636989745,000558.SZ +2024-07-29,10.97380757760514,000573.SZ +2024-07-29,11.073177687894406,000558.SZ +2024-07-30,11.126000352703494,600716.SH +2024-07-30,11.426617794961135,000558.SZ +2024-07-31,11.340168667846772,002133.SZ +2024-07-31,11.341824712574812,600716.SH +2024-08-01,11.711472573275223,000558.SZ +2024-08-01,11.858551197302234,600716.SH +2024-08-02,11.702076161894205,600082.SH +2024-08-02,11.836354573004312,600716.SH +2024-08-05,11.639534082683051,600716.SH +2024-08-05,11.653898941267958,000514.SZ +2024-08-06,11.293467057288455,600716.SH +2024-08-06,11.409269809750445,600503.SH +2024-08-07,11.62108127059922,600503.SH +2024-08-07,11.66387941224859,600716.SH +2024-08-08,10.535937856506802,600854.SH +2024-08-08,10.728883095994155,600716.SH +2024-08-09,10.41067417432521,002817.SZ +2024-08-09,10.48951114658584,600128.SH +2024-08-12,10.844402407406001,002133.SZ +2024-08-12,10.97047516456831,600082.SH +2024-08-13,10.915405112453806,002133.SZ +2024-08-13,10.959195046568652,600082.SH +2024-08-14,10.883693156433978,002133.SZ +2024-08-14,10.942036500093153,600082.SH +2024-08-15,10.655846333988737,002817.SZ +2024-08-15,10.720027465333555,600503.SH +2024-08-16,10.737650021370309,600082.SH +2024-08-16,10.771719852119087,000573.SZ +2024-08-19,10.641386912146395,002365.SZ +2024-08-19,10.791603416189211,002817.SZ +2024-08-20,10.709050109861698,600692.SH +2024-08-20,10.837332637069128,600159.SH +2024-08-21,10.771337440283261,600337.SH +2024-08-21,10.824820355622231,600159.SH +2024-08-22,10.837975520506392,600159.SH +2024-08-22,10.878139749598319,600692.SH +2024-08-23,10.62268818857339,600622.SH +2024-08-23,10.666527148887027,000573.SZ +2024-08-26,10.789214283670516,600692.SH +2024-08-26,10.86620487434041,600638.SH +2024-08-27,10.875433457125654,600785.SH +2024-08-27,10.912983512415009,600159.SH +2024-08-28,10.92417416182168,600159.SH +2024-08-28,10.950389085953367,600692.SH +2024-08-29,10.689906959677174,600159.SH +2024-08-29,10.791944236778386,000573.SZ +2024-08-30,11.005427783913037,000850.SZ +2024-08-30,11.029912904080557,600371.SH +2024-09-02,10.556183078310978,000637.SZ +2024-09-02,10.574283843997648,600692.SH +2024-09-03,10.995971968536626,600692.SH +2024-09-03,11.098343080040872,600503.SH +2024-09-04,10.42985369404223,000637.SZ +2024-09-04,10.45515807207255,600128.SH +2024-09-05,10.881380586789154,600716.SH +2024-09-05,10.890287347796608,002725.SZ +2024-09-06,10.614496874615819,000558.SZ +2024-09-06,10.708529443016095,600716.SH +2024-09-09,10.675700030523364,002442.SZ +2024-09-09,10.676584312579504,600716.SH +2024-09-10,10.96753203950262,600716.SH +2024-09-10,11.017636851684003,000558.SZ +2024-09-11,11.48254896903052,000558.SZ +2024-09-11,11.517425419554693,600082.SH +2024-09-12,11.425019561526092,600716.SH +2024-09-12,11.425391092212493,000558.SZ +2024-09-13,10.814273708495328,002133.SZ +2024-09-13,10.903627201359827,600854.SH +2024-09-18,10.831293026097022,002133.SZ +2024-09-18,10.93697215098542,000558.SZ +2024-09-19,11.226283133237033,601010.SH +2024-09-19,11.29429591128001,000558.SZ +2024-09-20,10.889802114166471,600735.SH +2024-09-20,10.940131834858727,002286.SZ +2024-09-23,10.368717413195368,600371.SH +2024-09-23,10.571133750053548,000558.SZ +2024-09-24,10.886795860828933,002133.SZ +2024-09-24,10.985258964540012,000558.SZ +2024-09-25,10.891513880617058,002836.SZ +2024-09-25,11.034851643678156,600854.SH +2024-09-26,10.698042271179455,000782.SZ +2024-09-26,10.723137745581228,002836.SZ +2024-09-27,10.953320102648211,600173.SH +2024-09-27,11.083589948372552,600854.SH +2024-09-30,10.077126363138545,600173.SH +2024-09-30,10.837127119311276,000608.SZ +2024-10-08,9.881826165690093,600854.SH +2024-10-08,10.016835052429304,002072.SZ +2024-10-09,10.663998711568647,600173.SH +2024-10-09,11.043096283912252,600533.SH +2024-10-10,11.059872092886287,600423.SH +2024-10-10,11.440538776762574,600173.SH +2024-10-11,11.35456835275112,600854.SH +2024-10-11,11.78465672623076,600173.SH +2024-10-14,11.48127404033739,600503.SH +2024-10-14,11.776298343552476,600173.SH +2024-10-15,11.630705411537132,600503.SH +2024-10-15,12.28269458393163,600173.SH +2024-10-16,11.578609005680352,600854.SH +2024-10-16,11.580415348108003,002763.SZ +2024-10-17,11.595754226065855,000573.SZ +2024-10-17,11.808123360196127,600854.SH +2024-10-18,12.355493459662437,600173.SH +2024-10-18,12.462582828873273,000573.SZ +2024-10-21,12.496211932483432,600854.SH +2024-10-21,12.532601291464589,600173.SH +2024-10-22,12.299112031630749,600082.SH +2024-10-22,12.343347925600886,600716.SH +2024-10-23,12.24611960727777,600854.SH +2024-10-23,12.36264596614783,600716.SH +2024-10-24,11.793266673569864,600716.SH +2024-10-24,11.83295565112393,600173.SH +2024-10-25,11.674320184357613,002133.SZ +2024-10-25,12.000667239692893,000573.SZ +2024-10-28,11.517138408150174,605003.SH +2024-10-28,11.573211972816333,603182.SH +2024-10-29,11.725549986809266,603836.SH +2024-10-29,11.749382656582194,002342.SZ +2024-10-30,11.813066367535578,603130.SH +2024-10-30,12.047867679712521,600173.SH +2024-10-31,11.699948515905973,600359.SH +2024-10-31,11.932664233140214,600854.SH +2024-11-01,12.030147488663033,600854.SH +2024-11-01,12.045721964821857,600716.SH +2024-11-04,11.941932847507724,603137.SH +2024-11-04,11.982108504921545,603029.SH +2024-11-05,11.70180761394145,002133.SZ +2024-11-05,11.70476277300233,603086.SH +2024-11-06,11.849903877891927,002282.SZ +2024-11-06,11.863819636843866,603289.SH +2024-11-07,11.772647877930892,600173.SH +2024-11-07,11.794062389583534,600232.SH +2024-11-08,12.035532668040332,002774.SZ +2024-11-08,12.047819057182473,600202.SH +2024-11-11,12.446301633331249,600173.SH +2024-11-11,12.547032392720295,600854.SH +2024-11-12,12.440382377186712,002133.SZ +2024-11-12,12.615113203897161,600854.SH +2024-11-13,12.04480843408481,002282.SZ +2024-11-13,12.078731879093112,603137.SH +2024-11-14,11.876464310981596,603012.SH +2024-11-14,11.884100505370792,603289.SH +2024-11-15,12.321240430303288,002133.SZ +2024-11-15,12.415408588930857,600173.SH +2024-11-18,11.725032735410332,002593.SZ +2024-11-18,11.750143179694653,603177.SH +2024-11-19,11.841239645513944,603682.SH +2024-11-19,11.873056206987677,600173.SH +2024-11-20,11.70419230792561,603238.SH +2024-11-20,11.843400863106085,600173.SH +2024-11-21,11.959502635068109,603137.SH +2024-11-21,12.0165144019009,600173.SH +2024-11-22,11.76363367443441,605299.SH +2024-11-22,12.069848215748856,600665.SH +2024-11-25,12.116341605655904,603137.SH +2024-11-25,12.182740484450775,600173.SH +2024-11-26,11.911943744290795,605287.SH +2024-11-26,11.93090384981525,002724.SZ +2024-11-27,11.731998352891967,002724.SZ +2024-11-27,11.850654526234905,605287.SH +2024-11-28,11.717780207252943,605189.SH +2024-11-28,11.978037369346925,001238.SZ +2024-11-29,11.601435160198337,605189.SH +2024-11-29,11.675632456791826,001333.SZ +2024-12-02,11.438938815843482,603238.SH +2024-12-02,11.546293035637555,002918.SZ +2024-12-03,11.841411107469103,002763.SZ +2024-12-03,12.0962690737451,600173.SH +2024-12-04,11.986215266544756,000897.SZ +2024-12-04,12.165493472837632,600173.SH +2024-12-05,11.832396000917292,600854.SH +2024-12-05,11.911249152257625,600173.SH +2024-12-06,11.419159442398321,001333.SZ +2024-12-06,11.460328389584024,002763.SZ +2024-12-09,11.680211434138496,002627.SZ +2024-12-09,11.945967360890489,600173.SH +2024-12-10,12.082993713382695,600173.SH +2024-12-10,12.150004379425095,600683.SH +2024-12-11,11.358018754829153,603700.SH +2024-12-11,11.539909806202301,002763.SZ +2024-12-12,11.153488705610284,603727.SH +2024-12-12,11.185914161267378,601177.SH +2024-12-13,11.521040249901553,000570.SZ +2024-12-13,11.562745405626316,002763.SZ +2024-12-16,11.54117738247216,600980.SH +2024-12-16,11.611299105161082,600854.SH +2024-12-17,11.751689027760369,002479.SZ +2024-12-17,11.75406483315718,600173.SH +2024-12-18,11.638343576456812,600359.SH +2024-12-18,12.204715851752763,600173.SH +2024-12-19,11.522516526500565,600854.SH +2024-12-19,12.186237634180417,600173.SH +2024-12-20,11.631541517498556,600173.SH +2024-12-20,11.786865589018364,600854.SH +2024-12-23,11.208882576142681,000514.SZ +2024-12-23,11.396089625324901,000965.SZ +2024-12-24,11.53001522252095,600173.SH +2024-12-24,11.635681469304329,600791.SH +2024-12-25,11.659310925268464,600791.SH +2024-12-25,11.877085049843586,600854.SH +2024-12-26,11.430930850795027,603798.SH +2024-12-26,11.729988317161654,600791.SH +2024-12-27,11.359043703049528,603320.SH +2024-12-27,11.647996742480984,600173.SH +2024-12-30,11.516834974807688,600463.SH +2024-12-30,11.780242219869992,600791.SH +2024-12-31,11.752534355196984,600543.SH +2024-12-31,11.833493415900017,000514.SZ +2025-01-02,11.513909422022211,600716.SH +2025-01-02,11.697273182968717,600173.SH +2025-01-03,12.403689194165592,600173.SH +2025-01-03,12.42544665270203,600791.SH +2025-01-06,10.942328731404043,000014.SZ +2025-01-06,10.966108777996235,000514.SZ +2025-01-07,10.700449015143704,600082.SH +2025-01-07,10.722044013002607,000014.SZ +2025-01-08,10.815986294932978,000926.SZ +2025-01-08,10.935029369357974,600463.SH +2025-01-09,11.363151355451187,600716.SH +2025-01-09,11.368926012755598,000926.SZ +2025-01-10,11.91247608046162,600159.SH +2025-01-10,11.978984947925019,600791.SH +2025-01-13,11.713091267716978,000926.SZ +2025-01-13,11.72042892189359,000014.SZ +2025-01-14,11.960060045460317,000797.SZ +2025-01-14,12.179098209840628,000042.SZ +2025-01-15,11.666498887130778,000926.SZ +2025-01-15,11.74055361050031,000014.SZ +2025-01-16,12.084731269784895,600159.SH +2025-01-16,12.08953522550441,600791.SH +2025-01-17,11.96559071725859,600665.SH +2025-01-17,12.042264675886683,600159.SH +2025-01-20,11.94484245426843,600665.SH +2025-01-20,11.94595872946151,600638.SH +2025-01-21,12.111901915117938,600082.SH +2025-01-21,12.205699770058594,600638.SH +2025-01-22,11.61911789622673,600665.SH +2025-01-22,11.654645406056055,000897.SZ +2025-01-23,12.41524866342799,600638.SH +2025-01-23,12.685581775854736,600665.SH +2025-01-24,12.464455347689578,600665.SH +2025-01-24,12.567199039650166,600638.SH +2025-01-27,11.506611418211156,600638.SH +2025-01-27,11.79222216803188,600082.SH +2025-02-05,11.500665924490553,000965.SZ +2025-02-05,11.759736815906642,600791.SH +2025-02-06,12.027319211744318,600159.SH +2025-02-06,12.235666995519333,600791.SH +2025-02-07,12.46479459605347,600159.SH +2025-02-07,12.54588819682955,600791.SH +2025-02-10,12.131570453196643,600082.SH +2025-02-10,12.284532715525735,600638.SH +2025-02-11,12.521872035531823,600159.SH +2025-02-11,12.534822789695443,600683.SH +2025-02-12,12.183394930353057,600791.SH +2025-02-12,12.335687366213826,600082.SH +2025-02-13,12.003943868091067,600683.SH +2025-02-13,12.142363901731601,600638.SH +2025-02-14,12.226434776821218,600854.SH +2025-02-14,12.3562007601372,600791.SH +2025-02-17,11.87902785824161,600791.SH +2025-02-17,12.055022554632504,600854.SH +2025-02-18,12.37764962940238,600791.SH +2025-02-18,12.499178026572213,600854.SH +2025-02-19,12.01070268826847,600082.SH +2025-02-19,12.167721650472554,600791.SH +2025-02-20,12.028390916166282,000965.SZ +2025-02-20,12.04365577826376,600791.SH +2025-02-21,11.848971733507078,600159.SH +2025-02-21,11.874565104843349,600082.SH +2025-02-24,11.75232661158245,600638.SH +2025-02-24,12.010691066550919,600791.SH +2025-02-25,11.880686306541952,600791.SH +2025-02-25,12.270173071890074,600854.SH +2025-02-26,11.812703156167506,600791.SH +2025-02-26,11.966104897991256,600854.SH +2025-02-27,11.233953929680826,603183.SH +2025-02-27,11.245984373775887,600791.SH +2025-02-28,12.258670843419617,600854.SH +2025-02-28,12.26724749716282,000965.SZ +2025-03-03,12.351744419067606,600082.SH +2025-03-03,12.626619982235383,600159.SH +2025-03-04,12.327186432342604,000897.SZ +2025-03-04,12.37452679880043,600854.SH +2025-03-05,11.882926687630489,600854.SH +2025-03-05,12.170339776940807,000965.SZ +2025-03-06,11.779891669745503,002454.SZ +2025-03-06,11.8443839820282,600082.SH +2025-03-07,12.171150368104822,600082.SH +2025-03-07,12.440808469423668,000897.SZ +2025-03-10,12.573820733453656,600082.SH +2025-03-10,12.753053704206803,600854.SH +2025-03-11,12.165774735166563,000897.SZ +2025-03-11,12.395433536561045,600082.SH +2025-03-12,12.30494860695175,600791.SH +2025-03-12,12.402288598174644,600082.SH +2025-03-13,11.99418081009836,000514.SZ +2025-03-13,12.076595897492986,000897.SZ +2025-03-14,12.123565332836492,600082.SH +2025-03-14,12.421450761290798,600683.SH +2025-03-17,12.342321037087775,600791.SH +2025-03-17,12.357959655244677,600683.SH +2025-03-18,12.501630722356012,600854.SH +2025-03-18,12.612014607150964,600683.SH +2025-03-19,12.635654096833587,600854.SH +2025-03-19,12.680999382192615,000965.SZ +2025-03-20,12.96400689084521,600683.SH +2025-03-20,13.029778434003992,600791.SH +2025-03-21,12.673217148197796,600159.SH +2025-03-21,12.929492889880125,600791.SH +2025-03-24,11.910804379394538,000897.SZ +2025-03-24,12.000239728269216,000926.SZ +2025-03-25,12.070517517130234,000897.SZ +2025-03-25,12.383507909879405,600159.SH +2025-03-26,11.58676562166584,000897.SZ +2025-03-26,11.884263153705062,600683.SH +2025-03-27,11.813541143836602,002443.SZ +2025-03-27,12.141849007020335,000965.SZ +2025-03-28,11.996115941665423,600082.SH +2025-03-28,12.156265999764758,000965.SZ +2025-03-31,12.132314894097815,600791.SH +2025-03-31,12.320471667948294,600159.SH +2025-04-01,11.848913430869485,600503.SH +2025-04-01,11.869027666006247,600159.SH +2025-04-02,11.555954494821226,600854.SH +2025-04-02,11.641206637528498,600638.SH +2025-04-03,11.491490444109115,600159.SH +2025-04-03,11.95783637993002,600854.SH +2025-04-07,11.51295435959414,600082.SH +2025-04-07,11.724769629427945,000514.SZ +2025-04-08,11.49132487271013,600503.SH +2025-04-08,11.661832960758991,600791.SH +2025-04-09,11.216165434843019,600854.SH +2025-04-09,11.28093807154939,600082.SH +2025-04-10,11.283603627972314,600854.SH +2025-04-10,11.400904574500988,000668.SZ +2025-04-11,11.960511344985953,600743.SH +2025-04-11,11.977232534410026,000863.SZ +2025-04-14,11.830990721643458,000863.SZ +2025-04-14,11.875752315664375,600854.SH +2025-04-15,11.925335050133073,000514.SZ +2025-04-15,11.989784587103253,600159.SH +2025-04-16,11.88869228986046,600743.SH +2025-04-16,11.96276114491518,600159.SH +2025-04-17,11.774643719795577,600322.SH +2025-04-17,11.79317395122967,600854.SH +2025-04-18,11.552939343300098,000608.SZ +2025-04-18,11.645398531935786,600854.SH +2025-04-21,12.078909544460746,600159.SH +2025-04-21,12.204524905600266,600854.SH +2025-04-22,12.105949728942955,600692.SH +2025-04-22,12.181279693675299,600082.SH +2025-04-23,12.618762434477766,600503.SH +2025-04-23,12.727735912767377,600665.SH +2025-04-24,12.305203300931469,600683.SH +2025-04-24,12.504022326949809,600665.SH +2025-04-25,12.672475932555626,600082.SH +2025-04-25,12.68599179282778,600638.SH +2025-04-28,12.516299934346627,600791.SH +2025-04-28,12.630050365691156,600638.SH +2025-04-29,12.600576356942351,600638.SH +2025-04-29,12.628048034562491,600716.SH +2025-04-30,12.595107452210618,600716.SH +2025-04-30,12.666569522510592,600791.SH +2025-05-06,12.682203466971416,600716.SH +2025-05-06,12.814329139957012,600791.SH +2025-05-07,12.490722439711377,600854.SH +2025-05-07,12.731169804862798,600791.SH +2025-05-08,12.387468456684092,600854.SH +2025-05-08,12.388939956262064,600791.SH +2025-05-09,12.521847708854455,600533.SH +2025-05-09,12.531347430588399,600716.SH +2025-05-12,12.424791032880385,600533.SH +2025-05-12,12.500332997254642,600665.SH +2025-05-13,12.482169995791754,600791.SH +2025-05-13,12.653404520920976,600854.SH +2025-05-14,12.558941260357859,600683.SH +2025-05-14,12.583799223209608,600791.SH +2025-05-15,12.294005964848063,600683.SH +2025-05-15,12.42930100582258,000897.SZ +2025-05-16,12.376723886905555,600159.SH +2025-05-16,12.460601674686107,600533.SH +2025-05-19,12.111254760654692,002476.SZ +2025-05-19,12.13247878953084,600488.SH +2025-05-20,12.199796508360162,000926.SZ +2025-05-20,12.237068955286247,600488.SH +2025-05-21,12.214622213997938,000919.SZ +2025-05-21,12.217142220792859,603878.SH +2025-05-22,12.415369494480597,600488.SH +2025-05-22,12.451285502263726,000919.SZ +2025-05-23,12.214910612991973,601996.SH +2025-05-23,12.242293439914857,600716.SH diff --git a/model/tabpfn-v2-classifier.ckpt b/model/tabpfn-v2-classifier.ckpt new file mode 100644 index 0000000..69433b7 Binary files /dev/null and b/model/tabpfn-v2-classifier.ckpt differ diff --git a/model/tabpfn-v2-regressor.ckpt b/model/tabpfn-v2-regressor.ckpt new file mode 100644 index 0000000..06fec0a Binary files /dev/null and b/model/tabpfn-v2-regressor.ckpt differ