Tushare 的安装、使用请参考:用 Tushare 轻松获取A股历史数据
一、环境准备1.1 安装必要库pip install tushare pandas1.2 获取Tushare Token访问 Tushare官网注册账号并登录在"个人中心"获取API Token设置环境变量:
# Linux/Macexport TUSHARE_TOKEN="你的token"# Windows PowerShell$env:TUSHARE_TOKEN="你的token"# Windows CMDset TUSHARE_TOKEN=你的token二、代码实现2.1 基础配置
import osimport sqlite3from datetime import datetime, timedeltaimport pandas as pdimport tushare as ts# 设置Tushare Tokents.set_token(os.getenv("TUSHARE_TOKEN"))pro = ts.pro_api()# 数据库路径DB_PATH = "tushare_basic.db"# 日期设置(获取最近一年的数据)END_DATE = datetime.now().strftime("%Y%m%d") # 使用当前日期START_DATE = (datetime.now() - timedelta(days=365)).strftime("%Y%m%d")2.2 获取股票列表
# 获取所有股票基本信息stock_df = pro.stock_basic(fields="ts_code,symbol,name,industry,list_date")print(f"获取到 {len(stock_df)} 只股票")2.3 获取交易日历
# 获取上交所交易日历(SSE代表上海证券交易所)cal_df = pro.trade_cal( exchange="SSE", start_date=START_DATE, end_date=END_DATE)# 筛选出交易日cal_df = cal_df[cal_df["is_open"] == "1"]2.4 获取日线数据
# 方法1:批量获取少量股票(示例)codes = stock_df["ts_code"].head(10).tolist() # 取前10只股票daily_list = []for code in codes: try: df = pro.daily( ts_code=code, start_date=START_DATE, # 改为获取时间段数据 end_date=END_DATE ) if not df.empty: daily_list.append(df) print(f"已获取 {code} 的数据,共 {len(df)} 条记录") except Exception as e: print(f"获取 {code} 数据失败: {e}")# 合并所有数据if daily_list: daily_df = pd.concat(daily_list, ignore_index=True)else: daily_df = pd.DataFrame()2.5 存储到SQLite
# 连接SQLite数据库(如果不存在会自动创建)with sqlite3.connect(DB_PATH) as conn: # 存储股票基本信息表 stock_df.to_sql("stock_basic", conn, if_exists="replace", index=False) # 存储交易日历表 cal_df.to_sql("trade_cal", conn, if_exists="replace", index=False) # 存储日线数据表 if not daily_df.empty: daily_df.to_sql("daily", conn, if_exists="replace", index=False) print(f"所有数据已保存至 {DB_PATH}")三、完整示例
import osimport sqlite3from datetime import datetime, timedeltaimport pandas as pdimport tushare as ts# === 配置 ===ts.set_token(os.getenv("TUSHARE_TOKEN"))pro = ts.pro_api()DB_PATH = "tushare_basic.db"END_DATE = "20260113"START_DATE = (datetime.strptime(END_DATE, "%Y%m%d") - timedelta(days=365)).strftime( "%Y%m%d")# === 1. 股票列表 ===stock_df = pro.stock_basic(fields="ts_code,symbol,name,industry,list_date")print(f"获取 {len(stock_df)} 只股票")# === 2. 交易日历 ===cal_df = pro.trade_cal(exchange="SSE", start_date=START_DATE, end_date=END_DATE)cal_df = cal_df[cal_df["is_open"] == "1"] # 仅保留交易日# === 3. 批量日线(简化版:仅下载10只)===codes = stock_df["ts_code"].head(10).tolist()daily_list = []for code in codes: df = pro.daily(ts_code=code, start_date=END_DATE, end_date=END_DATE) if not df.empty: daily_list.append(df)daily_df = pd.concat(daily_list, ignore_index=True) if daily_list else pd.DataFrame()# === 存入 SQLite ===with sqlite3.connect(DB_PATH) as conn: stock_df.to_sql("stock_basic", conn, if_exists="replace", index=False) cal_df.to_sql("trade_cal", conn, if_exists="replace", index=False) daily_df.to_sql("daily", conn, if_exists="replace", index=False)print(f"数据已保存至 {DB_PATH}")
使用 DB.Browser 查看保存到本地的数据库文件 tushare_basic.db: 表结构:
股票列表信息:
日线信息:
注意事项Token限制:免费版Tushare有调用频率限制