ともだちはすくないです

30代既婚男子。子供2人。日経先物トレードとかプログラミングとか英語とか

MySQLに日経先物の5分足データCSVをインポートしたらフリーズした。

相変わらず日経先物の過去データを集めています。過去の日足および最近の日中分足はwebからスクレイピングで取得しました。

ちなみにスクレイピングはこちらのサイト様にお世話になりました。

k-db.com

(サイト運営者様、サーバーに負荷かけてしまったかもしれないです。申し訳ありません。)




ただし、日中分足については最近のデータ(30分足は過去4ヶ月。15分足、5分足は過去4日)しかweb上にありません。そのため過去のデータについては別のところから取得する必要があります。ということで、ここから過去の日中分足をダウンロード。2012年〜のデータがあります。
225labo.com




で、このCSVMySQLに格納するためのプログラムをrubyで書きました。MySQLのコマンドで単純にインポートしても良かったんですが、取引日を加工してMySQLに格納したかったので、プログラムでやりました。

require 'mechanize'
require "active_record"
require "date"
require "time"

ActiveRecord::Base.establish_connection(
  adapter:  "mysql2",
  host:     "localhost",
  username: "root",
  password: "xxxxxx",
  database: "nikkei",
)

class Test < ActiveRecord::Base
end

today = 0
tomorrow = 0

regist = 0
FILE_NAME = 'n225_5.csv'
File.open(FILE_NAME) do |file|
  file.each_line do |line|
    regist += 1
    vals = line.split(',')

#------取引日の加工----------#

#ナイト・セッション(24時まで)は当日の日付に変更する。
    if vals[1].to_i == 9
      today = vals[0]
    end
    if vals[1].to_i >= 16
      vals[0] = today
    end

#ナイト・セッションの24時以降は当日の翌日日付とする。(金曜ナイトの24時以降は土曜の日付となる。)
    if vals[1].to_i >= 0 && vals[1].to_i <= 5
      tomorrow = Date.parse(today)
      vals[0] = tomorrow + 1
    end

#30分足の場合、朝のスタート時間をデータ上8時半にする。(ほんとのスタート時間は8時45分)
    # if vals[1].to_i == 8
    #   vals[1] = "08:30:00"
    # end

#-----取引日の加工終了----------#


    attr = {date: vals[0], time: vals[1], start: vals[2], high: vals[3],low: vals[4],end: vals[5],volume: vals[6]}
    test  = Test.new(attr)
    if test.save
      puts "data insert done!! #{regist}"
    else
    #データの保存でエラーとなったときはABENDさせる。
      puts "error"
      exit(1);
    end
  end
  puts "data insert END!!"
end



こんなプログラムで30分足、15分足、5分足のCSVデータをMySQLに格納していきます。5分足については2012年〜のデータで約30万件ありました。。この30万件を処理してたら、MySQLが動かなくなります。。

MySQLがフリーズしたときは以下のようにやれば解決しました。これでようやくデータの準備は完了です。やっと分析フェーズに入れそうです。長かった。1週間くらいかかったぜ!!

mysql> show processlist;

+-----+------+-----------+--------+---------+------+----------+------------------+
| Id  | User | Host      | db     | Command | Time | State    | Info             |
+-----+------+-----------+--------+---------+------+----------+------------------+
|  11 | root | localhost | nikkei | Sleep   |   58 |          | NULL             |
|  12 | root | localhost | NULL   | Sleep   |   18 |          | NULL             |
| 116 | root | localhost | NULL   | Query   |    0 | starting | show processlist |
+-----+------+-----------+--------+---------+------+----------+------------------+

mysql> kill 11;
mysql> kill 12;