{ "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 }