🚀 AI 一键生成 joinquant 策略代码
立即体验

聚宽平台如何编写三因子趋势选股与大盘择时避险策略?(附 Python 源码)

joinquant | 发布时间: 2026/8/10
以下内容由 EasyQuant 生成。

问题描述

JoinQuant 三因子趋势策略:如何实现大盘择时与逆回购避险?
如何在聚宽中使用 BBI 动量、年内价格区间位置和 ROE 三个因子选股,同时根据大盘趋势切换股票持仓与逆回购避险?

解决方案

策略逻辑概述

本策略是一个典型的多因子选股 + 大盘择时 + 避险资产切换的量化交易策略。策略核心逻辑如下:

  1. 三因子选股模型
    • 质量因子(ROE):使用 roe_ttm(权益回报率TTM),筛选出盈利能力强、基本面扎实的优质企业。
    • 动量因子(BBI动量):使用 BBIC 因子,寻找具有中短期多头趋势的标的。
    • 位置因子(52周价格位置):使用 fifty_two_week_close_rank 因子,评估当前股价在过去一年区间的位置,避免追高,选择处于合理突破或蓄势阶段的股票。
  2. 大盘择时机制
    • 监控沪深300指数(000300.XSHG)的20日均线(MA20)。
    • 当指数收盘价高于MA20时,判定为多头市场,全仓买入筛选出的优质股票组合。
    • 当指数收盘价低于MA20时,判定为空头市场,卖出所有股票持仓,切换至国债逆回购(如GC001 204001.XSHG)或现金避险。

聚宽 Python 策略源码

以下是基于 JoinQuant API 实现的完整策略代码:

# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
from jqdata import *
from jqfactor import get_factor_values

def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 策略参数设置
    g.market_index = '000300.XSHG'  # 择时参考大盘指数
    g.ma_period = 20                # 均线周期
    g.stock_num = 10                # 持股数量
    g.hedge_asset = '204001.XSHG'   # 避险资产:GC001(国债逆回购)
    
    # 设定手续费
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    # 每日运行
    run_daily(market_timing_and_trade, time='09:30')

def market_timing_and_trade(context):
    # 1. 大盘择时判断
    close_data = attribute_history(g.market_index, g.ma_period + 5, '1d', ['close'])
    ma20 = close_data['close'].rolling(g.ma_period).mean().iloc[-1]
    current_index_price = close_data['close'].iloc[-1]
    
    is_bull_market = current_index_price > ma20
    
    if is_bull_market:
        log.info("大盘处于多头市场,执行三因子选股调仓")
        # 如果持有避险资产,先清仓
        if g.hedge_asset in context.portfolio.positions:
            order_target(g.hedge_asset, 0)
            
        # 获取选股池(以沪深300成分股为例)
        stock_pool = get_index_stocks('000300.XSHG')
        
        # 获取因子值
        yesterday_str = (context.current_dt - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
        factors = ['roe_ttm', 'BBIC', 'fifty_two_week_close_rank']
        factor_data = get_factor_values(securities=stock_pool, factors=factors, end_date=yesterday_str, count=1)
        
        # 构建因子分析 DataFrame
        df = pd.DataFrame(index=stock_pool)
        df['roe'] = factor_data['roe_ttm'].iloc[-1]
        df['bbic'] = factor_data['BBIC'].iloc[-1]
        df['price_rank'] = factor_data['fifty_two_week_close_rank'].iloc[-1]
        
        # 剔除含有空值的股票
        df = df.dropna()
        
        # 因子打分与排序(ROE越大越好,BBIC越大越好,52周位置适中或偏低较好,此处以ROE和BBIC正向、位置因子中低向排序为例)
        df['roe_rank'] = df['roe'].rank(ascending=False)
        df['bbic_rank'] = df['bbic'].rank(ascending=False)
        df['position_rank'] = df['price_rank'].rank(ascending=True) # 倾向于年内位置不至于过高的股票
        
        # 综合得分
        df['total_score'] = df['roe_rank'] + df['bbic_rank'] + df['position_rank']
        
        # 选取综合排名最靠前的股票
        target_stocks = list(df.sort_values(by='total_score').index[:g.stock_num])
        
        # 调仓执行
        # 卖出不在目标池中的股票
        for stock in list(context.portfolio.positions.keys()):
            if stock != g.hedge_asset and stock not in target_stocks:
                order_target(stock, 0)
                
        # 等权重买入目标股票
        position_value = context.portfolio.total_value / g.stock_num
        for stock in target_stocks:
            order_target_value(stock, position_value)
            
    else:
        log.info("大盘处于空头市场,执行逆回购避险")
        # 卖出所有股票持仓
        for stock in list(context.portfolio.positions.keys()):
            if stock != g.hedge_asset:
                order_target(stock, 0)
                
        # 将剩余可用资金买入国债逆回购 GC001
        available_cash = context.portfolio.available_cash
        if available_cash >= 100000: # GC001 门槛为10万
            # 逆回购下单(此处简化为直接买入,实盘中需注意逆回购申报规则)
            order_value(g.hedge_asset, available_cash)

核心 API 详解

  1. get_factor_values
    • 用于批量获取聚宽因子库中的因子数据。本策略中调用的 roe_ttmBBICfifty_two_week_close_rank 均为聚宽内置的高级基本面与量价因子,无需手动计算,极大地提高了回测效率。
  2. attribute_history
    • 获取大盘指数的历史收盘价,用于计算移动平均线(MA),实现大盘择时过滤。
  3. order_target_value
    • 目标价值下单函数。在多头市场中,通过将总资产等分,快速实现投资组合的等权重再平衡。