うぇぶすくれいぴん

毎週末,保有株と購入候補株の値段を調べ,Excel表を更新しています.そのExcelでは,値動きや利回りに応じて「売るべし」「買うべし」が表示されるようにしています.これで,気分に左右されることなく,比較的普遍的な評価基準で,何も考えずに判断できる仕組みになっています.

毎週末の作業は,銘柄コードをYahoo!ファイナンスページへコピペし,直近1週間の日次情報をExcelへコピペするものです.現在は37銘柄を監視しており,このコピペ作業,意外と手間.株を始めた頃はこの作業もそれなりに楽しめていたのですが,そろそろ煩わしさが勝ってきました.なんとか楽したい.

ということで以前,それらしいWebAPIを軽く突けないかと,Webページを軽くハッキングしてみました.しかし,私のHTMLおよびJavaScript力では,乗り越えるに至らず,タイムアップでギブアップしました.

5月の大型連休を前に,少し時間が確保できたので,再挑戦.今度はアプローチを変え,Webサイトに表示されている株価をHTMLから抽出することにしました.いわゆる,Webスクレイピングです.これまでやったことないけど,これならやれるでしょう.やれました.ExcelのVBAで実現しました.

まずは,指定のWebページのHTMLの取得.「Microsoft XML, v6.0」というライブラリの参照を追加し,XMLHTTP60というクラスを使ったサンプルに倣いました.こんなに簡単にできちゃうんですね.

Private Function GetHtml(ByVal url As String) As String
    Dim httpReq As New XMLHTTP60
    Call httpReq.Open("GET", url)
    Call httpReq.send
    Do While httpReq.readyState < 4
        DoEvents
    Loop
    GetHtml = httpReq.responseText
End Function

次に,HTMLから株価の部分を抽出するコード.正規表現で頑張ればなんとかなりそう.「Microsoft VBScript Regular Expressions 5.5」というライブラリの参照を追加し,VBScript_RegExp_55.RegExpというクラスを使いました.正規表現自体,あまり使ったことないので,調べながらでした.これでいいかと思ったら,株価に桁区切りのカンマが入るケースがあったり,小数部が入るケースがあったりで,何度か修正.

Private Sub Extract(ByVal html As String)
    'HTMLに埋まっている株価の表の一部の例
    '{"openPrice":"3,015","highPrice":"3,039","lowPrice":"3,007","closePrice":"3,023","volume":"1,161,200","adjustedClosePrice":"3,023","baseDate":"2021年4月23日","baseDateIso":"2021-04-23T00:00:00+09:00"},
    '{"openPrice":"3,047","highPrice":"3,057","lowPrice":"3,001","closePrice":"3,036","volume":"1,478,500","adjustedClosePrice":"3,036","baseDate":"2021年4月22日","baseDateIso":"2021-04-22T00:00:00+09:00"},
    '{"openPrice":"3,032","highPrice":"3,034","lowPrice":"2,976","closePrice":"2,997","volume":"3,178,600","adjustedClosePrice":"2,997","baseDate":"2021年4月21日","baseDateIso":"2021-04-21T00:00:00+09:00"}

    Const PTN0  As String = """openPrice"":""(\d*,?\d+\.?\d*)"""
    Const PTN1  As String = """highPrice"":""(\d*,?\d+\.?\d*)"""
    Const PTN2  As String = """lowPrice"":""(\d*,?\d+\.?\d*)"""
    Const PTN3  As String = """closePrice"":""(\d*,?\d+\.?\d*)"""
    Const PTN4  As String = """volume"":""(\d*,?\d*,?\d+\.?\d*)"""
    Const PTN5  As String = """adjustedClosePrice"":""(\d*,?\d+\.?\d*)"""
    Const PTN6  As String = """baseDate"":""(\d{4}年\d?\d月\d?\d日)"""
    Const PTN7  As String = """baseDateIso"":""(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2})"""
    Dim regex   As New VBScript_RegExp_55.RegExp
    Dim matches As MatchCollection
    Dim m       As match

    regex.Pattern = "{" & PTN0 & "," & PTN1 & "," & PTN2 & "," & PTN3 & "," & PTN4 & "," & PTN5 & "," & PTN6 & "," & PTN7 & "}"
    regex.Global = True
    Set matches = regex.Execute(html)
    For Each m In matches
        Debug.Print "日付:" & m.SubMatches(6) & " 終値:" & m.SubMatches(3)
    Next
End Sub

これで要素技術は確保できたので,あとはExcelの表を良い感じに操作するだけです.銘柄コードからURL化するところはExcel上の数式にしちゃって,並べた銘柄分と取得した日数分だけループを回し,縦や横に配置する感じ.程よくエラー処理を入れたりして無事完成.毎週末の作業がだいぶ楽になりました.

今日観たアニメ(4378)

  • [B]スライム倒して300年、知らないうちにレベルMAXになってました「エルフが来た」(第3話 4/24深夜)

    魔を入れない結界を張っていたというのに,ベルゼブブはどうやって入ったのかと思ったら,そもそも結界を張った時点で中にいたってことね.ということは,結界は空間・領域的ではなく,膜・面状に展開されているのね.栄養ドリンクで瀕死になったという魔族に回復魔法は大丈夫なのか,心配するのはご尤も.まさか栄養ドリンクで瀕死になったのが誤報で,栄養ドリンクで働けちゃったから過労したのが真実とは.

  • [C]VIVY「Sing My Pleasure ~あなたを笑顔に」(第5話 4/24深夜)

    再び5年経過.初めてAIと結婚した人間が現れた感じ.ひっそり結婚式を挙げた廃教会のある小島,実はここが24時間稼働のAIによる工場のあるところなんじゃないかと.さて,今度は時代が追いつかないほどに発展したAIを止めるお仕事.正史からいろいろ変わっているというのに,マツモトの指令はどこまで信頼性あるのか.

  • [C]86「死にたくない」(第3話 4/24深夜)

    Aパートは86側.戦時中でも人は人,覘かれて困る状況ではなかったとはいえ,キャッキャウフフの茂みから狙うのはやめておけ.命縮むよ.BパートはAパートの会話の後半の都市側.同じ時間軸をあっち側とこっち側で描写するの,なんか好き.やっぱり安全なところで清廉潔白にしている奴と兵士とはまだまだ溝がありますか.

  • [C]シャドーハウス「すすによる病」(第3話 4/24深夜)

    偉い人の話を出しちゃいけないとか,他の班の仕事場まで気にしちゃいけないとか,端々に恐ろしさが潜んでいます.拷問用具のようなトゲトゲの就いたハンマー杖,掃除道具ってどういうこと? なるほど,暴走した煤塊を砕くのに使うのね.

  • [B]イジらないで,長瀞さん「またやりましょうね,センパイっ」「センパーイ,こっちこっち~」(第3話 4/24深夜)

    下校時に大雨に降られた二人.とりあえず公園の屋根のあるところで少し雨宿りしましょう,という会話をすぐそこの屋根のあるところでせい.近所の長瀞さんちで服を乾かして,ゲーム.ここぞとばかりにセンパイがギャフンさせる番だと思いきや,あの手この手で抑え込んでくる長瀞さんさすが.Bパート,混んでいる食堂で空席が見つからず,副題のとおり呼ばれた卓,JKに囲まれ可哀想.センパイに絡んでくる友人に不快感を示す長瀞さんってば.

  • [B]EDENS ZERO「冒険者たち」(第3話 4/24深夜)

    たしかに,思っていたギルドと違う.もっと家族感あるのを想像していました.の背後を通り過ぎるナツルーシィ.レベッカに突っかかってきた有名Bキューバー,気の強いウェンディですこと.視聴数を稼ぐためマザーを探すため宇宙船を入手するため博士に会うためやって来た岩降る星,地下に街が広がっているの,なんかわくわくします.

  • [C]バトルアスリーテス大運動会ReSTART!「それぞれの想い」(第3話 4/24深夜)

    合宿にやってきた5人.についてきたカンガルーは何なの.もしかして,他の惑星の代表選手だったりするのか.宇宙にはいろんな人種がいてもおかしくあるまい.だとして,どうせならそのうち言葉を話して,みんなとの女子会的なノリでやっていってほしいわ.

  • [C]美少年探偵団「きみだけに光りかがやく暗黒星 その3」(第3話 4/24深夜)

    美しくあること,少年であること,探偵であること,チームであること,で美少年探偵団.覚えやすい.透視までできちゃうとんでも視力のため,軍事衛星爆破の目撃者となっていたと.その目撃者を浚う雇われ人,なんかまた何度か出くわしそうな予感.団長が小五郎君と呼ばれている理由,小学5年生だからでしたか.

  • [C]アイカツプラネット!「パジャマ・パーティー・ナイト」(第16話 4/25朝)

    さすがに2クール目入ったので,実写パートに慣れてきました.にしても,アニメパートのおまけ感が少しずつ高まってきている気がします.実写のパジャマパーティとか萌えない.自宅にアイドル集合で胸いっぱいの兄ちゃんw.

  • [B]トロピカル~ジュ!プリキュア「メイクは魔法?映画でトロピカる!」(第9話 4/25朝)

    「最近は女優男優と分けずに俳優」と発言するみのりの配慮.あすかに合いそうな役と言われ,「癒し系じゃないキツい感じの役」かという台詞,言葉の選択難しいね.頭部だけの着ぐるみでも,晴天下では熱中症注意か.参ったさんごに対する「無鉄砲はまなつの担当」という台詞を華麗にスルーするまなつw.

  • [D]マジカパーティ「暴走!ワニスケと謎の魔法使い!」(第4話 4/25朝)

    マジンの名前から合成元を推定できそうでなかなかできません.ワニスケはワニとスケートボードか.ワニスケに操られていた謎の魔法使い,きっと態度怪しいケズルを追う中で目につけられたんでしょうね.

  • [C]デジモンアドベンチャー:「起動メタルガルルモン」(第45話 4/25朝)

    ガブモン,そんなに走りたがるキャラだったかしら.ミレニアモン復活を阻止しなきゃいけないのに,レースに興じる余裕あるんか.と思いましたが,そもそも阻止するためにやるべき具体的なタスクの落とし込みができていないので,気の向くままになっちゃうのやむなし.

  • [C]ONE PIECE「討ち入り!おでんと赤鞘九人男」(第971話 4/25朝)

    5年間毎週欠かさず裸踊りするも,約束は案の定,反故にされました.そんなことになると解っていたろうに.その間,光月家の評判は落ち,カイドウらは兵力を集め,泣きっ面に蜂.昔のワノ国話,そろそろクライマックス.気づくとすっかり麦わら海賊団,置いてけぼり.

  • [C]キラッとプリ☆チャン「ついに開幕!クイーンズ・グランプリだッチュ!」(第148話 4/25朝)

    グランプリ最初のステージはW Daia.こないだプリンセスに指名されたばかりで,本グランプリのステージ順の籤をマスコットだいあが引き,二人でステージという急展開.2番手はRing Marry.いきなりラビリィが感謝の手紙を読みだすサプライズ.3番手はMeltic StAr.これまたメルパンが手紙読むのかと思いきや,ライバルKirattsに特等席で観てもらうよう図るでした.

  • [C]ミュークルドリーミーみっくす!「ハッピーバースデイときわちゃん」(第3話 4/25朝)

    アンテナ風のものを頭部に取り付け,AIロボとして自由に動き回るユニ様.ぬいぐるみが動くのとさして変わらぬインパクトあると思うのですが.進級して級友と仲良くなった頃には誕生日過ぎてて祝ってもらえない4月生まれのサガ,なるほど.おめかしときわちゃん@ファイルーズあい萌え.

  • [C]BORUTO「繋ぐ力」(第196話 4/25夜)

    山中家のチャクラ監視網を突破して里へ侵入する果心居士.蛙を連れているってことは,仙術遣いってことかね.親子で組手修行,なんか幸せな雰囲気漂ってきます.これに感化され,サラダもパパに修行をつけてもらうってね.