🚀 AI 一键生成 joinquant 策略代码

如何在 JoinQuant 中调用 WorldQuant Alpha101 因子进行选股?

joinquant | 发布时间: 2025/12/1
以下内容由 EasyQuant 生成。

问题描述

如何调用 Alpha101 因子库中的因子进行选股?比如我想用 Alpha 001 因子

解决方案

在聚宽(JoinQuant)平台中调用 Alpha101 因子库非常方便。聚宽已经将 WorldQuant 发表的 101 个 Alpha 因子封装在 jqlib.alpha101 库中,您可以直接导入并使用。

以下是一个完整的策略示例,展示了如何调用 Alpha 001 因子,并在沪深300成分股中选取因子值最高的 10 只股票进行等权重买入。

策略实现代码

# -*- coding: utf-8 -*-
from jqdata import *
# 导入 Alpha101 库中的 alpha_001 函数
from jqlib.alpha101 import alpha_001

def initialize(context):
    # 设定基准为沪深300
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    # 设置手续费:买入万三,卖出万三加千一印花税
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    # 设定持仓数量
    g.stock_num = 10
    
    # 每天开盘时运行选股和调仓
    run_daily(trade, '09:30')

def trade(context):
    # 1. 获取股票池:这里选择沪深300成分股
    pool = get_index_stocks('000300.XSHG')
    
    # 2. 过滤停牌和ST股票
    current_data = get_current_data()
    pool = [stock for stock in pool if not current_data[stock].paused and not current_data[stock].is_st]
    
    # 3. 调用 Alpha 001 因子
    # 参数1:计算日期(通常使用前一个交易日的数据来决策今日交易)
    # 参数2:股票池列表
    # 返回值:一个 pandas.Series,索引是股票代码,值是因子值
    factor_values = alpha_001(context.previous_date, pool)
    
    # 4. 选股逻辑
    # 去除 NaN 值
    factor_values = factor_values.dropna()
    
    # Alpha 001 公式: (rank(Ts_ArgMax(SignedPower(((returns < 0) ? stddev(returns, 20) : close), 2.), 5)) - 0.5)
    # 该因子通常作为动量或反转类指标,这里演示选取因子值最大的前N只股票(假设因子值越大越好)
    # 对因子值进行降序排列,取前 g.stock_num 只
    long_list = factor_values.sort_values(ascending=False).head(g.stock_num).index.tolist()
    
    # 5. 执行交易
    # 获取当前持仓
    current_holdings = list(context.portfolio.positions.keys())
    
    # 卖出不在目标列表中的股票
    for stock in current_holdings:
        if stock not in long_list:
            order_target_value(stock, 0)
    
    # 买入目标列表中的股票
    if len(long_list) > 0:
        # 等权重分配资金
        target_value = context.portfolio.total_value / len(long_list)
        for stock in long_list:
            order_target_value(stock, target_value)
            
    print("今日买入列表: {}".format(long_list))

代码关键点解析

  1. 导入库
    必须使用 from jqlib.alpha101 import alpha_001 (或者 import *) 来引入因子计算函数。

  2. 函数调用
    alpha_001(date, securities)

    • date: 计算因子的日期。在回测中,为了避免未来函数,通常使用 context.previous_date(前一个交易日)的数据来进行计算,并在当天的开盘进行交易。
    • securities: 股票代码列表(如 ['000001.XSHE', '600000.XSHG'])。
  3. 返回值处理
    该函数返回的是一个 pandas.Series 对象,Index 是股票代码,Value 是计算出的因子值。由于数据缺失等原因,可能会包含 NaN,建议使用 .dropna() 进行清洗。

  4. 排序方向
    Alpha 101 中的因子方向性(越大越好还是越小越好)并不统一。在使用具体因子前,建议先查阅该因子的公式含义或进行简单的 IC 分析(信息系数分析)来确定排序方向。在本例中,我们默认选取因子值最大的股票。

常见问题 Q&A

Q: 如何调用其他的 Alpha 因子,比如 Alpha 002?
A: 方法完全一样,只需修改导入和调用函数即可:

from jqlib.alpha101 import alpha_002
# ...
factor_values = alpha_002(context.previous_date, pool)

Q: 这个库支持哪些股票池?
A: securities 参数支持任意股票代码列表。您可以传入沪深300、中证500,或者全市场股票代码(通过 get_all_securities(['stock']).index.tolist() 获取)。

Q: 为什么计算出来的因子值有很多 NaN?
A: Alpha 因子通常依赖过去一段时间的行情数据(如过去20天的均值、标准差等)。如果股票上市时间太短,或者近期有长期停牌导致数据不足,计算结果就会是 NaN。策略中必须包含去除 NaN 的逻辑。