忍者ブログ

EXCEL VBAで あくせく

Yahooファイナンスから時系列情報の取得

Yahooファイナンスは、リアルタイムで株価情報を更新しており、
この情報を外部に無料で配信するサービスを行っています。
リアルタイム情報を表示する「詳細情報」のページと、
前日までの情報を表示する「時系列」情報ページがあります。
時系列情報のページからEXCEL VBAで情報を取得するための
記述を下記に示します。
 
   
 
Private Sub CommandButton1_Click()
On Error GoTo ErrorTrap
Dim oHttp      As Object
Dim strURI     As String
Dim strText    As String
Dim cmpText    As String
Dim syCode     As String
Dim wRow       As Integer
Dim matubi     As Integer

Application.Cursor = xlWait
Set oHttp = CreateObject("MSXML2.XMLHTTP")
matubi = Cells(Rows.Count, 4).End(xlUp).Row 
   wRow = 6
Do Until wRow > matubi
  If (Cells(wRow, 4) >= 1000 And Cells(wRow, 4) <= 9999)  Then
  With oHttp
     strURI = "https://finance.yahoo.co.jp/quote/" & Cells(wRow,4)
        .Open "GET", strURI, False
  '     .setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
        .send  
     syCode = GetText(.responsetext, "【", "】")
     cmpText = GetText(.responsetext, "<head>", "<footer>")
  End With
   

     ---cmpTextから時系列データ抜取り処理---

 End If
      wRow = wRow + 1
Loop
    Application.Cursor = xlDefault
    Set oHttp = Nothing   
End Sub
-----------------------------------
Public Function GetText(prmAllText As String, prmStrText, prmEndText)
    Dim wStrNo      As Long
    Dim wEndNo      As Long     
    wStrNo = InStr(1, prmAllText, prmStrText) + Len(prmStrText)   
    wEndNo = InStr(wStrNo, prmAllText, prmEndText)   
    GetText = Mid$(prmAllText, wStrNo, wEndNo - wStrNo)
End Function
-------------------------------------
時系列データの場合は、YahooファイナンスのURLが、"/quote/"
になっている事に気づいてください。
ここでは、EXCEL表の6行目から証券コードの記入が始まっています。
Cells(wRow, 4)は、EXCEL表の4列目に、証券コードを記載している事を示しています。

GetText Fanctionで、Yahooから受取った該当証券コード情報の内、
.responsetext内の<Title>~</title>行にある【】に挟まれた証券コードを
抜き取っています。
Yahooファイナンスの各銘柄データは、1銘柄毎の全体量が100Kbぐらい
ありますので、非力なEXcelの関数で100Kbを1バイト単位に比較して株価
データを抜き取るには、銘柄数が1000件のもなれば処理時間が長くなって
きます。 ここでは、受取ったHTMLデータの個別銘柄情報のすぐ前にある
<head>のタグから、信用取引情報の後ろの<footer>タグ
までの間を切り取って、比較用の cmpTextを作成しています。
抜き取り後のデータ量は、3Kb程度になりました。
Yahooファイナンスからリアルタイム情報を取得する場合は、下記の1行を指定
しないと、最新情報が得られません。この.setRequestHeaderの1行を指定しない
とサーバーに蓄積された古い情報をもってくる様です。
 
しかし、時系列データの場合は、そもそもが蓄積データのため、この1行は
コメントアウトしました。これをコメントアウトすると約15%程度収集速度が、
 向上します。これは、負荷のかかっているリアルタイムサーバに最新データを
要求して応答が返ってくるまでの処理時間が無くなったからだと 思います。

コメントアウトした1行
 .setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"





2021.04.25  Yahooファイナンスの仕様変更により情報収集が出来なくなったので修正。
 998407 ;日経平均株価、998405 ;TOPIXはサービスがなくなったので収集できません。
2017.04.01 Yahooの仕様変更により情報収集ができなくなったので修正。
      接続先URLの変更。


拍手[5回]

PR