SQL Server Express に日経平均株価のヒストリカルデータテーブルをCREATEして、データをINSERTしたときのメモ。
VBAHaskellとvb_ODBC.clsを使用。
1.データの準備
日経平均株価 日足 時系列データ CSVダウンロードから各年のCSVファイルをダウンロードしておく。
2.ファイルを全部つなげた配列を作る
m = catVs(getTextFile("H:\download\indices_I101_1d_2007.csv"), _
getTextFile("H:\download\indices_I101_1d_2008.csv"), _
getTextFile("H:\download\indices_I101_1d_2009.csv"), _
getTextFile("H:\download\indices_I101_1d_2010.csv"), _
getTextFile("H:\download\indices_I101_1d_2011.csv"), _
getTextFile("H:\download\indices_I101_1d_2012.csv"), _
getTextFile("H:\download\indices_I101_1d_2013.csv"), _
getTextFile("H:\download\indices_I101_1d_2014.csv"), _
getTextFile("H:\download\indices_I101_1d_2015.csv"), _
getTextFile("H:\download\indices_I101_1d_2016.csv"))
中身はこんな感じ。
各ファイルにヘッダがついていて、末尾には空白行がある。
printM_ m, 4
日付,始値,高値,安値,終値
2007-12-28,15413.37,15413.37,15240.96,15307.78
2007-12-27,15616.41,15628.31,15535.51,15564.69
2007-12-26,15613.96,15653.54,15559.47,15653.54
printM_ m, -4
2016-01-06,18410.57,18469.38,18064.30,18191.32
2016-01-05,18398.76,18547.38,18327.52,18374.00
2016-01-04,18818.58,18951.12,18394.43,18450.98
3.日付でソートする
各行の先頭10文字を抽出して < で比較する。
si = sortIndex_pred(m, p_less(p_left(,10), p_left(,10)))
permutate m, si
ソート後の状態を見てみる。
printM_ m, 11
2007-01-04,17322.50,17379.46,17315.75,17353.66
printM_ m,-11
2016-12-22,19396.85,19427.67,19327.51,19427.67
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
日付,始値,高値,安値,終値
空白行が先頭に、ヘッダ行が末尾に集まっている。
4.データの整形
空白行(先頭10行)とヘッダ行(末尾10行)を削除し、各項目をカンマで区切る。
m = tailN(headN(m, -10), -10)
m = mapF(p_Split(, ","), m)
printS m
[Dim1]: 0 -> 2443 : Total Size = 2444
printM_ m,4
2007-01-04 17322.50 17379.46 17315.75 17353.66
2007-01-05 17315.53 17327.13 17011.09 17091.58
2007-01-09 17018.89 17261.02 16983.97 17237.76
2007-01-10 17192.41 17199.41 16847.57 16942.40
set oo = new vb_ODBC
?oo.connect(oo.sqlServer_expr("***-PC\SQLEXPRESS", "sampleDB01"))
True
6.テーブルCREATE
oo.exec "CREATE TABLE NK225 (" & _
"MDATE date," & _
" OPEN_P numeric(8,2)," & _
" HIGH_P numeric(8,2)," & _
" LOW_P numeric(8,2)," & _
" CLOSE_P numeric(8,2)" & _
");"
7.INSERT文を作る
s = oo.insert_expr_("NK225", Array("MDATE","OPEN_P","HIGH_P","LOW_P","CLOSE_P"), m)
printS s
[Dim1]: 0 -> 2443 : Total Size = 2444
printM_ S,3
INSERT INTO NK225 (MDATE,OPEN_P,HIGH_P,LOW_P,CLOSE_P) VALUES('2007-01-04',17322.50,17379.46,17315.75,17353.66);
INSERT INTO NK225 (MDATE,OPEN_P,HIGH_P,LOW_P,CLOSE_P) VALUES('2007-01-05',17315.53,17327.13,17011.09,17091.58);
INSERT INTO NK225 (MDATE,OPEN_P,HIGH_P,LOW_P,CLOSE_P) VALUES('2007-01-09',17018.89,17261.02,16983.97,17237.76);
8.INSERT文を実行
oo.exec s
9.結果を確認
m1 = oo.select_flat("select * from NK225 order by MDATE").get_data
printS m1
[Dim1]: 0 -> 2443 [Dim2]: 0 -> 4 : Total Size = 12220
printM m1,5
2007/01/04 17322.5 17379.46 17315.75 17353.66
2007/01/05 17315.53 17327.13 17011.09 17091.58
2007/01/09 17018.89 17261.02 16983.97 17237.76
2007/01/10 17192.41 17199.41 16847.57 16942.4
2007/01/11 16958.57 17057.44 16758.46 16838.16
printM m1,-5
2016/12/16 19438.39 19439.97 19360.36 19401.15
2016/12/19 19345.84 19399.26 19307.14 19391.6
2016/12/20 19367.84 19511.2 19356.81 19494.53
2016/12/21 19547.28 19592.9 19375.19 19444.49
2016/12/22 19396.85 19427.67 19327.51 19427.67
h = oo.get_header
printM h
MDATE TYPE_DATE
OPEN_P NUMERIC
HIGH_P NUMERIC
LOW_P NUMERIC
CLOSE_P NUMERIC