プレーンテキストファイルで「複式」家計簿(6)

グラフを描いてみました

シリーズの(1)で家計簿には 可視化 の必要性は大きくないと書きましたが、そうは言っても、Ledgerでできないわけではありません。そこで今回はとりあえずシンプルな図を描いてみました。

4月以降からのクルマに関係する経費(いわゆる「車両費」)の月ごとの推移を 積み上げ棒グラフ の例図にしたものです。3月は一部だけデータがあったので、それもプロットしています。

図1:  Ledgerとgnuplotを組み合わせてプロットした例図

図1: Ledgerとgnuplotを組み合わせてプロットした例図

こうして図にしてみると、4月は 夏タイヤ 4本を新調したために整備修理費がかさんで突出したこと、5月は 自動車税 の納税のため、7月は バッテリー交換 という想定外の支出があったなどということが一目でわかります。細かく数字的に帳合をとったりするのは図の守備範囲外でしょうが、全体的な動向をえいっやと認識するには便利です。

もともとLedgerの出力するレポートはgnuplotとの 相性 が良好です。大きなストレスを感じることなく作業をすすめることができますが、ちょっとしたコツをあげると:

  1. Ledgerの -j/J オプションをうまく使いわけること
  2. マルチコモディ、つまり円やドルが混在していたり、あるいはガソリンの給油量(L)と価格とが混在していたりしているとやっかいです。 -X JPY オプションを使いましょう
  3. たいがいY軸の数値は金額になります。数値の3桁ごとにカンマがある方が見やすいです

Ledgerとgnuplotを組み合わせて図を描くと見てくれも悪くはないので、いくつかのレポートはすぐに可視化できるようにテンプレートを用意しておこうかと思っています。今回はまずは「予告編」です。もう少し役に立つ図の例は後日ということで・・・

株の売買について

さて今回は株に焦点をあててまとめます。

同一銘柄株を一括して全量売買する場合

これはもっともシンプルな株の売買様態です。

これについては、Ledger3の公式マニュアル(4.5.2節)に提示されている事例がわかりやすいので紹介します。マニュアルではアップル社の株(AAPL)を題材にして、

  • 2004年5月に、1株30ドルで50株購入し
  • 2005年8月に、1株50ドルで50株全株を売却した

という場合のトランザクションの書き方を例示しています:

2004/05/01 Stock purchase
    Assets:Broker                     50 AAPL @ $30.00ファイル
    Expenses:Broker:Commissions        $19.95
    Assets:Broker                  $-1,519.95

2005/08/01 Stock sale
    Assets:Broker                    -50 AAPL {$30.00} [2004/05/01] @ $50.00
    Expenses:Broker:Commissions        $19.95
    Income:Capital Gains           $-1,000.00
    Assets:Broker                   $2,480.05

こうしておいて、balレポートを見ると次のとおりです:

$ led bal
	     $960.10  Assets:Broker
	      $39.90  Expenses:Broker:Commissions
	  $-1,000.00  Income:Capital Gains
--------------------
		   0

このような全量の一括売買は転記も簡単で、計算結果もほとんど問題はありません。しかし次のような、やや複雑な事例になると結構面倒なことが起こります。

同一銘柄株の一部を売買する場合

Google groupへのPranesh Prakashさんの投稿記事(2019/07/03)の一部を紹介します。次のようなケースを事例としています。

  • 期首バランス時にAAPL(アップル株)を2株保有している
  • その時点での1株は500ドル
  • 02/01で、値上がりして540ドルになった
  • 02/02に、1株だけ540ドルで売却、残りは1株
  • 02/10に、490ドルに下がった株を1株追加購入
  • 03/01に、525ドルに値上がりした

それぞれのトランザクションの書き方は次のようになります:

2018/12/31 Opening Balances
    Assets:Stocks                             2 AAPL @ $500.00
    Equity:Opening Balances

P 2019/02/01 AAPL $540.00

;2019/02/02 Broker
2019/02/02 Sell share
    Assets:Stocks                            -1 AAPL @ $500.00
    Income:Capital Gains                     $-40.00; 540-500
    Assets:Checking                          $540.00

P 2019/02/10 AAPL $490.00

;2019/02/10 Broker
2019/02/10 Buy share
    Assets:Stocks                             1 AAPL @ $490.00
    Assets:Checking                         $-490.00

P 2019/03/01 AAPL $525.00

こうしておいてbalレポートを見ると:

$ led bal -X '$'
	    $1100.00  Assets
	      $50.00    Checking
	    $1050.00    Stocks
	   $-1000.00  Equity:Opening Balances
	     $-40.00  Income:Capital Gains
--------------------
	      $60.00

ちゃんと 含み損益 も正しくレポートされています。

この場合には490ドルで購入した株が03/01には525ドルに値上がりしています。しかし売買は完了していませんので、いわゆる含み損益を抱えている事例となります。 Ledgerでは、 --unrealized オプションを使えば、 未実現 の含み益(=評価益)、含み損(=評価損)が計算できるということになります:

$ led bal  -X '$' --unrealized
	    $1100.00  Assets
	      $50.00    Checking
	    $1050.00    Stocks
	   $-1060.00  Equity
	   $-1000.00    Opening Balances
	     $-70.00    Unrealized Gains
	      $10.00    Unrealized Losses
	     $-40.00  Income:Capital Gains
--------------------
		   0

評価益と評価損がbalレポートに表示されています。

これを公式マニュアルの方式、つまり {},@ を使ってでやろうとすると、場合によっては?うまく計算があわなくなることがあるようです。ここで例示されたPrakashさんの方法ならばだいじょうぶのようです。

株価現在値の取得

~/.prices.dbファイル

~/.prices.db ファイルはシリーズ(5)でも紹介しました。そこでは円ドルなどの為替レートを保存しておくときに使いましたが、株価のデータ保存にも使います。中身はたとえば次のようになります:

   :
P 2019/07/19 09:23:06 USD JPY 107.4005
P 2019/07/19 14:03:43 JT JPY 2,4510
P 2019/07/19 14:03:43 キャノン JPY 3,092
   :

上の例ではJI(日本たばこ)とキャノンの現在株価がリストされています。 Ledgerに対して、このDBを使って評価益とか評価損を計算するように指示できます。

株価の取得方法

日本株に対してLedgerの持つこの機能を使うには、どこからか銘柄の 現在株価 を取得しなければなりません。少数の銘柄ならば、Webページを閲覧して手入力することもできます。しかしそれはいかにも原始的。

スクリプトを書いて自動的に取得するようにすべきだと思いますが、ファイナンス関係のサイトの中には(たとえばYahooファイナンスなど)、Webページからの スクレーピング を禁止しているところもあります。明示的に禁止はしていないものの、ページを表示して閲覧する以外の方法でWebページにアクセスすると、それをブロックするようにしているサイトもあります。

スクレーピングを禁止またはブロックする理由は次の2つだと思います。

  • 株価データの「著作権」の問題
  • スクレーピングによるアクセスが多発するとサイトのサーバの負荷が大きくなるという問題

この問題については、法律家による良い紹介サイトがあります(TOP COURTITに強い弁護士 中野秀俊 など)ので、それに譲ることにします。

ところで海外には、会社の株価はさまざまな方法で半自動的に取得が可能になっているところがあります。しかし、残念ながらそこには日本の会社のデータはほとんどありません。

結局のところ・・・

いろいろ調査した結果、自分自身では何とか特定の企業株の現在値を取得することができています。自分で使用する限りにおいては、スクレーピングに関する法律には触れませんが、しかしその方法を不特定多数の方に向けて公開するのは、(たいした技術ではないのですが)いささかリスキーだと思いますので、ここでは公開しません。あしからず・・・ 興味のある方はプライベートにコンタクトしてください。

各種レポート

さて ~/.prices.db は、株売買でどのように使われるのでしょうか。いま仮に次のようなトランザクションがあったとしましょう:

05/01  purchase stocks
    Assets:Brokerage            100 丸全運 @ 3000.00 JPY
    Expenses:Brokerage:手数料       450 JPY
    Assets:Brokerage

これに対して、次のようにいろいろなレポート表示を指示することができます。

コモディティ総額のレポート

--quantity, -O オプション(ディフォールト)を使うと次のようになります:

$ led bal -O
	 -300450 JPY
	  100 丸全運  Assets:Brokerage
	     450 JPY  Expenses:Brokerage:手数料
--------------------
	 -300000 JPY
	  100 丸全運

つまりコモディティのトータルがバランス表示されます。

コストのレポート

--basis, -B オプションは、全ポスティングのコストcost basisをレポートします:

$ led bal -B
	    -450 JPY  Assets:Brokerage
	     450 JPY  Expenses:Brokerage:手数料
--------------------
		   0

株価の最新情報(データベース的に)に基づく計算結果をレポートする

--market, -V オプションで以下の表示になります:

$ led bal -V
	   42050 JPY  Assets:Brokerage
	     450 JPY  Expenses:Brokerage:手数料
--------------------
	   42500 JP

キャピタル・ゲインのレポート

--gain -G オプションを使うと、3,000円で購入した丸全運の100株が、本日の株価でいくとどれほどのゲインになっているか(だけ)をみることができます:

$ led bal -G
	  42,500 JPY  Assets:Brokerage

-V とちがって手数料などは計算されません。純粋に株によるP&Lのみが表示されることになります。

Acknowledgement