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%の人があのケースでは男を突き飛ばすべきではないと回答しているようです。

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

道徳的ジレンマ【トロッコ問題】に対するアンケート調査

以前に、このブログで道徳的ジレンマ【トロッコ問題】という記事を紹介したことがありました。

今、僕が読んでいる神経学の書籍にトロッコジレンマの問題が出てきたので、再度紹介したいと思います。

また、先日『母平均の区間推定』の記事で年齢アンケートに答えてくださった方、ご協力ありがとうございました。
10名以上に回答をいただけるんであれば、アンケート調査もやりがいがあるので、今回のトロッコ問題のアンケートにもどうかご協力お願いします。

トロッコ問題

では、改めてこの問題を紹介します。

【ケース1】
トロッコが暴走している。
このままでは作業員5人にぶつかってしまう。

トロッコの進路を切り替えれば、作業員5人の命は助かる。
しかし、そうすると別の線路にいた作業員1人にトロッコはぶつかってしまう。

進路を切り替えるのは、正しい行動か?

※法的に罪は問われないとします。あくまでも、道徳的観念で考えてみてください。

ケース1

途中経過

Loading ... Loading ...

では、次に別ケースで考えてみてください。

【ケース2】
トロッコが暴走している。
このままでは作業員5人にぶつかってしまう。

あなたの隣にいる男を突き飛ばして、トロッコにぶつければ、トロッコは止まって5人の命は助かる。
もちろん、突き飛ばした男は死んでしまう。

男を突き飛ばすのは、正しい行動か?

一人を犠牲にして、5人を助けるという行為には変わらないが…

ケース2

途中経過

Loading ... Loading ...

よかったら、回答のご協力お願いします。

ちなみにケース2で突き飛ばす男性をチンパンジーに置き換えると、突き飛ばすと回答する方がほとんどのそうです。

僕だったら、ケース1では進路を切り替えるけど、やはりケース2で男性を突き飛ばすことはできないかなあ。

ただし、正しいか間違えているかと問われれば、正しいと答えます。
矛盾してるようですが、理屈では正しい。でも、感情では拒否するということです。

やる気が出ない・集中したいときは環境を変えてみる

本から知識を身につけるには?

根性論や精神論が大嫌い。
今日の記事は、そんなグータラお芋が自分を正当化するための記事です。

連休前の記事で三連休はスキルアップに当てます、なんて書いたけど。
まあ、やる気が出ないことw

神経学の本は2冊読み終えたけど、内容はほとんど頭に入ってないなあ。
本って読んだだけでは、知識は身につかないですからね。

本を読んで得た知識をアウトプットすることで、初めて身についていく。
だから、学んだことをブログで書いたり、人に話したりするのはとても効果的なようです。

でも、記事にするのって面倒くさいんだよぉ~
こんな怠け芋がどうやったら、集中して作業できるようになるんでしょうか?

やる気・気合いは万能ではない?

こんなこと書いてると、甘ったれるな!気合いが足りないとか言われそうだけど…

やる気とか気合いって、万能じゃないですからね。
意思の力で何とかできるほど人間は強くない!

それよりも、何かを成し遂げたいときには環境や刺激をコントロールするのが、簡単かつ効果的なようです。

たとえば、アルコール依存症の方にお酒を止めさせるのは、病院に入れるのが一番です。

どんなに強い決意を持ったとしても、近くにお酒がおいてあったり、いつでもお酒が飲める環境で断酒をするのは難しいです。

同様に、魅惑的な遊具がある場所で、勉強や仕事を集中してやれったって、そりゃ無理な話ですよ。

ってなわけで、セミナーをいくつか申し込みました。
やる気が出ないんだったら、やらざる得ない状況に身を置くしかないですからね。

そういった意味では、カフェや図書館で勉強するほうが、自宅でするよりもはかどるという理論に納得。
気分転換にもなりますしね。

私たちのような自由業は、自己規律を守るのが大変です。
怠けようと思ったら、いくらでも怠けれちゃうから。

まあ、やり始めちゃえば自然にやる気って湧いてくるもんだから、嫌々ながらでもデスクに向かいましょう。

以上、気分転換のための記事でした。
さあ、働こう…

母平均の区間推定

母平均と標本平均

■母平均
母集団から得られた平均の値

■標本平均
標本から得られた平均の値

他にも、母集団から得られた分散、標準偏差はそれぞれ母分散、母標準偏差。
標本から得られた分散、標準偏差はそれぞれ標本分散、標本標準偏差とよびます。

さて、昨日の記事でも説明したように、調査対象のすべてのデータを母集団。
母集団から抽出された一部のデータを標本といいます。

母集団のすべてのデータを集められればいいのですが、それはコストや手間を考えると現実的ではない。
なので、アンケートなどによってサンプル(標本)を集め、全体(母集団)を推測する、というような話を書いたと思います。

年齢のアンケート調査

具体例を用いてみます。

例えば、このブログ芋ほり日記を読んでくださっている方の平均年齢を知りたいとします。

そのために必要なものは、母集団が何人いるのか?と母集団すべての年齢です。

母集団が何人いるのかは、アクセス解析をすればおおよその見当はつきますが、正確な人数まではわかりません。
ましてや、読んでくださっている方すべての年齢を知ることは不可能でしょう。

まっ、平均30~40歳くらいだと思いますけど^^;

そこで、アンケートフォームなどを設置して、年齢を聞くアンケート調査を行ったとしましょう。
その結果、10人からの回答が得られたとします。

あっ、蛇足かもしれませんが、標本を集めるときに注意するのは、なるべく無作為(ランダム)にデータを集めるようにしなければならないという点です。
そうでないと偏ったデータが集まってしまうからです。

さて、得られた回答が以下のようなものだったとしましょう。

20150108

標本平均は35なので、このブログを読んでくれている方の平均年齢を35歳と推定、していいのでしょうか?

標本数が多ければ多いほど、母平均に近い標本平均が出る確率は高まりますが、10人程度の標本数ではどのくらいの信頼度があるのでしょう。

標本数が少ない場合、t分布を用いて区間推定を行う方法がありますが、今日はt分布を使わないで区間推定をしてみます。

95%の確率で取りうる区間を推定する

先述の通り、標本数が多ければ多いほど、標本平均は母平均に近づきますが、ズバリここだ!というように一点で当てることは難しいです。
なので、統計学では区間で推定します。

そのために大事なのが、母集団の分布がどんな形であれ、標本平均の分布は正規分布するという特徴です。
ここでも標本数が多ければ多いほど、正規分布の形に近づいていきます。

この特徴を利用して、母平均の区間を推定するのです。
長くなってきたので、結論を書いていくと…

正規分布の場合、±1.96σの範囲に95%の確率で収まります。
よって、母平均の区間を95%の確率で推定する式は、以下のようになります。

母平均―1.96×(√不偏分散÷√標本数)<=標本平均<=母平均+1.96×(√不偏分散÷√標本数)

手じゃとても無理なので、先ほどのアンケート結果の値を代入して、Excelで計算してみましょう。
使う関数はAVEREGE、SQRT、STDEVです。

2015010802

上記の計算結果から、芋ほり日記を読んでくれている方の平均年齢(母平均)は、95%の確率で33~37歳である、と推定します。
※架空のアンケート結果です。

この推定が合ってるかどうか、回答が得られるかどうかはわかりませんが、いちおうアンケートフォームを設置しておきます。

あなたの年齢を教えてください

途中経過

Loading ... Loading ...

トレード結果

今日は、日経は大幅反発したようですね。
まだ結果は見てないけど、見るのが怖いなあ…

貯金があるから少し心に余裕があるとはいえ、大きく喰らいたくはない。
というか、いつ何時でもマイナスは嫌だ。

10年トレードやってるけど、納得の負けなんて一度もありませんよw

願望込みの推定収支は+12000~42000円。
どうかこの範囲に収まりますように。上ブレはもちろん大歓迎です。

今日の収支 ▼3550円

残念ながら、マイナスでした。
愚痴をたらたら書きたかったけど、データの更新が上手くできません。

仕様が変わっちゃったのかな?
急いで対処しないと。