宽客秀

宽客秀

Quant.Show的Web3站点,Archives from quant.show

基于ATR的资金分配方法

在进行股票交易时,往往不止 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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。