「Webから株価データ取得(Yahoo)」とほぼ同じツールは、

(←←クリックでアマゾンのページを表示)この本に
ツール名「tp01-ダウンロード(Yahoo)」で、マクロの説明付きでソースを公開しています。
マクロを改善して、自分専用の更に儲かるツール作成を考えている方はこの本を参考にして下さい。

(1) Webから株価データ取得(Yahoo)

自分に合った解析ツールを自作したいが、株価データのダウンロード方法が 判らないのでデータロード方法を教えて欲しいとのメールが数回あった。

Yahooファイナンスから株価データをダウンロードするマクロの最低限必要な基本的マクロ の説明をします。これは株データ以外のWebに表示されているデータ取り込みにも応用できます。 ただしサイトによってはダウンロード禁止の場合もあり、マクロ作成に当っては各サイトの注意書き にしたがいインターネット使用のマナーを守って下さい。

ダウンロード
これは説明用に作成したマクロでプロテクトを掛けてないのでソースを見ることが出来ます。
KI(load_np)ダウンロ−ド
(ただし、本ページで紹介のWebクエリで取得はIE7およびExcel2000では使用できなくなり、マクロでエラー発生の質問がくるので下記の実用版はIE7、Excel2000に対応できる「正規表現方式」で取得しています)。

なお、・週データ・月データ・日経平均・TOPIXを追加した「正規表現方式」の実用版、、 「エクセルで時系列株価取得」はベクターからダウンロードできます。
この実用版とほぼ同じツールは、「 新・Excel VBAで極めるシステムトレード 〜最強パワーアップ編 」のCD-ROMにもソースを公開で収録されています。

1.概略
株価のダウンロ−ドは特に難しいことは何もなく、Excelの通常操作でマクロも自動記録できます。
(1)メニューから「新しいWebクエリ」実行(下図参照)


(2)新しいWebクエリダイアロク(下図)へ必要事項入力(Excel2000のケース)


[1]WebのURL入力
 ・これはYahooファイナンスの時系列を開き、銘柄コードと表示期間を
  指定しWebページを開きそのURLを事前にコピーしておいた方がよい
 ・ここへの貼り付けは、[Ctrl]+[V]キーで出来ます(右クリックは効かない)
表示期間を指定できる画面は2009/11月から変わり、時系列表の
右下にある「株価時系列データをもっと見る」クリックで入力
出来ます(その画面はWebクエリでの取り込みも可)

[2]Webページの1部取り込みであり「選択した表」にチェック

[3]そのWebページ内の表の位置指定(本例は"10"ですが時々変わります)
  (このマクロ作成時は10だったが、2004/10/5より19に変わりました)

[4]保存するWebページの形式選択は、「なし」をチェック

[5] 「OK」クリック

※ このURL例は、時系列のデーリーデータですが、「本日の値動き」「財務指標」
  「詳細情報」も同じようにダウンロード出来ます。また他のサイトの
   株価情報も大体同じ方法でダウンロード出来ます。(取得テーブル位置
   の数字は変更のこと)



(3)貼り付けるセル指定



 ・本例はセル"A1"を指定

 ・【参考】KIkabu(load)は"A3"です


(4)ダウンロードしたシート



2.自動記録のマクロ説明
(1)自動記録したマクロ
前述の、1.概略を自動記録すると、下記マクロが出来る。

'==================================================================================
Sub Macro1()
' マクロ記録日 : 2004/7/18  ユーザー名 : iryo
'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://table.yahoo.co.jp/t?c=2004&a=6&b=1&f=2004&d=7&e=18&g=d&s=1301.t&y=0&z=1301.t" _
        , Destination:=Range("A1"))
        .Name = "t?c=2004&a=6&b=1&f=2004&d=7&e=18&g=d&s=1301.t&y=0&z=1301.t"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlSpecifiedTables
        .WebFormatting = xlWebFormattingNone
        .WebTables = "10"
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .Refresh BackgroundQuery:=False
    End With
End Sub
'==================================================================================
これでマクロ完成です。簡単でしょう!!

なお、実際のダウンロードマクロを作る場合は、上記はデーリーデータですが、 週データ、月データも取得したいとか、「本日の値動き」や「財務指標」も 取り込みたい等いろいろ欲が出てきますが、基本的には概要で説明した自動記録 で出来ます(どれだけ使いやすく出来るかはVBAのスキルの問題)。

また、Yahooファイナンスの1ページで取得出来るデータは50個までであり、 連続で50個以上取得する場合マクロに細工が必要です。本コーナーでは こよみ暦70日×2(約100日分)のサンプルを例に、概要で作成した 自動記録を使いやすくしたマクロを説明します。


(2)自動記録のマクロを使いやすくする
自動記録したプロパティの意味を下記表に示す
取込み方法の指定 説明
FieldNames = True データの列見出し:True→表示、False→非表示
RowNumbers = False True→行番号の指定追加?
FillAdjacentFormulas = False True→クエリーテーブルの更新時、数式を自動更新
PreserveFormatting = True True→ページフィルド項目の移動等でピポットテーブルの書式維持
RefreshOnFileOpen = False True→ブックを開くたびにクエリーテーブル自動更新
BackgroundQuery = True True→クエリーテーブルをバックグランド(非同期)で実行
RefreshStyle = xlInsertDeleteCells
 
 
xlInsertDeleteCells→ワークシートに新しい一部の行を挿入または削除
xlOverwriteCells→ ワークシートに新しいセルまたは行を追加しません
xlInsertEntireRows 必要ならば、オーバーフローしないように行全体を挿入
SavePassword = False True→パスワードを保存する
SaveData = True True→クエリーテーブルのデータをブックと一緒に保存
AdjustColumnWidth = True True→列幅のアジャストを行なう
RefreshPeriod = 0 アプリケーション情報更新間隔(0は自動タイマ更新が無効)
WebSelectionType = xlSpecifiedTables xlEntirePage→ページ全体、xlAllTables→Webの表のみ、
WebFormatting = xlWebFormattingNone
 
保存するWebページ形式:xlWebFormattingNone→指定なし
xlWebFormattingRTF→リッチテキスト、xlWebFormattingAll→HTML
WebTables = "10" 10→Webページのインデックス番号10のテーブルを指定
WebPreFormattedTextToColumns = True Web ページの HTML<PRE>タグ内にあるデータを列に区切る
WebConsecutiveDelimitersAsOne = True Web ページの HTML<PRE> タグ内のデータが複数の列指定関連
WebSingleBlockTextImport = False Web ページの特定のテーブルのみをインポートするかを示す値を設定
WebDisableDateRecognition = False False の場合、日付認識を有効にします
Refresh BackgroundQuery:=False True→クエリーテーブル更新をバックグランド(非同期)で実行

既存値で問題ないものは特に指定する必要ないので、整理すると下記マクロでよい。

'==================================================================================
Sub Macro1()
With ActiveSheet.QueryTables.Add(Connection:= _
    "URL;http://table.yahoo.co.jp/t?c=2004&a=6&b=1&f=2004&d=7&e=18&g=d&s=1301.t&y=0&z=1301.t" _
    , Destination:=Range("A1"))

    .RefreshStyle = xlOverwriteCells
    .AdjustColumnWidth = False
    .WebSelectionType = xlSpecifiedTables
    .WebFormatting = xlWebFormattingNone
    .WebTables = "10"                     '時々変更あり、最近は19
    .Refresh BackgroundQuery:=False
End With
End Sub
'==================================================================================
上記をコピーしてExcelのマクロシートに貼り付ければ、1301(極洋)の 2004/6/1〜2004/7/18の株価をダウンロードすることが出来ます。



3.サンプル掲載のKIkabe(load_np)のマクロ説明

(1)変数の宣言銘柄コード指定

'==================================================================================
Const URLYAHOO As String = "URL;http://table.yahoo.co.jp/"
Const BASHO As String = ".t"     '東証

Dim urlweb As String             'Web接続先
Dim meino As String   '銘柄コード
Dim ymden As Date     '取得end日
Dim ymdst As Date     '取得スタート日
Dim endr As Integer   'データ貼り付け最終行
Dim d10y As String, d10m As String, d10d As String
Dim d11y As String, d11m As String, d11d As String
Sub load_np()

'過去データ削除-------------------------------------------------------------
    ActiveSheet.Unprotect
    For Each zu In ActiveSheet.Shapes
        zu.Delete
    Next

 Cells.Select
    Selection.ClearContents
    Range("A1").Select

'銘柄コード指定------------------------------------------------------------
    msg = "Yahooファイナンスからデータ取得する銘柄コード入力"
    meino = InputBox(msg, "銘柄コード入力", "")
    If meino = "" Then
        MsgBox "取得する銘柄コードを入力して下さい"
        Exit Sub
    End If
    If Len(meino) <> 4 Then
        MsgBox "取得する銘柄コードを数字4桁で入力して下さい"
        Exit Sub
    End If
'==================================================================================
・定数宣言URLYAHOO → 変化しないURLは定数指定がマクロがすっきりする
・定数宣言BASHO → 市場を指定 ".t"東証、".o"大阪、等ここを変更する
  (定数の名前は、全て大文字にするのが通例)
・Dim ymden As Date → 日付形式指定でこの変数は日付のみ代入可
・過去データ削除 → 連続で別銘柄実行を考慮し一度シートデータを削除
・銘柄コード指定 → 4桁等入力ミス防止もガードした方がよい



(2)取得期間の指定

'==================================================================================
'取得日の指定
    yyy = Date
   msg = "データ取得する日付を指定して下さい"
    ymd = InputBox(msg, "銘柄コード入力", yyy)
    If ymd = "" Then
        MsgBox "取得する日付を入力して下さい"
        Exit Sub
    End If
    If IsDate(ymd) = False Then
        MsgBox "日付(yy/mm/dd)を入力して下さい"
        Exit Sub
    End If

'取得1
    ymden = ymd
    ymdst = ymden - 70
    endr = 1
    Call 取得準備
    
'取得2
    ymden = ymdst - 1
    ymdst = ymden - 70
    
    Cells(10000, 1).End(xlUp).Select
    endr = ActiveCell.Row + 1
    Call 取得準備

'==================================================================================
・最終取得日を使用者が入力する
・ymdst = ymden-70 → スタート日は、本例は最終取得日より70日前
  (この70は休日も含むこよみ暦であり、70行取得の意味ではありません)
・取得2で、取得1以前の70日をダウンロード
  (取得1で貼り付けた次の行から貼り付ける関係で、変数(endr)へ最終行を読み取る)



(3)取得準備

'==================================================================================
Sub 取得準備()
'スタート日
    d10y = Year(ymdst)
    d10m = Month(ymdst)
    d10d = Day(ymdst)
'収得日
    d11y = Year(ymden)
    d11m = Month(ymden)
    d11d = Day(ymden)

'URLと日付指定
urlweb = URLYAHOO & "t?c=" & d10y & "&a=" & d10m & "&b=" & d10d & "&f=" & d11y & "&d=" _
        & d11m & "&e=" & d11d & "&g=d&s=" & meino & BASHO & "&y=0&z=" & meino & BASHO
Call 取得

End Sub
'==================================================================================
・Web側CGIに合わせるため、年、月、日に分ける
・URLはYahooファイナンスへ直接記入した場合と、100%同じであること。



(4)最終処理

'==================================================================================
'データ整理
    Columns("G").Delete Shift:=xlToLeft    '調整後終値*カット
    Columns("B").Insert Shift:=xlToRight   'B列を空ける
    Columns("G").Cut                      'G列切り取り
    Range("B1").Select
    ActiveSheet.Paste                        'B列へ貼り付け
    Range("A1").Select

    Cells(10000, 1).End(xlUp).Select
    cend2 = ActiveCell.Row
  
'株データ以外の行削除
For i = cend2 To 4 Step -1
  If IsNumeric(Cells(i, 2)) = False Or Cells(i, 2) = "" Then
       Rows(i).Select
       Selection.Delete Shift:=xlUp
  End If
Next
  Range("A1").Select
End Sub
'==================================================================================
・後でExcelでグラフ作成等行う場合、Excel標準フォーマットにしておいた方がよい。
→G列削除、B列を空けG列にある「出来高」をB列へ貼り付け
・株価データ以外のコメントデータ削除



(5)Webから取得

'==================================================================================
Sub 取得()
With ActiveSheet.QueryTables.Add(Connection:=urlweb _
        , Destination:=Cells(endr, 1))
    .RefreshStyle = xlOverwriteCells
    .AdjustColumnWidth = False
    .WebSelectionType = xlSpecifiedTables
    .WebFormatting = xlWebFormattingNone
    .WebTables = "19"
    .Refresh BackgroundQuery:=False
End With
End Sub
'==================================================================================
説明済み(2項参照のこと)(貼り付けセルは変数指定が出来るCellsに変えた)


◆◆このページを活用された方は下記をクリックしランキングの応援をお願いします◆◆

【ホーム】