Yahooファイナンスから時系列データを取得【TDタグからデータを抜く】

Webクエリを使わない方法

先日、Yahooファイナンスの時系列テーブルに変更がありましたよね?

20150113

以前は1ページに50営業日分が表示されていたはずですが、20営業日分までしか表示されなくなったようです。

この変更が不便になった人は少ないと思いますが、僕には不便になってしまいました。
時系列データを取得する際に、僕はWebクエリを使うことが多いので、処理速度も遅くなってしまいます。

なので、今日はWebクリエを使わずに、TDタグの中身を直接抜き出してみようと思います。

時系列データ取得マクロ

まずは、コードを載せますね。

Sub Get_TagTD()

‘お約束
Dim objIE As Object
Set objIE = CreateObject(“InternetExplorer.application”)
objIE.Visible = True

‘変数の宣言
Dim n As Integer
Dim x As Integer, y As Integer

‘TDを抜き出す
Cells.Delete

Cells(1, “A”) = “n(番目)”
Cells(1, “B”) = “InnerTEXT”

objIE.Navigate “http://stocks.finance.yahoo.co.jp/stocks/history/?code=8411.T”
IE_Complete objIE

Dim objTD As Object
Set objTD = objIE.document.all.tags(“TD”)

For n = 0 To objTD.Length – 1

Cells(n + 2, “A”) = n
Cells(n + 2, “B”) = objTD(n).InnerTEXT

Next n

‘列の幅を整える
Columns(“B:B”).ColumnWidth = 18.13

‘IEを閉じる
Set objTD = Nothing

objIE.Quit
Set objIE = Nothing

‘時系列データの整理
Cells(4, “D”) = “日付”
Cells(4, “E”) = “始値”
Cells(4, “F”) = “高値”
Cells(4, “G”) = “安値”
Cells(4, “H”) = “終値”
Cells(4, “I”) = “出来高”
Cells(4, “J”) = “微調整終値”

For y = 1 To 20
For x = 1 To 7

Cells(y + 4, x + 3) = Cells(x + y * 7 – 3, “B”)

Next x
Next y

‘列の幅を整える
Columns(“D:J”).EntireColumn.AutoFit

End Sub

‘IEが表示されるまで待つ
Public Sub IE_Complete(ByVal objIE As Object)

Do While objIE.Busy = True
DoEvents
Loop
Do While objIE.document.readyState <> “complete”
DoEvents
Loop

End Sub

例によって、三流君さんのサイトを参考に作りました。

なので、僕の解説を見るよりも、三流君さんのサイトを見た方がためになります。
ここでの解説は僕のメモ書き、備忘録代わりです。

コードの解説

18行目 objIE.Navigateで、みずほ(8411)の時系列データのページに飛びます。

冒頭で時系列データのページの画像を張りましたが、ソースの中身は以下のような感じです。

2015011303

<TD>中に、時系列データが入っていますね。
この中身をすべて抜いてみます。

21行目でテーブルオブジェクトを格納するObjTDを宣言します。
24行目からForループで、TDタグの数の分回します。

objTD.Lengthからなぜ―1するのか、忘れちゃいました…
知りたい方は、三流君さんのところで解説してあったと思います。

列Aに何番目か、列Bにテキストの中身を出力します。
27行目でobjTD(n).InnerTEXTと、objTD(n)が配列として使われているのにも違和感を感じますが、僕はよくわかってないのでこういうもんだと割り切って使ってます。

出力した結果がこんな感じです。

2014011301

B列にTDタグの中身を吐き出しました。
見ると、5行目の日付からが時系列テーブルです。

日付、始値、高値、安値、終値、出来高、微調整終値の順番でデータが入っているようです。

僕は微調整終値が便利だから、Yahooファイナンスからデータを取得することが多いです。
株式分割があると、面倒くさいんだもん…

そして40行~58行で、データを綺麗にまとめた結果が以下になります。

2015011302

こんな感じで時系列データを取得できました。
次回はもっと長い期間を取得するマクロを公開しようと思います。

メモ書き

■<TD>とは
Table Dataの略

セルの内容が「データ」となるデータセルを作成。
セルの内容が「見出し」の場合には~を使用。

■TDのタグを抜く
Dim objTD As Object
Set objTD = objIE.document.all.tags(“TD”)

テーブルオブジェクトを格納するobjTDを宣言
objIEがdocumentを持っていて、その.allのタグのグループのTDを返す
objTDにタグの集合が入る

※メモ
Public SubとPrivate Subの違い

Publicはすべてのモジュールから呼び出せるプロシージャ
Privateは同じモジュールの中からしか呼び出せないプロシージャ
省略した場合、SubはPublic Subとして扱われる

トレード結果

もう少し勝てたかな?
という、勝ちきれなかった感はあったけど。

今日の収支 28850円

三連敗を防げてよかったです♪

トロッコ問題のアンケートに回答してくれた方、ご協力ありがとうございました。

予想通り、ケース2で男を突き飛ばすのは間違いだという方がほとんどでした。
実際に行われた調査でも、85%の人があのケースでは男を突き飛ばすべきではないと回答しているようです。

また、興味深い問題があったらご協力のほどをよろしくお願いします。