ダウ理論を定義、検出するためのコードを作ってみました。
まずはいつものようにアカウント設定をします。
pip install oandapyV20 pandas
import oandapyV20
from oandapyV20 import API
import oandapyV20.endpoints.instruments as instruments
import pandas as pd
API_KEY = 'あなたのAPIキー'
ACCOUNT_ID = 'あなたのアカウントID'
client = API(access_token=API_KEY, environment="live")
次に為替データの取得をします。
通貨ペアと時間足、ローソク足の数も好きな数値に設定。
params = {
"granularity": "D", # 日足データ
"count": 100 # 取得するデータの数
}
r = instruments.InstrumentsCandles(instrument="USD_JPY", params=params)
client.request(r)
data = r.response['candles']
df = pd.DataFrame([{
'time': candle['time'],
'open': candle['mid']['o'],
'high': candle['mid']['h'],
'low': candle['mid']['l'],
'close': candle['mid']['c']
} for candle in data])
df['time'] = pd.to_datetime(df['time'])
df.set_index('time', inplace=True)
以下はダウ理論の定義。安値切り上げと高値切り上げをuptrendと定義し、高値切り下げと安値切り下げをdowntrendと定義、それ以外はsidewaysと定義します。
def identify_trends(df):
df['trend'] = None
for i in range(1, len(df)-1):
if df['high'][i] > df['high'][i-1] and df['low'][i] > df['low'][i-1]:
df.at[df.index[i], 'trend'] = 'uptrend'
elif df['high'][i] < df['high'][i-1] and df['low'][i] < df['low'][i-1]:
df.at[df.index[i], 'trend'] = 'downtrend'
else:
df.at[df.index[i], 'trend'] = 'sideways'
return df
df = identify_trends(df)
次にエリオット波動の第3波と第5波の定義になります。
def detect_elliott_waves(df):
wave_data = []
for i in range(2, len(df)-1):
if df['trend'][i-2] == 'uptrend' and df['trend'][i-1] == 'downtrend' and df['trend'][i] == 'uptrend':
wave_data.append((df.index[i-2], 'wave 1 start'))
wave_data.append((df.index[i], 'wave 3 start'))
if df['trend'][i-2] == 'downtrend' and df['trend'][i-1] == 'uptrend' and df['trend'][i] == 'downtrend':
wave_data.append((df.index[i], 'wave 5 start'))
return wave_data
waves = detect_elliott_waves(df)
for wave in waves:
print(wave)
print(df)
ここにもう少し追加して検証をしていこうと思います。