見出し画像

〈BitMEX〉OHLC 取得 → Pandas 加工 → インジゲーター作成する方法 / Python ソースコード

OHLC を取得しトレードロジックでよく用いられる、インジゲーターを作成する方法について解説します。トレードロジックには MA(移動平均線)RSI(相対力指数)などが良く用いられる事があります。

通常は OHLC などのローソク足データやヒストリカルデータ、RSI などのインジゲーターは業者から API で提供されているのが普通なのですが、ビットコイン界隈ではまだそのような業者は存在しておらず、何もかも自分で作る他ありません。しかし初心者の方や馴染みが無い人からすると、なかなかそれを一から実装するのは難しいのが現状です。

という事で、OHLC を取得しそこからインジゲーターを作成する一連の流れを書きたいと思います。やり方は既にいろいろ紹介されていると思うので、ここでは一番簡単かつ汎用性の高い方法を解説します。インジゲーターはTA-Lib などの難しいライブラリーのインストールはありませんので AWS Cloud9でも簡単に使う事ができます。ファイルも2ファイルのみ。メインコードの記述も8ステップだけです。これでインジゲーターから数値の取得まで出来てしまいます。

もし、これから Python で BOT 制作に挑戦する方はぜひ参考にしてみてください。


1~3 で、OHLC を取得し、一旦 CSV 形式でファイル保存します。ここでは例として Bitmex へアクセスし 2日分のヒストリカルデータを取得しています。CSV で保存する際は、 Pandas で加工しやすいようにデータを整えています。

4~5 は、Pandas を用いてデータを加工し、OHLC で取り出せるようにしています。この時、いまは5分で取得したものを、そのまま5分足に変換していますがデータの置換もできます。5分足から1時間足や日足に変換する事もできます。基本的には短い足から長い足にスケールアップしかできません。

分 = 'T'
時 = 'H'
日 = 'D'
週 = 'W'
月 = 'M'
ohlc_5M = getHist(os.path.join(PATH, FILE_NAME), '5T') #5分足に変換

ohlc_1H = getHist(os.path.join(PATH, FILE_NAME), 'H') #1時間足に変換

ohlc_4H = getHist(os.path.join(PATH, FILE_NAME), '4H') #4時間足に変換

ohlc_1D = getHist(os.path.join(PATH, FILE_NAME), 'D') #日足に変換


6 は、OHLC の数値を取り出しています。データは古い順にならんでいるので、最新の数値にアクセスするには以下のようにして一番後ろの値を参照してください。

Open[-1]
High[-1]
Low[-1]
Close[-1]


7~8 インジゲーターの作成は、あらかじめ作成されたインジゲーターファイルを読み込み、5分足に変換したデータを渡すだけで使う事ができます。これも最新の数値にアクセスするには [-1] を指定すればOKです。ひとつ前(ひとつ古い足、10分前)の数値にしたければ [-2] としましょう。

rsi = indi.iRSI(ohlc_5M, 7)

print("RSI:", rsi[-1])


以下は、その全ソースコードです。必要な関数もありますのでぜひ参考にしてみてください。アクセス先を Bitmex ではなく Cryptowatch などに変えれば同じように他の業者などに置き換えが可能になります。

まず初めに以下のライブラリをインストールをお願いします。

sudo pip install numpy pandas scipy numba requests


# -*- coding:utf-8 -*-
import requests, time, datetime, calendar, os, json
import pandas as pd

#UNIX Time に変換
def ToUnixTime(dt):
    to_unixime = calendar.timegm(dt.timetuple())
    return to_unixime
    

#UNIX Time から UTC に変換
def UnixtimeToDateTime(unixtime):
    utc = datetime.datetime.utcfromtimestamp(unixtime)
    return utc

#現在時刻 UTC
def TimeCurrent():
    now = datetime.datetime.utcnow()
    return now
    

#ファイル書き込み
def Write(path, fileName, filemode, Msg):
    
    try:
        _path = os.path.join(path, fileName)
        with open(_path, mode=filemode, encoding="utf-8") as f:
            f.write(Msg)
        
    except Exception as e:
        print(str(TimeCurrent()), " Exception => Output Write: ", fileName, str(e))

#Bitmex からデータを取得
def Get_Bitmex_Ohlc(timeframe, get_hist):
    
    
    now = int(time.time())
    
    try:
        
        req = "https://www.bitmex.com/api/udf/history?symbol=XBTUSD&resolution="+ str(timeframe) + "&from=" + str(now-get_hist) + "&to=" + str(now)
        print(req)
        
        data = requests.get(req)
        tohlc = data.json()
        
        return tohlc
            
            
    except Exception as e:
        print("Exception => GetOhlc: " + str(e))
        return None

    
#OHLC を CSV 保存する(Pandas で使えるデータにする)
def WriteFile_OHLC(tohlc, path, file_Name):
    
    if(len(tohlc) > 0):
        
        try:
            
        
            for i in range(len(tohlc['t'])):
                
                _timestmp = UnixtimeToDateTime(tohlc['t'][i])
                _open = int(tohlc['o'][i])
                _high = int(tohlc['h'][i])
                _low  = int(tohlc['l'][i])
                _close = int(tohlc['c'][i])
                
                #Time, Open, High, Low, Close
                data = "{0};{1};{2};{3};{4}{5}".format(str(_timestmp), str(_open), str(_high), str(_low), str(_close), "\n")
                
                #CSV保存
                Write(path, file_Name, "a", data)
                
            
            
            print(str(TimeCurrent()), " OHLCをCSV保存しました")
            
        
        except Exception as e:
            print("Exception => WriteFile_OHLC: " + str(e))
     

#Pandasのデータフレームに変換
def TF_ohlc(df, tf):
    
    x = df.resample(tf).ohlc()
    O = x['Open']['open']
    H = x['High']['high']
    L = x['Low']['low']
    C = x['Close']['close']
    ret = pd.DataFrame({'Open': O, 'High': H, 'Low': L, 'Close': C}, 
                       columns=['Open','High','Low','Close'])
    return ret.dropna()

#データシリーズに変換
def getHist(file, tf):
    
    try:
        data = pd.read_csv(file, sep=';',
                     names=('Time','Open','High','Low','Close'),
                     index_col='Time', parse_dates=True)
                     
        ohlc =  TF_ohlc(data, tf)
        
        return ohlc
            
    except Exception as e:
        print("Exception => getHist: " + str(e))
        
        

if __name__ == '__main__':
    
    TIME_FRAME = 5
    GET_HIST = 60*60*24*2 #172800秒=2日前までのデータ
    PATH = "./"
    FILE_NAME = "bitmex_ohlc_5M.csv"
    
    
    #1. ファイルを一旦クリア
    Write(PATH, FILE_NAME, "w","")

    #2. BitmexへアクセスOHLCのデータを取得
    tohlc = Get_Bitmex_Ohlc(TIME_FRAME, GET_HIST)
    
    #3. OHLCをCSV保存
    WriteFile_OHLC(tohlc, PATH, FILE_NAME)
    
    #4
    #CSVのOHLCをリサンプル(タイムフレームの変換)→ 5分足のデータフレームに変換
    #30分足などにしたい場合は、パラメーターを '30T' のようにする。時間足なら 'H' 日足なら 'D'
    ohlc_5M = getHist(os.path.join(PATH, FILE_NAME), '5T')
    
    #5. OHLC でデータを取り出す
    Open = ohlc_5M['Open']
    High = ohlc_5M['High']
    Low = ohlc_5M['Low']
    Close = ohlc_5M['Close']
    
    #6. 最新の価格だけを出力
    print("------------")
    print("Open:", Open[-1])
    print("High:", High[-1])
    print("Low:", Low[-1])
    print("Close:", Close[-1])
    print("------------")
    
    
   
    
    #7. インジケーター: RSIを作成
    import indicators as indi
    rsi = indi.iRSI(ohlc_5M, 7)
    
    
    #8. 最新のRSIの数値を取得
    print("RSI:", rsi[-1])

●実行結果


ここからは有料パートになります。有料パートでは

・インジゲーターファイルのダウンロードが可能になります。

使えるインジゲーターは以下になります。TA-Lib のインストールは必要ありません。同じフォルダに indicators.py を置いてもらうだけでOKです。全てのインジは見本で書いてある RSI のように、一行での記述が可能です。ぜひご活用ください。

・MA
・EMA
・ATR
・モメンタム
・RSI
・CCI
・エンベロープ
・MACD
・WPR(Williams %R)
・Bands
・ストキャスティクス
・ADX
・SAR
・Ichimoku


この続きをみるには

この続き:1,334文字/画像1枚

〈BitMEX〉OHLC 取得 → Pandas 加工 → インジゲーター作成する方法 / Python ソースコード

ミラーマン

5,000円

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

7

ミラーマン