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/CuPyCPU/GPU加速

12. 最佳实践

  1. 版本管理:使用conda/pipenv固定版本,避免依赖冲突
  2. 数据验证:所有数据源需交叉验证
  3. 回测一致性:开发与实盘环境参数完全一致
  4. 性能监控:使用line_profiler、memory_profiler
  5. 代码规范:遵循PEP8,使用type hints和文档字符串

需要特定库的深度教程、源码示例或部署方案,请告诉我具体需求!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注