目次
概要

ラリー・ウィリアムズ(Rarry Williams)氏によって考案された。オシレータ系テクニカル指標です。一般的なA/Dラインは取引出来高に関する指標ですが、このWilliams A/DはA(Accumulation)とD(Distribution)の累積値を使用してグラフ化し、トレンド転換のタイミングを計るために使用します。
Aとは買い方のエネルギーによる値上がり、Dとは売り方のエネルギーによる値下がりの値でそれぞれトゥルーハイ(TRH)とトゥルーロー(TRL)を使用し計算します。これは一般的な出来高を使ったA/Dラインを値幅で置き換えたものです。
計算方法(日足の場合)
TRHとTRLは前日の終値と当日の高値および安値から計算します。前日終値と当日高値を比較しどちらか大きい方がTRH、前日終値と当日安値を比較しどちらか小さい方がTRLとなります。
$$ \rm{} TRH = Max(前日終値, 当日高値)\\ TRL = Min(前日終値, 当日安値)\\ $$次に、TRHとTRLを当日終値と比較しA/Dを計算します。
$$ \rm{} 当日終値>前日終値の場合 \\ A/D = 当日終値 – TRH \\ 当日終値<前日終値 \\ A/D = 当日終値 - TRL \\ それ以外の場合 \\ A/D = 0 \\ ウィリアムズA/D = 当日A/D + 前日のウイリアムズA/D $$それでは実際に計算してみましょう。
日数 | 終値 | 安値 | 高値 | TRH | TRL | A/D | ウィリアムズA/D |
1日目 | 1000 | 997 | 1057 | – | – | – | – |
2日目 | 1050 | 1040 | 1074 | 1074 | 1000 | -24 | – |
3日目 | 1070 | 1157 | 1073 | 1073 | 1050 | -3 | -27 |
4日目 | 1060 | 1056 | 1082 | 1082 | 1056 | 4 | 1 |
5日目 | 1080 | 1078 | 1101 | 1101 | 1060 | -21 | -17 |
6日目 | 1100 | 1095 | 1155 | 1155 | 1080 | -55 | -76 |
7日目 | 1150 | 1112 | 1158 | 1158 | 1112 | -8 | -63 |
8日目 | 1120 | 1113 | 1132 | 1150 | 1113 | 7 | -1 |
9日目 | 1130 | 1094 | 1134 | 1134 | 1094 | -4 | 3 |
10日目(最新) | 1100 | 1040 | 1112 | 1112 | 1040 | 60 | 56 |
上で分かるように上昇局面ではWilliams A/Dは前日終値と当日高値から計算するため負になります。下降局面では正の値となります。
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()
Williamas A/Dを計算します
df_high = df['High']
df_low = df['Low']
df_close = df['Close'].shift(1)
df_close = df_close.fillna(0)
df_trh = pd.concat([df_high, df_close], axis=1).max(axis=1)
df_trl = pd.concat([df_low, df_close], axis=1).min(axis=1)
df_ad = df['Close'] - df_trh
df_ad.loc[df['Close'] - df_close < 0] = df['Close'] - df_trl
df_ad.loc[df['Close'] - df_close == 0] = 0
df_ad = df_ad.fillna(0)
df_ad_williams = df_ad.copy()
df_ad_williams_diff = df_ad_williams.shift(1)
df_ad_williams_diff.fillna(0)
df_ad_williams = df_ad + df_ad_williams_diff
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_ad_williams.values[n_data:], color='red', ls='-', label='Williams AD')
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([-120, 120])
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_high.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('ADline.png', facecolor=fig.get_facecolor(), edgecolor='none')
以上のコードをGoogle社の提供しているColaboratory上で公開しており、実際に動作させることができます。
リンク先はこちら。
Williams A/Dを使った予想
当日のレートと値動きを比較しながら、ダイバージェンスやコンバージェンスと言った逆行現象を予測に利用します。図2で売買タイミングを見ていきましょう。
- 買い
- 直近のウィリアムズA/Dに谷間となるB1とB2がある時、B1<B2で対応するレートがR3>R4だった場合(コンバージェンスと呼びます)、相場反転の兆しと見て、逆張りの買いでエントリーします。
- 売り
- 直近のウィリアムズA/DのピークとなるT1とT2がある時、T1>T2で対応するレートがR1<R2だった場合(ダイバージェンスと呼びます)、相場反落の兆しと見て、逆張りの売りでエントリーします。

注意点
ダイバージェンスとコンバージェンスを判断することは難しいので、他のオシレータ系指標と組み合わせて使用すると、売買ポイントが理解しやすくなります。
※このHPページで紹介しているテクニカル指標を使った取引ルールや売買シグナルの見方は一般的な考え方に基づくものであり、利益の増加や損失の減少を保証するものではありません。ご自身の判断にてお取引いただきますようお願いいたします。
現在、ニューラボでは人工知能による取引アルゴリズムを開発中です。11月にリリース予定。乞うご期待!
自動取引にご興味を持たれましたら お問い合わせページよりお気軽にお問合せください。