| No.115 HTMLソースの取得 |
| 概要 |
・インターネット上の株価情報を取得するため、HTMLソースの取得に挑戦した。
・マイクロソフトアクセスのVBAを使い、データベース化してみた。
・文字コードの変換が難しかった。
・データベースの分析を行い、株ロボに挑戦してみようと思っている。
(2007/12/16)
|
| HTMLソース |
最近、プログラミングを行う機会が激減していることに気がつきました。2005年末頃までは、Javaを勉強していましたが、それ以降の仕事はインフラ整備や情報システム導入の調整などが多く、また、最近は起業で忙しかったためです。
たまには、プログラムを作らないとやり方を忘れてしまうので、何か目的を見つけてプログラムを作ることにしました。そこで思いついたのが、株価情報の取得です。株は私の趣味の一つですから。今回は、株価情報の取得とデータベース化に挑戦してみました。
その前に、誰かが既に良い物を作って公開しているかもと思いベクターで検索してみました。すると、エクセルやアクセスを使って、株価情報を取得するフリーソフトが多数掲載されています。いくつかダウンロードして使ってみましたが、残念ながらプログラムソースを公開しているものはなさそうでした。
ソースがないと好きなように改良できないので、やっぱり自分で作ることにしました。私が一番慣れているのはマイクロソフトアクセスです。バージョンは2000。ちょっと古いですが、個人的に使うのなら問題ないでしょう。言語はVBAです。株価情報をデータベース化することまで考えるなら、エクセルよりもアクセスの方が向いています。
久しぶりのプログラミングか。アクセスを使うのなんて何ヶ月ぶりだろ。ちょっと楽しくなってきました。
|
| 株価データベース |
まず最初の壁はインターネット上のファイルを扱う方法です。少し調査してみたら、HTTPの通信を行うためのオブジェクトが存在するとのこと。これを使えばいけそうです。で、作ってみたのが、以下のコードです。
Function GetHttpDoc1(URL) As String
Dim Http As Object
On Error GoTo GetHttpDoc1_ERR
Set Http = CreateObject("MSXML2.XMLHTTP")
Http.Open "GET", URL, False
Http.Send
GetHttpDoc1 = StrConv(Http.responseBody, vbUnicode)
GetHttpDoc1_RESUME:
On Error GoTo 0
Exit Function
GetHttpDoc1_ERR:
Debug.Print "GetHttpDoc1:" & Err.Description
Resume GetHttpDoc1_RESUME
End Function
こりゃ簡単。エラー処理がなければほんの数行です。
使い方は、「GetHttpDoc1("http://www.sysana.com")」のようにURLをパラメータに指定すれば、ソースファイルをテキスト形式で取得できます。テキスト形式ならば、文字列検索関数などを使って処理すれば何とでもできるはずです。もちろん、インターネットに接続している必要があります。今は常時接続が普通なので問題にならないとは思いますが。
インターネット経由で株価情報を入手できるサイトは複数存在します。ほとんどのサイトで株価情報は約20分遅れで表示されます。そのため、デイトレード用のリアルタイム分析は不可能ですが、中期〜長期投資のための日々の株価情報の入手なら全く問題ありません。
試してみると...あれ?文字化けしてるよ。どうやら、ウェブサーバで使っている文字コードがEUC-JPのようで、これをUnicodeに変換している部分で文字化けしているようなのです。漢字が正しく変換できないと文字列検索できません。昔から文字コードの変換は非常に困難で、変換テーブルを作成したり、変換するための専用の外部プログラムを使ったりしていたのを思い出しました。
これは結構面倒かも...と思ったのですが、調べてみたら最近は便利なオブジェクトが存在するとのこと。オブジェクト指向万歳!ストリームというファイルや文字列を扱うためのオブジェクトを使えば、Windowsでよく利用されるShiftJISという文字コードへ変換することもできるようなのです。おお便利だ。
作り直したのが以下のコードです。これでどんなサイトのHTMLソースでも、正しくShiftJISのテキスト形式に変換できます。
Function GetHttpDoc2(URL) As String
Dim Stream As Object
Dim Http As Object
On Error GoTo GetHttpDoc2_ERR
Set Http = CreateObject("MSXML2.XMLHTTP")
Http.Open "GET", URL, False
Http.Send
Set Stream = CreateObject("ADODB.Stream")
Stream.Open
Stream.Type = 2 'テキスト
Stream.Charset = "Shift_JIS"
Stream.WriteText Http.responseText
Stream.Position = 0
GetHttpDoc2 = Stream.readText(-1)
GetHttpDoc2_RESUME:
On Error GoTo 0
Exit Function
GetHttpDoc2_ERR:
Debug.Print "GetHttpDoc2:" & Err.Description
Resume GetHttpDoc2_RESUME
End Function
最近はプログラム言語そのものを覚えるよりも、便利なオブジェクトの使い方を覚える方が重要になってきていますね。
|
| カブロボ! |
集めたデータを何に活用するかというと、もちろん自分の中期投資の成績向上に使いたいと思っています。非常に多数の情報を使って、特定の条件で抽出したり分析したりする作業は、人間よりもコンピュータにやらせた方が効率がいいですからね。ある程度、投資対象を絞り込んでから最終的に人間が判断すれば良いと思っています。
さらに、もし良い法則を見つけることができたら、株ロボを作ってみようと思っています。株ロボというのは、プログラムを使った株の売買システムのことです。私も最近まで知らなかったのですが、Javaを使って株ロボを作り、それを試す場が用意されているのです。詳しくは、株ロボの公式サイトを参照してください。(リンク集に追加します。)
それにしても、JavaにAccessか。どちらも正式な業務で使うのをあきらめたのに、個人的には活用することになるとはね。時代は巡るということなのか。
|