xChar
·5 years ago

在进行股票交易时,往往不止1只备选股,一般是2-3只,甚至更多的备选股。如何在多个股票之间分配资金呢?一般常见的有等权重法、按固定数量,按市值/流通市值比例等方法。今天要介绍的是基于ATR的资金分配方法。该方法的思路来自海龟交易策略的一部分。

1,什么是ATR

在介绍基于ATR的资金分配方法前,首先要介绍什么ATR?

ATR,又名平均真实波幅, 主要是用来衡量市场波动的指标之一。ATR的计算可分为两步:

1,TR(又名真实波幅)计算:MAX(以下3个值)

  • | 最高价-最低价|——这个很容易理解,一天之内的振幅
  • |(昨日)收盘价-最高价|——考虑了次日跳空高开高走的情况
  • |(昨日)收盘价-最近价|——考虑了次日跳空低开低走的情况

2,ATR = TR / N, 其中N为天数,TR表示N天的TR合计,一般N取20

2,等权重分配资金有什么缺点

如果以等权重法进行资金分配的话,那么就是按照(可用资金 / 股票数 )进行分配资金。比如说,如果计划同时买入股票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%,你的总账依旧会亏损。

3,基于ATR的资金分配方法

我们引入基于ATR的资金分配方案来规避上述的不确定性。买入数量如下设置:

买入数量(Unit)= (可用资金*固定百分比)/ 股票的1个ATR

假设有可用资金=10万元,固定百分比=1%(一般都设置为1%,含义是当天振幅使得总资产的变化不超过1% ),

以AI ETF和国债ETF为例,

  • AI ETF当天的ATR为0.0548元,相当于收盘价(1.239)的4.08%;
  • AIETF买入数量=1000/0.0548=18248,即18200股 ;
  • 国债ETF当天的ATR为0.4604元,相当于收盘价(124.458)的0.37%;
  • 国债ETF买入单位=1000/0.4604=2172, 即2100股 ;
  • 两者合计资金约28万元

通过上述的资金分配,我们大体可以使这两个股票的正常波动对投资组合的影响大致相等,不会过分受到某一只股票的影响。

4,基于ATR的资金分配代码示例

###以下代码基于JoinQuant编写

计算ATR及ATRma值

#参数:
#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

基于ATR的资金分配方法

#参数:
#security:股票名
#unit:买卖单位,一般为总资产的1%。当总资产为10万时,unit=1000
def getAmount(security, unit=1000):
atr_value, atr_ma = atrMa(security)
amount = unit/atr_value
return amount

Loading comments...