3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
这是一个基于 沪深300指数(000300.XSHG) 的 PE(市盈率)估值波段 交易策略。
# -*- coding: utf-8 -*-
# 导入函数库
from jqdata import *
import pandas as pd
def initialize(context):
# 1. 设定基准
set_benchmark('000300.XSHG')
# 2. 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 3. 设置手续费(股票类,买入万三,卖出万三+千一印花税)
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
# --- 策略参数设置 ---
# 目标指数:沪深300
g.index_code = '000300.XSHG'
# 交易标的:300ETF
g.etf_code = '510300.XSHG'
# 估值波段阈值 (基于沪深300历史数据经验值)
# 历史低位通常在 10-12倍左右,高位在 15-17倍左右
g.pe_buy_threshold = 11.5 # 买入阈值
g.pe_sell_threshold = 16.0 # 卖出阈值
# 每天开盘时运行
run_daily(market_open, time='09:30')
def market_open(context):
# 1. 计算当前指数的加权PE
current_pe = get_index_pe(context, g.index_code)
if current_pe is None:
return
# 记录PE值到图表,方便回测查看
record(Index_PE=current_pe)
# 获取当前现金和持仓
cash = context.portfolio.available_cash
position = context.portfolio.positions[g.etf_code].total_amount
# 2. 交易逻辑
# 信号:低估 -> 买入
if current_pe < g.pe_buy_threshold:
if cash > 0:
log.info(f"当前PE: {current_pe:.2f} < 买入阈值 {g.pe_buy_threshold},执行买入")
order_value(g.etf_code, cash)
# 信号:高估 -> 卖出
elif current_pe > g.pe_sell_threshold:
if position > 0:
log.info(f"当前PE: {current_pe:.2f} > 卖出阈值 {g.pe_sell_threshold},执行卖出")
order_target(g.etf_code, 0)
# 处于中间波段 -> 持仓不动
else:
pass
# log.info(f"当前PE: {current_pe:.2f},处于持有/观望区间")
def get_index_pe(context, index_code):
"""
计算指数的加权PE (总市值 / 总净利润)
"""
# 获取指数成分股
stocks = get_index_stocks(index_code)
if not stocks:
log.error("获取指数成分股失败")
return None
# 查询成分股的市值和PE(TTM)
# valuation.market_cap 单位: 亿元
# valuation.pe_ratio: 市盈率(TTM)
q = query(
valuation.code,
valuation.market_cap,
valuation.pe_ratio
).filter(
valuation.code.in_(stocks),
valuation.pe_ratio > 0 # 过滤掉亏损股,避免计算异常,也可以选择不过滤
)
df = get_fundamentals(q)
if df is None or len(df) == 0:
return None
# 计算原理:
# 单个股票净利润 = 市值 / PE
# 指数PE = 总市值 / 总净利润
# 1. 计算每只股票的净利润 (单位:亿元)
df['net_profit'] = df['market_cap'] / df['pe_ratio']
# 2. 计算总市值和总净利润
total_market_cap = df['market_cap'].sum()
total_net_profit = df['net_profit'].sum()
# 3. 计算指数加权PE
if total_net_profit > 0:
index_pe = total_market_cap / total_net_profit
return index_pe
else:
return None
如果你希望策略自动计算百分位(例如:PE处于过去5年 20% 分位点买入),你需要维护一个历史PE列表。由于聚宽 initialize 中不能大量查询历史财务数据,通常的做法是:
valuation.pe_ratio > 0 过滤了亏损股。Q: 这个策略可以直接用于实盘吗?
A: 这是一个基础的择时策略模板。实盘前建议:1. 结合当前宏观环境调整阈值;2. 考虑分批建仓(例如PE每跌0.5买入20%)而不是一次性全仓,以平滑风险。
Q: 如何查看回测中的PE变化曲线?
A: 代码中包含 record(Index_PE=current_pe),回测结束后,在结果页面的图表下方,勾选 "Index_PE" 即可看到指数估值随时间变化的曲线,方便你验证买卖点是否合理。
Q: 可以换成中证500指数吗?
A: 可以。将 g.index_code 改为 '000905.XSHG',将 g.etf_code 改为 '510500.XSHG'。注意:中证500的估值中枢比沪深300高,你需要将买入阈值调整为 20-25 左右,卖出阈值调整为 35-40 左右(具体需参考中证500历史估值)。