今回は、「FX自動取引プログラムを開発する~準備編~ヒストリカルデータを集める」で
集めたヒストリカルデータをデータベースに登録します。
データベースはSqliteを使用することにします。
ダウンロードしたデータは全て「historicaldata」ディレクトリに保存しているという前提です。
では、プログラムのソースコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# -*- 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を使用します。
1 |
glob.glob(target_directory + '*.txt') |
という形で正規表現でファイルの一覧を取得できるためです。
CSVファイルの読み込みはその名もずばり「csv」を使用して
以下で行っています。
まずは、
1 |
import csv |
します。
そして各ファイルごとにread_fileを実行し、
読み込んだ内容をdatalistにセットして返しています。
1 2 3 4 5 6 7 |
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メソッドで行っている処理内容は、
1 |
with open(file, 'r') as f: |
でファイルを開き、
1 |
datas = csv.reader(f) |
でファイル内容をdatasに取り込みます。
1 2 |
for row in datas: datalist.append(row) |
で、1行ずつループを回し、読み込んだ内容をdatalistに追加していきます。
ファイルを最後まで読み込んだらdatalistを返します。
次のcreate_sqlでは、CSVファイルから読み込んだデータを元に
SQL文を生成しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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文を生成し返すということをこのメソッドでやっています。
メイン部分は以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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からダウンロードしたデータをデータベースに登録することができました。