在进行股票交易时,往往不止1只备选股,一般是2-3只,甚至更多的备选股。如何在多个股票之间分配资金呢?一般常见的有等权重法、按固定数量,按市值/流通市值比例等方法。今天要介绍的是基于ATR的资金分配方法。该方法的思路来自海龟交易策略的一部分。
在介绍基于ATR的资金分配方法前,首先要介绍什么ATR?
ATR,又名平均真实波幅, 主要是用来衡量市场波动的指标之一。ATR的计算可分为两步:
1,TR(又名真实波幅)计算:MAX(以下3个值)
2,ATR = TR / N, 其中N为天数,TR表示N天的TR合计,一般N取20
如果以等权重法进行资金分配的话,那么就是按照(可用资金 / 股票数 )进行分配资金。比如说,如果计划同时买入股票1和股票2,而账户中有10万元资金,那么资金分配方案为:股票1:5万元,股票:5万元。 这种方法大家最为常用,也最方便操作。但是这种资金分配有一个缺点——忽视了个股的波动性。比如说,以今天为例,国债ETF(511010)的振幅在0.2%,而AI ETF(512930)的振幅在3%,两者相差了15倍。若以同样的资金购买国债ETF和AI ETF,那么波动性大的AI ETF带来的亏损和盈利都会超过波动性相对小的国债ETF。假设你的胜率有60%,但如果不幸如今天的行情一样,波动性小的国债ETF涨了0.14%,波动性大的AI ETF却跌了2.36%,你的总账依旧会亏损。
我们引入基于ATR的资金分配方案来规避上述的不确定性。买入数量如下设置:
买入数量(Unit)= (可用资金*固定百分比)/ 股票的1个ATR
假设有可用资金=10万元,固定百分比=1%(一般都设置为1%,含义是当天振幅使得总资产的变化不超过1% ),
以AI ETF和国债ETF为例,
通过上述的资金分配,我们大体可以使这两个股票的正常波动对投资组合的影响大致相等,不会过分受到某一只股票的影响。
###以下代码基于JoinQuant编写
#参数:
#security:股票名
#atr_length:平均真实振幅天数
#atr_ma_length:ATR的平均天数
#n:历史数据取值天数
#unit:取值单位
#include_now:是否包含当天
def atrMa(security, atr_length=20 atr_ma_length=10, n=40, unit='1d', include_now=False):
atr_value = 0
atr_ma = 0
bar_ndarray = get_bars(security, n, unit=unit, fields=
['close','high','low'], include_now=include_now)
if bar\_ndarray.shape\[0\] == 0:
print("股票 %s 输入数据全是 NaN,该股票可能已退市、未上市或刚上市,返回
NaN 值数据。" %security)
else:
# 最新时刻HL
bar\_high = bar\_ndarray\['high'\]\[-1\]
bar\_low = bar\_ndarray\['low'\]\[-1\]
bar\_close = bar\_ndarray\['close'\]\[-1\]
## 技术指标计算
#ATR、ATRma
result = talib.ATR(bar\_ndarray\['high'\], bar\_ndarray\['low'\],
bar\_ndarray\['close'\], atr\_length)
atr\_value = result\[-1\]
atr\_ma = result\[-atr\_ma\_length:\].mean()
return atr\_value, atr\_ma
#参数:
#security:股票名
#unit:买卖单位,一般为总资产的1%。当总资产为10万时,unit=1000
def getAmount(security, unit=1000):
atr_value, atr_ma = atrMa(security)
amount = unit/atr_value
return amount