雑記

Pythonで資産管理 ②ポートフォリオを記録する

投稿日:

前回の続きです。だいぶ時間が空いてしまいました。

今回は自身の銘柄の株価を取得して、資産の推移を記録するところまでをやってみます。

今回はかなり長文ですがお付き合いください。

ちなみに前回は以下の記事です。

スポンサーリンク




資産管理の考え方

Pythonでどのように資産の推移を記録していくかを概説します。

自身の総資産額を計算を式にすると以下のとおりとなります。

資産推移で最も厄介なのは個別銘柄の値動きです。これは毎日変化します。仮にエクセルで管理しようとなると毎日の値動きを記録しなければいけません。しかし、株価の値動きはPythonのライブラリを使えば比較的簡単に日別の値動きが取れます。

次に個別銘柄の保有株数があります。デイトレードのように毎日、複数回の取引をやるとそれだけでも記録が大変ですが、米国株のように月に数回の売り買いであればそれに伴って記録するだけで良いです。

最後に保有キャッシュです。基本的には個別株の売り買いでキャッシュポジションが変化します。また、配当を受け取った場合やドル転でキャッシュを追加した場合はここの値を更新する必要があります。

しかし、この総資産の管理だけでは、例えば毎月50万円ドル転した場合など、総資産は増え続けるけど株式のピュアな運用利回りはよくわからなくなる問題がおきます。

したがって、自身のポートフォリオのパフォーマンスを正しく把握するために、利回り計算用に集計するデータも用意しておきます。この利回り集計用データを定式化すると以下のようになります。

上記をまとめると、以下のように記録していけばPythonで資産を可視化でき流ようになるはずです。

  1. 毎日の値動きはPythonのライブラリで自動取得
  2. 個別銘柄を売り買いした場合のみ、保有銘柄数を記録する
  3. 保有銘柄の売り買いした場合のキャッシュの金額を記録する。また、ドル転や配当を受け取った場合など、キャッシュが増えた場合もつど記録する。

エクセルでセルを埋めていくというより、簿記の仕分けに近い考え方で、取引のたびにそれを記録していけばOKです。日々の値動きを記録せず、現金と保有銘柄数のみに着目するためエクセル管理よりは幾分楽かと思います。

データフレームの構造

Pythonでデータを処理する上で最も重要なのはデータを作るところです。データさえ作れればグラフにしようが統計解析しようが好きにできます。データはデータフレーム形式(つまり表形式)で集計します。

最終的な目標は以下のようなデータフレームを作ることを目標にpythonを弄っていきます。

青いセルの部分はライブラリを使って自動取得したり、他のでテータ項目からの計算で一発で取得できる部分です。黄色いセルの部分は簿記の仕分けのごとく取引のつど記録をしていく部分です。

Pythonでのポートフォリオ管理

1.保有銘柄の一括取得

pandas-datareaderを使います。あらかじめコマンドプロンプトから、以下のコマンドを流し、自PCにpandas-datareaderをインストールしておいてください。

「 pip3 install pandas-datareader 」

pandas-datareaderを使い、保有銘柄の株価を自動取得し、dfという名前のデータフレームに格納します。

 

 

なお、複数の株価データ取得は、以下の過去記事で詳しく扱っています。(該当は前半部分)

2.1.データフレームへ列追加

現在のデータフレームdfは保有銘柄の株価のみしか持っていないため、自身の銘柄別の資産額やキャッシュの金額を記録するための列を追加しておきます。

df["変数名"] = 0 で値がゼロの新しい列が追加できます。

2.2.ドル転キャッシュの記録

総資産の推移を管理するだけならドル転分のキャッシュを記録する必要はありませんが、運用利回りを求める際は元本の増減は計算上ノイズになりますので、あとで取り除けるようにドル転金額を別に記録しておくようにします。

プログラムの基本的な書き方ですが、データフレーム操作のpandasの文法を使って記述していきます。

以下のように書くと、dfというデータフレームのとある列の、とある行以降に数字を代入できます。

df["列名"].loc["行名":] = 代入したい数字

pandasでは.locで行名を指定できます。また、:は範囲を指定でき、:だけだとそれ以降という意味になっています。

今回は下図のように、ドル転記録用の列「addCash」に金額を記録してみます。

#なんか警告文が出ますが正しい結果は出てますので、基本的に気にしないで進めます。

2.3.保有銘柄の評価額を記録

次に、株の売買に合わせて保有銘柄の評価額を記録していきます。

売買のタイミングで、保有銘柄数が変わるはずなので、その時点での保有銘柄数を記録することで評価額を計算します。

プログラムは以下のように書きます。

df["myANET"].loc["2017-12-29":] = df["ANET"] * 34

上記の式は、「評価額記録用の「myANET」列の2017-12-29以降は、ANET株を34株保有した。」ということを意味します。

これを繰り返すと以下のような感じになります。

# 株の売買をしたら常に、最新の保有数量を記録するようにします。

2.4.Cashの金額推移の記録

株の売り買いをするとキャッシュが増減します。また配当をもらってもキャッシュが増えますので、キャッシュの増減も株の売り買いのタイミングで記録しておきます。

記録の仕方は同じです。

2.5. ポートフォリオの計算

めんどくさい株の売買の記録が終わったので、あとは足し合わせてデータ作りは終わりです。

運用利回り計算用にmyPortfolioという変数に計算結果を代入します。また、総資産は銘柄別に集計したりしたいので、assetというディクショナリ型の変数を新しく定義します。

3.運用利回りの計算とグラフ化

やっと最後です。

集計に必要となるデータは2までで全て打ち込んだため、あとはデータを変換して利回りや資産を図示できる形式に加工してやります。

手順は以下の通りです。

  1. pct_change()コマンドで資産額から日々の変化率に変換。
  2. cumprod()コマンドで、日々の変化率を累積変化率(つまり複利計算)に変換。
  3. plotで普通にプロット。何かのベンチマークと比較したい場合はその銘柄も指定。

次に、ドル転分も含めた総資産の推移を可視化する方法を示します。手順は以下の通りです。

  1. 総資産を構成する銘柄、及びキャッシュだけを集めて新しいデータフレームを作る。
  2. plotで普通にプロット。プロット種類をエリアにするとかっこいい。

4.まとめ

今回はpythonでポートフォリオの成績を記録する方法を紹介しました。

Pythonで資産管理をするメリットは、一度作ってしまえば、売買時に保有銘柄の数量を変更し、キャッシュを更新するという作業だけで簡単に集計・グラフ化ができる点です。

私も月に数度しか売買しないので、利回り計算の際は、基本的にはダウンロード時の日付指定を変更し、Jupyter notebookの上から「Shift + Enter」連打で実行するだけです。お手軽ですね。

最後に、参考までに今回のソースコード(Python_Asset_record)を公開しておきます。

 

あと、細かいテクニックやjupyterを使った株価データの取り扱いなどは、下記書籍がわかりやすいです。こちらも参考まで。







-雑記
-,

Copyright© ただの しかばね のようだ。 , 2018 All Rights Reserved Powered by AFFINGER4.