别再到处找数据了!用Python+Tushare Pro免费获取A股行情、财务、资金流数据(附完整代码)
PythonTushare Pro构建个人金融数据库的实战指南刚接触量化分析时最头疼的就是数据获取。要么接口昂贵要么数据不全要么稳定性差。直到发现Tushare Pro这个宝藏工具——它不仅免费提供沪深股票全量数据还包含行情、财务、资金流等核心维度。本文将手把手教你用PythonTushare Pro搭建自动化金融数据库并实现多因子选股分析。1. 环境配置与基础准备1.1 注册与Token获取首先访问Tushare Pro官网完成注册。免费账户可获得基础权限每日调用限额足够个人研究使用。注册成功后在个人中心找到API Token这是所有数据调用的通行证。import tushare as ts TOKEN 你的Token # 替换为实际获取的字符串 ts.set_token(TOKEN) pro ts.pro_api() # 初始化接口1.2 安装与版本检查通过pip安装最新版库并验证版本兼容性pip install tushare --upgrade检查安装是否成功print(f当前Tushare版本{ts.__version__}) # 输出示例当前Tushare版本1.2.32. 核心数据获取实战2.1 股票基础信息抓取获取全量股票列表是构建数据库的第一步stock_list pro.stock_basic( exchange, list_statusL, fieldsts_code,symbol,name,industry,list_date ) print(stock_list.head())关键参数说明exchange: 交易所代码SSE/SZSE空值表示全部list_status: L-上市 D-退市 P-暂停上市fields: 指定返回字段减少不必要的数据传输2.2 行情数据获取技巧获取日K线数据时推荐使用批量查询模式# 获取多只股票最近30个交易日数据 daily_data pro.daily( ts_code600519.SH,000858.SZ, start_date(datetime.now()-timedelta(days30)).strftime(%Y%m%d), end_datedatetime.now().strftime(%Y%m%d) )注意Tushare的日期格式统一为YYYYMMDD需特别注意格式转换行情数据字段说明字段名说明类型open开盘价floathigh最高价floatlow最低价floatclose收盘价floatvol成交量手floatamount成交额千元float2.3 财务数据深度获取财务数据是量化分析的核心Tushare提供完整的财务报表接口# 获取贵州茅台最新季度利润表 income pro.income( ts_code600519.SH, start_date20220101, end_date20221231, period20220331 # 指定财报期 )财务数据获取策略按季度获取避免数据量过大使用period参数精准定位财报期优先获取关键指标ROE、毛利率等3. 数据存储与管理方案3.1 本地CSV存储方案最简单的存储方式是使用pandas直接保存CSVdef save_to_csv(data, filename): data.to_csv(f./data/{filename}.csv, indexFalse, encodingutf_8_sig) # 示例保存沪深300成分股数据 hs300 pro.hs300() save_to_csv(hs300, hs300_constituents)3.2 SQLite数据库方案对于大量历史数据推荐使用SQLite进行管理import sqlite3 from sqlalchemy import create_engine # 创建数据库引擎 engine create_engine(sqlite:///quant.db) # 存储日线数据到数据库 daily_data.to_sql(daily_price, engine, if_existsappend, indexFalse)数据库表结构设计建议按数据类型分表price, finance, index等添加时间戳字段便于版本管理建立复合索引提高查询效率3.3 自动化更新策略实现定时更新的完整方案def auto_update(): # 获取最近一个交易日 trade_cal pro.trade_cal(exchangeSSE, is_open1) last_date trade_cal.iloc[-1][cal_date] # 增量更新数据 new_data pro.daily(trade_datelast_date) save_to_database(new_data) # 设置定时任务每天17:00运行 schedule.every().day.at(17:00).do(auto_update)4. 多因子分析实战案例4.1 数据整合方法构建分析数据集的关键步骤# 获取基础指标 basic pro.daily_basic(trade_date20230630) # 获取财务指标 finance pro.fina_indicator(period20220331) # 合并数据集 merged_data pd.merge( basic, finance, onts_code, howinner )4.2 简单选股策略实现实现PEROE双因子筛选def select_stocks(data): # 条件筛选 condition ( (data[pe] 15) (data[pe] 0) (data[roe] 0.15) ) return data[condition] good_stocks select_stocks(merged_data) print(f筛选出优质股票{len(good_stocks)}只)4.3 策略回测框架简易回测框架示例def backtest(stock_list, start_date, end_date): # 获取历史行情 all_data [] for code in stock_list[ts_code]: hist pro.daily( ts_codecode, start_datestart_date, end_dateend_date ) all_data.append(hist) # 计算组合收益 full_data pd.concat(all_data) portfolio_return full_data.groupby(trade_date)[pct_chg].mean() return portfolio_return.cumsum() # 执行回测 returns backtest(good_stocks, 20200101, 20221231)5. 性能优化与高级技巧5.1 批量请求优化使用并行请求大幅提升数据获取效率from concurrent.futures import ThreadPoolExecutor def get_batch_data(codes): with ThreadPoolExecutor(max_workers5) as executor: results list(executor.map( lambda x: pro.daily(ts_codex, start_date20230101), codes )) return pd.concat(results) # 示例批量获取前100只股票数据 codes stock_list.head(100)[ts_code].tolist() batch_data get_batch_data(codes)5.2 缓存机制实现使用磁盘缓存避免重复请求from functools import lru_cache import pickle import hashlib def cache_request(func): def wrapper(*args, **kwargs): # 生成唯一缓存key key hashlib.md5(str(argstuple(kwargs.items())).encode()).hexdigest() cache_file f./cache/{key}.pkl # 检查缓存 if os.path.exists(cache_file): with open(cache_file, rb) as f: return pickle.load(f) # 执行请求并缓存 result func(*args, **kwargs) with open(cache_file, wb) as f: pickle.dump(result, f) return result return wrapper # 装饰接口方法 pro.daily cache_request(pro.daily)5.3 异常处理策略健壮的数据获取需要完善的错误处理def safe_query(func, max_retry3, **kwargs): for i in range(max_retry): try: return func(**kwargs) except Exception as e: print(f请求失败重试 {i1}/{max_retry}) time.sleep(2**i) # 指数退避 raise Exception(超过最大重试次数) # 安全调用示例 data safe_query(pro.daily, ts_code600519.SH, start_date20230101)在实际项目中最耗时的部分是历史数据初始化。我的经验是分阶段获取先抓取最近3年数据快速验证策略待核心逻辑跑通后再补充完整历史数据。对于财务数据特别注意财报披露的滞后性一般季报在期末后1个月内才会完整更新。