Pythonでつくる、株式ポートフォリオ
こんにちは。
今回はPythonを使って、国内株式の運用状況が一目でわかる、ポートフォリオのツールを作ってみました。
とりあえずできることとして、
ができます。
これだけみると、「普通に証券口座で確認できるレベル」なんですが、最初のベースとしてはこれでいいかなと。
段々と機能を追加していき、最終的にはポートフォリオの分析や株価の指標に基づいた評価等が自動でできるアプリとか作りたい。
システムのイメージ図はこんな感じ。
それでは早速ソースコードを書いていきます。
今回はJupyter Notebookを使ってMarkDown形式のブログへの添付を試みました!
これでところどころの出力結果が見えます。
import dash import dash_core_components as dcc import dash_html_components as html import plotly.express as px import pandas as pd import numpy as np import math import matplotlib.pyplot as plt from pandas_datareader import data as web import pandas_datareader as pdr import seaborn as sns sns.set(font=['Yu Gothic'])
# データ読み込み df_pf = pd.read_csv('portfolio.csv', encoding='shift_jis', index_col=0) df_pf
# 総額の算出 df_pf['取得総額(円)'] = df_pf['取得単価(円)'] * df_pf['取得数'] df_pf
証券コード | 取得単価(円) | 取得数 | 取得総額(円) | |
---|---|---|---|---|
銘柄 | ||||
全国保証 | 7164 | 5035 | 100 | 503500 |
三菱HCキャピタル | 8593 | 642 | 300 | 192600 |
TAKARA&COMPANY | 7921 | 1850 | 100 | 185000 |
new_price_list = [] for i in range(len(df_pf)): s_code = int(df_pf.iloc[i]['証券コード']) get_price = df_pf.iloc[i]['取得単価(円)'] get_num = int(df_pf.iloc[i]['取得数']) new_price = web.DataReader('{}.T'.format(s_code), data_source='yahoo')["Adj Close"] new_price = new_price.tail(1).values new_price_list.append(new_price) new_price_list
[array([4780.]), array([596.]), array([1702.])]
np_sum = np.concatenate([new_price_list])
df_new = pd.DataFrame(np_sum, index=df_pf.index, columns=['最新価格(円)'])
df_new
最新価格(円) | |
---|---|
銘柄 | |
全国保証 | 4780.0 |
三菱HCキャピタル | 596.0 |
TAKARA&COMPANY | 1702.0 |
df_new = pd.concat([df_pf, df_new], axis=1)
df_new
証券コード | 取得単価(円) | 取得数 | 取得総額(円) | 最新価格(円) | |
---|---|---|---|---|---|
銘柄 | |||||
全国保証 | 7164 | 5035 | 100 | 503500 | 4780.0 |
三菱HCキャピタル | 8593 | 642 | 300 | 192600 | 596.0 |
TAKARA&COMPANY | 7921 | 1850 | 100 | 185000 | 1702.0 |
# 最新の価格での総額算出 df_new['最新総額(円)'] = df_new['最新価格(円)'] * df_pf['取得数'] df_new
証券コード | 取得単価(円) | 取得数 | 取得総額(円) | 最新価格(円) | 最新総額(円) | |
---|---|---|---|---|---|---|
銘柄 | ||||||
全国保証 | 7164 | 5035 | 100 | 503500 | 4780.0 | 478000.0 |
三菱HCキャピタル | 8593 | 642 | 300 | 192600 | 596.0 | 178800.0 |
TAKARA&COMPANY | 7921 | 1850 | 100 | 185000 | 1702.0 | 170200.0 |
# 評価損益 df_new['評価損益(円)'] = df_new['最新総額(円)'] - df_new['取得総額(円)'] df_new
証券コード | 取得単価(円) | 取得数 | 取得総額(円) | 最新価格(円) | 最新総額(円) | 評価損益(円) | |
---|---|---|---|---|---|---|---|
銘柄 | |||||||
全国保証 | 7164 | 5035 | 100 | 503500 | 4780.0 | 478000.0 | -25500.0 |
三菱HCキャピタル | 8593 | 642 | 300 | 192600 | 596.0 | 178800.0 | -13800.0 |
TAKARA&COMPANY | 7921 | 1850 | 100 | 185000 | 1702.0 | 170200.0 | -14800.0 |
# 全体資産の可視化 title_name = '取得総額(円)' plt.title(title_name) plt.pie(df_new[title_name], labels=df_new.index, autopct='%1.1f%%', counterclock=False, startangle=90) plt.axis('equal') plt.show() title_name = '最新総額(円)' plt.title(title_name) plt.pie(df_new[title_name], labels=df_new.index, autopct='%1.1f%%', counterclock=False, startangle=90) plt.axis('equal') plt.show() # 評価損益の可視化 title_name = '評価損益(円)' plt.title(title_name) plt.bar(df_new.index, df_new[title_name]) plt.show()
というような感じで、最後に円グラフで資産全体のポートフォリオが取得時と現在の最新価格で表示され、いくら損益が発生しているかがわかります。
もう少し使い勝手良くしたいものですね。
またアイディアを形にできたら更新してみようと思います。