必要なもの
- Go環境をセットアップ。IDEにIntellijのGoLandを使いました。
- PostgreSQL
- Kabu+の株価一覧表のcsvをDBに投入する https://kabu.plus/
結果
先にどういったデータを取得できるか示します。
下記のエンドポイントにアクセスして
http://localhost:8000/sma?code=1333&date=2018-08-07
このような結果が得られます。
[
{
"code": 1333,
"price": 3820,
"sma": 4084.2,
"tstamp": "2018-08-07T00:00:00Z"
}
]
1333マルハニチロの8/7における終値が3820。その日の25日移動平均は4084.2です。
ソースコード
ポイント
-
Go言語は初めて触れたのですが、URLルータとディスパッチャのライブラリであるGorillaが理解しやすくかつ書きやすいです。サンプルコード読んでたら、多くのTutorial/Get Started系の記事で使われていました。
http://www.gorillatoolkit.org/ -
Postgres側でmoving_averageという関数を用意します。引数は順に銘柄コード、日付、移動平均日数です。今回は25日で固定にしました。/sma?length=5などとクエリパラメターに加えてもよかったと思います。
-
下記のコードはテーブルから行を取得し、それをJSONに変換するパートです。 1. db.QueryでPostgresの関数の実行結果を取得。 2. columnsがcode, price, sma, tstampと4つあるので
for i, column := range columns
の部分でループを回す。 3. objectはmap、それをarray of mapのobjectsに追加するイメージです。
func query(code string, dt string) ([]byte, error) {
var objects []map[string]interface{}
rows, _ := db.Query("select * from moving_average($1,$2, 25)", code, dt)
for rows.Next() {
columns, err := rows.ColumnTypes()
if err != nil {
return nil, err
}
values := make([]interface{}, len(columns))
object := map[string]interface{}{}
for i, column := range columns {
object[column.Name()] = reflect.New(column.ScanType()).Interface()
values[i] = object[column.Name()]
}
err = rows.Scan(values...)
if err != nil {
return nil, err
}
objects = append(objects, object)
}
return json.MarshalIndent(objects, "", "\t")
}
同じことFlaskでもDjangoでもできると言われればそれまでなんですが、Go言語を触ってみるにはいい機会でした。