本サイトは広告・プロモーションが含まれています
雑記

【管理人勉強日記】株の配当利回りランキングwebアプリをAmplifyでつくる【2024年2~3月上旬】

2026年1月のフリーランス独立に向けて、日々勉強中の管理人の勉強日記。

2月の勉強内容は、1月にUdemyで勉強したAmplifyを使って株の配当利回りアプリの作成。
とにかくソフトウェアエンジニアとして経験が足りなさ過ぎるので、ひたすら勉強勉強。

現在の管理人のスキルはこんな感じ。

作成したアプリについて


日本の上場企業について企業名、株価、配当金、配当利回り一覧を表で示すアプリを作成しました。

スクリーンショットだけで申し訳ないのですが
今のアプリ感が全く感じられないアプリの画面がこちら。

アプリでは会社名と株価、分配金、分配利回りを表にしたものになってます。

表のデータは定期的にyfinanceから取得していて、DBに保存しています。
週1で実行するようになっていて、お金も0.04ドルくらいかけてます。(全然少ない)

データはヘッダーのボタンを押すと並び替えができるようになっていて
デフォルトでは配当利回り順で表示、株価順にもできるようになってます。

まだ免責事項などを書いていないので公開は難しいですが、おいおいリンクを貼らせてもらえたらと思います。

アプリの構成

webアプリはローカルのPCでNext.jsで作成しました。
AWSのAmplifyのサービスを使って作成したアプリをデプロイしてます。

株価の情報についても、yfinanceというライブラリを使ったPythonコードを書いて
AWSのLambdaとEventBridgeを使って定期的に実行するという内容。

後はこの構成図を書くために、draw.ioを勉強もしたりしました。

AWS構成の勉強



Udemyの「AWS AppSync & Amplify with React & GraphQL – Complete Guide」の内容でAmplifyの構成を勉強しました。

1月に勉強したことを生かして実装。やっぱUdemyって神。


Pythonを使ったwebスクレイピングについては下記の記事を参考に書かせてもらいました。

株価の取得には外部ライブラリを使います。外部ライブラリを使うにはLambda レイヤー作成が必要ですが、リンク先の記事に作成方法が書いてったので、ありがたく参考にしました。

一度Amplifyに慣れさえすれば、AWSについても慣れてくるので
Lambdaでの書き方も調べられるようになる?気がします。

プログラミング勉強内容

①JavaScriptでの表の書き方


JavaScriptでの表の書き方は色々あるのですが、今回はx-data-gridを使って書きました。
理由は並び換えの機能がついていたから。

下記のコードのように、列と行とクリックしたときの動作を渡しただけです。
親コンポーネントで少しデータや関数の整理をしていますが、あんまり難しくないと思います。

import { DataGrid } from '@mui/x-data-grid'

const Table = (props) => {
    return (
        <DataGrid
            columns={props.columns|| []}
            rows={props.rows || []}
            onRowClick={props.handleRowClick}
        />  
    )
}
export default Table

Pythonで株価を取得する


yfinanceの勉強をしました!!

最初はyahooqueryを使っていたのですが、、、、取得までが遅い!!
ということでyfinanceに乗り換えました。

Pythonコードは以下になります。
・os.getenvで環境変数の設定
・クエリの書き方勉強する
・EventBridgeから変数(start_rate, end_rate)を与える
などAWS環境とも絡めたものなので、単体では全く動作しないですが
下記のようなものを書きました。

import os
import numpy as np
import pandas as pd
import yfinance as yf
from tqdm import tqdm
import requests
import json
import uuid

API_URL = os.getenv("API_INVESTMENTAPP_GRAPHQLAPIENDPOINTOUTPUT")
API_KEY = os.getenv("API_INVESTMENTAPP_GRAPHQLAPIKEYOUTPUT")

def collect(start_rate, end_rate):
    if not os.path.isfile('/var/task/stockData/data_j.xls'):
        print(os.getcwd())
        print('東証上場銘柄一覧を[data_j.xls]のファイル名で保存してください。')
        exit()
    
    print('東証上場銘柄一覧を読み込みます。')
    df_data_j = pd.read_excel('/var/task/stockData/data_j.xls', index_col=None)

    df_data_j = df_data_j[df_data_j['市場・商品区分'] != 'REIT・ベンチャーファンド・カントリーファンド・インフラファンド']
    df_data_j = df_data_j[df_data_j['市場・商品区分'] != 'ETF・ETN']
    df_data_j = df_data_j[df_data_j['コード'] != 25935]

    total_codes = len(df_data_j['コード'])
    start_index = int(np.ceil(total_codes * start_rate))
    end_index = int(np.ceil(total_codes * end_rate))

    for ticker in tqdm(df_data_j['コード'][start_index:end_index]):
        ticker_str = str(ticker) + '.T'
        ticker_data = yf.Ticker(ticker_str)  # yfinanceを使用してTickerオブジェクトを取得

        try:
            hist = ticker_data.history(period="1d")
            if not hist.empty:
                latest_date = hist.index[-1].isoformat()
                close_price = hist['Close'].iloc[-1]
                dividend = ticker_data.info['dividendRate'] if 'dividendRate' in ticker_data.info else None
                dividend_yield = ticker_data.info['dividendYield'] * 100 if 'dividendYield' in ticker_data.info else None
            else:
                latest_date = None
                close_price = None
                dividend = None
                dividend_yield = None

            stock_name = df_data_j.loc[df_data_j['コード'] == ticker, '銘柄名'].values[0]

            stock_info = {
                '証券コード': ticker,
                '銘柄名': stock_name,
                '株価': close_price,
                '配当': dividend,
                '配当利回り': dividend_yield,
                '最新株価日付': latest_date
            }

            headers = {
                'Content-Type': 'application/json',
                'x-api-key': API_KEY
            }
            
            mutation = {
                'query': '''
                    mutation CreateStock($id: ID!, $name: String!, $price: Float, $dividend: Float, $createdAt: AWSDateTime!) {
                    createStock(input: {id: $id, name: $name, price: $price, dividend: $dividend, createdAt: $createdAt}) {
                        id
                        name
                        price
                        dividend
                        createdAt
                    }
                    }
                ''',
                'variables': {
                    'id': str(uuid.uuid1()),
                    'name': stock_info['銘柄名'],
                    'price': stock_info['株価'],
                    'dividend': stock_info['配当'],
                    'dividend': stock_info['配当'],
                    'createdAt': stock_info['最新株価日付']
                }
            }

            response = requests.post(API_URL, headers=headers, data=json.dumps(mutation))
            print(response.json())

        except Exception as e:
            print(f'証券コード {ticker} のデータ取得中にエラーが発生しました: {e}')


プログラミングの勉強も大変ではあったのですが
AWSの勉強が一番難しく、骨が折れました。

もっと若い時に勉強すればよかったと少し後悔です。
でも周りにAWS触れる人いなかったんだよね。。。

おわりに


30歳超えて勉強生活はめっちゃ疲れる。。。
めっちゃ疲れる~(泣)。


仕事:忙しい
趣味:テニスやり始めて忙しい
土日:遊ぶのに忙しい
夜:酒を飲むのに忙しい

ほら勉強する時間なんて無いじゃないのよ。

そんな忙しい日々なので、体力回復のために肩こり解消のMYTREXグッズを毎日のように使っています。
オススメの設定はモード6でレベルマックス。
肩に衝撃が来て?こりが解消します。


このあたりのプログラマー社畜グッズたちも、今度まとめようかしら。

ではまた。



COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA