今回はPythonで有名なテクニカル指標の計算を行っていきたいと思います。計算するテクニカル指標は、単純移動平均(SMA)・MACD・RSIの3つです。
テクニカル指標の計算に使うデータを用意する
Coingeckoから引っ張ってきたビットコイン(Bitcoin)の一年分の日足の価格データ
##モジュールのインストール##
import requests
import json
def get_bitcoinprice(kasou):
url=('https://api.coingecko.com/api/v3/coins/')+str(kasou)+('/market_chart?vs_currency=jpy&days=1')
r=requests.get(url) r=json.loads(r.text)
bitcoin=r['prices']
data=[]
date=[]
for i in bitcoin:
data.append(i[1])
date.append(i[0])
bitcoin=pd.DataFrame({"date":date,"price":data})
price=bitcoin['price']
a=price.pct_change()
bitcoin=pd.DataFrame({"date":date,"price":data,"change":a})
return bitcoin
#関数を使ってビットコインの価格データを取得する
a=get_bitcoinprice('bitcoin')
price = pd.Series(a['price'])
#データの確認
print(price.head())
一応変数bitcoinの中身を確認すると以下のようになっていると思います。
[[1367107200000, 13203.1967],
[1367193600000, 14108.4087],
[1367280000000, 13629.7741],
[1367366400000, 11364.3607],
[1367452800000, 10350.6908],
[1367539200000, 9602.7634],
[1367625600000, 11128.1292],
[1367712000000, 11470.4956],
[1367798400000, 11124.2848],
…
みたいなデータが取得できます。ビットコインを始めとする仮想通貨の価格を取得する方法はCoingeckoだけではなく、ほかにもいろいろありますが、個人的にはCoingeckoの仕様が一番しっくりきたのでCoingeckoを使っています。
他にもPandasから簡単に日経平均株価やダウ工業平均が取得できるので、pythonはスクレイピング・データ分析において非常に便利です。
というわけでデータもそろったので次はpythonでテクニカル指標を算出していきます。
単純移動平均(SMA)を計算する
単純移動平均(SMA)とは、過去一定期間の値動きの平均の値です。基本的に短期の移動平均線の2種類を計算し、主な使い方としては、短期移動平均線が下から上に長期移動平均線を突き抜ける「ゴールデンクロス」なら買い、逆に短期移動平均線が長期移動平均線を下に抜ける「デッドクロス」なら売りという戦略になります。pythonでの単純移動平均の計算はpandasに内蔵されている関数で計算できます。
#Pandasで移動平均線を計算する SMA5=price.rolling(window=5).mean() SMA25=price.rolling(window=25).mean()
Pythonでの移動平均の計算は「変数名.rolling(window=任意の数).mean()」で計算できます。引数のwindowで計算する移動平均を計算する期間を指定できます。今回は日足のデータから5日と25日の移動平均を計算したいので、window=5とwindow=25として、5日移動平均線と25日移動平均線を計算しました。
MACDを計算する
MACDとは「「短期の指数平滑移動平均」と「長期の指数平滑移動平均」の2つを使用することで、「買い」と「売り」を判断する分析手法です。指数移動平均線によってゴールデンクロス・デッドクロスを判断する指標です。単純移動平均を少しアレンジしたもので、テクニカル指標だと単純移動平均よりもこっちの方が一般的かなと思われます。
・EMA(指数移動平均線)
=前日のEMA×(1-α) + 当日の指数×α
=前日のEMA + α(当日の指数-前日のEMA)
・MACD
=短期EMA-長期EMA
これをプログラミング言語で表現しようと思うと難しいのが移動平均のところです。普通の平均なら、for in :mean=~みたいなので簡単にできますが、平均を移動させるところが少し難点です。
term=5
ema5=[]
ema20=[]
bitcoin_close=[]for i in bitcoin:
b=bitcoin[1]
bitcoin_close.append(b)
for i in range(len(bitcoin)):
x = (int(sum(bitcoin_close[i-term:i])) + int(bitcoin_close[i]))/int((term+1))
ema5.append(x)for i in range(len(price)):
y = (int(sum(bitcoin_close[i-20:i])) + int(bitcoin_close[i]))/int((20+1))
ema20.append(y)
他にもpandasを使うことでも単純移動平均を計算することができます。
RSIを計算する
##価格データだけを抜き出す data=[] for i in bitcoin: data.append(i[1])
Dataの中身は↓のような感じ
data
[13203.1967,
14108.4087,
13629.7741,
11364.3607,
10350.6908,
9602.7634,
11128.1292,
次はこのデータを時系列データに変換します。
##リストをデータフレームにする dataa=pd.Series(data)
ここでリストをデータフレームに変換する理由は、pandaの時系列データにしておくとdiff()で差分やmeans()で移動平均が計算できたり、テクニカル指標を計算する上で便利な関数が適用できるので、リストのままゴチャゴチャやるより簡単に処理ができるようになるからです。
##差分を計算する diff = dataa.diff() ##最初の数値がNanで欠損してしまうので削除する diff_data = diff[1:] ## 値上がり幅、値下がり幅をシリーズへ切り分け up, down = diff_data.copy(), diff_data.copy() up[up < 0] = 0 down[down > 0] = 0 # 値上がり幅/値下がり幅の単純移動平均(14)を処理 up_sma_14 = up.rolling(window=14, center=False).mean() down_sma_14 = down.abs().rolling(window=14, center=False).mean() # 値上がり幅/値下がり幅の単純移動平均(14)を処理 up_sma_14 = up.rolling(window=14, center=False).mean() down_sma_14 = down.abs().rolling(window=14, center=False).mean() # RSIの計算 RS = up_sma_14 / down_sma_14 RSI = 100.0 - (100.0 / (1.0 + RS))
参考:http://www.algo-fx-blog.com/rsi-python-ml-features/
これでRSIが計算できます。
Botとかに使うのであればif文でこの数値が30以下なら買い、70以上なら売りみたいに組み込めばRSIでの自動取引ができます。
終わり
以上がpythonによるテクニカル指標の計算方法です。まあわざわざ自分で計算しなくともpythonには「ta-lib」というライブラリがあるので、それを使えば、他のボリンジャーバンドやモメンタムといったテクニカル指標も関数1つで計算できるのでわざわざ計算する必要もないですね
コメント