
数据获取类库
做股票数据分析,第一步永远是拿到数据。数据来源无非两种,要么从免费公开接口抓,要么从付费终端导。Python在这块的选择很丰富,但坑也不少。
yfinance
这是目前散户圈子里用得最广的免费美股数据接口。雅虎财经的底层数据,一行代码就能拉历史K线和实时报价。
import yfinance as yf
df = yf.download('AAPL', start='2024-01-01', end='2024-12-31')
拿到手就是标准的DataFrame,包含开盘价、最高价、最低价、收盘价、成交量。日线、周线、分钟线都支持。A股也能拉,代码后面加.SS或.SZ,例如600519.SS。港股加.HK。缺点是偶尔会抽风,接口限流或者数据缺失,做严肃回测前最好把数据存到本地数据库。

tushare
国内做A股分析绕不开的库。免费版有积分门槛,但基础行情数据足够用。财务数据、龙虎榜、资金流向这些衍生数据也全。
import tushare as ts
pro = ts.pro_api('你的token')
df = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20241231')
数据质量比爬虫稳定得多,适合需要A股全市场数据的场景。缺点是免费额度有限,高频调用要充值。
akshare
开源免费的A股数据接口合集,覆盖股票、期货、基金、债券、外汇。数据源来自各大财经网站,更新及时。
import akshare as ak
df = ak.stock_zh_a_hist(symbol='000001', period='daily', start_date='20240101', end_date='20241231')
期货数据也能拿,比如螺纹钢主力连续合约。接口命名比较乱,文档需要花时间翻。稳定性不如tushare,但胜在免费且品种全。
数据处理与计算类库
拿到原始数据只是起点,清洗、对齐、计算指标才是重头戏。
pandas
这是Python数据分析的绝对核心。股票数据本质就是带时间索引的二维表格,pandas的DataFrame就是为此而生。
处理复权、填充停牌日、计算滚动收益率、重采样成周线月线,全是一两行代码的事。
# 计算20日滚动波动率
df['returns'] = df['Close'].pct_change()
df['volatility'] = df['returns'].rolling(20).std() * (252**0.5)
时间序列的对齐和切片更是pandas的强项。多只股票对齐日期做相关性分析,用df.pivot和df.corr几步搞定。
numpy
pandas底层依赖numpy,做数值计算时直接调numpy更快。计算移动平均、指数加权、矩阵运算,numpy的向量化操作比循环快几十倍。
import numpy as np
prices = df['Close'].values
ma20 = np.convolve(prices, np.ones(20)/20, mode='valid')
做期权定价或者风险价值计算时,numpy的随机数生成和线性代数模块必不可少。
scipy
统计检验、优化算法、插值。做配对交易时算协整关系,做参数优化时求极值,scipy比手写算法靠谱得多。
技术指标与策略回测类库
指标计算和策略验证是股票分析的核心环节。
TA-Lib
技术分析库的鼻祖,200多个指标函数,MACD、RSI、布林带、KDJ全都有。C语言底层,速度快。
import talib
macd, signal, hist = talib.MACD(df['Close'], fastperiod=12, slowperiod=26, signalperiod=9)
安装有点麻烦,Windows下需要编译好的whl文件。但装好之后就是生产力工具。
pandas-ta
纯Python实现的技术指标库,安装零门槛。接口设计比TA-Lib更符合pandas习惯,直接给DataFrame加列。
import pandas_ta as ta
df.ta.rsi(length=14, append=True)
df.ta.bbands(length=20, append=True)
指标数量比TA-Lib还多,社区更新活跃。缺点是纯Python实现,大数据量下比TA-Lib慢。
backtrader
老牌回测框架,功能全面,支持多品种、多周期、事件驱动。期货的保证金交易、做空、杠杆都能模拟。
import backtrader as bt
class MyStrategy(bt.Strategy):
def __init__(self):
self.sma = bt.indicators.SimpleMovingAverage(self.data.close, period=20)
def next(self):
if self.data.close[0] > self.sma[0]:
self.buy()
学习曲线陡峭,但一旦掌握,策略逻辑表达非常清晰。内置的 analyzers 能直接输出夏普比率、最大回撤、年化收益。
vectorbt
新一代回测库,基于numpy和numba,速度极快。核心思路是向量化计算,适合参数扫描和批量回测。
import vectorbt as vbt
fast_ma = vbt.MA.run(close, 10)
slow_ma = vbt.MA.run(close, 30)
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)
portfolio = vbt.Portfolio.from_signals(close, entries, exits)
几千组参数几秒钟跑完,做策略优化时效率碾压backtrader。缺点是对复杂逻辑的支持不如backtrader灵活。
可视化与报告类库
matplotlib
绘图基础库,K线图、收益曲线、回撤图都能画。配合mplfinance(原mpl_finance)画专业K线。
import mplfinance as mpf
mpf.plot(df, type='candle', volume=True, mav=(5,10,20))
plotly
交互式图表,鼠标悬停看具体数值,缩放拖拽都支持。做多品种对比或者展示给非技术同事看,plotly比matplotlib直观得多。
import plotly.graph_objects as go
fig = go.Figure(data=[go.Candlestick(x=df.index, open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'])])
fig.show()
pyfolio
量化组合分析专用,输入收益率序列,自动生成夏普比率、回撤分析、月度收益热力图。和backtrader配合使用,回测完直接出报告。
期货数据处理的特殊之处
期货和股票的数据结构差异很大,选库时要留意。
期货有主力合约换月的问题,价格序列不连续。处理主力连续合约时,需要做前复权或者后复权拼接。akshare和tushare都提供主力连续合约数据,但拼接规则要自己确认。
期货有保证金和杠杆,回测时不能只看价格收益率。backtrader的CommissionInfo和Margin设置要按交易所规则来,否则回测结果和实盘差得远。
期货有夜盘,交易时段和股票不同。做日内策略时,pandas的between_time方法能帮你筛选特定时段的数据。
# 筛选夜盘时段(21:00到23:00)
night_session = df.between_time('21:00', '23:00')
组合使用建议
入门阶段,yfinance + pandas + matplotlib 三件套足够。能拉数据、能算指标、能画图。
进阶阶段,tushare或akshare + pandas-ta + backtrader。A股期货数据全覆盖,指标现成,回测框架成熟。
高频或参数优化场景,vectorbt + numpy + numba。速度是王道。
生产环境,数据落地到本地数据库(SQLite或PostgreSQL),用pandas从数据库读,避免反复调接口。
工具不在多,在于用熟。把pandas玩透,比装十个库每个只懂皮毛强得多。股票和期货分析的本质是逻辑,库只是帮你实现逻辑的扳手。
