2017年07月22日

リスク資産グラフの自動生成[SBI証券+DC年金](Python + matplotlib)

前回、SBI証券のリスク資産をパイチャート(円グラフ)で示すEXCELを作成しました。
Python関連を連続して書いているけれど、投資に関連する内容も!ということでS...
自分が保有しているリスク資産はSBI証券とDC年金となります。また、現在は半年に1回サイトにアクセスして評価額を確認しながらEXCELを作成してグラフを作成していました。この作業は手間がかかるため、SBI証券とDC年金の2つのリスク資産配分をを合算したパイチャートのグラフを自動で作成したいと考えました。

コマンドと実行結果

コマンドは下記となります。

> python.exe .\graphAA.py .\piChart.png <SBIID> <SBIPW> <DCID> <DCPW>
Navigating for SBI...
Signing for SBI...
Navigating for SMTB...
Signing for SMTB...
Saving pieChart...

今回はEXCELを作成するのではなくて、パイチャートの画像データを直接作成しています。下記のパイチャートが自動で作成されました。
20170719_python_piChart.png

下記の記事の2017年7月時点のリスク資産と比較してほぼ同じとなっているので、情報の取得はうまくいっていると思います。あと、他の人はリスク資産の分類のチャートをどのようにして作成しているのかが気になります。MoneyForwardでも自分が思ってたようなチャートを作れなかったので……。
半年に一度の資産状況確認を実施してみました。...
続いてソースコードになります


ソースコード

コードは下記となります。matplotlibだけでなくseabornも使っています。あと日本語設定も別途実施しています。

import sys,os
import re
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

def getSBIAA(ID,PW):
# chromeを起動させる
browser = webdriver.Chrome("chromedriver.exe")

# parameter
NONE = 0
STOCKLINE = 1
TRUSTLINE = 2
rowSM = NONE

# SBI証券のページを開く。
print('Navigating for SBI...', file=sys.stderr)
browser.get('https://site1.sbisec.co.jp/ETGate/')

# IDとPWを入力
input_element = browser.find_element_by_name('user_id')
input_element.send_keys(ID)
input_element = browser.find_element_by_name('user_password')
input_element.send_keys(PW)
# フォームを送信する。
print('Signing for SBI...', file=sys.stderr)
botton_element = browser.find_elements_by_name('ACT_login')
botton_element[0].click()

# ページの移動 リンク用のTEXTで判別
botton_element = browser.find_elements_by_link_text('ポートフォリオ')
botton_element[0].click()

# データの取得
sbiInformation = browser.find_elements_by_css_selector('td table[style="width:100%;"]')

# Line単位で処理をするためリスト化
lineData = sbiInformation[0].text.split("\n")
for line in lineData:
line = re.sub(r"\u3000","",line,0) # 全角は銘柄orファンド名なので除去
line = re.sub(r"[\t\s]+"," ",line,0) # それ以外の空白は区切りに使う
line = re.sub(r",","",line,0)
lineList = line.split(" ")
if rowSM == STOCKLINE: # 株式の場合
# 情報がなくなったら株式情報が終了
if len(lineList) <= 1:
rowSM = NONE
else:
classData['国内株式'] += float(lineList[12])

elif rowSM == TRUSTLINE: # 投資信託の場合
# 情報が無くなったら投資信託情報が終了
if len(lineList) <= 1:
rowSM = NONE
else:
if re.search(r"TOPIX",lineList[2]): # TOPIXは国内株式
classData['国内株式'] += float(lineList[11])
if re.search(r"外国株式",lineList[2]): # 外国株式は先進国株式
classData['先進国株式'] += float(lineList[11])
if re.search(r"(8資産均等型)",lineList[2]): # 8資産均等は各々1/8
classData['国内株式'] += float(lineList[11])/8
classData['新興国株式'] += float(lineList[11])/8
classData['先進国株式'] += float(lineList[11])/8
classData['国内債券'] += float(lineList[11])/8
classData['先進国債券'] += float(lineList[11])/8
classData['新興国債券'] += float(lineList[11])/8
classData['先進国REIT'] += float(lineList[11])/8
classData['国内REIT'] += float(lineList[11])/8

else: # 株式or投資信託の行になるまで
if(len(lineList) > 1):
searchStock = re.search(r"^銘柄",lineList[1])
searchTrust = re.search(r"^ファンド名",lineList[1])
if searchStock:
rowSM = STOCKLINE;
elif searchTrust:
rowSM = TRUSTLINE;

# Debug用に辞書型の資産データを出力
print("-----Debug data After pricessing SBI----")
print(classData)
# Chromeを閉じる
browser.close()

def getSMTBAA(ID,PW):
# chromeを起動させる
browser = webdriver.Chrome("chromedriver.exe")

# DC年金のページを開く。
print('Navigating for SMTB...', file=sys.stderr)
browser.get('https://www01.smtb.jp/Lifeguide/')

# IDとPWを入力
input_element = browser.find_element_by_css_selector('#f_personal\:kojinId')
input_element.send_keys(ID)
input_element = browser.find_element_by_css_selector('#f_personal\:kojinPw')
input_element.send_keys(PW)
# フォームを送信する。
print('Signing for SMTB...', file=sys.stderr)
botton_element = browser.find_elements_by_css_selector('input[type="submit"]')
botton_element[0].click()

# 資産配分ページの移動 リンク用のTEXTで判別
botton_element = browser.find_elements_by_css_selector('.subbtn')
#0:ログオフ
#1:口座登録すると残高を表示できます
#2:過去の運用利回り
#3:詳細:資産残高
#4:詳細:資産配分
#4:詳細:残高の推移
botton_element[4].click()

# Table中の資産内容を取得する
table_elements = browser.find_elements_by_css_selector('tbody tr')
for table_element in table_elements:
table_text = re.sub(",","",table_element.text)
table_text = re.sub("外国","先進国",table_text)
tableList = re.split(" ",table_text)
if len(tableList) > 2:
if re.search("債券",tableList[0]) or re.search("株式",tableList[0]):
classData[tableList[0]] += float(tableList[1])

# Debug用に辞書型の資産データを出力
print("-----Debug data After pricessing SMBT----")
print(classData)
browser.close()

def plotpie(WFILE):
# 整形する。
# Labelを別途作成
classDataForPandas = {'資産割合': classData}
label = classData.keys()
# 辞書型からDataFrameにCast
df = pd.DataFrame.from_dict(classData,orient='index')

# 円グラフの作成
plt.pie(df, autopct="%.1f%%", labels=label, pctdistance=0.7,wedgeprops={'linewidth': 1, 'edgecolor':"white"})
# 楕円ではなく円にする
plt.axis('equal')
# 凡例を出力したいときはコメントアウトを外す
# plt.legend()
plt.savefig(WFILE)
plt.show()

##############################
# MAIN
##############################


# Result data
classData = {'国内株式':0,'先進国株式':0,'新興国株式':0,
'国内債券':0,'先進国債券':0,'新興国債券':0,
'国内REIT':0,'先進国REIT':0}

# from argv
WFILE = sys.argv[1]
SBIID = sys.argv[2]
SBIPW = sys.argv[3]
SMTBID = sys.argv[4]
SMTBPW = sys.argv[5]

getSBIAA(SBIID,SBIPW)
getSMTBAA(SMTBID,SMTBPW)
print('Saving pieChart...', file=sys.stderr)
plotpie(WFILE)

日本語設定

定番のIPAexフォントを使用しています。

fontのttfファイルについては1だけでなく2にも置いています。
  1. C:\Users\kumana\Anaconda3\lib\site-packages\matplotlib\mpl-data\fonts\ttf
  2. C:\Windows\Fonts
設定ファイルは「C:\Users\kumana\Anaconda3\Lib\site-packages\seaborn\rcmod.py」を下記の様に変更しています。

80a81,82
> #def set(context="notebook", style="darkgrid", palette="deep",
> # font="sans-serif", font_scale=1, color_codes=False, rc=None):
82c84
< font="sans-serif", font_scale=1, color_codes=False, rc=None):
---
> font="IPAexGothic", font_scale=1, color_codes=False, rc=None):
190c192,193
< "font.family": ["sans-serif"],
---
> # "font.family": ["sans-serif"],
> "font.family": ["IPAexGothic"],


あとはキャッシュファイルも削除しないといけないのですが、どのファイルか忘れてしまったので、思い出したら追記します。

スポンサーリンク
posted by くまなべ at 16:00 | Comment(0) | TrackBack(0) | Python
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/180381133
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック