GnuCashで日本の投資信託の基準価額を取得するPerlモジュールを書いた

GnuCashで日本の投資信託の基準価額を取得するPerlモジュールを書いた

一ヶ月以上前に作ったまま長いこと紹介せずに放置していたので、そろそろ公開しようと思う...

LiosK's Finance--Quote--YahooJapan at master - GitHub

A Perl module that enables GnuCash to get quotes of Japanese stocks and funds from Yahoo! JAPAN.

GNUプロジェクトの財務管理ソフトウェアであるGnuCashには、Web上のデータソースから株式や投資信託の価格を自動で取得する便利な機能がついています。

Features | GnuCash (投資ポートフォリオに関する機能を抜粋)

Stock/Mutual Fund Portfolios
Track stocks individually (one per account) or in portfolio of accounts (a group of accounts that can be displayed together).
Online Stock & Mutual Fund Quotes
Get Stock & Mutual Fund quotes from various web sites, update portfolio automatically. Additional pricing sources are added regularly.

この機能を使えばGnuCashで投資ポートフォリオを管理するのがだいぶ楽になるのですが、残念なことにデフォルトでは日本の株式や投資信託の価格を取得することができませんでした。おそらく、日本では株式等の価格をCSVのような再利用可能な形で簡単に手に入れることができないために、GnuCashの方で対応してもらえなかったのでしょう。金融後進国は不便ですね...

というわけで、Yahoo!ファイナンスの検索結果ページをスクレイプして、日本の株価や投資信託価格をGnuCashで取り込めるようにするPerlモジュールを作成したので、GitHubで公開しましたよ!というのがこの記事の本題です。使い方等の詳細は続きで。

概要

GnuCashの相場表自動取得機能は、Finance::QuoteっていうPerlモジュールを使って実装されています。Finance::Quoteに含まれるサブモジュールがWeb上のデータソースから情報を取得し、GnuCashが取り込める形式に変換して返すような仕組みになっています。Finance::Quoteにはあらかじめ複数のサブモジュールが含まれていて、各国のYahoo、証券会社、取引所などのWebサイトから相場情報を取得できるようになっていますが、日本の株式や投資信託の価格を取得できるサブモジュールは含まれていませんでした。

ということで、日本の株価や投資信託価格を取得できるように作ってみたサブモジュールが、冒頭で紹介したFinance::Quote::YahooJapanです。

相場情報はYahoo!ファイナンスの検索結果ページ (例1, 例2) をスクレイプして取得しています。従って、当然ながら取得された相場情報に関する権利はYahooに属しますし、Yahooの利用規約に従って相場情報を利用する必要があります。また、Finance::Quoteに含まれる他の多くのサブモジュールと違って、CSVやXMLを利用するのではなくHTMLをスクレイピングしているので、Yahoo側の仕様変更などに振り回されてしばしば使えなくなるということが予想されます。利用する場合はそこらへんを理解しておいてください。

使い方

1. Finance::Quoteのインストール

まずはGnuCashで相場表示自動取得機能を利用するためにFinance::Quoteをインストールします。GnuCashのヘルプにも詳しく書いてありますが、標準的なLinux環境であれば、ターミナルを立ち上げてGnuCashがインストールされているディレクトリに移動し、

./gnc-fq-update

と入力するだけで大丈夫なようです (未確認)。Windows環境であれば、Strawberry PerlOpenSSL (Win32版) をインストールして、

perl "C:\Program Files\gnucash\bin\gnc-fq-update"

とコマンドプロンプトから入力してあげるのが一番簡単かと思います。

GnuCash Help Manual (参考)

To install Finance::Quote;

  1. Close any GnuCash applications you have running.
  2. Locate the folder where GnuCash is installed by searching for “gnc-fq-update” (without the quotes).
  3. Change to that directory, open a root shell and run the command “gnc-fq-update” (without the quotation marks). This will launch a Perl CPAN update session that will go out onto the Internet and install the Finance::Quote module on your system. The gnc-fq-update program is interactive, however, with most systems you should be able to answer “no” to the first question: “Are you ready for manual configuration? [yes]” and the update will continue automatically from that point.

After installation is complete, you should run the “gnc-fq-dump” test program, in the same directory, distributed with GnuCash to test if Finance::Quote is installed and working properly.

2. Finance::Quote::YahooJapanのインストール

まず、Finance::Quote::YahooJapanレポジトリに含まれているYahooJapan.pmを、PerlモジュールディレクトリのFinance/Quoteディレクトリ直下に保存します。Windows環境のStrawberry Perlであれば、C:\strawberry\perl\site\lib\Finance\Quote\YahooJapan.pmに保存することになると思います。

続いて、Finance::Quoteの本体に少し手を加えるために、lib/Finance/Quote.pmを編集します。読み取り専用属性を解除したり (Windows)、適切な権限のユーザーで開いたり (Linux) しなければQuote.pmは編集できないかもしれません。

Finance::Quoteは、引数を与えずにインスタンス化すると、いくつかのデフォルトサブモジュールを自動的に読み込む仕様になっています。GnuCashでFinance::Quote::YahooJapanを使うためには、YahooJapanをデフォルトサブモジュールとして登録してあげなければいけません。

Quote.pmの中には、デフォルトサブモジュールのリストが含まれているので (Version 1.16では170行目付近)、↓のようにYahooJapanを追加します。

# Default modules
@modules = qw/AEX AIAHK ASEGR ASX BMONesbittBurns Bourso Cdnfundlibrary
        Currencies Deka DWS FTPortfolios Fidelity FinanceCanada Fool
        GoldMoney HEX
        IndiaMutual LeRevenu ManInvestments Morningstar NZX Platinum SEB
        StockHouseCanada TSP TSX Tdefunds Tdwaterhouse Tiaacref Troweprice
        Trustnet Union USFedBonds VWD ZA Cominvest Finanzpartner
        Yahoo::Asia Yahoo::Australia Yahoo::Brasil Yahoo::Europe Yahoo::NZ
        Yahoo::USA YahooJapan/; }

これでPerl側のセットアップは完了です。

3. GnuCash側のセットアップ

ここから先はGnuCashのヘルプを見ても進められます。っていうかそっちの方が詳しい...

GnuCashを起動したら、メニューバーの「ツール」→「証券エディタ」と進んで証券エディタを開き、「追加」ボタンもしくは「編集」ボタンを押して証券編集ダイアログを開きます。証券編集ダイアログを開いたら、↓の図のように値を入力していきます (例はSTAM 新興国株式インデックス・オープン)。

Editing Commodity / Screenshot / GnuCash

重要なのは赤枠でくくった4項目で、他は適当でも大丈夫です (たぶん)。

  • 「記号/略語」欄には株式・投信のコードを入力します。大文字小文字を区別するので、Yahoo!ファイナンスの検索結果ページに表示されるとおりに入力してください。株式の取引証券市場を表す「.t」などの接尾辞はつけないでください。
  • 「オンライン相場表を取得」チェックボックスをONにします。
  • 「相場情報源のタイプ」に「未知」を指定し、右のドロップダウンメニューで「yahoo_japan」を指定します。

「OK」ボタンを押して保存します。ちなみに、投資信託を扱う場合は「Fraction traded (取引の最小単位)」に「1/10000」を指定しておくのがおすすめだったりします。 (日本の投信は1万口を1単位として扱う機会が多いため)。

次に、メニューバーの「ツール」→「価格エディタ」とたどって価格エディタを開きます。

価格エディタを開いたら右下の「相場表を取得」ボタンを押します。ちょっと待った結果、↓の図のように最新の価格が取得できていれば成功です。これでGnuCashで日本の株式や投資信託の相場情報を自動取得できるようになりました。

Happy GnuCashing!

Price Editor / Screenshot / GnuCash

技術的ないくつかの補足 (と言い訳)

  • Finance::QuoteにはFinance::Quote::Yahoo::USAやFinance::Quote::Yahoo::Asiaなど、Finance::Quote::Yahoo::*という名前のサブモジュールがはじめからいくつか含まれていますが、あえてFinance::Quote::Yahoo::JapanではなくFinance::Quote::YahooJapanという名前にしたのは、Yahoo::*系のサブモジュールと大きくアルゴリズムが異なっているからです。Yahoo::*系のサブモジュールはFinance::Quote::Yahoo::Baseを使ってCSVからデータを取得しているだけですが、YahooJapanはHTMLをスクレイプしてデータを抽出しています。
  • スクレイピングのアルゴリズムは至っていい加減です。class=chartbgというキーワードを手がかりにtable要素を抽出して、タグをすべて半角スペースに変換した後に、半角スペースでsplitして各セルの値を取得しているだけです。
  • オブジェクト指向Perlはあまり経験がないので、お行儀のよい書き方がわかりません。直すべきところがあったら教えてください。とりあえず、_scrape_determine_dateの2つのサブルーチンは、プライベートメソッド的な思いで書きました。
  • 普段、投資信託の価格を取得するのにこのモジュールを使っていて、今のところ大きな問題はありませんが、あまりテストはされていません。バグ報告をしてくれたり、テストケースを作ってくれたりしたら感謝します。
  • 本当は、エラーチェックを充実させてちゃんとデータが取得できているかをチェックしようと思っていましたが、心が折れて挫折しました。「スクレイピングエンジンは変更が多くなるからシンプルな形にとどめておこう」と言い聞かせて放置しています。

トラックバックURL

http://liosk.blog103.fc2.com/tb.php/185-3e473426

0 件のトラックバック

3 件のコメント

はじめまして。北側研究室(別棟)のCharlieです。

ご紹介いただきましたPerlモジュールを試してみました。株・投資信託ともに問題なくGnuCashに価格を取り込めています。
ありがとうございました。

私がしてきたYahooの情報をcsvファイルに落とし・・・という方法は無用になりそうです。

私はMS Money2007を使っていましたが、9月で相場価格自動更新ができなくなります。
本格的にGnuCashへ移行を考えていただけに、ありがたかったです。
  • 2009-08-22
  • by Charlie
  • id:SFo5/nok
  • 編集
ご丁寧にありがとうございます。
バグ等ありましたらご連絡ください。
  • 2009-08-27
  • by LiosK
  • id:-
はじめまして。namaraと申します。

4つの銘柄の投信についてやってみましたが、ちゃんと価格を取り込むことが出来ました。

これは私の方の問題ですが、今まで取引入力のところで、株式を10000で割らずに価格のほうを10000で割っていたものですから、それを修正する必要がありましたが(一瞬ものすごい金持ちになりました)、それ以外はすぐに使えるようになりました。

私もMS Moneyからの乗換え組みです。大変助かります。
  • 2009-10-16
  • by namara
  • id:-

コメントの投稿

お名前
コメント
編集キー