#requestsライブラリのインストール(初回のみ実行)
!pip install requests
import pandas as pd
import numpy as np
import datetime
import requests
import time
import matplotlib.pyplot as plt
from IPython.display import clear_output
#空のDataFrameを作成
df_all = pd.DataFrame(columns = ['データ数','日時','通貨ペア','為替レート','移動平均_5','移動平均_20','移動平均_5の傾き','std','2up','2low','3up','3low'])
df_all = df_all.set_index('データ数')
#データ数のカウント
cnt = 0
while True:
###データ数###
cnt += 1
###時間の取得###
dt_now = datetime.datetime.now()
dt_now = dt_now.strftime('%Y-%m-%d %H:%M:%S')
###通貨ペア取得###
currency_pair = 'usdjpy'
###為替レート取得###
#requestsライブラリを使ってAlpha Vantage APIへアクセス params=辞書型でパラメータを指定
response = requests.get( url = "https://www.alphavantage.co/query" , params = {"function": "CURRENCY_EXCHANGE_RATE", #通貨交換レートと指定
"from_currency":"USD", #USDを変換元通貨として指定
"to_currency":"JPY", #JPYを変換先通貨として指定
"apikey":"YOUR_ALPHA_VANTAGE_API_KEY",#Alpha VantageのAPIキー
})
#APIの返信をJSON形式から辞書型へ変換
data = response.json()
#リアルタイム為替レートを取得 ("Realtime Currency Exchange Rate" というキーにある "5. Exchange Rate" へアクセス)
exchange_rate = data["Realtime Currency Exchange Rate"]["5. Exchange Rate"]
exchange_rate = round(float(exchange_rate),3)
########################################
### Alpha Vantage APIの利用制限 ###
### ・1分あたり5回のAPIリクエスト ###
### ・1日あたり500回のAPIリクエスト ###
########################################
###現時点の情報を df_all にまとめる###
df_now = pd.DataFrame([[cnt,dt_now,currency_pair,exchange_rate,'','','','','','','','']],
columns = ['データ数','日時','通貨ペア','為替レート','移動平均_5','移動平均_20','移動平均_5の傾き','std','2up','2low','3up','3low'])
df_now = df_now.set_index('データ数')
df_all = pd.concat([df_all,df_now])
###移動平均の計算###
df_all.loc[cnt,'移動平均_5'] = round(df_all['為替レート'].tail(5).mean(),3)
df_all.loc[cnt,'移動平均_20'] = round(df_all['為替レート'].tail(20).mean(),3)
###移動平均線の傾き###
dt_data = df_all.tail(5).index.astype(int)
ave_line_slope = df_all['移動平均_5'].tail(5).astype(float)
#線形回帰
coefficients_ave_line = np.polyfit(dt_data, ave_line_slope, 1) # 1次の多項式(直線)にフィッティング
#傾きと切片の取得
slope_ave = coefficients_ave_line[0]
#表へ転記
df_all.loc[cnt,'移動平均_5の傾き'] = round(slope_ave,3)
###ボリンジャーバンドの計算###
#標準偏差 tailの引数=平均化する要素数(DataFrameの下からの数量)
df_all.loc[cnt,'std'] = round(df_all['為替レート'].tail(20).std(),3)
#ボリンジャーバンドも算出 S1,S2は移動平均線から標準偏差×S 分ずらす
df_all.loc[cnt,'2up'] = round(df_all.loc[cnt,'移動平均_20'] + (2 * df_all.loc[cnt,'std']),3)
df_all.loc[cnt,'2low'] = round(df_all.loc[cnt,'移動平均_20'] - (2 * df_all.loc[cnt,'std']),3)
df_all.loc[cnt,'3up'] = round(df_all.loc[cnt,'移動平均_20'] + (3 * df_all.loc[cnt,'std']),3)
df_all.loc[cnt,'3low'] = round(df_all.loc[cnt,'移動平均_20'] - (3 * df_all.loc[cnt,'std']),3)
###ターミナルへの出力###
clear_output()
print(cnt ," 時間:",dt_now ," 通貨ペア:",currency_pair ," '為替レート':",exchange_rate ," 移動平均_5の傾き:",df_all.loc[cnt,'移動平均_5の傾き'])
###グラフの作成###
# x軸、y軸のデータ
Time = df_all['日時']
exchange = df_all['為替レート']
ave_5 = df_all['移動平均_5']
ave_20 = df_all['移動平均_20']
B3up = df_all['3up']
B2up = df_all['2up']
B2low = df_all['2low']
B3low = df_all['3low']
# グラフをプロットする
plt.plot(Time , exchange , color ="k")
plt.plot(Time , ave_5 , color ="g")
plt.plot(Time , ave_20 , color ="y")
plt.plot(Time , B3up , color ="r")
plt.plot(Time , B2up , color ="m")
plt.plot(Time , B2low , color ="c")
plt.plot(Time , B3low , color ="b")
# グラフのサイズ等の書式変更
plt.xticks(Time, rotation=90)
plt.rcParams["figure.figsize"] = [20,5]
plt.grid()
# グラフタイトル、x軸名、y軸名
plt.title('USA/JAP exchange_rate')
plt.xlabel('Time')
plt.ylabel('Exchange Rate(\)')
# グラフを出力する
plt.show()
###更新間隔###
time.sleep(60)