必要なデータの抽出
解凍したテキストファイルには、複数の通貨ペアのデータが詰まっています。
さしあたりドル円(USD/JPY)のデータのみを抽出したファイルを作成してみましょう。
VBAを使って読み込みや編集、作成を行うプログラムを作ることにより、大量のファイルでも余裕で(もちろん限度はありますが、人間が作業することに比べれば簡単に)処理することができます。
実際のところ容量に問題がなければわざわざ抽出する必要はありませんが、ここでは一応バックテストに使用するデータだけを抜き出してみます。
また、元のファイル名のままだと扱いづらいので、ファイル名をyyyymmdd形式に変更して(例:010212.txt→20120201.txt)新たに作成します。
ファイル内のデータは1行毎に"通貨ペア,日付(yyyymmdd),時間(hhmmss),開始レート,高値,安値,終了レート"の順で並べられています。
以下はunzippedフォルダ内のファイルから必要な通貨ペア(USD/JPY)のデータのみを抜き出し、新ファイル(エクセルがあるフォルダ内にUSDJPYフォルダを作成し、その中に展開)に保存するサンプルコードです。
Sub SortHistDat()
'///概要
'ヒストリカルデータの中から使用する通貨ペアデータを抜き出し、
'日付順に並べてファイルを作成する。
'元ファイルの形式(通貨ペア,yyyymmdd,hhmmss,開始レート,高値,安値,終了レート)
'(TICKER,DTYYYYMMDD,TIME,OPEN,HIGH,LOW,CLOSE)
'///
'/*変数リスト
Dim line As Variant 'ファイル内の文字列を一行読み込むための配列
Dim daydata(24 * 60) As Variant '1日分のline配列を格納する配列(最大24時間×60分)
Dim inputpath As String '入力元フォルダ
Dim outputpath As String '出力先フォルダ
Dim filelist(20 * 365) As String '処理対象のファイルリスト(最大20年×365日)
Dim filename As Variant 'ファイル名
Dim i As Long 'カウンタ用変数
Dim buf As String '読み込み用バッファ
Dim ff As Long 'フリーファイル変数
Dim newfile As String '新しいファイル
'*/
inputpath = ThisWorkbook.Path + "\unzipped\" '入力フォルダ名
outputpath = ThisWorkbook.Path + "\USDJPY" '出力フォルダ名
If Dir(outputpath, vbDirectory) = "" Then
MkDir outputpath '出力フォルダがなければ新規作成
End If
outputpath = outputpath + "\" '"※\マークのHTMLエスケープ用。特に意味なし。
'入力フォルダ内のファイルリストを取得
i = 0 'カウンタクリア
filename = Dir(inputpath + "*.txt") 'ファイル名(1件目)を取得
Do While filename <> ""
filelist(i) = inputpath + filename 'パス+ファイル名をリストに保存
filename = Dir() 'ファイル名(2件目以降)を取得
i = i + 1
Loop
'ファイルを順に処理
For Each filename In filelist
If filename = "" Then
Exit For
End If
ff = FreeFile 'フリーファイル変数をセット
buf = "" 'バッファを初期化
Erase daydata() '一日分の配列を初期化
i = 0 'カウンタ用変数を初期化
Open filename For Input As #ff '入力ファイルを読み込む
Do Until EOF(1)
Line Input #ff, buf
line = Split(buf, ",") '一行分を分割して配列に格納
If line(0) = "USDJPY" Then '対象通貨ペア
daydata(i) = line '分足データを配列に格納
i = i + 1 'カウンタ更新
End If
Loop
Close #ff '1ファイル読み込み終了
If IsEmpty(daydata(0)) = False Then
newfile = outputpath + daydata(0)(1) + ".txt"
ff = FreeFile 'フリーファイル変数をセット
Open newfile For Output As #ff '出力ファイルを作成
For Each line In daydata
If IsEmpty(line) Then
Exit For
End If
Print #ff, Join(line, ",") '元の形式で1行書き込み
Next
Close #ff '1ファイル出力終了
End If
Next
End Sub
※抜き出した2012年分(USD/JPY)の総ファイルサイズは16.9MBと、元のサイズ(317MB)に比べてかなりコンパクトになります。