因子量化投资开源库
所属分类 quant
浏览量 5
简单的起步建议:
从Alphalens + FinMind开始,先学会分析现有因子,再尝试构建自己的因子。
入门友好型
1. Alphalens - 因子分析神器
import alphalens
# 极简因子分析流程
factor_data = alphalens.utils.get_clean_factor_and_forward_returns(
factor, # 你的因子数据
prices, # 价格数据
quantiles=5, # 分成5组
periods=(1, 5, 10) # 未来1,5,10天收益
)
# 一键生成分析报告
alphalens.tears.create_full_tear_sheet(factor_data)
特点:
一行代码生成专业因子分析报告
可视化IC、分组收益、换手率等指标
轻量级,学习成本低
2. FinMind - 台湾开源的完整解决方案
from FinMind.data import DataLoader
api = DataLoader()
# 获取各种因子数据
data = api.taiwan_stock_factor(
stock_id='2330',
start_date='2020-01-01',
end_date='2020-12-31'
)
内置因子:
价值因子(PE、PB、股息率)
成长因子(营收增长率)
质量因子(ROE、毛利率)
动量因子(过去收益率)
生产级框架
3. Qlib - 微软出品(中文友好)
from qlib.contrib.data.handler import Alpha158
# 使用预定义的158个因子
handler = Alpha158(
instruments='csi300', # 沪深300成分股
start_time='2010-01-01',
end_time='2020-12-31',
freq='day'
)
# 获取因子数据
data = handler.fetch()
优势:
158个预定义因子,开箱即用
完整的因子研究流程
支持机器学习模型
详细的文档和中文支持
4. Empyrical + Pyfolio 组合
import empyrical
import pyfolio as pf
# 计算因子绩效
def analyze_factor_performance(factor_returns):
# 基础指标
sharpe = empyrical.sharpe_ratio(factor_returns)
max_dd = empyrical.max_drawdown(factor_returns)
# Pyfolio详细分析
pf.create_returns_tear_sheet(factor_returns)
return sharpe, max_dd
因子计算专用库
5. WorldQuant - 101个Alpha因子
# 安装:pip install alpha101
from alpha101 import Alpha101
# 计算101个WorldQuant公开因子
alpha = Alpha101(prices, volumes)
factor_df = alpha.get_all_factors()
# 选择特定因子
momentum_factor = alpha.alpha_001() # 动量因子
mean_reversion = alpha.alpha_002() # 均值回归因子
特点:
101个经典量化因子
代码简洁明了
适合学习因子构建逻辑
6. TA-Lib - 技术指标因子
import talib
# 计算技术指标因子
rsi = talib.RSI(close_prices, timeperiod=14) # RSI因子
macd, signal, hist = talib.MACD(close_prices) # MACD因子
boll_upper, boll_middle, boll_lower = talib.BBANDS(close_prices) # 布林带因子
# 动量类因子
momentum = talib.MOM(close_prices, timeperiod=10)
roc = talib.ROC(close_prices, timeperiod=10)
7. Pandas-TA - 更Pythonic的技术指标
import pandas_ta as ta
# 链式调用,非常直观
df.ta.rsi(length=14, append=True) # RSI因子
df.ta.macd(append=True) # MACD因子
df.ta.bbands(length=20, append=True) # 布林带因子
df.ta.obv(append=True) # OBV能量潮因子
极简实战示例
完整的双因子策略(价值+动量)
import pandas as pd
import numpy as np
import yfinance as yf
class SimpleFactorStrategy:
"""简单双因子策略"""
def __init__(self):
self.factors = {}
def get_stock_data(self, tickers, start='2020-01-01'):
"""获取股票数据"""
data = yf.download(tickers, start=start)['Adj Close']
return data
def calculate_pe_factor(self, prices, eps_data):
"""计算PE价值因子(越低越好)"""
pe_ratio = prices / eps_data
# 标准化:-1表示最便宜,1表示最贵
pe_factor = -self.zscore(pe_ratio)
return pe_factor
def calculate_momentum_factor(self, prices, window=20):
"""计算动量因子(过去20天收益率)"""
momentum = prices.pct_change(window)
momentum_factor = self.zscore(momentum)
return momentum_factor
def zscore(self, series):
"""Z-score标准化"""
return (series - series.mean()) / series.std()
def combine_factors(self, factor1, factor2, weight1=0.5):
"""因子合成"""
# 等权合成
combined = weight1 * factor1 + (1-weight1) * factor2
return combined
def generate_signals(self, combined_factor, top_n=10):
"""生成交易信号:买入得分最高的top_n只股票"""
# 按因子值排序
ranked = combined_factor.rank(axis=1, ascending=False)
# 买入前top_n,卖出后top_n
buy_signal = ranked <= top_n
sell_signal = ranked >= (ranked.shape[1] - top_n)
return buy_signal.astype(int) - sell_signal.astype(int)
def backtest(self, prices, signals, initial_capital=100000):
"""简单回测"""
positions = signals.shift(1) # 避免未来函数
returns = positions * prices.pct_change()
portfolio_value = initial_capital * (1 + returns.sum(axis=1)).cumprod()
return portfolio_value
# 使用示例
strategy = SimpleFactorStrategy()
# 1. 获取数据
tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'META']
prices = strategy.get_stock_data(tickers)
# 2. 计算因子(这里简化处理,实际需要EPS数据)
pe_factor = strategy.calculate_pe_factor(prices, prices/20) # 假设EPS为价格的1/20
momentum_factor = strategy.calculate_momentum_factor(prices)
# 3. 合成因子
combined = strategy.combine_factors(pe_factor, momentum_factor)
# 4. 生成信号
signals = strategy.generate_signals(combined, top_n=2)
# 5. 回测
portfolio = strategy.backtest(prices, signals)
因子分析工具链
8. 因子绩效分析一键脚本
python
def analyze_factor(factor_scores, forward_returns):
"""因子分析四步法"""
# 1. IC分析(信息系数)
ic_series = factor_scores.corrwith(forward_returns, axis=1)
ic_mean = ic_series.mean()
ic_ir = ic_series.mean() / ic_series.std()
# 2. 分组收益分析
def calc_group_returns(factor, returns, n_groups=5):
groups = factor.rank(axis=1, pct=True)
labels = pd.qcut(groups.stack(), n_groups, labels=False)
group_returns = returns.stack().groupby(labels).mean()
return group_returns
# 3. 换手率分析
def calc_turnover(factor_scores):
# 计算因子排名变化
rank = factor_scores.rank(axis=1)
turnover = rank.diff().abs().mean().mean()
return turnover
# 4. 可视化
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# IC序列图
ic_series.plot(ax=axes[0,0], title='IC序列')
# 分组收益柱状图
group_returns = calc_group_returns(factor_scores, forward_returns)
group_returns.plot(kind='bar', ax=axes[0,1], title='分组收益')
return {
'IC_mean': ic_mean,
'IC_IR': ic_ir,
'turnover': calc_turnover(factor_scores)
}
快速上手指南
新手推荐路线:
python
# Day 1: 使用FinMind获取因子数据
# Day 2: 用Alphalens分析因子有效性
# Day 3: 用简单策略验证因子
# Day 4: 用Pyfolio分析策略绩效
数据源推荐:
免费中文数据:
akshare:A股全面数据
tushare:需要Token但数据质量高
baostock:稳定免费
免费国际数据:
yfinance:雅虎财经
pandas-datareader:多种数据源
项目结构建议:
factor_investing/
├── data/ # 数据模块
│ ├── collector.py # 数据收集
│ └── processor.py # 数据清洗
├── factors/ # 因子模块
│ ├── value.py # 价值因子
│ ├── momentum.py # 动量因子
│ └── quality.py # 质量因子
├── analysis/ # 分析模块
│ ├── ic_analysis.py # IC分析
│ └── backtest.py # 回测
└── config.py # 配置文件
注意事项
因子过拟合:避免在过多历史数据上优化参数
未来函数:确保因子计算只用历史数据
幸存者偏差:使用成分股历史数据而非当前成分股
换手率成本:考虑交易成本对策略的影响
市场状态:因子在不同市场环境下表现不同
实用小技巧
# 1. 因子去极值(Winsorize)
def winsorize(series, n=3):
mean, std = series.mean(), series.std()
return series.clip(mean - n*std, mean + n*std)
# 2. 中性化处理(去除行业、市值影响)
def neutralize(factor, market_cap, industry_dummies):
"""行业市值中性化"""
import statsmodels.api as sm
X = pd.concat([market_cap, industry_dummies], axis=1)
X = sm.add_constant(X)
model = sm.OLS(factor, X).fit()
return model.resid
# 3. 因子衰减权重
def decay_weight(factor, half_life=60):
"""指数衰减权重,新数据权重更大"""
decay_rate = np.log(2) / half_life
weights = np.exp(-decay_rate * np.arange(len(factor))[::-1])
return weights / weights.sum()
上一篇
下一篇
WorldQuant 101 因子
聚宽因子库 Alpha191 Alpha101
《趋势跟踪》 笔记
因子与量化投资联系和区别
Alphalens FinMind Qlib 实例