Files
NewStock/main/data/update/update_daily_basic.ipynb

470 lines
18 KiB
Plaintext
Raw Normal View History

2025-02-12 00:21:33 +08:00
{
"cells": [
{
"cell_type": "code",
2025-05-06 23:42:40 +08:00
"execution_count": 1,
2025-02-12 00:21:33 +08:00
"id": "18d1d622-b083-4cc4-a6f8-7c1ed2d0edd2",
"metadata": {
"ExecuteTime": {
2025-04-10 23:17:22 +08:00
"end_time": "2025-04-09T14:57:36.913044Z",
"start_time": "2025-04-09T14:57:36.159612Z"
2025-02-12 00:21:33 +08:00
}
},
2025-05-06 23:42:40 +08:00
"outputs": [],
2025-02-12 00:21:33 +08:00
"source": [
"import tushare as ts\n",
"ts.set_token('3a0741c702ee7e5e5f2bf1f0846bafaafe4e320833240b2a7e4a685f')\n",
"pro = ts.pro_api()"
2025-05-06 23:42:40 +08:00
]
2025-02-12 00:21:33 +08:00
},
{
2025-02-15 23:33:34 +08:00
"cell_type": "code",
2025-05-13 15:30:06 +08:00
"execution_count": 2,
2025-02-15 23:33:34 +08:00
"id": "14671a7f72de2564",
2025-02-12 00:21:33 +08:00
"metadata": {
"ExecuteTime": {
2025-04-10 23:17:22 +08:00
"end_time": "2025-04-09T14:57:39.128278Z",
"start_time": "2025-04-09T14:57:36.918051Z"
2025-02-12 00:21:33 +08:00
}
},
2025-05-06 23:42:40 +08:00
"outputs": [],
2025-02-12 00:21:33 +08:00
"source": [
"from datetime import datetime\n",
"import pandas as pd\n",
2025-03-31 23:08:03 +08:00
"import warnings\n",
"\n",
"warnings.filterwarnings(\"ignore\")\n",
"def filter_rows(df):\n",
" # 按照 name 和 start_date 分组\n",
" def select_row(group):\n",
" # 如果有 end_date 不为 NaT 的行,优先保留这些行\n",
" valid_rows = group[group['end_date'].notna()]\n",
" if not valid_rows.empty:\n",
" return valid_rows.iloc[0] # 返回第一个有效行\n",
" else:\n",
" return group.iloc[0] # 如果没有有效行,返回第一行\n",
"\n",
" filtered_df = df.groupby(['name', 'start_date'], group_keys=False).apply(select_row)\n",
" filtered_df = filtered_df.reset_index(drop=True)\n",
" return filtered_df\n",
2025-02-12 00:21:33 +08:00
"\n",
"def is_st(name_change_dict, stock_code, target_date):\n",
" target_date = datetime.strptime(target_date, '%Y%m%d')\n",
" if stock_code not in name_change_dict.keys():\n",
" return False\n",
" df = name_change_dict[stock_code]\n",
" for i in range(len(df)):\n",
" sds = df.iloc[i, 2]\n",
" eds = df.iloc[i, 3]\n",
" if eds is None or eds is pd.NaT:\n",
" eds = datetime.now()\n",
" if (target_date - sds).days >= 0 and (target_date - eds).days <= 0:\n",
" return True\n",
" return False\n",
"\n",
2025-06-02 22:23:44 +08:00
"name_change_df = pd.read_hdf('/mnt/d/PyProject/NewStock/data/name_change.h5', key='name_change')\n",
2025-02-12 00:21:33 +08:00
"name_change_df = name_change_df.drop_duplicates(keep='first')\n",
"\n",
"# 确保 name_change_df 的日期格式正确\n",
"name_change_df['start_date'] = pd.to_datetime(name_change_df['start_date'], format='%Y%m%d')\n",
"name_change_df['end_date'] = pd.to_datetime(name_change_df['end_date'], format='%Y%m%d', errors='coerce')\n",
2025-05-08 15:42:17 +08:00
"# name_change_df = name_change_df[name_change_df.name.str.contains('ST') ]\n",
2025-02-12 00:21:33 +08:00
"name_change_dict = {}\n",
"for ts_code, group in name_change_df.groupby('ts_code'):\n",
" # 只保留 'ST' 和 '*ST' 的记录\n",
2025-05-06 23:42:40 +08:00
" # st_data = group[(group['change_reason'] == 'ST') | (group['change_reason'] == '*ST')]\n",
2025-05-08 15:42:17 +08:00
" st_data = group[(group['name'].str.contains('ST')) | (group['name'].str.contains('退'))]\n",
2025-02-12 00:21:33 +08:00
" if not st_data.empty:\n",
2025-03-31 23:08:03 +08:00
" name_change_dict[ts_code] = filter_rows(st_data)"
2025-05-06 23:42:40 +08:00
]
2025-02-12 00:21:33 +08:00
},
{
2025-02-15 23:33:34 +08:00
"cell_type": "code",
2025-05-13 15:30:06 +08:00
"execution_count": 3,
2025-02-15 23:33:34 +08:00
"id": "e7f8cce2f80e2f20",
2025-02-12 00:21:33 +08:00
"metadata": {
"ExecuteTime": {
2025-04-10 23:17:22 +08:00
"end_time": "2025-04-09T14:58:09.296046Z",
"start_time": "2025-04-09T14:57:39.339423Z"
2025-02-12 00:21:33 +08:00
}
},
2025-05-06 23:42:40 +08:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
2025-06-10 15:22:25 +08:00
"Index: 8701511 entries, 0 to 26922\n",
2025-05-06 23:42:40 +08:00
"Data columns (total 2 columns):\n",
" # Column Dtype \n",
"--- ------ ----- \n",
" 0 ts_code object\n",
" 1 trade_date object\n",
"dtypes: object(2)\n",
2025-06-10 15:22:25 +08:00
"memory usage: 199.2+ MB\n",
2025-05-06 23:42:40 +08:00
"None\n",
2025-06-10 15:22:25 +08:00
"20250530\n",
"20250603\n"
2025-05-06 23:42:40 +08:00
]
}
],
2025-02-12 00:21:33 +08:00
"source": [
"import time\n",
"from concurrent.futures import ThreadPoolExecutor, as_completed\n",
"\n",
2025-06-02 22:23:44 +08:00
"h5_filename = '/mnt/d/PyProject/NewStock/data/daily_basic.h5'\n",
2025-02-12 00:21:33 +08:00
"key = '/daily_basic'\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.info())\n",
" max_date = df['trade_date'].max()\n",
"\n",
"print(max_date)\n",
2025-05-06 23:42:40 +08:00
"trade_cal = pro.trade_cal(exchange='', start_date='20170101', end_date='20250720')\n",
2025-02-12 00:21:33 +08:00
"trade_cal = trade_cal[trade_cal['is_open'] == 1] # 只保留交易日\n",
"trade_dates = trade_cal[trade_cal['cal_date'] > max_date]['cal_date'].tolist()\n",
"start_date = min(trade_dates)\n",
"print(start_date)"
2025-05-06 23:42:40 +08:00
]
2025-04-09 22:57:01 +08:00
},
{
"cell_type": "code",
2025-05-13 15:30:06 +08:00
"execution_count": 4,
2025-04-09 22:57:01 +08:00
"id": "553cfb36-f560-4cc4-b2bc-68323ccc5072",
"metadata": {
"ExecuteTime": {
2025-04-10 23:17:22 +08:00
"end_time": "2025-04-09T14:58:16.817010Z",
"start_time": "2025-04-09T14:58:09.326485Z"
2025-05-06 23:42:40 +08:00
},
"scrolled": true
2025-04-09 22:57:01 +08:00
},
2025-05-06 23:42:40 +08:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-05-26 21:34:36 +08:00
"任务 20250718 完成\n",
2025-06-02 22:23:44 +08:00
"任务 20250717 完成\n",
2025-05-26 21:34:36 +08:00
"任务 20250716 完成\n",
2025-06-02 22:23:44 +08:00
"任务 20250715 完成\n",
2025-05-13 15:30:06 +08:00
"任务 20250714 完成\n",
2025-05-26 21:34:36 +08:00
"任务 20250711 完成\n",
"任务 20250710 完成\n",
2025-06-10 15:22:25 +08:00
"任务 20250709 完成\n",
2025-05-06 23:42:40 +08:00
"任务 20250708 完成\n",
2025-05-08 15:42:17 +08:00
"任务 20250707 完成\n",
2025-05-06 23:42:40 +08:00
"任务 20250703 完成\n",
2025-06-10 15:22:25 +08:00
"任务 20250704 完成\n",
2025-05-06 23:42:40 +08:00
"任务 20250702 完成\n",
"任务 20250701 完成\n",
"任务 20250630 完成\n",
"任务 20250627 完成\n",
2025-05-26 21:34:36 +08:00
"任务 20250626 完成\n",
2025-06-02 22:23:44 +08:00
"任务 20250625 完成\n",
2025-05-06 23:42:40 +08:00
"任务 20250624 完成\n",
"任务 20250623 完成\n",
2025-05-26 21:34:36 +08:00
"任务 20250620 完成\n",
2025-06-02 22:23:44 +08:00
"任务 20250619 完成\n",
2025-05-06 23:42:40 +08:00
"任务 20250618 完成\n",
"任务 20250617 完成\n",
"任务 20250616 完成\n",
"任务 20250613 完成\n",
"任务 20250612 完成\n",
"任务 20250611 完成\n",
"任务 20250610 完成\n",
"任务 20250609 完成\n",
"任务 20250605 完成\n",
2025-06-10 15:22:25 +08:00
"任务 20250606 完成\n",
2025-06-02 22:23:44 +08:00
"任务 20250604 完成\n",
2025-06-10 15:22:25 +08:00
"任务 20250603 完成\n"
2025-05-06 23:42:40 +08:00
]
}
],
2025-02-12 00:21:33 +08:00
"source": [
"\n",
"\n",
"# 使用 HDFStore 存储数据\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",
" daily_basic_data = pro.daily_basic(ts_code='', trade_date=trade_date)\n",
" if daily_basic_data is not None and not daily_basic_data.empty:\n",
" # 添加交易日期列标识\n",
" daily_basic_data['trade_date'] = trade_date\n",
" daily_basic_data['is_st'] = daily_basic_data.apply(\n",
" lambda row: is_st(name_change_dict, row['ts_code'], row['trade_date']), axis=1\n",
" )\n",
" time.sleep(0.2)\n",
" # print(f\"成功获取并保存 {trade_date} 的每日基础数据\")\n",
" return daily_basic_data\n",
"\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",
" # 计数一次 API 调用\n",
" api_call_count += 1\n",
"\n",
" # 每调用 300 次,检查时间是否少于 1 分钟,如果少于则等待剩余时间\n",
" if api_call_count % 150 == 0:\n",
" elapsed = time.time() - batch_start_time\n",
" if elapsed < 60:\n",
" sleep_time = 60 - elapsed\n",
" print(f\"已调用 150 次 API等待 {sleep_time:.2f} 秒以满足速率限制...\")\n",
" time.sleep(sleep_time)\n",
" # 重置批次起始时间\n",
" batch_start_time = time.time()\n",
"\n"
2025-05-06 23:42:40 +08:00
]
2025-02-12 00:21:33 +08:00
},
{
2025-02-15 23:33:34 +08:00
"cell_type": "code",
2025-05-13 15:30:06 +08:00
"execution_count": 5,
2025-02-15 23:33:34 +08:00
"id": "919023c693d7a47a",
2025-02-12 00:21:33 +08:00
"metadata": {
"ExecuteTime": {
2025-04-10 23:17:22 +08:00
"end_time": "2025-04-09T14:58:16.864178Z",
"start_time": "2025-04-09T14:58:16.855084Z"
2025-02-12 00:21:33 +08:00
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-05-26 21:34:36 +08:00
" ts_code trade_date close turnover_rate turnover_rate_f \\\n",
2025-06-10 15:22:25 +08:00
"0 600845.SH 20250605 25.68 0.8243 2.5243 \n",
"1 000153.SZ 20250605 6.12 1.9588 2.7729 \n",
"2 002086.SZ 20250605 2.76 5.2365 6.0861 \n",
"3 300020.SZ 20250605 3.87 2.2399 2.5078 \n",
"4 605567.SH 20250605 9.90 2.5088 4.5825 \n",
2025-05-26 21:34:36 +08:00
"... ... ... ... ... ... \n",
2025-06-10 15:22:25 +08:00
"21540 000068.SZ 20250603 3.38 1.1289 2.0176 \n",
"21541 301135.SZ 20250603 25.84 4.8553 4.8553 \n",
"21542 603026.SH 20250603 33.42 0.4772 0.7542 \n",
"21543 002079.SZ 20250603 9.45 1.0524 1.3694 \n",
"21544 688335.SH 20250603 12.69 1.1169 2.2103 \n",
2025-02-12 00:21:33 +08:00
"\n",
2025-06-10 15:22:25 +08:00
" volume_ratio pe pe_ttm pb ps ps_ttm dv_ratio \\\n",
"0 1.47 32.6889 34.9249 6.1529 5.4276 5.7895 3.2460 \n",
"1 0.95 17.6853 18.7324 1.4099 0.6639 0.6930 1.7509 \n",
"2 1.00 NaN NaN 3.8361 15.8946 15.5013 0.0000 \n",
"3 0.66 NaN NaN 0.9763 5.6130 21.2702 0.0000 \n",
"4 0.99 242.4925 78.2360 1.8181 0.7875 0.7674 0.0000 \n",
"... ... ... ... ... ... ... ... \n",
"21540 1.02 259.4835 175.8911 4.9250 3.3696 3.4641 0.0000 \n",
"21541 0.98 68.9144 62.8352 2.0805 2.0868 1.9475 1.1264 \n",
"21542 0.95 412.5304 NaN 1.7468 1.2212 1.1453 0.1197 \n",
"21543 0.93 103.8909 74.2709 2.4969 1.3579 1.4180 0.4011 \n",
"21544 0.87 NaN NaN 1.6474 10.0514 8.7963 NaN \n",
2025-02-12 00:21:33 +08:00
"\n",
2025-06-10 15:22:25 +08:00
" dv_ttm total_share float_share free_share total_mv \\\n",
"0 3.2460 288380.3858 213374.0521 69678.6847 7.405608e+06 \n",
"1 1.6340 46477.3722 45294.3722 31996.8047 2.844415e+05 \n",
"2 NaN 195894.6500 151702.1291 130526.0564 5.406692e+05 \n",
"3 NaN 79467.7974 76663.9584 68475.6577 3.075404e+05 \n",
"4 NaN 20000.0000 20000.0000 10949.3050 1.980000e+05 \n",
"... ... ... ... ... ... \n",
"21540 NaN 100667.1464 100667.1464 56326.7969 3.402550e+05 \n",
"21541 1.1264 10195.2000 5558.9000 5558.9000 2.634440e+05 \n",
"21542 0.1197 20268.0000 20268.0000 12822.4285 6.773566e+05 \n",
"21543 0.4011 81013.9316 80937.8478 62203.4223 7.655817e+05 \n",
"21544 NaN 14803.4592 14803.4592 7480.3745 1.878559e+05 \n",
2025-02-12 00:21:33 +08:00
"\n",
2025-05-26 21:34:36 +08:00
" circ_mv is_st \n",
2025-06-10 15:22:25 +08:00
"0 5.479446e+06 False \n",
"1 2.772016e+05 False \n",
"2 4.186979e+05 False \n",
"3 2.966895e+05 True \n",
"4 1.980000e+05 False \n",
2025-05-26 21:34:36 +08:00
"... ... ... \n",
2025-06-10 15:22:25 +08:00
"21540 3.402550e+05 False \n",
"21541 1.436420e+05 False \n",
"21542 6.773566e+05 False \n",
"21543 7.648627e+05 False \n",
"21544 1.878559e+05 False \n",
2025-02-12 00:21:33 +08:00
"\n",
2025-06-10 15:22:25 +08:00
"[21545 rows x 19 columns]\n"
2025-02-12 00:21:33 +08:00
]
}
],
2025-05-06 23:42:40 +08:00
"source": [
"all_daily_data_df = pd.concat(all_daily_data, ignore_index=True)\n",
"print(all_daily_data_df)"
]
2025-02-12 00:21:33 +08:00
},
{
2025-02-15 23:33:34 +08:00
"cell_type": "code",
2025-05-13 15:30:06 +08:00
"execution_count": 6,
2025-02-15 23:33:34 +08:00
"id": "28cb78d032671b20",
2025-02-12 00:21:33 +08:00
"metadata": {
"ExecuteTime": {
2025-04-10 23:17:22 +08:00
"end_time": "2025-04-09T14:58:16.881685Z",
"start_time": "2025-04-09T14:58:16.871184Z"
2025-02-12 00:21:33 +08:00
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-05-26 21:34:36 +08:00
" ts_code trade_date close turnover_rate turnover_rate_f \\\n",
2025-06-10 15:22:25 +08:00
"3 300020.SZ 20250605 3.87 2.2399 2.5078 \n",
"5 000506.SZ 20250605 8.11 11.2852 16.8442 \n",
"43 600243.SH 20250605 3.09 2.3385 2.8128 \n",
"48 002528.SZ 20250605 2.63 1.7748 3.7890 \n",
"78 300044.SZ 20250605 3.43 3.7959 3.9616 \n",
2025-05-26 21:34:36 +08:00
"... ... ... ... ... ... \n",
2025-06-10 15:22:25 +08:00
"21429 600243.SH 20250603 3.06 3.3544 4.0348 \n",
"21434 002528.SZ 20250603 2.52 1.4622 3.1216 \n",
"21464 300044.SZ 20250603 3.45 4.3894 4.5810 \n",
"21494 300097.SZ 20250603 4.89 2.6755 3.1205 \n",
"21515 600200.SH 20250603 2.59 6.4745 7.8264 \n",
2025-02-12 00:21:33 +08:00
"\n",
2025-06-10 15:22:25 +08:00
" volume_ratio pe pe_ttm pb ps ps_ttm dv_ratio \\\n",
"3 0.66 NaN NaN 0.9763 5.6130 21.2702 0.0 \n",
"5 5.96 NaN NaN 14.2472 22.6112 19.7704 0.0 \n",
"43 0.52 NaN NaN 2.1216 5.7313 5.8761 0.0 \n",
"48 1.08 NaN NaN 17.3769 3.3364 4.0382 0.0 \n",
"78 1.05 NaN NaN 25.1987 18.2860 27.0836 0.0 \n",
"... ... ... ... ... ... ... ... \n",
"21429 0.68 NaN NaN 2.1010 5.6757 5.8190 0.0 \n",
"21434 0.77 NaN NaN 16.6502 3.1969 3.8693 0.0 \n",
"21464 1.26 NaN NaN 25.3456 18.3927 27.2415 0.0 \n",
"21494 1.55 NaN NaN 3.0435 3.6740 4.2734 0.0 \n",
"21515 0.79 26.1689 NaN 1.0523 1.1539 1.5214 0.0 \n",
2025-02-12 00:21:33 +08:00
"\n",
2025-06-10 15:22:25 +08:00
" dv_ttm total_share float_share free_share total_mv circ_mv \\\n",
"3 NaN 79467.7974 76663.9584 68475.6577 307540.3759 296689.5190 \n",
"5 NaN 92901.7761 92867.0961 62218.8027 753433.4042 753152.1494 \n",
"43 NaN 43885.0000 43885.0000 36485.0000 135604.6500 135604.6500 \n",
"48 NaN 119867.5082 104974.0608 49171.2582 315251.5466 276081.7799 \n",
"78 NaN 76386.9228 76375.7508 73182.1277 262007.1452 261968.8252 \n",
"... ... ... ... ... ... ... \n",
"21429 NaN 43885.0000 43885.0000 36485.0000 134288.1000 134288.1000 \n",
"21434 NaN 119867.5082 104974.0608 49171.2582 302066.1207 264534.6332 \n",
"21464 NaN 76386.9228 76375.7508 73182.1277 263534.8837 263496.3403 \n",
"21494 NaN 28854.9669 27000.9948 23150.5534 141100.7881 132034.8646 \n",
"21515 NaN 71215.1832 71087.9480 58808.3718 184447.3245 184117.7853 \n",
2025-06-02 22:23:44 +08:00
"\n",
2025-06-10 15:22:25 +08:00
" is_st \n",
"3 True \n",
"5 True \n",
"43 True \n",
"48 True \n",
"78 True \n",
"... ... \n",
"21429 True \n",
"21434 True \n",
"21464 True \n",
"21494 True \n",
"21515 True \n",
2025-02-12 00:21:33 +08:00
"\n",
2025-06-10 15:22:25 +08:00
"[753 rows x 19 columns]\n"
2025-02-12 00:21:33 +08:00
]
}
],
2025-05-06 23:42:40 +08:00
"source": [
"print(all_daily_data_df[all_daily_data_df['is_st']])"
]
2025-02-12 00:21:33 +08:00
},
{
2025-02-15 23:33:34 +08:00
"cell_type": "code",
2025-05-13 15:30:06 +08:00
"execution_count": 7,
2025-02-15 23:33:34 +08:00
"id": "692b58674b7462c9",
2025-02-12 00:21:33 +08:00
"metadata": {
"ExecuteTime": {
2025-04-10 23:17:22 +08:00
"end_time": "2025-04-09T14:58:17.773453Z",
"start_time": "2025-04-09T14:58:16.903459Z"
2025-02-12 00:21:33 +08:00
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"所有每日基础数据获取并保存完毕!\n"
]
}
],
2025-05-06 23:42:40 +08:00
"source": [
"# 将数据保存为 HDF5 文件table 格式)\n",
"all_daily_data_df.to_hdf(h5_filename, key='daily_basic', mode='a', format='table', append=True, data_columns=True)\n",
"\n",
"print(\"所有每日基础数据获取并保存完毕!\")\n"
]
2025-02-12 00:21:33 +08:00
},
{
2025-02-15 23:33:34 +08:00
"cell_type": "code",
2025-05-13 15:30:06 +08:00
"execution_count": 8,
2025-02-15 23:33:34 +08:00
"id": "d7a773fc20293477",
2025-02-12 00:21:33 +08:00
"metadata": {
"ExecuteTime": {
2025-04-10 23:17:22 +08:00
"end_time": "2025-04-09T14:58:24.305403Z",
"start_time": "2025-04-09T14:58:17.816332Z"
2025-02-12 00:21:33 +08:00
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
2025-06-10 15:22:25 +08:00
"Index: 8723056 entries, 0 to 21544\n",
2025-02-12 00:21:33 +08:00
"Data columns (total 3 columns):\n",
" # Column Dtype \n",
"--- ------ ----- \n",
" 0 ts_code object\n",
" 1 trade_date object\n",
" 2 is_st bool \n",
"dtypes: bool(1), object(2)\n",
2025-06-10 15:22:25 +08:00
"memory usage: 208.0+ MB\n",
2025-02-12 00:21:33 +08:00
"None\n"
]
}
],
2025-05-06 23:42:40 +08:00
"source": [
"with pd.HDFStore(h5_filename, mode='r') as store:\n",
" df = store[key][['ts_code', 'trade_date', 'is_st']]\n",
" print(df.info())"
]
2025-02-12 00:21:33 +08:00
}
],
"metadata": {
"kernelspec": {
2025-06-02 22:23:44 +08:00
"display_name": "stock",
2025-02-12 00:21:33 +08:00
"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",
2025-06-02 22:23:44 +08:00
"version": "3.13.2"
2025-02-12 00:21:33 +08:00
}
},
"nbformat": 4,
"nbformat_minor": 5
}