メディア
連載
» 2022年05月31日 11時30分 公開

自作の「金融商品自動売買ツール」をGo言語で作ってみる「お金に愛されないエンジニア」のための新行動論(3)(6/9 ページ)

[江端智一,EE Times Japan]

自作の「金融商品自動売買ツール」を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.

RSSフィード

公式SNS

All material on this site Copyright © ITmedia, Inc. All Rights Reserved.
This site contains articles under license from AspenCore LLC.