基本面ATR轮动策略
由 bq0sufws创建,
策略思想
1. 策略理念
该策略每天选取固定的5只股票,依据基本面因子和ATR(Average True Range)进行轮动换仓。科创板股票除外。ATR是一个衡量市场波动性的指标,基本面因子则通常包括市盈率、市净率、资产收益率等财务指标。
2. 策略介绍
该策略综合运用了基本面分析和ATR因子,将基本面较好且波动率适中的股票纳入股票池。每天根据最新数据进行调整,保持投资组合的理性和灵活性,以实现稳健的收益。
3. 策略背景
轮动策略旨在通过定期调整投资组合,避免长期持有单一或少量股票可能带来的风险,同时捕捉市场中不同股票的上涨机会。这种策略在市场变化频繁的环境下,能够有效地分散风险,提高收益的稳定性。
策略风格
- 投资标的特征:
- 股票池主要由市盈率、市净率、资产收益率等基本面指标表现较优的股票构成。
- 排除科创板股票。
- 优选标准:
- 使用了ATR作为衡量市场波动的因子,选取波动性适中的股票。
- 股票持仓特征:
- 每日持仓调整,以达到动态平衡和适时换仓的目的。
- 固定持有5只股票,持仓集中度适中。
策略风险
- 市场风险:
- 由于策略中包含了股票市场,市场整体下跌可能导致策略亏损。
- 使用ATR虽然能减少部分风险,但波动性仍然会对收益产生不确定的影响。
- 个股风险:
- 每日只持有5只股票,相对集中度较高,可能面临个别股票波动引起的较大风险。
- 操作风险:
- 由于是每日执行轮动换仓,执行中的延迟、错误可能导致不必要的损失。
- 流动性风险:
- ATR因子虽然可以减少部分波动性大的股票,但如果选中的股票流动性较低,可能导致买卖困难。
策略优势
- 分散风险: 基于每天的基本面因子和ATR调整持仓,避免了长期持有单一股票的高风险。
2. 动态调整: 每天调仓可以及时应对市场变化,避免单只股票长时间持有带来的潜在风险。
- 波动控制: 使用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.ordertargetpercent(instrument, 0)
stocknow = {e: p for e, p in context.portfolio.positions.items() if p.amount>0}
for i, x in todaydf.iterrows():
if x.instrument in stocknow:
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="""""",
exprtables="""userdataufws0b59f8b7""",
extrafields="""date, instrument""",
orderby="""date, instrument""",
exprdropna=True,
expraddsql=False,
sql="""""",
extractdata=False,
mname="""m5"""
)
m6 = M.extractdatadai.v16(
sql=m5.data,
startdate="""2021-03-01""",
startdateboundtotradingdate=True,
enddate="""2024-04-11""",
enddateboundtotradingdate=True,
beforestartdays=90,
debug=False,
mname="""m6"""
)
m1 = M.scoretoposition.v2(
input1=m6.data,
scorefield="""score DESC""",
holdcount=5,
positionexpr="""1 AS position""",
totalposition=1,
extractdata=True,
mname="""m1"""
)
解释:
- 功能:
- 依据得分筛选股票,形成持仓比例。
- 参数:
- m5, m6: 数据处理模块,用于提取和整理数据。
- m1: 提取最终股票池,设定持仓比例。
模块4:交易模块 - m2
该模块主要负责执行交易,包括订单生成、交易执行、交易回报等。
m2 = M.bigtrader.v17(
data=m1.data,
startdate="""""",
enddate="""""",
initialize=m2initializebigquantrun,
beforetradingstart=m2beforetradingstartbigquantrun,
handletick=m2handletickbigquantrun,
handledata=m2handledatabigquantrun,
handletrade=m2handletradebigquantrun,
handleorder=m2handleorderbigquantrun,
aftertrading=m2aftertradingbigquantrun,
capitalbase=500000,
frequency="""daily""",
producttype="""股票""",
rebalanceperiodtype="""交易日""",
rebalanceperioddays="""1""",
rebalanceperiodrollforward=True,
backtestenginemode="""标准模式""",
beforestartdays=0,
volumelimit=1,
orderpricefieldbuy="""open"""",
orderpricefieldsell="""open"""",
benchmark="""沪深300指数""",
plotcharts=True,
debug=False,
backtestonly=False,
m_name="""m2"""
)
解释:
- 功能:
- 进行每日交易管理,执行策略。
- 参数:
- m1: 股票池数据。
- 各种交易函数:包括初始化、开盘前、tick数据处理、每日数据处理等。
- 交易设定:包括初始资金、交易频率、基准、回测设置等。