Pythonを使って有名なテクニカル指標を計算してみる

スポンサーリンク

今回はPythonで有名なテクニカル指標の計算を行っていきたいと思います。計算するテクニカル指標は「移動平均・MACD」「RSI」「ボリンジャーバンド」の3つです。

使う元データ

Coingeckoから引っ張ってきたビットコイン(Bitcoin)の一年分の日足の価格データ

##モジュールのインストール##

import requests
import json

##CoingeckoからBitcoinの全期間の価格データを取得する##

url=(‘https://api.coingecko.com/api/v3/coins/’)+str(‘bitcoin’)+(‘/market_chart?vs_currency=jpy&days=max’)
r=requests.get(url)
r=json.loads(r.text)
bitcoin=r[‘prices’]

変数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を使っています。

単純移動平均(SMA)を計算する

単純移動平均(SMA)とは、過去一定期間の値動きの平均の値です。基本的に短期の移動平均線の2種類を計算し、ゴールデンクロスなら買い、デッドクロスなら売りという戦略になります。pythonでの単純移動平均の計算はpandasに内蔵されている関数で計算できます。

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(price)):

     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での自動取引ができます。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする