3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
本策略是一个典型的多因子选股 + 大盘择时 + 避险资产切换的量化交易策略。策略核心逻辑如下:
roe_ttm(权益回报率TTM),筛选出盈利能力强、基本面扎实的优质企业。BBIC 因子,寻找具有中短期多头趋势的标的。fifty_two_week_close_rank 因子,评估当前股价在过去一年区间的位置,避免追高,选择处于合理突破或蓄势阶段的股票。000300.XSHG)的20日均线(MA20)。204001.XSHG)或现金避险。以下是基于 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)
get_factor_values:
roe_ttm、BBIC 和 fifty_two_week_close_rank 均为聚宽内置的高级基本面与量价因子,无需手动计算,极大地提高了回测效率。attribute_history:
order_target_value: