FX Python システムトレード

FX自動取引プログラムを開発する~準備編~ヒストリカルデータを登録する

スポンサードリンク

今回は、「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からダウンロードしたデータをデータベースに登録することができました。

スポンサードリンク

-FX, Python, システムトレード
-, , ,

© 2024 FX・ビットコイン・オプションのシステムトレード開発と取引録 Powered by AFFINGER5