自作の「金融商品自動売買ツール」をGo言語で作ってみる:「お金に愛されないエンジニア」のための新行動論(3)(6/9 ページ)
「老後のための投資」について、どうも“着火”(やる気に火がつくこと)しません。だとしたら、私が大好きな趣味の世界に、このテーマを持ち込むしかありません。というわけで、私は、大好きなシミュレーションを利用できる、「金融商品自動売買ツール」の構築を目指すことにしました。
自作の「金融商品自動売買ツール」をGo言語で作る!
そんな訳で、少しずつではありますが、自作の金融商品自動売買ツールの作成を目指して、少しずつ勉強を開始しています。ここからは、エンジニアらしく技術の話もしてみたいと思います。
皆さんは、”Go”をご存じでしょうか。私が今、必死に勉強しているプログラミング言語です(筆者ブログ)。
“Go言語”は、Googleが2009年に開発したプログラミング言語です。詳細は、上記の表をご覧頂きたいと思いますが ―― どの言語も、自分に都合の良いことをアピールしていますので、それを踏まえた上でご覧ください。
これまで1年近く“Go言語”を使ってきた私から言わせると、あまりお勧めできる言語ではないような気がします。初心者なら、間違いなく、Pythonを選ぶべきですし、鉄板であればJava、Web系だけで良いなら、JavaScript(これは言語かな?)で十分です。なのに、なぜ私が、Go言語を選んだかというと、その理由は、この一つに尽きます。
―― goroutineという超軽量スレッドを大量に使った、並行処理が可能である。
これ、私の得意分野である、エージェントシミュレーションには、どうしても避けて通ることのできないものなのです。とにかく1つのプログラムから作れるgoroutineは、私が知る限り、4700万を越えて生成できるそうです。
これ、東京都民の全員を、シミュレータ上のエージェントとして、バラバラに動かすことが可能である、ということです ―― スーパーコンピュータを持ち出す必要もなく、私のパソコンでも可能です。これだけは、他のコンピュータ言語ではできそうにありません。
Go言語が、『「進化したC言語」という側面がある』と言われれば、『それなら、C言語の仕様拡張でいいだろうが!』と突っ込みたくなりますし、『シンプルな構文で構成されており、文法が分かりやすく、学習する際の負担が小さい』と言われると、『ダウト!』と叫びたくなります(少なくとも、私には、高負担でした)。
私は、金融商品自動売買ツールのバックエンドに、1000万人くらいのエージェントを用意して、彼らにも売買をやらせてみたいのです。そのエージェントの中には、金持ちも貧乏人も、楽天家もペシミストも用意して、そんな人間のごった煮からなる、新しい推論エンジンを試してみたいのです。
この研究、私が死ぬまでの30年間(予想)では終わりそうもありません ―― それならば、なかなか良い、老後のライフワークとは思えます。「ぼっち」を貫きながら、「安心安全な老後」を担保しつつ、「自分なりの楽しい」を継続して ――まあ、「ゼロ苦痛」だけはどうしようもありませんが ―― が、実現可能に思えてきます。
さて、本日は、Go言語を使って、金融商品自動売買ツールの基本形である、証券会社のWebサイトから必要なデータをパクってくる、スクレイビング(データ収集)方法をご紹介したいと思います。
円、ドルなどの通貨、各種の債券、そして自分の購入した金融商品は、毎日売買価格が変動します。それらは、証券会社のサイトのWebページを見て、それを手書きで書き写して、変動を計算したり、グラフにしたりすることができます。また、そういうデータを別途入手することもできますが、有料であることが多いですし、いらないデータまでも付いてくることがあります。
そのようなWebサイトに表示されるデータを自分の望む形で、PCに取り込むことを、”Webスクレイピング”といいます。ここでは、皆さんが、ご自分のPCやクラウドに、Go言語を使える環境を構築していることを前提として、話を進めます(“Go言語”、”インストール”でググれば、すぐにページが出てきます)
まずは、適当なディレクトリ(私の場合、C:\Users\ebata\kese\gonet-html)に、以下のプログラムを、ここから取ってきて、”mail.go”というファイル名で保存してください。
package main import ( "fmt" "log" "net/http" "github.com/PuerkitoBio/goquery" ) func main() { // Request the HTML page. res, err := http.Get("http://kobore.net") if err != nil { log.Fatal(err) } defer res.Body.Close() if res.StatusCode != 200 { log.Fatalf("status code error: %d %s", res.StatusCode, res.Status) } // Load the HTML document doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { log.Fatal(err) } doc.Find("input").Each(func(i int, s *goquery.Selection) { // For each item found, get the title title, _ := s.Attr("type") fmt.Printf("Review %d: %s\n", i, title) }) }
さらに、コマンドプロンプトから、以下を実施してください。
$ go get github.com/PuerkitoBio/goquery
その後、コマンドプロンプトから、以下を実施してください。
$ go run main.go
こうすると、私のHPのトップページのhtmlファイルから、<input type= で始まる、行を見つけ出します。
このような行を見つけて、
<input type="hidden" name="cx" value="010448971387544815344:gehqdwxqnlo" /> <input type="hidden" name="ie" value="Shift_JIS" />
以下のような形で報告してくると思います。
Review 0: hidden Review 1: hidden Review 2: text Review 3: submit
さて、次は、もう少し実践的なコードにしてみたいと思います。
今度は、”kabutan.jp”というページで、”https://kabutan.jp/stock/?code=6501”の会社の情報をパクってみましょう。
ここから、以下のプログラムで情報を抜き取ります。
今度は以下のプログラムを、ここから取ってきて、”main.go”というファイルで保存します。
package main import ( "fmt" "github.com/PuerkitoBio/goquery" ) func main() { q, err := goquery.NewDocument("https://kabutan.jp/stock/?code=6501") if err != nil { fmt.Println("get html NG") } name := q.Find("div.company_block > h3").Text() fmt.Println(name) code_short_name := q.Find("#stockinfo_i1 > div.si_i1_1 > h2").Text() fmt.Println(code_short_name) market := q.Find("span.market").Text() fmt.Println(market) unit_str := q.Find("#kobetsu_left > table:nth-child(4) > tbody > tr:nth-child(6) > td").Text() fmt.Println(unit_str) sector := q.Find("#stockinfo_i2 > div > a").Text() fmt.Println(sector) }
これを、$ go run main.goで実施すると、以下の情報が出力されます。
日立製作所
6501日立製作所
東証P
100 株
電気機器
さて、この仕組みについて、簡単に説明します。
main.goの28行目は、タグを使って、目的の値(ここでは文字列)に到着するまでの手順を記載しています。そして、このプログラムは、実際のhtmlファイルのタグをたどって、目的の値「電気機器」を見つけ出しています。
”Webスクレイピング”とは、htmlファイルのフォーマットを利用して、そこからデータを抜き出す単純なものです ―― 一方、htmlファイルのフォーマットが定期的に変更されるようなサイトでは、ある日、突然全く動かなくなる、というリスクもあります。
いずれにしても、”Webスクレイピング”は、金融商品自動売買ツールを実現するために、最も基本的な技術の一つです。今後も、Go言語を使った金融商品自動売買ツールの技を試して、ご紹介していきたいと思います。
Copyright © ITmedia, Inc. All Rights Reserved.