- ホーム
- ヒストリカルデータのデータベース化 ソースデータの取得と加工。
- タグクラウド
ヒストリカルデータのデータベース化 ソースデータの取得と加工。
posted by SBT at 2006-01-22(日) 17:17
過去の傾向について検証を行う際、必ず必要となるものがヒストリカルデータ(過去のデータ)です。
今までは、その都度、その都度、必要な部分のデータを探してきてExcelでインポートしていました。
別にCSVファイル(カンマ区切りのテキストファイル)やTSV(タブ区切りのテキストファイル)として全てのヒストリカルデータを保存しておいても良いのですが、検証の際に頻繁に使用するExceには、扱えるデータ数がシート当たり64,000行までという制限があるのです。
これだと、結局、余計な作業が発生してしまい、あまりにも面倒なので、思い切ってMySQLによるヒストリカルデータのデータベース化に挑戦してみました。 データベースの用途は、主に指定した日付、時刻、あるいは、レートでのヒストリカルデータの検索と抽出です。
システムトレードに使用するわけでもなく、おおよそのレートがわかれば良いので、元のデータにはForexiteのものを使用しました。
(ヒストリカルデータの記事を参照。)
まずは、Irvineを使って、Forexiteから分足のファイルを自動で全てダウンロードします。
ダウンロードされた大量のzipファイルを全て展開すると、日付ごとに各通貨ペアの分足を含んだテキストファイルが大量に作成されます。
ファイルが多すぎて大変なので、Vectorから複数テキスト結合というソフトを見つけてきて、一つのファイルに結合します。
ただ、これでは、一つのファイルに複数の通貨ペアが混在している状態なので、さらにFreeCSVというソフトを見つけてきて、通貨ペアごとに抽出します。
これで、通貨ペアごとに分足のCSVファイルができました。

このままでも良いのですが、日付・時刻の基準がGMT+1なのでズバリ自動化 Waha!Transformer Personalを使用して、日付・時刻をGMT+9(日本時間)に変換します。
ただし、ズバリ自動化 Waha!Transformer Personalは10万レコードまでしか処理できないので、これまたDivというソフトを見つけてきて、各通貨ペアのファイルを10万行ごとに分割します。
あとは、ズバリ自動化 Waha!Transformer Personalで日付・時刻を日本時間に変換するジョブを作成して、各ファイルを処理するだけです。
このとき、MySQLのデータ型に合わせて、日付・時刻の表記も変換(yyyy-mm-dd・HH:MM:SS)しておきます。
変換後のファイルを、再度、複数テキスト結合を使用して結合すると、MySQLにインポートするためのCSVファイルが出来上がりました。
今までは、その都度、その都度、必要な部分のデータを探してきてExcelでインポートしていました。
別にCSVファイル(カンマ区切りのテキストファイル)やTSV(タブ区切りのテキストファイル)として全てのヒストリカルデータを保存しておいても良いのですが、検証の際に頻繁に使用するExceには、扱えるデータ数がシート当たり64,000行までという制限があるのです。
これだと、結局、余計な作業が発生してしまい、あまりにも面倒なので、思い切ってMySQLによるヒストリカルデータのデータベース化に挑戦してみました。 データベースの用途は、主に指定した日付、時刻、あるいは、レートでのヒストリカルデータの検索と抽出です。
システムトレードに使用するわけでもなく、おおよそのレートがわかれば良いので、元のデータにはForexiteのものを使用しました。
(ヒストリカルデータの記事を参照。)
まずは、Irvineを使って、Forexiteから分足のファイルを自動で全てダウンロードします。
ダウンロードされた大量のzipファイルを全て展開すると、日付ごとに各通貨ペアの分足を含んだテキストファイルが大量に作成されます。
ファイルが多すぎて大変なので、Vectorから複数テキスト結合というソフトを見つけてきて、一つのファイルに結合します。
ただ、これでは、一つのファイルに複数の通貨ペアが混在している状態なので、さらにFreeCSVというソフトを見つけてきて、通貨ペアごとに抽出します。
これで、通貨ペアごとに分足のCSVファイルができました。
このままでも良いのですが、日付・時刻の基準がGMT+1なのでズバリ自動化 Waha!Transformer Personalを使用して、日付・時刻をGMT+9(日本時間)に変換します。
ただし、ズバリ自動化 Waha!Transformer Personalは10万レコードまでしか処理できないので、これまたDivというソフトを見つけてきて、各通貨ペアのファイルを10万行ごとに分割します。
あとは、ズバリ自動化 Waha!Transformer Personalで日付・時刻を日本時間に変換するジョブを作成して、各ファイルを処理するだけです。
このとき、MySQLのデータ型に合わせて、日付・時刻の表記も変換(yyyy-mm-dd・HH:MM:SS)しておきます。
変換後のファイルを、再度、複数テキスト結合を使用して結合すると、MySQLにインポートするためのCSVファイルが出来上がりました。
コメント
Posted by SBT at 2006-02-01(水) 21:06
はじめまして、独り言のような記事でしたが参考にしていただけてよかったです。 SQL文で分足 -> n分足というのは自分も考えたんですが、なかなか一発というのは無理そうですね。 とりあえず、5分足を出すのには↓のようなのまでは思いついたんですが、これだと指定した時間の高値・安値しか出せないですね・・・ 何かよい方法ありましたら是非教えてください。 SELECT Date, Max(High), MIN(Low) FROM gbpjpy WHERE Time BETWEEN 'hh:mm:ss' AND 'hh:mm:ss'+'00:05:00 GROUP BY Date; MSのAccessだと、 SELECT Date, First(Open), Max(High), MIN(Low), Last(Close) FROM gbpjpy WHERE Time BETWEEN 'hh:mm:ss' AND 'hh:mm:ss'+'00:05:00 GROUP BY Date; みたいな感じで、指定時間のn分足の四本値が出せるみたいです。 First、LastはAccess独自みたいなのでMySQLではだめでしたが・・・。
Posted by ┌|∵|┘ at 2006-02-02(木) 19:59
正直あまり良い方法が思い浮かばないのですが、以下のようにテンポラリでテーブルを作成して結合すれば、5分足などの4本値を一つのテーブルとして抽出することができそうです。フィールドの型やWhere句は、必要に応じて変更してください。 /* レートデータテーブル */ CREATE TABLE t_Rate( TICKER text, DATE integer, TIME integer, OPEN real, HIGH real, LOW real, CLOSE real ); /* テンポラリーテーブル */ CREATE TABLE t_HighLow( DATE integer, HIGH real, LOW real ); CREATE TABLE t_Open( DATE integer, TIME integer, OPEN real ); CREATE TABLE t_CLOSE( DATE integer, TIME integer, OPEN real ); /* テンポラリテーブルに抽出データを格納する */ INSERT INTO t_HighLow (date, high, low) SELECT Date, Max(HIGH), MIN(LOW) FROM t_Rate WHERE Time between 170000 AND 170500 GROUP BY Date ORDER BY DATE; INSERT INTO t_Open (date, time, open) SELECT Date, TIME, OPEN FROM t_Rate WHERE Time = 170000 GROUP BY Date ORDER BY DATE; INSERT INTO t_CLOSE (date, time, open) SELECT Date, TIME, open FROM t_Rate WHERE Time = 170500 ORDER BY DATE; /* 各テンポラリテーブルを結合する */ SELECT t_Open.DATE, t_Open.time, t_Open.OPEN, HIGH, LOW, t_CLOSE.OPEN FROM t_Open, t_HighLow, t_CLOSE WHERE t_Open.Date = t_HighLow.Date AND t_Open.Date = t_CLOSE.Date ; かなりベタなSQLなので、もっと上手いやり方があるとは思うのですが・・・。viewを使う手も考えたのですが、DBの件数が多いためにかなり重くなってしまうかもしれません。
Posted by SBT at 2006-02-03(金) 23:58
なるほど、テンポラリテーブルですか、ありがとうございます。 これがうまいこと出来るとおおまかにレートの検索や、把握をするのがだいぶ楽になるのですが・・・。 SQLの扱いにまだ慣れていないので、リファレンスとにらめっこしながら試してみます。 うまいことできたら、また記事にでもしてみますね。
Posted by こはる at 2006-07-03(月) 00:26
はじめまして。 為替のシステムトレードを調べていて、こちらにたどり着きました。 プログラミングはさっぱりなのですが、エクセルを使ってできないかなと思って挑戦中です。 すごく参考になりましたので、御礼がてら足跡残しますね。
Posted by SBT at 2006-07-03(月) 22:32
こはるさん、コメントありがとうございます。 Excelは自分で中身を確認しながらできるのがよいですよね。ちょっとした検証や確認作業には重宝します。 がんばってくださいね。
Posted by kuro at 2006-07-04(火) 21:30
トレステとsqlで検索して来ました。 イントラデータの管理は大変ですね、私はもう自分でやるのはあきらめてtradestationに口座を開こうかと思っています。 1分足からn分足への変換ですが、以下のようにして select max(price), min(price) from ... group by (time - (time - 930) % n) n分ごとに丸めた式でgroup byをすると一応できるのではないでしょうか。 (timeは分単位、寄付は9:30と仮定) ただ、これでもn分のopen/closeはむずかしいですね。 リレーショナルDBはデータの入っている順序を気にしてくれないので firstやlastのような操作は難しいですね。 Accessはかなり特殊なほうだと思います。
Posted by SBT at 2006-07-05(水) 00:51
kuroさん、はじめまして、こんにちは。 結局、あまり良い方法が思いつかず変換は放置していたのですが、そういったやり方もできるのですね。 SQL文だけでやるのはやっぱりちょっと無理がありそうですかもですね。必要な場合は抜き出して手動とか脳内でやってますが、案外、こっちのほうが早いかも…。 参考になりました、ありがとうございました。
トラックバック
このエントリーへのトラックバックはありません。
- トラックバックURL
- http://core.t3-ism.net/trackback/254



Posted by ┌|∵|┘ at 2006-02-01(水) 00:24