rukbatの世界分散投資

30代後半のサラリーマンが国際分散投資で早期退職を目論むブログです。

Google Spreadsheetで資産管理 国内株式・投資信託編1

前回紹介した通り、米国株式・ETFは、googlefinance関数を使えば簡単に価格を取得できます。
rukbat.hateblo.jp
しかし、googlefinance関数は、日本の株式や投資信託の価格を取得することはできません。
日本に住んで、日本の証券会社を使っていると、ほとんどの方が日本の株式や投資信託保有していると思いますので、googlefinance関数だけでは満足できないと思います。
そこで、日本の株式や投資信託の価格を取得する方法を紹介します。

ウェブ・スクレイピング

皆さんは、株価や基準価額を調べたいとき、どうするでしょうか?普通、証券会社や運用会社のサイト、Yahoo!ファイナンス等のポータルサイトなんかにアクセスして調べると思います。この、「サイトにアクセスして必要な情報を調べる」という作業をコンピュータにやらせようという技術がウェブ・スクレイピングです。

実際のやり方は、Google Spreadsheetの任意のセルに、以下のように入力します。

=importxml(URL,XPath)

URLはデータを取得するページのURL、XPathXML Path Languageというもので、ページの中でのデータの住所みたいなものです。
例えば、たわらノーロード先進国株式の基準価額を取得したい場合は、次のような式になります。

=importxml("http://www.diam.co.jp/fund/list/313125/","//span[@class=""large current""]")

第1引数はたわらノーロード先進国株式のWebページのURL、第2引数は基準価額の位置を示すXPathです。(large currentをダブルクオーテーション(")2つで囲っていますが、Google Spreadsheetの制限によるもので、XPathとしては、"large current"というようにダブルクオーテーション1つで囲んでいるだけです。)Webページのソースで基準価額を表示している部分を見ると以下のようになっています。
(ソースの中でその日の基準価額を検索すると簡単に見つけられます。検索に引っかからない場合は、後述の「スクレイピングできないページ」の可能性が高いです。)

<div class="current_price_table">

<div class="table">
  <dl>
   <dt>基準価額(円)</dt>
    <dd class="cell">
     <div class="down">
      <span class="large current">11,192</span><br />
      (前日比<span class="before" style="color: green;" >
-62</span></div>
    </dd>
   </dl>
   <dl>
    <dt>純資産総額(百万円)</dt>
    <dd class="cell">9,652</dd>
   </dl>
   <dl>
    <dt>直近の分配金(円)</dt>
    <dd class="cell"><span class="large">0</span> <br />第1期 2016/10/12</dd>
   </dl>
   <dl>
    <dt>基準日</dt>
    <dd class="cell">2017/06/05</dd>
   </dl>
  </div><!--//.table-->
 </div><!--//.current_price_table-->

(平成29年6月5日、たわら先進国株式のページよりソースを引用、インデントを調整した。)
ここで、基準価額が表示されている行を見ると、というタグに11,192という基準価額が囲まれています。importxml関数に与えたXPathである//span[@class="large current"]は、「ドキュメントのどこかにあるclass="large current"というオプションが付いたspanタグ」という意味で、まさにこのspanタグをあらわしています。最初の//が「ドキュメントの中のどこか」、span[@class="large current"]が「class="large current"オプションが付いたspanタグ」という意味です。
基準価額のXPathは他にも、//div[@class="down"]/span[1]
とも書けます。こちらは、「ドキュメントのどこかにあるclass="down"オプションが付いたdivタグの中の1つ目のspanタグ」という意味です。
要は、ソースの中から基準価額が書いてあるところを見つけ、それを含むオプションが付いたタグを指定すれば良いだけです。慣れると簡単ですので、一度、やってみて下さい。

URLとXPathの設定値

私が保有しているファンドに設定するURLとXPathの組み合わせを紹介します。同じファンドを所有されている方はもちろん、同じ運用会社のファンドでも、URLさえ変えれば価格と前日比を取得できると思います。実際、たわらノーロード先進国株式とたわらノーロード先進国債券のXPathは同じです。他の運用会社のファンドについても、ソースを読めばさほど難しくありませんので、一度、チャレンジしてみてください。どうしてもわからない場合は、コメントで基準価額を表示しているページのURLを教えてくだされば、可能な限り対応します。

銘柄URLXPath
価格前日比
三菱UFJ DC海外株式インデックスファンドhttp://www.am.mufg.jp/fund/260172.html//td[@class="cell_numeral cell_valstyle"]//td[@class="cell_numeral cell_valstyle"]/span[1]
たわらノーロード 先進国株式http://www.diam.co.jp/fund/list/313125///span[@class="large current"]//span[@class="before"]
たわらノーロード 先進国債http://www.diam.co.jp/fund/list/313126///span[@class="large current"]//span[@class="before"]
EXE-i 新興国株式ファンドhttp://apl.morningstar.co.jp/webasp/sbiam2/exe-i/fund/fd02_iframe.html//table[@class="table01"]/tr[2]/td[1]/span//table[@class="table01"]/tr[2]/td[2]/span
iシェアーズ TOPIX ETFhttps://www.blackrock.com/jp/individual/ja/products/279438///*[@id="subTabMultipleListingPrice"]/div/div/ul/li[1]/span[2]//*[@id="subTabMultipleListingPrice"]/div/div/ul/li[2]/span[2]
iシェアーズ TOPIX ETFのページ構成が変更されたため、XPathを修正しました。(平成29年8月2日)
iシェアーズ TOPIX ETFのページ構成が再度変更されたため、XPathを更新しました。(平成29年8月6日)

スクレイピングできないページ

わたしは上記のファンドの他に、ひふみプラスとニッセイ国内債券インデックスファンドを保有していますが、これらのファンドはこの方法では基準価額を取得できませんでした。実際に、ひふみプラスのページのソースを見ると、以下のようになっています。

<table class="rhs-table rhs-table--row-header">
 <colgroup class="rhs-colgroup">
  <col class="rhs-width-33" />
  <col class="rhs-width-33" />
  <col class="rhs-width-33" />
 </colgroup>
 <tr>
  <th class="rhs-table__header">基準価額(1万口当たり)</th>
  <th class="rhs-table__header">前日比</th>
  <th class="rhs-table__header">純資産総額</th>
 </tr>
 <tr>
  <td class="rhs-table__data"><span class="js-rhs-rate__price"></span></td>
  <td class="rhs-table__data"><span class="js-rhs-rate__zenjituhi"></span>円(<span class="js-rhs-rate__rate"></span></td>
  <td class="rhs-table__data"><span class="js-rhs-rate__aum"></span>百万円 </td>
 </tr>
</table>

(平成29年6月5日、ひふみプラスのページよりソースを引用、インデントを調整した。)
ブラウザの表示とtableタグを見比べると、span class="js-rhs-rage__price"の後に基準価額が入っていそうですが、なにも書かれていません。それは、このWebページはJavaScriptという技術で基準価額を後から書き込んでいるからです。このような場合の対処法は、次回に紹介したいと思います。

注意

ここまで読んで少し考えると、Yahoo!ファイナンスのようなポータルサイトを使えば、どの銘柄でもページの構成が同じでurlが違うだけなので、xpathが共通でurlだけ変えればすべての銘柄に対応できることに気付くと思います。
しかし、Yahoo!ファイナンスからスクレイピングしないで下さい。
それは、Yahoo!ファイナンススクレイピングを禁止しているからです。
Yahoo!ファイナンスヘルプ

そもそも、Yahoo!ファイナンスはWebページを見る人が広告を見たりクリックすることで収益を得ていますが、スクレイピングのように広告を表示しない方法でデータだけ取られると、収益を得られません。このことも、スクレイピングを禁止する要因だと思います。一方、上で紹介した方法は、運用会社から情報を得ています。これらの会社は、投資家が投資信託等を保有することで収益を得ており、Webページはそのための情報提供の手段に過ぎません。このため、運用会社にとっては投資家がブラウザでデータを得ようが、Google Spreadsheetで情報を得ようが関係有りません。このため、スクレイピングを禁止する必要性が低いと言えます。このような理由で、投資信託の基準価額が欲しい場合、運用会社のWebページからスクレイピングするのが適切だと考えます。

追記

表が見づらいので、csvを用意しました。
xpath.csv - Google ドライブ