目次
概要
アルーンは1995年にトゥーシャー・シャンデ氏によって開発されたアルーン・インディケータとアルーン・オシレータ、2つの指標指標からなるテクニカル指標で、 アルーンとはインドのサンクスリット語で「夜明けの光」の意味します。トレンドの始まりを夜明けに例えています。 アルーン・アップとアルーン・ダウン2本のラインから構成されています。どちらも期間nの間にアルーン・アップなら最高値を、アルーン・ダウンなら最安値を更新した日がどのぐらいの比率あったかを示しています。図1は表示例で、上昇トレンドはアルーン・アップ、下落トレンドはアルーン・ダウンで判断します。最高値を更新し続けるということは買いの勢いが強いということになるので、アルーン・アップの値が大きい場合(70%以上)は上昇トレンドと判断されます。逆にアルーン・アップの値が小さい場合は上昇トレンドではないということです。

計算方法(n=5の場合の例)
アルーン・アップはある区間nの中で、直近の最高値を記録した日からの日数を使って計算します。区間内の最終日が最高値の場合100.0%になります。一方でアルーン・ダウンも同様にある区間の中での、最安値を記録した日からの日数を使って計算します。nを5としてみると以下の計算式となります。
$$ \rm{} アルーン・アップ=(5日-過去5日中の最高値更新の日からの日数)/5 \times 100 (\%) \\ アルーン・ダウン=(5日-過去5日中の最安値更新の日からの日数)/5 \times 100 (\%) $$アルーン・インディケータで使用されるnは通常14日ですが、 簡単のためn=5として計算をしてみましょう。上げトレンドを捉えていることがわかります。
日数 | 終値 | 安値 | 高値 | アルーン・アップ | アルーン・ダウン | |
1日目 | 1000 | 997 | 1057 | – | – | |
2日目 | 1050 | 1040 | 1074 | – | – | |
3日目 | 1070 | 1057 | 1073 | – | – | |
4日目 | 1060 | 1056 | 1082 | – | – | |
5日目 | 1080 | 1078 | 1101 | – | – | |
6日目 | 1100 | 1095 | 1155 | 100.0% | 0.0% | 上げトレンド発生 |
7日目 | 1150 | 1112 | 1158 | 100.0% | 0.0% | 上げトレンド |
8日目 | 1120 | 1113 | 1132 | 80.0% | 20.0% | 上げトレンド |
9日目 | 1130 | 1094 | 1134 | 60.0% | 0.0% | 上げトレンド |
10日目(最新) | 1100 | 1040 | 1112 | 40.0% | 20.0% | トレンド終了 |
Pythonによる実装
必要なライブラリを読み込みます
!pip install mpl_finance #Collaboratoryに入っていないライブラリを読み込みます
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import mpl_finance
import sys
import numpy as np
from datetime import datetime
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import requests
import io
データを読み込みます
#ファイルの読み込み
URL = "https://neulab.co.jp/wp-content/uploads/pseudo_data.csv" #csvファイルのURL
datafile = requests.get(URL)#ファイルの読み込み
#データフレームの作成
df_temp = pd.read_csv(io.BytesIO(datafile.content), header=0, index_col=0, parse_dates=True, encoding="UTF-8")
df = df_temp.loc[:,['Open','High','Low','Close']]
df.head()
アルーン・インディケータを計算します
df['aroon_max'] = df['High'].rolling(14).max()
df['aroon_min'] = df['Low'].rolling(14).min()
df = df.fillna(-0.1)
df['up'] = 0
High = df['aroon_max'][0]
High_pre = 0
High_num = 0
df = df.fillna(-0.1)
df['down'] = 0
Low = df['aroon_min'][0]
Low_pre = 0
Low_num = 0
for index, item in df.iterrows():
High = df.at[index, 'aroon_max']
if High < 0:
df.at[index, 'up'] = 0
elif High < High_pre:
High_num = 0
df.at[index, 'up'] = High_num
elif High > High_pre:
High_num = 0
df.at[index, 'up'] = High_num
else:
df.at[index, 'up'] = High_num
High_num = High_num + 1
High_pre = High
for index, item in df.iterrows():
Low = df.at[index, 'aroon_min']
if Low < 0:
df.at[index, 'down'] = 0
elif Low > Low_pre:
Low_num = 0
df.at[index, 'down'] = Low_num
elif Low < Low_pre:
Low_num = 0
df.at[index, 'down'] = Low_num
else:
df.at[index, 'down'] = Low_num
Low_num = Low_num + 1
Low_pre = Low
df_aroon_up = (14 - df['up'])/14 * 100
df_aroon_down = (14 - df['down'])/14 * 100
Matplotを使った描画例です
canvas_color = '#fffafa'
line_color = '#c8ced1'
font_color = '#171510'
colorup = '#bf0000'
colordown = '#006fbf'
n_data = -100
data = df[n_data:]
ohlc = np.vstack((range(len(data)), data.T)).T
fig, (ax1, ax2) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [10, 6]}, sharex=True, figsize=(12,9))
fig.patch.set_facecolor(canvas_color)
ax1.patch.set_facecolor(canvas_color)
mpl_finance.candlestick_ohlc(ax1, ohlc, width=0.5, alpha=1, colorup=colorup, colordown=colordown)
ax2.patch.set_facecolor(canvas_color)
ax2.plot(range(len(data)), df_aroon_up.values[n_data:], color='red', ls='-', label='Up')
ax2.plot(range(len(data)), df_aroon_down.values[n_data:], color='blue', ls='-', label='Down')
ax1.grid()
ax2.grid()
#ロゴ読み込み
logoURL = "https://neulab.co.jp/wp-content/uploads/logo.png" #logoファイルのURL
img_c = plt.imread(logoURL)
imagebox = OffsetImage(img_c, zoom=0.020) #画像をimageboxにいれる。
imagebox.image.axes = ax1
im_sabo = AnnotationBbox(imagebox, (0, 9850), xybox=(0, 9950), xycoords="data", boxcoords="data", pad=0.3, frameon=False)
l1,l2 = ax2.get_legend_handles_labels()
ax2.legend(l1,l2, fontsize=14, edgecolor='none', facecolor=canvas_color)
ax1.add_artist(im_sabo)
ax1.set_ylabel("Price of Something", fontsize=22)
ax1.set_ylim(9000., 10000.)
ax1.yaxis.tick_right()
ax1.yaxis.set_label_coords(0, 0.5)
ax1.tick_params(labelsize=24, labelcolor=font_color, color=line_color)
ax1.spines['left'].set_linewidth(0)
ax1.spines['right'].set_linewidth(0)
ax1.spines['top'].set_linewidth(0)
ax1.spines['bottom'].set_linewidth(0)
ax2.yaxis.tick_right()
ax2.set_ylim([-5,105])
ax2.tick_params(labelsize=22, labelcolor=font_color, color=line_color)
ax2.spines['left'].set_color(line_color)
ax2.spines['right'].set_color(line_color)
ax2.spines['top'].set_color(line_color)
ax2.spines['bottom'].set_color(line_color)
xtick0 = 2
plt.xticks(range(xtick0,len(data),12), [x.strftime('%m/%d') for x in df_aroon_up[n_data:].index][xtick0::12])
plt.subplots_adjust(left=0.05, right=0.89, bottom=0.1, top=0.99)
plt.grid(which='major',color=line_color,linestyle='-')
plt.grid(which='minor',color=line_color,linestyle='-')
ax2.grid(linestyle='--', lw=1)
ax1.set_axisbelow(True)
fig.savefig('Aroon.png', facecolor=fig.get_facecolor(), edgecolor='none')
以上のコードをGoogle社の提供しているColaboratory上で公開しており、実際に動作させることができます。
リンク先はこちら。
アルーンを使った予想
- 買い
- アルーン・アップがアルーン・ダウンを上抜けしたとき
- アルーン・アップが一旦100%に達してその後も70%以上で推移する場合、この時アルーン・ダウンは30%以下(順張り)
- 上昇トレンドはアルーン・アップが50%を割った場合に終了
- 売り
- アルーン・ダウンがアルーン・アップを上抜けしたとき
- アルーン・ダウンが一旦100%に達してその後も70%以上で推移する場合、この時アルーン・アップは30%以下(順張り)
- 下落トレンドはアルーン・ダウンが50%を割った場合に終了
図2がエントリーポイントの予測です。(代表的な点だけ図示しています。)

注意点
他の指標の多くが100%と0%のようにトレンドの発生ポイントが上下に離れているのと異なり、アルーン・アップとアルーン・ダウンともに100%がトレンドの発生を示していることに注意してください。
※このHPページで紹介しているテクニカル指標を使った取引ルールや売買シグナルの見方は一般的な考え方に基づくものであり、利益の増加や損失の減少を保証するものではありません。ご自身の判断にてお取引いただきますようお願いいたします。
現在、ニューラボでは人工知能を活用した取引アルゴリズムを販売中です。
自動取引にご興味を持たれましたらこちらのHPまで。