量化开发速查表
本文档汇总了量化开发中常用的公式、指标和代码片段,方便快速查阅。
常用收益率计算
简单收益率
returns = df['Close'].pct_change()
对数收益率
log_returns = np.log(df['Close'] / df['Close'].shift(1))
累计收益率
cumulative_return = (1 + returns).cumprod() - 1
年化收益率
annual_return = (1 + returns.mean()) ** 252 - 1
风险指标
波动率
volatility = returns.std() * np.sqrt(252)
最大回撤
cumulative = (1 + returns).cumprod()
running_max = cumulative.cummax()
drawdown = (cumulative - running_max) / running_max
max_drawdown = abs(drawdown.min())
夏普比率
sharpe = (returns.mean() * 252 - risk_free_rate) / (returns.std() * np.sqrt(252))
索提诺比率
downside_returns = returns[returns < 0]
downside_std = downside_returns.std() * np.sqrt(252)
sortino = (returns.mean() * 252 - risk_free_rate) / downside_std
卡玛比率
calmar = annual_return / max_drawdown
VaR
var_95 = np.percentile(returns, 5) # 95% VaR
CVaR
cvar_95 = returns[returns <= var_95].mean()
技术指标公式
移动平均线
SMA:
sma = df['Close'].rolling(window=20).mean()
EMA:
ema = df['Close'].ewm(span=20, adjust=False).mean()
MACD
ema12 = df['Close'].ewm(span=12).mean()
ema26 = df['Close'].ewm(span=26).mean()
dif = ema12 - ema26
dea = dif.ewm(span=9).mean()
macd = (dif - dea) * 2
RSI
其中
delta = df['Close'].diff()
gain = delta.where(delta > 0, 0).rolling(14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(14).mean()
rs = gain / loss
rsi = 100 - (100 / (1 + rs))
布林带
middle = df['Close'].rolling(20).mean()
std = df['Close'].rolling(20).std()
upper = middle + 2 * std
lower = middle - 2 * std
ATR
high = df['High']
low = df['Low']
close_prev = df['Close'].shift(1)
tr = pd.concat([
high - low,
(high - close_prev).abs(),
(low - close_prev).abs()
], axis=1).max(axis=1)
atr = tr.rolling(14).mean()
仓位管理公式
凯利公式
其中 是胜率,, 是盈亏比。
def kelly_criterion(win_rate, avg_win, avg_loss):
b = avg_win / abs(avg_loss)
p = win_rate
q = 1 - p
kelly = (p * b - q) / b
return max(0, min(kelly, 1))
波动率倒数仓位
position_ratio = target_vol / asset_vol
因子分析指标
IC(信息系数)
ic = factor.corr(forward_return)
ICIR
icir = ic_series.mean() / ic_series.std()
IR(信息比率)
excess_return = portfolio_return - benchmark_return
tracking_error = (portfolio_return - benchmark_return).std()
ir = excess_return.mean() / tracking_error
常用数据处理
去极值
def winsorize(series, limits=(0.01, 0.01)):
lower = series.quantile(limits[0])
upper = series.quantile(1 - limits[1])
return series.clip(lower, upper)
标准化
# Z-score标准化
standardized = (series - series.mean()) / series.std()
# Min-Max标准化
normalized = (series - series.min()) / (series.max() - series.min())
# 排名标准化
rank_normalized = series.rank(pct=True)
缺失值处理
# 删除
df.dropna()
# 前向填充
df.fillna(method='ffill')
# 线性插值
df.interpolate(method='linear')
Backtrader常用代码
策略模板
class MyStrategy(bt.Strategy):
params = (('period', 20),)
def __init__(self):
self.ma = bt.indicators.SMA(self.data.close, period=self.params.period)
self.order = None
def notify_order(self, order):
if order.status in [order.Completed]:
pass
self.order = None
def next(self):
if self.order:
return
if not self.position:
if self.data.close[0] > self.ma[0]:
self.order = self.buy()
else:
if self.data.close[0] < self.ma[0]:
self.order = self.sell()
添加分析器
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trades')
常用数据源
| 数据源 | 类型 | 说明 |
|---|---|---|
| yfinance | 免费 | 美股、港股数据 |
| tushare | 免费/付费 | A股数据 |
| akshare | 免费 | A股、期货数据 |
| Wind | 付费 | 专业金融数据 |
| Bloomberg | 付费 | 全球金融数据 |
常用库列表
# 数据处理
import numpy as np
import pandas as pd
# 数据获取
import yfinance as yf
import tushare as ts
# 技术指标
import talib
# 回测框架
import backtrader as bt
# 机器学习
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import lightgbm as lgb
# 可视化
import matplotlib.pyplot as plt
import seaborn as sns
# 统计分析
from scipy import stats
import statsmodels.api as sm
交易时间参考
| 市场 | 交易时间(北京时间) |
|---|---|
| A股 | 9:30-11:30, 13:00-15:00 |
| 港股 | 9:30-12:00, 13:00-16:00 |
| 美股 | 21:30-04:00 (夏令时) / 22:30-05:00 (冬令时) |
| 期货(日盘) | 9:00-11:30, 13:30-15:00 |
| 期货(夜盘) | 21:00-次日02:30(部分品种) |
风险管理检查清单
- 单笔风险不超过总资金的2%
- 总敞口不超过设定上限
- 设置止损止盈
- 最大回撤预警
- 流动性检查
- 相关性检查
- 压力测试
策略评估检查清单
- 样本外测试
- 参数稳健性检验
- 交易成本测试
- 滑点敏感性分析
- 与基准对比
- 不同市场环境表现
- 过拟合检验