投資信託の評価損益を「見える化」する

投資とLedger-cli

Ledger-cli の広範囲な使われ方の中で、 経理・会計 分野はもちろんメインの領域ですが、その他に 時間マネージメント在庫管理 などにも広く活用されています。

メインの領域の中でもLedgerを個人や小規模な団体の 投資 モニターに使うのはいわば 王道 の一つです。投資管理のために有効な機能が豊富に備わっています。

すでに「プレーンテキストファイルで「複式」家計簿(6)」で 株式 についてLedgerの基本的な機能を紹介しました。ここでは投資信託を例にとって投資の可視化例をお話します。

投資信託の「評価損益」の可視化

日々の「 基準価額 」は投資信託を提供している会社のホームページで公開されています。しかし「 評価損益 」 とくにその推移の可視化は個々人にまかされているというのが一般的かもしれません(注1)。

株式でも投資信託でも、評価損益の計算そのものはとても簡単。使う計算は 加減乗除 算だけなので、ユーザレベルで自分で使いやすく「見える化」するのはさほど難しいことではありません

投資信託を購入したときの基準価額( 簿価単価 )と本日の基準価額の差を求めて、保有している「 口数 」をかけ算すれば当日の評価損益になります(注2)。

ひとつ例を上げましょう。

いま 架空の投信 を3種(AAA投信, BBB投信, CCC投信)保有しているとします。評価損益の推移は図1のようにプロットできます。

図1:  期間を1ヶ月に指定した場合の投資信託評価損益の推移。赤いラインは3投資信託の合計損益(架空の損益プロットです)。

図1: 期間を1ヶ月に指定した場合の投資信託評価損益の推移。赤いラインは3投資信託の合計損益(架空の損益プロットです)。

1では期間幅(=X軸)を1ヶ月にしていますが、起動時のオプションでweekly, monthly, 3months, 6months, yearly の中から一つを選択できるようにしてあります。3ヶ月分のデータをプロットするときのスクリプトの起動方法は次のとおりです3

$ time pnl-it-plotter 3
real    0m0.206s
user    0m0.156s
sys     0m0.069s

上の例では time コマンドを使って起動から図が表示されるまでの所要時間も表示しています(注4)。コードの要点は下記 に紹介しました。

日々の基準価額をどうやって取得するか

株価の終値もそうですが投資信託の基準価額も毎日きちんと取得するにはそれなりの工夫が必要です。

一番原始的で簡単なのは、夕方に信託会社のホームページを開いて当日の価額を 書きとめる 方法です。保有する投資信託の本数が少数の場合には、この方法でもなんとかなります。しかし「片手」近い数になると「目で見て手で入力する」方法はミスも起こるし現実的ではありません。

最も確実な方法は、 cron で定時的に curl を使ってホームページから価額データベースに収納していく方法です。これも技術的な難易度は高くはありません。しかしその方法を公けにするのははばかられます。信託会社の顧客であっても、そのホームページから価額をスクレーピングすることが法律的に許容されるかどうか、ちょっと微妙な点がわが国(=情報化における 極東のガラパゴス )にはあります。

Ledgerの出番

さて実はここまでのプロセスにはLedgerの出番はありません。Ledgerが提供する .prices.db というコモディティの 価格データベース を使っているだけです。

しかし、いったんこの価格データベースに日々の価額や株価が収納されれば、Ledgerはそれを使って評価損益(ゲイン)やマーケット価格、元本などの情報を計算してくれます。評価損益などの 具体的な金額 をコマンドラインから 瞬時にほしい 、そんな時にLedgerの本領とパワーが発揮されます。

ちょっとしたコツ

トランザクション内で投資信託をどう転記するかによって、コマンドラインから投資信託の現状を把握する際の クエリ (検索・抽出コマンド)の方法が決まります。

Ledger内で投資信託の 名称 をハンドリングする方法は基本的には次の3つです。

  1. 投資信託名を アカウント にする
  2. 投資信託名を コモディティ にする
  3. 投資信託名を タグの値(value) にする

汎用性があって使いやすく、多くのユーザが採用しているのは上の2)と3)を合わせた次のような方法です。

購入時の転記のしかた

ABC信託会社から 「AAA信託」を単価12,500円で40口、
合計金額=500,000円で購入した。手数料は0円。

これを転記するには次のようにします。

2020/01/10 ABC信託会社
    ; fund: AAA信託
    Expenses:Trusts:cmsn                      0 JPY
    Assets:Trusts            40 AAA信託 @ 12,500 JPY
    Assets:abcBank                      -500,000 JPY

2行目で fund というタグに AAA信託 という値(value)を与えています。これは必須ではありませんがあとで検索のときに使います。

4行目で AAA信託コモディティ (まるで 通貨単位commodity )のように使われています。 Ledgerのコモディティはとても広い概念です(注5)。この場合には 40 AAA信託 という形で資産を表現します。 @ マークは単価を、 @@ マークは合計金額を意味します。

評価損益のクエリ

評価損益(ゲインまたはPNL)を得たいときには次のようにします:

$ ledger bal ^assets and trust --gain --account=commodity
	 -72,029 JPY  AAA投信:Assets:Trusts
	  14,163 JPY  BBB投信:Assets:Trusts
	  43,862 JPY  CCC投信:Assets:Trusts
--------------------
	 -14,005 JPY

このコマンドラインクエリは短縮形にすると
$ led b ^assets and trust -G -a commodity になります。

投信の中から一つだけ抽出して評価損益を得たいときにはさっきの「タグと値(value)」を使います。

$ ledger bal  ^assets and trust and %fund=CCC --account=commodity --gain
	 43,862 JPY  CCC投信:Assets:Trusts

%fund=CCCfund というタグで、かつ CCC という文字列を持つ値(value)が抽出されます。どうしてもタグを使うのがいやな人は次のように --limit= を使えばタグ無しでのクエリが可能です。

$ ledger bal trust --limit="commodity =~ /CCC/"  --gain

売却時の転記のしかた

「保有していたAAA信託の半分=20口だけ売却(単価18,000円で)した」ときの転記は次のとおりです。

2021/04/10 ABC信託会社
    ; fund: AAA信託
    Expenses:Trusts:cmsn                   1,300 JPY
    Assets:Trusts           -20 AAA信託 @ 18,000 JPY
    Assets:abcBank                       358,700 JPY

Appendix: コードの要点

bashスクリプトとgnuplotのリテラシーを持っている方なら図1を見ただけですぐに書けると思いますが、自分への備忘もかねて要点だけ記しておきます。

bashパート

bashパートでは、投資信託名および簿記単価、口数を「 3次元配列 」っぽく(注6)データ化しておきます(数値は乱数です)。

fund_list=(
	"AAA 12090 111.9427"
	"BBB 11439 104.8205"
	"CCC 30125 28.5414"
	"DDD 13392 122.4732"
	"EEE 15298 130.9514"
)

当日の価額は .prices.db から読み込みます。これで評価損益を算出します。投資信託の数が増えても(減っても)配列定義のパートだけを変更するだけで対応できます。

X軸の期間は入力された期間のキーワード(w,m,3,6)を case文 で仕分けます。

gnuplotパート

gnuplotのX軸関係のパラメータは全部変数化しておいてbashから引き継いでいます。

# 時間軸の設定
  set xdata time
  set timefmt "%Y%m%d"
  set format x "${x_format}"
# xticsの設定
  unset mxtic
  set xtics format "${x_format}"
  set xtics "${xtics1}", ${xtics2}, "${xtics3}"
  set xtics  font "Arial, 10"
# X軸の設定
  set xrange ["${xrange1}":"${xrange3}"]
  set xlabel '${xlabel}' font "Arial,12"

これ以外のパートは単純な折れ線グラフを描くgnuplotスクリプトです。

各折れ線グラフの最終ポイントにだけ価格をラベルとして印字するところは次のように 三項演算子 を使っています:

  :
  '' using 1:((column(1)==${latest_date}) ? column(2): 1/0):(sprintf("%'d", column(2))) \
	 w labels font "Arial, 8" offset 0., +0.7 textcolor rgb "dark-green" notitle,\
  :

以前にも紹介しましたが、 "%'d" は数値に3桁ごとにカンマを入れるフォーマットです。

Acknowledgements:

更新履歴

2021/04/16
新規投稿日
2021/10/17
pnl-it-plotter のオプションに yearly を追加

Footnotes:


  1. 会社によっては、それも可視化して提供しているところもあるかも。 ↩︎

  2. 厳密には 有効数字 の問題があって、単純に 価額x口数 では正確な評価損益を得ることはできませんが、そのあたりになると話が細かいので今回は省略します。 ↩︎

  3. pnl-it-plotter の起動オプションは [m]onthly, [3]months, [6]months, [yearly]。先頭1文字だけの指定も可です。 ↩︎

  4. bashでコマンド、スクリプトの実行時間測定をしています。実際には、スクリプトはこの図を書くだけではなくて、基準価額のデータベースを更新したり、USBやクラウドにデータをバックアップしたりするなどの処理もしていますので200msecほどかかっています。 ↩︎

  5. 詳しくは上のLedgerマニュアルを参照してください。 ↩︎

  6. Bashスクリプトは公式には配列には対応していませんが「 配列もどき 」の使い方はできます。😄 ↩︎