技術は使ってなんぼ

自分が得たものを誰かの役に立てたい

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
証券コード 取得単価(円) 取得数
銘柄
国保 7164 5035 100
三菱HCキャピタル 8593 642 300
TAKARA&COMPANY 7921 1850 100
# 総額の算出
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()

output1

output2

output3

というような感じで、最後に円グラフで資産全体のポートフォリオが取得時と現在の最新価格で表示され、いくら損益が発生しているかがわかります。

もう少し使い勝手良くしたいものですね。

またアイディアを形にできたら更新してみようと思います。