0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ダウ理論、エリオット波動検出のコード

Posted at

ダウ理論を定義、検出するためのコードを作ってみました。
まずはいつものようにアカウント設定をします。

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)

ここにもう少し追加して検証をしていこうと思います。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?