基本面ATR轮动策略

由 bq0sufws创建,

策略思想


1. 策略理念


该策略每天选取固定的5只股票,依据基本面因子和ATR(Average True Range)进行轮动换仓。科创板股票除外。ATR是一个衡量市场波动性的指标,基本面因子则通常包括市盈率、市净率、资产收益率等财务指标。

2. 策略介绍


该策略综合运用了基本面分析和ATR因子,将基本面较好且波动率适中的股票纳入股票池。每天根据最新数据进行调整,保持投资组合的理性和灵活性,以实现稳健的收益。

3. 策略背景


轮动策略旨在通过定期调整投资组合,避免长期持有单一或少量股票可能带来的风险,同时捕捉市场中不同股票的上涨机会。这种策略在市场变化频繁的环境下,能够有效地分散风险,提高收益的稳定性。

策略风格

  1. 投资标的特征:

- 股票池主要由市盈率、市净率、资产收益率等基本面指标表现较优的股票构成。
- 排除科创板股票。
  1. 优选标准:

- 使用了ATR作为衡量市场波动的因子,选取波动性适中的股票。
  1. 股票持仓特征:

- 每日持仓调整,以达到动态平衡和适时换仓的目的。
- 固定持有5只股票,持仓集中度适中。

策略风险

  1. 市场风险:

- 由于策略中包含了股票市场,市场整体下跌可能导致策略亏损。
- 使用ATR虽然能减少部分风险,但波动性仍然会对收益产生不确定的影响。
  1. 个股风险:

- 每日只持有5只股票,相对集中度较高,可能面临个别股票波动引起的较大风险。
  1. 操作风险:

- 由于是每日执行轮动换仓,执行中的延迟、错误可能导致不必要的损失。
  1. 流动性风险:

- ATR因子虽然可以减少部分波动性大的股票,但如果选中的股票流动性较低,可能导致买卖困难。

策略优势

  1. 分散风险: 基于每天的基本面因子和ATR调整持仓,避免了长期持有单一股票的高风险。

2. 动态调整: 每天调仓可以及时应对市场变化,避免单只股票长时间持有带来的潜在风险。
  1. 波动控制: 使用ATR因子,优选波动适中的股票,有效控制策略整体的波动性。

4. 精选标的: 依据基本面因子,选取基本面优质的股票,提高整体持仓质量和稳健性。

代码讲解


模块1:初始化模块 - m2initializebigquantrun


该模块用于策略初始化,包括设定交易手续费等。

def m2initializebigquantrun(context):
from bigtrader.finance.commission import PerOrder
context.setcommission(PerOrder(buycost=0.0003, sellcost=0.0013, mincost=5))

解释
- 功能:
- 为策略设定初始环境参数,如交易手续费。
- 参数:
- context: 策略运行时环境参数对象。

模块2:数据处理模块 - m2handledatabigquantrun


该模块主要用于每日调仓,根据当天的数据决定是否买入卖出股票。

def m2handledatabigquantrun(context, data):
import pandas as pd
if not context.rebalanceperiod.issignaldate(data.currentdt.date()):
return
todaydf = context.data[context.data["date"] == data.currentdt.strftime("%Y-%m-%d")]
for instrument in sorted(set(context.getaccountpositions().keys()) - set(todaydf["instrument"])):
context.order
targetpercent(instrument, 0)
stock
now = {e: p for e, p in context.portfolio.positions.items() if p.amount>0}
for i, x in todaydf.iterrows():
if x.instrument in stock
now:
continue
context.ordertargetpercent(x.instrument, 0.0 if pd.isnull(x.position) else x.position)

解释
- 功能:
- 每天根据数据决定是否换仓,卖出不在目标持仓列表中的股票,并买入新的目标持仓列表中的股票。
- 参数:
- context: 策略运行时环境参数对象。
- data: 每日市场数据。

模块3:构建股票池模块 - m5, m6, m1


该模块用于过滤和选取股票,形成股票池。

m5 = M.inputfeaturesdai.v26(
mode="""表达式""",
expr="""score""",
exprfilters="""""",
expr
tables="""userdataufws0b59f8b7""",
extra
fields="""date, instrument""",
orderby="""date, instrument""",
expr
dropna=True,
expr
addsql=False,
sql="""""",
extract
data=False,
mname="""m5"""
)

m6 = M.extract
datadai.v16(
sql=m5.data,
start
date="""2021-03-01""",
startdateboundtotradingdate=True,
end
date="""2024-04-11""",
enddateboundtotradingdate=True,
before
startdays=90,
debug=False,
m
name="""m6"""
)

m1 = M.scoretoposition.v2(
input1=m6.data,
score
field="""score DESC""",
holdcount=5,
position
expr="""1 AS position""",
totalposition=1,
extract
data=True,
mname="""m1"""
)

解释
- 功能:
- 依据得分筛选股票,形成持仓比例。
- 参数:
- m5, m6: 数据处理模块,用于提取和整理数据。
- m1: 提取最终股票池,设定持仓比例。

模块4:交易模块 - m2


该模块主要负责执行交易,包括订单生成、交易执行、交易回报等。

m2 = M.bigtrader.v17(
data=m1.data,
start
date="""""",
enddate="""""",
initialize=m2
initializebigquantrun,
beforetradingstart=m2beforetradingstartbigquantrun,
handle
tick=m2handletickbigquantrun,
handledata=m2handledatabigquantrun,
handle
trade=m2handletradebigquantrun,
handleorder=m2handleorderbigquantrun,
after
trading=m2aftertradingbigquantrun,
capitalbase=500000,
frequency="""daily""",
product
type="""股票""",
rebalanceperiodtype="""交易日""",
rebalanceperioddays="""1""",
rebalanceperiodrollforward=True,
backtest
enginemode="""标准模式""",
before
startdays=0,
volume
limit=1,
orderpricefieldbuy="""open"""",
order
pricefieldsell="""open"""",
benchmark="""沪深300指数""",
plotcharts=True,
debug=False,
backtest
only=False,
m_name="""m2"""
)

解释
- 功能:
- 进行每日交易管理,执行策略。
- 参数:
- m1: 股票池数据。
- 各种交易函数:包括初始化、开盘前、tick数据处理、每日数据处理等。
- 交易设定:包括初始资金、交易频率、基准、回测设置等。