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

スポンサーリンク

今回は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つで計算できるのでわざわざ計算する必要もないですね

プログラミングを挫折せず最短で習得する方法


プログラミングは小学校の義務教育にも導入され始めており、これから社会人として生きていく上にあたってはもはや出来て当たり前のスキルとなりつつあります。こういう話はテレビや雑誌でも最近増えてきたので、知らない人はいないでしょう。そしてそういう話を聞いて参考書なりを購入して独学でプログラミング勉強しようと思っている人も少なくないでしょう。しかしプログラミングを独学で勉強し始めようと思うものの



・「分からない箇所で詰まって挫折してしまった」

・「勉強する時間が足りない」

・「ネットの記事だと情報が断片的でよくわからない」

・「コードのエラーの原因が分からない」



という壁にぶち当たって、プログラミングの勉強を止めてしまう方が少なくありません。独学でプログラミングを勉強してる時間のほとんどはつまづいている時間です。実際僕も最初のころ独学でプログラミングを勉強していた頃はエラーの原因が分からず丸1日を不意にしてしまった・・・そんな苦い経験がありました。



それで僕は一度はプログラミングの学習を諦めてしまいましたが、就活で現実を知る中で「プログラミングを勉強して、いずれフリーランスとして自由な生き方がしたい」「エンジニアとして若いうちから高収入を得たい」という気持ちから一念発起して侍エンジニアのwebサービスコースに申し込み、プロのエンジニアの方に対面でマンツーマンでPythonによるWebサービス作り方とWeb技術の基本を教えてもらい、ようやくプログラミングが理解できました。


侍エンジニアでは様々なコースが用意されており、PHPなどを使ってWebサイトやWebアプリを作ってみたい人からPythonでデータサイエンティストやAIエンジニアになりたい人にもおすすめです。(ちなみに現在、侍エンジニアに申し込むと25歳以下の学生の方であれば、受講料が20%offなるので超お得です。)







巷でいわれるように侍エンジニアのようなマンツーマンのプログラミングスクールは値段が少し高いのは事実ですが、その分やる気さえあれば間違いなくプログラミングスキルが身に付くので、僕はいいと思います。プログラミングは大勢で授業を受けるよりも自分が分からない箇所をピンポイントでプロの講師に直接質問して、ちゃんと納得するというスタイルの方がお金は確かに少し掛かりますが、独学で学ぶより絶対にモノになります。


最近はオンラインで無料でプログラミングが学べるというようなサイトも確かにありますが、自分のお金を払って勉強した方が、払った分の元を取ろうと必死になれるのでプログラミングの学習効率は絶対に上がります。エンジニアの間では、プログラミングは好きなやつが独学で勉強するものだという風潮がありますが、もうそういうのは時代遅れだと思います。僕の意見としてはプログラミングはプログラミングスクールに通って勉強するべきです。


スポンサーリンク

シェアする

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

フォローする