株式取引を行う際、通常 1 つ以上の候補株があります。一般的には 2〜3 つ、またはそれ以上の候補株があります。どのように複数の株式間で資金を配分するのでしょうか?一般的な方法には、等重法、固定数量法、時価総額 / 流通時価総額比率法などがあります。今日は ATR に基づく資金配分方法を紹介します。この方法のアイデアは、タートルトレーディング戦略の一部から得られました。
1. ATR とは何ですか#
ATR に基づく資金配分方法を紹介する前に、まず ATR とは何かを説明します。
ATR(Average True Range)は、市場の変動を測定するための指標の 1 つです。ATR の計算は次の 2 つのステップで行われます:
- TR(True Range)の計算:MAX(以下の 3 つの値)
- | 最高価格 - 最低価格 | - これは 1 日のレンジです
- |(前日)終値 - 最高価格 | - 翌日のギャップアップの場合を考慮しています
- |(前日)終値 - 最安価格 | - 翌日のギャップダウンの場合を考慮しています
- ATR = TR / N、ここで N は日数を表し、TR は N 日間の TR の合計を表します。一般的には N を 20 とします。
2. 等重法による資金配分の欠点#
等重法による資金配分を行う場合、利用可能な資金を株式数で割って資金を配分します。例えば、株式 1 と株式 2 を同時に購入する予定で、アカウントに 10 万円の資金がある場合、資金配分の計画は次のようになります:株式 1:5 万円、株式 2:5 万円。この方法は一般的で、操作が簡単です。しかし、この資金配分には欠点があります - 個々の株式の変動性を無視しているという点です。例えば、今日を例に挙げると、国債 ETF(511010)の振幅は 0.2% であり、AI ETF(512930)の振幅は 3% です。これらの 2 つの値は 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% に相当します。
- AI ETF の購入数量 = 1000/0.0548=18248、つまり 18200 株です。
- 国債 ETF の当日の ATR は 0.4604 円であり、終値(124.458)の 0.37% に相当します。
- 国債 ETF の購入数量 = 1000/0.4604=2172、つまり 2100 株です。
- 両者の合計資金は約 28 万円です。
上記の資金配分により、これら 2 つの株式の正常な変動が投資ポートフォリオに与える影響を大体同等にすることができ、特定の株式の影響を過度に受けることはありません。
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