2017年07月14日

Python + SeleniumでSBI証券の保有資産データを取得

Python関連を連続して書いているけれど、投資に関連する内容も!ということでSBI証券の保有資産データを取得&分類分けをしてEXCELでパイチャートを作成してみました。

まずは結果から

下記の様なパイチャートを含むEXCELを自動生成しました。国内株と投資信託のデータを取得して8分類に分けています。8分類なのはeMAXIS Slimバランスがあるからなのですが。
20170715_python_0.jpg

使用モジュール

EXCELのデータを吐き出すためにopenpyxlをインストールしています

> pip install openpyxl
続いてコード関連です。

ソースコード


保有している投資信託は「ニッセイ外国株式インデックスファンド」「ニッセイTOPIXインデックスファンド」「eMAXIS Slim バランス(8資産均等型)」なので、その前提でマッチングを取っています。
また、引数は順に <出力EXCELファイル名><SBI証券ID><SBI証券PW>となります。

import openpyxl
import sys,os
import re
from selenium import webdriver
from selenium.webdriver.support.ui import Select

# chromeを起動させる
browser = webdriver.Chrome("chromedriver.exe")

# parameter
NONE = 0
STOCKLINE = 1
TRUSTLINE = 2

WFILE = sys.argv[1]
ID = sys.argv[2]
PW = sys.argv[3]

# Open EXCEL dat
sbiWorkBook = openpyxl.Workbook()
sbiSheet = sbiWorkBook.active
sbiSheet.title = "SBI資産分類"

# Result data
classData = {'国内株式':0,'先進国株式':0,'新興国株式':0,
'国内債権':0,'先進国債権':0,'新興国債権':0,
'国内REIT':0,'先進国REIT':0}
valueList =[]
labelList =[]
rowSM = NONE

# SBI証券のページを開く。
print('Navigating...', 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 in...', 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(classData)

# Excelへの資産データの書き込み
# 最初にlabelの書き込み
sbiSheet.cell(row=1,column=1).value = "分類"
sbiSheet.cell(row=1,column=2).value = "金額"
# labelの後からの書き込みなのでi=2
i = 2
for key,data in classData.items():
sbiSheet.cell(row=i,column=1).value = key
sbiSheet.cell(row=i,column=2).value = data
i=i+1

# labelの範囲指定
lab_obj = openpyxl.chart.Reference(sbiSheet,min_col=1,min_row=2,max_row=9)
# 実際のデータの範囲指定
ref_obj = openpyxl.chart.Reference(sbiSheet,min_col=2,min_row=2,max_col=2,max_row=9)
# Title指定
series_obj = openpyxl.chart.Series(ref_obj, title="資産分類")

chart_obj= openpyxl.chart.PieChart()
chart_obj.append(series_obj)
chart_obj.set_categories(lab_obj)
sbiSheet.add_chart(chart_obj,"D1")

# ファイルへの書き込み
sbiWorkBook.save(WFILE)
リスク資産はSBI証券とDC年金なので後者も自動で取得できるようになれば資産分類が自動で作成できるようになりそうです。

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

メールアドレス:

ホームページアドレス:

コメント:

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

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