HaskellでCSVファイルの株価データをデーターベースに入れてみた。SVG電子工作ブログやってます。policyHaskellでCSVファイルの株価データをデーターベースに入れてみた。株価をCSVファイルからデーターベースに格納するCSVファイルをパースして株価を得る株価CSVの行をテーブルの定義に合わせて変換してデーターベースへMariaDBにアクセス株価を集計するコマンドラインプログラムにするコンパイル&インストールテスト普通の株価データの場合(8306-T)欠損値のある株価データの場合(7312-T)前回PythonでCSVファイルの株価データをデーターベースに入れるスクリプトを作った。データーベースに株価を入れて、Pandasでテクニカル分析を始めるのはちょっとおいといて、Haskellで書きたい気分だったのでポーティングしてみた。結果が同じプログラムを二つ持っても無意味だけど、Pythonで書いたものとHaskellで書いたものをGitHUBにおいておきます。PythonでCSVファイルの株価データをデーターベースに入れて、ローソク足チャートを描いてみた。テーブル定義MariaDBを使う。ダウンロードしてきたCSVファイルをデーターベースに入れる。入力はこんなCSVファイルを想定しています。日付,始値,高値,安値,終値,出来高,売買代金2017-06-21,726.50,728.00,718.40,719.80,60170000,433921713302017-06-20,734.00,739.90,729.60,729.60,64983500,477302699902017-06-19,719.90,727.60,718.30,725.20,42098400,304743041702017-06-16,721.00,730.00,720.00,722.60,104013700,753478661302017-06-15,720.50,727.90,715.00,715.00,72207900,519581581802017-06-14,740.90,741.90,729.30,729.30,56718700,416600423002017-06-13,732.50,737.20,729.40,734.00,40896300,300220935102017-06-12,742.00,748.30,732.00,733.30,69324400,512953364502017-06-09,731.90,738.00,728.10,734.70,118601100,869624205001時間足CSVは8列で日足CSVは7列であることに注意することと、日本語の取り扱いは面倒なので1行目は読み飛ばしてパースします。skiprows=1の指定でCSVファイルをパースします。['date','time','open','high','low','close','volume','turnover']Haskellにpandas.read_csvは無かったので自分で作ったCSVファイルパーサーでCSVファイルを読んでパースします。カスタマイズした物です。この部分は時刻列は有るかもしれないし、無いかもしれないと宣言しています。BL8.ByteStringこの部分で7列または8列のCSVしか受け付けないとパターンマッチで表現してます。file."株価CSVファイルを読み込む処理は以上で終わり。データーベースに入れる。r:append_key(sec_code,r)こういう物を見たら部分適用していると思ってください。関数適用して変換後executeInsertIgnoreDB関数でデーターベースに入れる。(Leftはパースエラーだからprint関数が適用される。qiitaを参考にして書いた。こことかコピペしました、ありがとうございました。O/Rマッパ(的な何か)が無いので、適当にDBアクセサの型クラスを用意した。DataBaseAccessibleのインスタンスにする所です。mysql-haskellがよく分かってないので説明は無しの方向で。以上で株価をCSVファイルからデーターベースに格納できた。株価を集計するバッチ処理として、1時間足テーブルから株価を取り出して集計し、日足テーブルに入れる。Pythonではこの関数で行なう。組み合わせて集計する。'turnover':'sum'})引数に集計方法を渡して呼ぶ。‘turnover’は総和とした。Haskellではこのようにバッチ処理関数の引数に具体的な集計関数を渡して行なう。"]具体的な集計関数を渡して集計する。}aggregateOHLCでは初値-終値の時系列リストで初値中の初値、高値中の最高値、安値中の最安値、終値中の終値を集計する。取引が行なわれないことがあるので(期間中に売買が無いとかストップ高/安、取引停止など)、これは欠損値(N/A)を許容する。売買代金の総和を集計する。ここで、空リストが渡されるのはグループ化に失敗しているので、Nothingを返す。a)この高階関数に渡す集計関数は型クラスDataBaseAccessibleと型クラスDailyAggregatable両方のインスタンスでないとエラーになる。なっているので集計関数として渡せる。ありがとうございました。sec)データーベースに入る。sec)1時間足テーブルを集計して日足テーブルに入る。ダウンロードしてきた日足CSVと一致する。sec)取引のなかった時間帯にはNULLが入っている。sec)1時間足テーブルを集計して日足テーブルに入る。欠損値も含めてダウンロードしてきた日足CSVと一致する。日付,始値,高値,安値,終値,出来高,売買代金2017-06-29,39.00,40.00,32.00,38.00,20337900,7353350002017-06-28,35.00,49.00,33.00,35.00,59227300,22739176002017-06-27,110.00,110.00,110.00,110.00,3459500,3805450002017-06-26,,,,,0,02017-06-23,113.00,160.00,112.00,160.00,32973600,46818894002017-06-22,126.00,135.00,110.00,110.00,46751100,57212694002017-06-21,244.00,244.00,244.00,244.00,194700,475068002017-06-20,324.00,324.00,324.00,324.00,98500,319140002017-06-19,404.00,404.00,404.00,404.00,45200,182608002017-06-16,,,,,0,0Python版も結果は同じ。ここまででPythonからHaskellに移植できた。