首页  

因子量化投资开源库     所属分类 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 实例