やったこと
- USDJPYの1分足過去データの入手
- 入手したデータの読み込み
- 日付列と時刻列から日時データを作成
- ボリンジャーバンドの計算、描画
USDJPYの1分足過去データの入手
FOREX TESTERさんが公開しているデータをローカルに落としてきます。
ちなみに私は、USDJPY_test.txtというファイル名にしました。
【データ概要】
・時間足: 1分足
・データ期間: 2001年1月 - 2019年07月31日 ※随時変わるかも知れません
・格納データ: 通貨ペア名, 日付, 時刻, 始値, 高値, 底値, 終値, 取引量
入手したデータの読み込み
ダウンロードしたデータを、pandas DataFrame形式で読み込みます。
import pandas as pd
#オリジナルのデータ形式
#TICKER, DATE, TIME, OPEN, HIGH, LOW, CLOSE, VOL
df = pd.read_csv('USDJPY_test.txt', dtype={1:str, 2:str})
pd.read_csvの第2引数 dtype={1:str, 2:str} は、
「読み込むデータの1、2列目※をstr形式で読み込みなさい」
という意味です。
※最左列を0列目とカウントするため、ここでは「日付」「時刻」の列を指しています。
これをする意味は、後ほど「日付」と「時刻」から「日時」列を作成する際に、文字列の方が都合が良いからです。
なお、この処理を行わなければ、「日付」「時刻」列とも、numpy.int64型になってしまいます。
日付列と時刻列から日時データを作成
DATE列とTIME列からdatetime64型のデータを作り、DATETIME列として格納します。
完了後は、DATE列、TIME列ともに不要なので削除しました。
TICKER列も特に使用しなさそうなので、このタイミングで削除しています。
#DATE列とTIME列からDATETIME列を作成し、dfのindexにする
df['DATETIME'] = pd.to_datetime(df['DATE'] + ' ' + df['TIME'])
df = df.set_index('DATETIME')
df = df.drop(['DATE', 'TIME'], axis=1)
#TICKER 列を削除
del df['TICKER']
ボリンジャーバンドの計算、描画
ここまでで、過去データを分析する環境が整いました。
試しに、ボリンジャーバンドを計算し、グラフ化してみます。
#計算
base = pd.Series.rolling(df['CLOSE'], window=25).mean() #直近25本の移動平均線
deviation = 2
sigma = pd.Series.rolling(df['CLOSE'], window=25).std(ddof=0) #σの計算
upper_sigma = base + sigma
upper2_sigma = base + sigma * deviation
lower_sigma = base - sigma
lower2_sigma = base - sigma * deviation
#描画してみる
d = '2001-1-3 10'
base[d].plot(label="base")
upper_sigma[d].plot(label="+σ")
upper2_sigma[d].plot(label="+2σ")
lower_sigma[d].plot(label="-σ")
lower2_sigma[d].plot(label="-2σ")
plt.grid()
plt.legend()
plt.savefig('Bollinger.png')
まとめ
Pythonを使ってUSDJPYの自動売買アルゴリズムを開発するのがゴールですが、その前段のデータ入手について今回整理しました。
約19年分の過去データが使える形になったので、これを使って今後分析していきたいと思います。
また、ゆくゆくはJupyter環境構築方法など、Pythonを触れるようにするためのお膳立て部分についてもまとめていけたらと思います。