Python 量化金融库
Python 量化金融核心库全面指南
Python 的量化金融生态极其丰富,涵盖数据获取、策略开发、风险管理、期权定价等全流程。以下是专业量化交易必备库的系统介绍,按功能分类整理。
1. 数据获取与处理库
yfinance – Yahoo Finance 数据接口
import yfinance as yf
import pandas as pd
# 批量获取股票数据
tickers = ['AAPL', 'MSFT', 'SPY']
data = yf.download(tickers, start='2020-01-01', end='2025-01-01',
group_by='ticker', auto_adjust=True)
# 获取期权链
aapl = yf.Ticker('AAPL')
options = aapl.option_chain('2025-01-17')
calls = options.calls
puts = options.puts
# 实时数据
ticker = yf.Ticker('AAPL')
info = ticker.info # 基本面数据
quote = ticker.history(period='1d', interval='1m') # 分钟数据
Alpha Vantage – 专业金融API
from alpha_vantage.timeseries import TimeSeries
from alpha_vantage.foreignexchange import ForeignExchange
from alpha_vantage.techindicators import TechIndicators
# 初始化(需要免费API Key)
ts = TimeSeries(key='YOUR_API_KEY', output_format='pandas')
fx = ForeignExchange(key='YOUR_API_KEY', output_format='pandas')
ti = TechIndicators(key='YOUR_API_KEY', output_format='pandas')
# 股票数据
data, meta = ts.get_intraday('AAPL', interval='1min', outputsize='full')
# 外汇数据
usd_eur, _ = fx.get_currency_exchange_intraday('USD', 'EUR', interval='1min')
# 技术指标
sma, _ = ti.get_sma(symbol='AAPL', interval='daily', time_period=20)
rsi, _ = ti.get_rsi(symbol='AAPL', interval='daily', time_period=14)
Tushare – 国内市场数据
import tushare as ts
pro = ts.pro_api('your_token')
# A股日线
daily = pro.daily(ts_code='000001.SZ', start_date='20200101', end_date='20250101')
# 财务数据
income = pro.income(ts_code='000001.SZ', period='20231231')
balance = pro.balancesheet(ts_code='000001.SZ', period='20231231')
# 指数成分
index_weight = pro.index_weight(index_code='000300.SH', start_date='20250101')
AKShare – 聚合数据源
import akshare as ak
# 股票数据
stock_zh_a_daily = ak.stock_zh_a_daily(symbol="sh600000")
stock_em_ggtj = ak.stock_em_ggtj() # 个股跟踪
# 宏观经济
macro_china_gdp_yearly = ak.macro_china_gdp_yearly()
macro_china_cpi_monthly = ak.macro_china_cpi_monthly()
# 期货数据
futures_zh_minute_sina(symbol="IF0", period="5")
2. 技术分析与指标库
TA-Lib – 专业技术分析库
import talib
import numpy as np
import pandas as pd
# 基础数据
close = np.random.random(100)
high = close + np.random.random(100)/2
low = close - np.random.random(100)/2
volume = np.random.randint(1000, 10000, 100)
# 趋势指标
sma = talib.SMA(close, timeperiod=20)
ema = talib.EMA(close, timeperiod=12)
macd, macdsignal, macdhist = talib.MACD(close, fastperiod=12, slowperiod=26)
# 动量指标
rsi = talib.RSI(close, timeperiod=14)
stoch_k, stoch_d = talib.STOCH(high, low, close)
# 波动率指标
bb_upper, bb_middle, bb_lower = talib.BBANDS(close, timeperiod=20)
atr = talib.ATR(high, low, close, timeperiod=14)
# 蜡烛图形态识别
doji = talib.CDLDOJI(open, high, low, close)
hammer = talib.CDLHAMMER(open, high, low, close)
pandas-ta – Pandas 集成技术分析
import pandas_ta as ta
import yfinance as yf
df = yf.download('AAPL', start='2024-01-01')
# 批量计算多个指标
df.ta.sma(length=20, append=True)
df.ta.rsi(append=True)
df.ta.bbands(append=True)
df.ta.macd(append=True)
# 高级指标
df.ta.supertrend(append=True) # SuperTrend
df.ta.psar(append=True) # 抛物线转向
df.ta.ichimoku(append=True) # 一目均衡表
# 自定义策略信号
df['signal'] = np.where(df['RSI_14'] < 30, 1,
np.where(df['RSI_14'] > 70, -1, 0))
3. 回测与策略开发框架
Backtrader – 灵活回测框架
import backtrader as bt
import backtrader.analyzers as btanalyzers
import yfinance as yf
class MAStrategy(bt.Strategy):
params = (('short', 10), ('long', 30),)
def __init__(self):
self.sma_short = bt.indicators.SMA(self.data.close, period=self.p.short)
self.sma_long = bt.indicators.SMA(self.data.close, period=self.p.long)
self.crossover = bt.indicators.CrossOver(self.sma_short, self.sma_long)
def next(self):
if not self.position:
if self.crossover > 0:
self.buy()
elif self.crossover < 0:
self.sell()
# 数据准备
data = bt.feeds.PandasData(dataname=yf.download('AAPL', '2020-01-01', '2025-01-01'))
# 回测引擎
cerebro = bt.Cerebro()
cerebro.addstrategy(MAStrategy)
cerebro.adddata(data)
cerebro.broker.setcash(100000)
cerebro.broker.setcommission(0.001)
# 分析器
cerebro.addanalyzer(btanalyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(btanalyzers.DrawDown, _name='drawdown')
cerebro.addanalyzer(btanalyzers.TradeAnalyzer, _name='trades')
results = cerebro.run()
strat = results[0]
print(f"夏普比率: {strat.analyzers.sharpe.get_analysis()['sharperatio']}")
print(f"最大回撤: {strat.analyzers.drawdown.get_analysis()['max']['drawdown']}%")
cerebro.plot()
Zipline – Quantopian 开源框架
from zipline.api import order, symbol, record
from zipline import run_algorithm
from zipline.utils.calendar_utils import get_calendar
import pandas as pd
def initialize(context):
context.asset = symbol('AAPL')
context.i = 0
def handle_data(context, data):
if context.i % 5 == 0: # 每5天交易一次
order(context.asset, 100)
record(AAPL=data.current(symbol('AAPL'), 'price'))
context.i += 1
# 运行回测
start = pd.Timestamp('2020-01-01')
end = pd.Timestamp('2025-01-01')
results = run_algorithm(start=start, end=end, initialize=initialize,
handle_data=handle_data, capital_base=100000,
bundle='quantopian-quandl')
VectorBT – 向量化回测
import vectorbt as vbt
import pandas as pd
import numpy as np
# 数据准备
close = pd.Series(np.random.randn(1000).cumsum() + 100, name='close')
# 信号生成
entries = close.rolling(20).apply(lambda x: x[-1] > x.mean())
exits = close.rolling(20).apply(lambda x: x[-1] < x.mean())
# 向量化回测
pf = vbt.Portfolio.from_signals(close, entries, exits,
init_cash=100000, fees=0.001)
# 绩效分析
print(pf.stats())
pf.plot().show()
4. 风险管理与绩效分析
Pyfolio – 专业绩效分析
import pyfolio as pf
import pandas as pd
import numpy as np
# 模拟策略收益
dates = pd.date_range('2020-01-01', '2025-01-01', freq='D')
returns = pd.Series(np.random.normal(0.0005, 0.02, len(dates)), index=dates)
# tear sheet 分析
pf.create_returns_tear_sheet(returns)
# 详细分析
pf.create_full_tear_sheet(returns,
live_start_date='2024-01-01',
risk_free_rate=0.02)
EmPyricAl – 金融绩效指标
import empyrical as ep
# 计算绩效指标
returns = pd.Series(np.random.normal(0.0005, 0.02, 1000))
sharpe = ep.sharpe_ratio(returns, risk_free=0.02, period='daily')
sortino = ep.sortino_ratio(returns, required_return=0, period='daily')
max_drawdown = ep.max_drawdown(returns)
calmar = ep.calmar_ratio(returns)
print(f"夏普比率: {sharpe:.3f}")
print(f"Sortino比率: {sortino:.3f}")
print(f"最大回撤: {max_drawdown:.3%}")
print(f"Calmar比率: {calmar:.3f}")
Riskfolio-Lib – 高级风险管理
import riskfolio as rp
import pandas_datareader.data as web
import pandas as pd
# 获取数据
assets = ['AAPL', 'MSFT', 'GOOGL']
data = web.get_data_yahoo(assets, start='2020-01-01')['Adj Close']
returns = data.pct_change().dropna()
# 构建投资组合优化器
port = rp.Portfolio(returns=returns)
# 计算风险措施
method_mu = 'hist' # 历史均值
method_cov = 'hist' # 历史协方差
port.assets_stats(method_mu=method_mu, method_cov=method_cov, d=0.97)
# 优化(最小方差)
w = port.optimization(model='Classic', rm='MV', obj='MinRisk', rf=0.03,
l=0, hist=True)
print("最优权重:", dict(zip(assets, w)))
ax = rp.plot_pie(w=w)
5. 期权与衍生品定价
QuantLib – 专业金融计算库
import QuantLib as ql
# 设置环境
today = ql.Date(17, 10, 2025)
ql.Settings.instance().evaluationDate = today
# 市场数据
spot = 100.0
strike = 100.0
volatility = ql.BlackVolTermStructureHandle(
ql.BlackConstantVol(today, ql.NullCalendar(), 0.20, ql.Actual365Fixed())
)
rate = ql.YieldTermStructureHandle(
ql.FlatForward(today, 0.05, ql.Actual365Fixed())
)
dividend = ql.YieldTermStructureHandle(
ql.FlatForward(today, 0.02, ql.Actual365Fixed())
)
# 期权参数
exercise = ql.EuropeanExercise(ql.Date(17, 10, 2026))
payoff = ql.PlainVanillaPayoff(ql.Option.Call, strike)
option = ql.VanillaOption(payoff, exercise)
# Black-Scholes 定价
bsm_process = ql.BlackScholesProcess(
ql.QuoteHandle(ql.SimpleQuote(spot)),
dividend, rate, volatility
)
option.setPricingEngine(ql.AnalyticEuropeanEngine(bsm_process))
print(f"期权价格: {option.NPV():.4f}")
print(f"Delta: {option.delta():.4f}")
print(f"Gamma: {option.gamma():.4f}")
py_vollib – 期权希腊字母计算
from py_vollib.black_scholes import black_scholes
from py_vollib.black_scholes.greeks import analytical
S = 100
K = 100
t = 0.25
r = 0.05
sigma = 0.2
# 期权价格
call_price = black_scholes('c', S, K, t, r, sigma)
put_price = black_scholes('p', S, K, t, r, sigma)
# 希腊字母
call_delta = analytical.delta('c', S, K, t, r, sigma)
call_gamma = analytical.gamma('c', S, K, t, r, sigma)
call_vega = analytical.vega('c', S, K, t, r, sigma)
print(f"看涨期权价格: {call_price:.4f}")
print(f"Delta: {call_delta:.4f}, Gamma: {call_gamma:.4f}")
6. 机器学习与因子分析
skfolio – 投资组合机器学习
from skfolio import Population, ObjectiveFunction
from skfolio.optimization import MeanRisk
from sklearn.ensemble import RandomForestRegressor
import pandas as pd
# 准备数据
returns = pd.DataFrame(...) # 资产收益数据
# 机器学习预测
model = RandomForestRegressor()
model.fit(X_train, y_train) # X: 因子, y: 预期收益
# 集成到投资组合优化
objective = ObjectiveFunction(
predict_return=model.predict,
objective=MeanRisk()
)
population = Population(returns)
optimized_portfolio = population.optimize(objective)
Alphalens – 因子有效性分析
import alphalens as al
# 因子数据
factor_data = pd.DataFrame(...) # 因子值
price_data = pd.DataFrame(...) # 价格数据
# 因子分析
factor_returns = al.utils.get_clean_factor_and_forward_returns(
factor_data, price_data, quantiles=5, bins=None, periods=[1,5,10])
# 因子绩效
al.tears.create_full_tear_sheet(factor_returns)
7. 固定收益与利率库
QuantLib-SWIG – 债券与利率
import QuantLib as ql
# 利率曲线
today = ql.Date(17, 10, 2025)
ql.Settings.instance().evaluationDate = today
# 存款利率
deposits = [
(ql.Date(17, 10, 2025), 0.01),
(ql.Date(17, 1, 2026), 0.015),
]
# 构建收益率曲线
calendar = ql.UnitedStates(ql.UnitedStates.GovernmentBond)
depo_helpers = [ql.DepositRateHelper(
ql.QuoteHandle(ql.SimpleQuote(rate)),
date, calendar, ql.Actual360(), ql.ModifiedFollowing, False,
ql.MoneyMarket()) for date, rate in deposits]
curve = ql.PiecewiseYieldCurve(today, depo_helpers, ql.Actual365Fixed())
rate_handle = ql.YieldTermStructureHandle(curve)
# 债券定价
bond = ql.FixedRateBond(10, 1000, ql.Period(ql.Semiannual), 0.05)
bond.setPricingEngine(ql.DiscountingBondEngine(rate_handle))
print(f"债券价格: {bond.NPV():.2f}")
8. 高性能计算库
Numba – JIT 编译加速
from numba import jit, prange
import numpy as np
@jit(nopython=True, parallel=True)
def monte_carlo_option(S, K, T, r, sigma, n_simulations):
"""JIT加速的蒙特卡洛期权定价"""
dt = T / 252
payoffs = np.zeros(n_simulations)
for i in prange(n_simulations):
price = S
for _ in range(252):
z = np.random.normal()
price *= np.exp((r - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * z)
payoffs[i] = max(price - K, 0)
return np.mean(payoffs) * np.exp(-r * T)
# 性能对比
price = monte_carlo_option(100, 100, 1.0, 0.05, 0.2, 1000000)
CuPy – GPU 加速
import cupy as cp
import numpy as np
# GPU 上的蒙特卡洛模拟
def gpu_monte_carlo(S, K, T, r, sigma, n_simulations):
dt = T / 252
n_steps = 252
# GPU 计算
rand = cp.random.normal(size=(n_simulations, n_steps))
log_returns = (r - 0.5 * sigma**2) * dt + sigma * cp.sqrt(dt) * rand
log_paths = cp.cumsum(log_returns, axis=1)
final_prices = S * cp.exp(log_paths[:, -1])
payoffs = cp.maximum(final_prices - K, 0)
return cp.mean(payoffs) * cp.exp(-r * T)
gpu_price = gpu_monte_carlo(100, 100, 1.0, 0.05, 0.2, 10000000)
9. 专业平台与接口
VN.PY – 国内量化交易框架
from vnpy.app.cta_strategy import CtaTemplate, StopOrder
from vnpy.app.cta_strategy import BarGenerator, ArrayManager
from vnpy.trader.constant import Interval
class DoubleMaStrategy(CtaTemplate):
"""双均线策略"""
double_ma_short = 10
double_ma_long = 30
fixed_size = 1
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
self.bg = BarGenerator(self.on_bar, 5, self.on_5min_bar)
self.am = ArrayManager()
def on_bar(self, bar):
self.bg.update_bar(bar)
def on_5min_bar(self, bar):
self.am.update_bar(bar)
if not self.am.inited:
return
# 交易逻辑
short_ma = self.am.sma(self.double_ma_short)
long_ma = self.am.sma(self.double_ma_long)
if short_ma > long_ma and not self.pos:
self.buy(bar.close_price, self.fixed_size)
elif short_ma < long_ma and self.pos > 0:
self.sell(bar.close_price, abs(self.pos))
Interactive Brokers API
from ib_insync import *
# 连接IB TWS/Gateway
ib = IB()
ib.connect('127.0.0.1', 7497, clientId=1)
# 获取实时数据
contract = Stock('AAPL', 'SMART', 'USD')
ib.reqMktData(contract)
ticker = ib.ticker(contract)
# 下单
order = MarketOrder('BUY', 100)
trade = ib.placeOrder(contract, order)
ib.disconnect()
10. 安装与环境管理
Conda 环境配置
# 创建量化环境
conda create -n quant python=3.10
conda activate quant
# 核心库安装
conda install numpy pandas matplotlib seaborn jupyter scikit-learn
pip install yfinance talib backtrader zipline pyfolio QuantLib
# 国内库
pip install tushare akshare vnpy
# 性能库
conda install numba cupy
pip install vectorbt riskfolio-lib
Docker 部署
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
# 安装TA-Lib(需要编译)
RUN apt-get update && apt-get install -y build-essential
RUN wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
RUN tar -xzf ta-lib-0.4.0-src.tar.gz && cd ta-lib/
RUN ./configure --prefix=/usr && make && make install
RUN pip install TA-Lib
COPY . .
CMD ["python", "main.py"]
11. 库选择指南
场景 | 推荐库 | 理由 |
---|---|---|
数据获取 | yfinance + AKShare | 免费、稳定、覆盖国内外 |
技术分析 | TA-Lib + pandas-ta | 专业算法 + Pandas集成 |
策略回测 | Backtrader/VectorBT | 灵活性 vs 速度 |
风险分析 | Pyfolio + Riskfolio | 全面指标 + 优化 |
期权定价 | QuantLib | 行业标准 |
实盘交易 | VN.PY/IB API | 国内/国际接口 |
高性能 | Numba/CuPy | CPU/GPU加速 |
12. 最佳实践
- 版本管理:使用conda/pipenv固定版本,避免依赖冲突
- 数据验证:所有数据源需交叉验证
- 回测一致性:开发与实盘环境参数完全一致
- 性能监控:使用line_profiler、memory_profiler
- 代码规范:遵循PEP8,使用type hints和文档字符串
需要特定库的深度教程、源码示例或部署方案,请告诉我具体需求!