宽客秀

宽客秀

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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。