今回は、「FX自動取引プログラムを開発する~準備編~ヒストリカルデータを集める」で
集めたヒストリカルデータをデータベースに登録します。
データベースはSqliteを使用することにします。
ダウンロードしたデータは全て「historicaldata」ディレクトリに保存しているという前提です。
では、プログラムのソースコードです。
# -*- coding: utf-8 -*- """ Created on Fri Jan 6 16:20:35 2017 @author: """ import glob import csv import sqlite3 DB = 'usd_jpy_prices.db' target_directory = './historicaldata/' def get_filelist(): return glob.glob(target_directory + '*.txt') def read_file(file): datalist = [] with open(file, 'r') as f: datas = csv.reader(f) for row in datas: datalist.append(row) return datalist def create_sql(datalist): sqllist = [] for data in datalist: if data[0] == 'USDJPY': #ドル円の場合のみ処理する fdate = data[1] + data[2] fopen = data[3] fhigh = data[4] flow = data[5] fclose = data[6] sql = "INSERT INTO onemin (datetime, open, high, low, close) VALUES ('%s', '%s', '%s', '%s', '%s')" % (fdate, fopen, fhigh, flow, fclose) sqllist.append(sql) return sqllist if __name__ == '__main__': conn = sqlite3.connect(DB) cur = conn.cursor() sql = "create table onemin (datetime, open, high, low, close);" cur.execute(sql) filelist = get_filelist() for file in filelist: datalist = read_file(file) sqllist = create_sql(datalist) for sql in sqllist: print(sql) cur.execute(sql) conn.commit() conn.close()
CSVファイルの読み込みにはglobを使用します。
glob.glob(target_directory + '*.txt')
という形で正規表現でファイルの一覧を取得できるためです。
CSVファイルの読み込みはその名もずばり「csv」を使用して
以下で行っています。
まずは、
import csv
します。
そして各ファイルごとにread_fileを実行し、
読み込んだ内容をdatalistにセットして返しています。
def read_file(file): datalist = [] with open(file, 'r') as f: datas = csv.reader(f) for row in datas: datalist.append(row) return datalist
datalistメソッドで行っている処理内容は、
with open(file, 'r') as f:
でファイルを開き、
datas = csv.reader(f)
でファイル内容をdatasに取り込みます。
for row in datas: datalist.append(row)
で、1行ずつループを回し、読み込んだ内容をdatalistに追加していきます。
ファイルを最後まで読み込んだらdatalistを返します。
次のcreate_sqlでは、CSVファイルから読み込んだデータを元に
SQL文を生成しています。
def create_sql(datalist): sqllist = [] for data in datalist: if data[0] == 'USDJPY': #ドル円の場合のみ処理する fdate = data[1] + data[2] fopen = data[3] fhigh = data[4] flow = data[5] fclose = data[6] sql = "INSERT INTO onemin (datetime, open, high, low, close) VALUES ('%s', '%s', '%s', '%s', '%s')" % (fdate, fopen, fhigh, flow, fclose) sqllist.append(sql) return sqllist
FOREXITEからダウンロードしたファイルを確認すると、
CSVファイルは、
TICKERは、「EURUSD」や「USDJPY」等の通貨名、
DTYYYYMMDDは日付、
TIMEは時間、
OPEN、HIGH、LOW、CLOSEはそれぞれの価格です。
時間はどうやって保存しようかと思いましたが、
Sqliteは型がないようなので、
DTYYYYMMDDとTIMEをそのまま引っ付けて登録することにしました。
これらのデータを元にINSERT文を生成し返すということをこのメソッドでやっています。
メイン部分は以下になります。
if __name__ == '__main__': conn = sqlite3.connect(DB) cur = conn.cursor() sql = "create table onemin (datetime, open, high, low, close);" cur.execute(sql) filelist = get_filelist() for file in filelist: datalist = read_file(file) sqllist = create_sql(datalist) for sql in sqllist: print(sql) cur.execute(sql) conn.commit() conn.close()
最初の4行でデータベースに接続し、oneminというテーブルを作成するSQLを実行するというところまでやっています。
続いてget_filelist()を呼び出してファイル別にループ処理を行います。
read_file()でそのファイルの内容を読み込み、
create_sql()でINSERT文を生成し、
SQL1行ごとにループ処理を行い、
cur.execute(sql)でINSERTを実行します。
ループ終了後にcommitし、接続をcloseして終了です。
以上でFOREXITEからダウンロードしたデータをデータベースに登録することができました。