跳转至

选股策略框架

本篇导览

项目 说明
目标 使用 TopNSelector 和 MultiFactorSelector 构建选股策略
前置 运行回测

1. 选股策略框架

eqlib 提供 TopNSelectorMultiFactorSelector 两个选股框架,支持周期性调仓和因子筛选。

1.1 TopNSelector:排名选股

按因子值排名选出 Top N 只股票。

from eqlib import TopNSelector

def initialize(context):
    g.selector = TopNSelector(
        universe=['600519', '601390', '000858', '600036', '601166'],
        factor_fn=momentum_factor,  # 自定义因子函数
        top_n=3,
        rebalance_freq='weekly',    # 每周调仓
    )
    run_daily(rebalance, time='every_bar')

def momentum_factor(security, context):
    """动量因子:过去 20 日涨幅"""
    hist = attribute_history(security, 20, '1d', ['close'])
    if hist.empty or len(hist) < 20:
        return None
    return (hist['close'].iloc[-1] / hist['close'].iloc[0] - 1)

def rebalance(context):
    candidates = g.selector.select(context)
    if candidates:
        for sec in candidates:
            order_value(sec, context.portfolio.available_cash / len(candidates))

1.2 MultiFactorSelector:多因子选股

结合多个因子进行综合评分选股。

from eqlib import MultiFactorSelector

def initialize(context):
    g.selector = MultiFactorSelector(
        universe=['600519', '601390', '000858', '600036', '601166'],
        factors={
            'momentum': (momentum_factor, 0.4),    # 权重 40%
            'volatility': (volatility_factor, 0.3), # 权重 30%
            'value': (value_factor, 0.3),           # 权重 30%
        },
        top_n=3,
        rebalance_freq='monthly',
    )

def volatility_factor(security, context):
    """波动率因子(逆向):波动率越低越好"""
    hist = attribute_history(security, 20, '1d', ['close'])
    if hist.empty:
        return None
    returns = hist['close'].pct_change().dropna()
    return -returns.std()  # 取负,使低波动率得分高

def value_factor(security, context):
    """估值因子:PE 越低越好"""
    val = get_valuation(security)
    if val is None or val.get('pe_ratio') is None:
        return None
    return -val['pe_ratio']  # 取负,使低 PE 得分高

def rebalance(context):
    candidates = g.selector.select(context)
    # 调仓逻辑...

1.3 选股周期配置

参数 可选值 说明
rebalance_freq 'daily' 每个交易日调仓
'weekly' 每周一调仓
'biweekly' 每两周调仓
'monthly' 每月首个交易日调仓
'quarterly' 每季度首个交易日调仓

1.4 因子函数规范

因子函数签名为:

def my_factor(security: str, context: Context) -> float | None:
    """
    Args:
        security: 股票代码
        context: 策略上下文

    Returns:
        因子值(数值越大越好)或 None(该股票不参与排名)
    """
    pass

完整 API 参数说明见 选股策略 API 参考