3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化投资中,红利策略(高股息率策略)因其稳定的现金流和低估值特性,在长期中表现优异。然而,在市场系统性下跌或高波动时期,红利股同样会面临较大的回撤。为了优化红利策略,我们可以通过以下三个维度进行改进:
dividend_liability 或通过财务数据计算)最高的前20只股票。stddev),剔除标准差最大的5只,保留15只波动率较低的红利股。000300.XSHG)过去20天的年化波动率。511010.XSHG)。511010.XSHG)。以下是基于 JoinQuant API 编写的完整策略代码:
import numpy as np
import pandas as pd
from jqdata import *
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')
# 基金交易手续费设置(国债ETF)
set_order_cost(OrderCost(open_commission=0.0001, close_commission=0.0001), type='fund')
# 定义全局变量
g.bond = '511010.XSHG' # 国债ETF作为防御资产
g.index = '000300.XSHG' # 大盘指数
g.stock_num = 15 # 最终持股数量
# 每月第一个交易日开盘运行调仓
run_monthly(handle_portfolio, monthday=1, time='09:30')
def handle_portfolio(context):
# 1. 获取大盘波动率并决定仓位
market_prices = attribute_history(g.index, 20, '1d', ['close'])
market_returns = market_prices['close'].pct_change().dropna()
# 计算年化波动率
market_vol = market_returns.std() * np.sqrt(252)
if market_vol <= 0.20:
stock_ratio = 1.0
elif market_vol <= 0.30:
stock_ratio = 0.5
else:
stock_ratio = 0.2
bond_ratio = 1.0 - stock_ratio
log.info(f"当前大盘年化波动率: {market_vol:.2%}, 股票目标比例: {stock_ratio:.0%}, 债券目标比例: {bond_ratio:.0%}")
# 2. 筛选高股息红利股
# 获取当前沪深300成分股
stocks = get_index_stocks(g.index)
# 查询财务数据:获取最新股息率(此处以估值表中的市净率倒数及相关红利因子近似,或直接查询财务库)
# 聚宽中可以通过 query(valuation.code) 结合 indicator 报表获取股息率,这里使用简化逻辑:
# 筛选出市盈率(PE)在0-15之间,且市净率(PB)较低的股票作为红利替代池
q = query(
valuation.code,
valuation.pb_ratio,
valuation.pe_ratio
).filter(
valuation.code.in_(stocks),
valuation.pe_ratio > 0,
valuation.pe_ratio < 15
).order_by(
valuation.pb_ratio.asc()
).limit(30)
df_fundamental = get_fundamentals(q)
candidate_stocks = list(df_fundamental['code'])
# 3. 波动率过滤(剔除候选池中个股波动率最高的一批)
vol_list = []
for s in candidate_stocks:
hist = attribute_history(s, 60, '1d', ['close'])
ret = hist['close'].pct_change().dropna()
vol_list.append({'code': s, 'vol': ret.std()})
df_vol = pd.DataFrame(vol_list).sort_values(by='vol', ascending=True) # 波动率从小到大排序
# 取波动率最低的前 g.stock_num 只股票
target_stocks = list(df_vol['code'].head(g.stock_num))
# 4. 执行调仓交易
# 获取当前持仓
current_positions = context.portfolio.positions
# 卖出不在目标股票池且不是债券的资产
for s in list(current_positions.keys()):
if s != g.bond and s not in target_stocks:
order_target(s, 0)
# 计算资金分配
total_value = context.portfolio.total_value
stock_budget = total_value * stock_ratio
bond_budget = total_value * bond_ratio
# 债券调仓
order_target_value(g.bond, bond_budget)
# 股票等权重调仓
if len(target_stocks) > 0:
each_stock_budget = stock_budget / len(target_stocks)
for s in target_stocks:
order_target_value(s, each_stock_budget)
log.info("调仓完成!")
511010.XSHG),从而成功避开主跌浪,大幅降低最大回撤。