見出し画像

見たいデータだけ見る!株の管理編



はじめに

chatGPTで色々なプログラムを試しているところではありますが、いくつかの証券会社で株を所有していると一つにまとめて管理したい、つまりポートフォリオを作成したいと考え、試すことにしました。シンプルにpythonで取得したデータをエクセルなどの表計算ソフトに株の終値を自動で入力できれば、雛形さえ作っておけば効率的だ!

Google スプレッドシートをpythonと連携

と、いうことで直接エクセルなどやGoogleのスプレッドシートにまずは関数で株価を取得できるかを調べました。が、結果としてスプレッドシートに海外の株価データは取得できましたが、日本株はできないため、GoogleでAPIを取得し、スプレッドシートに直接書き込むようにしたという背景です。

スプレッドシートの限界

以下のようなコードで株価を取得し、直接データを入力することができました。

from datetime import datetime, timedelta
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import yfinance as yf
import pandas as pd

# Google Sheets API の認証情報の設定
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('あなたの認証ファイル.json', scope)
gc = gspread.authorize(credentials)

# スプレッドシートの開始
spreadsheet = gc.open_by_key('編集したいスプレッドシートのkeyを入力')
worksheet = spreadsheet.worksheet("編集したいシート名")

# A2 から A18 までの銘柄コードを取得
stock_codes = worksheet.range('A2:A19')

# yfinance を使用して各銘柄の過去10年間のデータを取得
today = datetime.now()
ten_years_ago = today - timedelta(days=3650)

stock_data = {}
for cell in stock_codes:
    stock = yf.Ticker(cell.value + ".T")
    hist = stock.history(start=ten_years_ago, end=today)
    if not hist.empty:
        closing_price = hist['Close'].iloc[-1]
        worksheet.update_cell(cell.row, 6, closing_price)  # F列に最終日の終値を書き込む
        hist['MA25'] = hist['Close'].rolling(window=25).mean()
        hist['MA75'] = hist['Close'].rolling(window=75).mean()
        stock_data[cell.value] = hist.iloc[-30:]  # 過去30日間のデータを保持
    else:
        worksheet.update_cell(cell.row, 6, "データなし")

軽く、解説するとあるセルのA2からA18にある4桁の銘柄コードをもとに、指定のセルに終値を入力するものです。また、この後に使うため終値だけでなく、あらかじめ10年分のデータを取得しております。

しかし、私は思います。見たいものを見たいのに、これではただの数字の羅列であり、グラフやチャートなどを表示して、特に気になるものをすぐに見つけられるようにするべきでは?、と。

しかし、スプレッドシートではpythonでチャートを作成ができてもそのチャートをスプレッドシートに貼れませんでした。また、pythonでデータを取り込むのにしても今度はスプレッドシートに入れることにより、それはそれでわかりづらくなることを懸念し、別の方法を考えることにしました。

オリジナルのダッシュボードを作成

と、いうことで今度はチャートを別で作ることにします。dashというサービスがあり、ここではpythonで作成したプログラムをブラウザ上で動かすことができるというものです。そこでまずは取得したデータをもとにプログラムを作成。
※作成したのはchatGPTです。
以下、コードと実行結果

import dash
import dash_core_components as dcc
import dash_html_components as html

# 各銘柄のチャートを作成する関数
def create_stock_chart(stock_code, df):
    return dcc.Graph(
        figure={
            'data': [
                {'x': df.index, 'y': df['Close'], 'type': 'line', 'name': 'Close'},
                {'x': df.index, 'y': df['MA25'], 'type': 'line', 'name': '25-day MA'},
                {'x': df.index, 'y': df['MA75'], 'type': 'line', 'name': '75-day MA'}
            ],
            'layout': {'title': f'Stock Price of {stock_code}'}
        },
        style={'display': 'inline-block', 'width': '30%'}
    )

# 銘柄のデータを3列に配置するためにリストを分割
def chunk(lst, n):
    for i in range(0, len(lst), n):
        yield lst[i:i + n]

stock_chunks = list(chunk(list(stock_data.items()), 3))

# Dashアプリケーションのレイアウト設定
app.layout = html.Div([
    html.Div([
        create_stock_chart(code, data) for code, data in chunk
    ], style={'display': 'flex', 'flex-direction': 'row'}) for chunk in stock_chunks
])

# アプリケーションを実行
if __name__ == '__main__':
    app.run_server(debug=True)


プログラム実行後、127.0.0.1:8050にアクセスするとプログラムで作成したものが表示されます。特にサーバー上にデータをアップデートしているわけではありませんので、プログラムを実行したパソコンからしか見れないようですが、チャートが表示されました。また、移動平均線もついでに追加していますので、簡単にゴールデンクロスやデッドクロスがあったかどうかが一目なので、全体を見た後で気になる銘柄だけあとは注視すれば良いので、日々の銘柄の監視にもかなり便利なものができたと思います。

こらからのアップデート

とはいえ、これだけではまだ情報が足りません。そのため以下のような項目を追加できればと考えています。
・日経平均やSP500などの相関性について
・他の指標もチャートに入れて売買タイミングを見極める。
・セクターごとに日々の動きを監視できるものもあれば。
・各銘柄の四季報のような情報があり、気になったものだけ表示。

ちなみに上記の追加項目は確かに証券会社さんのサイトであれば見れますが、せっかくなので一つにまとめてみたいと思った今日この頃でした。
皆様の参考になれば幸いです。

この記事が気に入ったらサポートをしてみませんか?