353 lines
11 KiB
Plaintext
353 lines
11 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"id": "initial_id",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-02-10T15:46:10.320268Z",
|
||
"start_time": "2025-02-10T15:46:10.310270Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"hello world\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print('hello world')\n",
|
||
"\n",
|
||
"import warnings\n",
|
||
"warnings.filterwarnings(\"ignore\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "f294ba92-512a-48e6-bbaa-e19401c691ba",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-02-10T15:46:11.019636Z",
|
||
"start_time": "2025-02-10T15:46:10.330271Z"
|
||
}
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"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": null,
|
||
"id": "f403cc963e1d39b",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-02-10T15:47:42.715615Z",
|
||
"start_time": "2025-02-10T15:46:11.085042Z"
|
||
},
|
||
"scrolled": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"任务 000002.SZ 完成\n",
|
||
"任务 000004.SZ 完成\n",
|
||
"任务 000001.SZ 完成\n",
|
||
"任务 000006.SZ 完成\n",
|
||
"任务 000007.SZ 完成\n",
|
||
"任务 000008.SZ 完成\n",
|
||
"任务 000010.SZ 完成\n",
|
||
"任务 000009.SZ 完成\n",
|
||
"任务 000011.SZ 完成\n",
|
||
"任务 000012.SZ 完成\n",
|
||
"任务 000016.SZ 完成\n",
|
||
"任务 000014.SZ 完成\n",
|
||
"任务 000019.SZ 完成\n",
|
||
"任务 000020.SZ 完成\n",
|
||
"任务 000017.SZ 完成\n",
|
||
"任务 000021.SZ 完成\n",
|
||
"任务 000025.SZ 完成\n",
|
||
"任务 000026.SZ 完成\n",
|
||
"任务 000027.SZ 完成\n",
|
||
"任务 000028.SZ 完成\n",
|
||
"任务 000029.SZ 完成\n",
|
||
"任务 000030.SZ 完成\n",
|
||
"任务 000031.SZ 完成\n",
|
||
"任务 000032.SZ 完成\n",
|
||
"任务 000034.SZ 完成\n",
|
||
"任务 000035.SZ 完成\n",
|
||
"任务 000036.SZ 完成\n",
|
||
"任务 000037.SZ 完成\n",
|
||
"任务 000039.SZ 完成\n",
|
||
"任务 000042.SZ 完成\n",
|
||
"任务 000040.SZ 完成\n",
|
||
"任务 000045.SZ 完成\n",
|
||
"任务 000048.SZ 完成\n",
|
||
"任务 000049.SZ 完成\n",
|
||
"任务 000050.SZ 完成\n",
|
||
"任务 000055.SZ 完成\n",
|
||
"任务 000056.SZ 完成\n",
|
||
"任务 000060.SZ 完成\n",
|
||
"任务 000058.SZ 完成\n",
|
||
"任务 000059.SZ 完成\n",
|
||
"任务 000061.SZ 完成\n",
|
||
"任务 000065.SZ 完成\n",
|
||
"任务 000062.SZ 完成\n",
|
||
"任务 000063.SZ 完成\n",
|
||
"任务 000066.SZ 完成\n",
|
||
"任务 000068.SZ 完成\n",
|
||
"任务 000069.SZ 完成\n",
|
||
"任务 000070.SZ 完成\n",
|
||
"任务 000078.SZ 完成\n",
|
||
"任务 000088.SZ 完成\n",
|
||
"任务 000089.SZ 完成\n",
|
||
"任务 000090.SZ 完成\n",
|
||
"任务 000096.SZ 完成\n",
|
||
"任务 000099.SZ 完成\n",
|
||
"任务 000100.SZ 完成\n",
|
||
"任务 000151.SZ 完成\n",
|
||
"任务 000153.SZ 完成\n",
|
||
"任务 000155.SZ 完成\n",
|
||
"任务 000156.SZ 完成\n",
|
||
"任务 000157.SZ 完成\n",
|
||
"任务 000158.SZ 完成\n",
|
||
"任务 000159.SZ 完成\n",
|
||
"任务 000301.SZ 完成\n",
|
||
"任务 000166.SZ 完成\n",
|
||
"任务 000333.SZ 完成\n",
|
||
"任务 000338.SZ 完成\n",
|
||
"任务 000400.SZ 完成\n",
|
||
"任务 000401.SZ 完成\n",
|
||
"任务 000402.SZ 完成\n",
|
||
"任务 000403.SZ 完成\n",
|
||
"任务 000404.SZ 完成\n",
|
||
"任务 000407.SZ 完成\n",
|
||
"任务 000408.SZ 完成\n",
|
||
"任务 000409.SZ 完成\n",
|
||
"任务 000410.SZ 完成\n",
|
||
"任务 000411.SZ 完成\n",
|
||
"任务 000415.SZ 完成\n",
|
||
"任务 000417.SZ 完成\n",
|
||
"任务 000419.SZ 完成\n",
|
||
"任务 000420.SZ 完成\n",
|
||
"任务 000421.SZ 完成\n",
|
||
"任务 000422.SZ 完成\n",
|
||
"任务 000423.SZ 完成\n",
|
||
"任务 000425.SZ 完成\n",
|
||
"任务 000428.SZ 完成\n",
|
||
"任务 000426.SZ 完成\n",
|
||
"任务 000429.SZ 完成\n",
|
||
"任务 000430.SZ 完成\n",
|
||
"任务 000488.SZ 完成\n",
|
||
"任务 000498.SZ 完成\n",
|
||
"任务 000501.SZ 完成\n",
|
||
"任务 000503.SZ 完成\n",
|
||
"任务 000504.SZ 完成\n",
|
||
"任务 000505.SZ 完成\n",
|
||
"任务 000506.SZ 完成\n",
|
||
"任务 000507.SZ 完成\n",
|
||
"任务 000509.SZ 完成\n",
|
||
"任务 000510.SZ 完成\n",
|
||
"任务 000513.SZ 完成\n",
|
||
"任务 000514.SZ 完成\n",
|
||
"任务 000516.SZ 完成\n",
|
||
"任务 000517.SZ 完成\n",
|
||
"任务 000518.SZ 完成\n",
|
||
"任务 000519.SZ 完成\n",
|
||
"任务 000520.SZ 完成\n",
|
||
"任务 000521.SZ 完成\n",
|
||
"任务 000523.SZ 完成\n",
|
||
"任务 000525.SZ 完成\n",
|
||
"任务 000524.SZ 完成\n",
|
||
"任务 000526.SZ 完成\n",
|
||
"任务 000528.SZ 完成\n",
|
||
"任务 000530.SZ 完成\n",
|
||
"任务 000529.SZ 完成\n",
|
||
"任务 000531.SZ 完成\n",
|
||
"任务 000532.SZ 完成\n",
|
||
"任务 000533.SZ 完成\n",
|
||
"任务 000534.SZ 完成\n",
|
||
"任务 000536.SZ 完成\n",
|
||
"任务 000537.SZ 完成\n",
|
||
"任务 000539.SZ 完成\n",
|
||
"任务 000538.SZ 完成\n",
|
||
"任务 000541.SZ 完成\n",
|
||
"任务 000543.SZ 完成\n",
|
||
"任务 000545.SZ 完成\n",
|
||
"任务 000544.SZ 完成\n",
|
||
"任务 000546.SZ 完成\n",
|
||
"任务 000547.SZ 完成\n",
|
||
"任务 000550.SZ 完成\n",
|
||
"任务 000548.SZ 完成\n",
|
||
"任务 000551.SZ 完成\n",
|
||
"任务 000552.SZ 完成\n",
|
||
"任务 000553.SZ 完成\n",
|
||
"任务 000554.SZ 完成\n",
|
||
"任务 000555.SZ 完成\n",
|
||
"任务 000557.SZ 完成\n",
|
||
"任务 000558.SZ 完成\n",
|
||
"任务 000559.SZ 完成\n",
|
||
"任务 000560.SZ 完成\n",
|
||
"任务 000561.SZ 完成\n",
|
||
"任务 000563.SZ 完成\n",
|
||
"任务 000564.SZ 完成\n",
|
||
"任务 000565.SZ 完成\n",
|
||
"任务 000566.SZ 完成\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"\n",
|
||
"\n",
|
||
"# 读取本地保存的股票列表 CSV 文件(假设文件名为 stocks_data.csv)\n",
|
||
"from concurrent.futures import ThreadPoolExecutor, as_completed\n",
|
||
"\n",
|
||
"\n",
|
||
"stocks_df = pd.read_csv('/mnt/d/PyProject/NewStock/stocks_list.csv', encoding='utf-8-sig')\n",
|
||
"\n",
|
||
"# 用于存放所有股票的日线数据(每次获取的 DataFrame)\n",
|
||
"daily_data_list = []\n",
|
||
"\n",
|
||
"# API 调用计数和时间控制变量\n",
|
||
"api_call_count = 0\n",
|
||
"batch_start_time = time.time()\n",
|
||
"\n",
|
||
"def get_data(ts_code):\n",
|
||
" start_time = time.time()\n",
|
||
" daily_data = ts.pro_bar(ts_code=ts_code, adj='hfq', start_date='20170101')\n",
|
||
" # 如果返回数据不为空,则添加一列标识股票代码\n",
|
||
" if time.time() - start_time < 0.15:\n",
|
||
" time.sleep(0.5)\n",
|
||
" if daily_data is not None and not daily_data.empty:\n",
|
||
" return daily_data\n",
|
||
"\n",
|
||
"\n",
|
||
"# 循环遍历每个股票代码并获取数据\n",
|
||
"with ThreadPoolExecutor(max_workers=4) as executor:\n",
|
||
" future_to_date = {executor.submit(get_data, row['ts_code']): row['ts_code'] for idx, row in stocks_df.iterrows()}\n",
|
||
"\n",
|
||
" for future in as_completed(future_to_date):\n",
|
||
" ts_code = future_to_date[future]\n",
|
||
" try:\n",
|
||
" result = future.result()\n",
|
||
" daily_data_list.append(result)\n",
|
||
" print(f\"任务 {ts_code} 完成\")\n",
|
||
" except Exception as e:\n",
|
||
" print(f\"获取 {ts_code} 数据时出错: {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\"已调用300次API,等待 {sleep_time:.2f} 秒以满足速率限制...\")\n",
|
||
" time.sleep(sleep_time)\n",
|
||
" # 重置批次起始时间\n",
|
||
" batch_start_time = time.time()\n",
|
||
"\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "85bdf760cb83fbd3",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-02-10T15:47:42.761559200Z",
|
||
"start_time": "2025-02-07T16:24:09.366158Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"所有日线数据已保存到 daily_data.h5\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# 合并所有获取到的日线数据\n",
|
||
"if daily_data_list:\n",
|
||
" all_daily_data = pd.concat(daily_data_list, ignore_index=True)\n",
|
||
" # 使用 HDF5 格式保存到本地文件(文件名:daily_data.h5,key设为 'daily_data')\n",
|
||
" all_daily_data.to_hdf('/mnt/d/PyProject/NewStock/data/daily_data.h5', key='daily_data', mode='w', format='table')\n",
|
||
" print(\"所有日线数据已保存到 daily_data.h5\")\n",
|
||
"else:\n",
|
||
" print(\"未获取到任何日线数据。\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "3443425bc25f02",
|
||
"metadata": {
|
||
"ExecuteTime": {
|
||
"end_time": "2025-02-10T15:47:42.781521100Z",
|
||
"start_time": "2025-02-07T16:25:19.768620Z"
|
||
}
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" ts_code trade_date open high low close pre_close \\\n",
|
||
"0 000001.SZ 20250822 1601.22 1603.86 1578.82 1589.36 1601.22 \n",
|
||
"1 000001.SZ 20250821 1588.04 1606.49 1585.41 1601.22 1590.68 \n",
|
||
"2 000001.SZ 20250820 1589.36 1597.27 1578.82 1590.68 1589.36 \n",
|
||
"3 000001.SZ 20250819 1594.63 1597.27 1584.09 1589.36 1592.00 \n",
|
||
"4 000001.SZ 20250818 1589.36 1601.22 1585.41 1592.00 1592.00 \n",
|
||
"\n",
|
||
" change pct_chg vol amount \n",
|
||
"0 -11.86 -0.74 1644259.77 1979461.311 \n",
|
||
"1 10.54 0.66 1217418.25 1477053.292 \n",
|
||
"2 1.32 0.08 1048738.53 1265435.773 \n",
|
||
"3 -2.64 -0.17 892859.89 1077380.173 \n",
|
||
"4 0.00 0.00 1239058.37 1496527.039 \n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"print(all_daily_data[all_daily_data['ts_code'] == '000001.SZ'].head())"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "stock",
|
||
"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.13.2"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|