こんにちはーーー
Pythonを使って株の分析をしています。
今回は、関連銘柄のPERを比較するコードを作成したので記事にしました。
この記事が誰かの役に立てば幸いです。
言語はPython 3.9.5を使っています。
プログラム実行結果
プログラムの実行結果から説明します。
今回は一例として銘柄をアップルと指定しました。
関連銘柄自動抽出して、現在と将来PERを比較するグラフを↓のように出力しました。
(※グラフ化したデータが正しいのかは確認してないのであしからず。)
概ね意図通りにですが、TSLAではなく、MSFTでは?と思ったりします・・・
(まあ、ここは改良ポイントですかね)
コード全文
作成したコードです。
関連銘柄とPERの抽出しは、yahooqueryのライブラリを使えば比較的簡単で、
for文とmatplotlibの組み合わせに苦労しました。
#株情報必要なライブラリ from yahooquery import Ticker #情報処理に必要なライブラリ import pandas as pd #グラフ作成に必要なライブラリ import matplotlib.pyplot as plt import numpy as np # 銘柄の指定(カスタマイズするところ) name='AAPL' analyze = Ticker(name) #関連銘柄の取得 cone=analyze.recommendations print(cone) #辞書の階層が深いので必要な情報を抜き出させるよう処理 cone1 = cone[name] cone2 = cone1['recommendedSymbols'] cone3 = [d.get('symbol') for d in cone2] cone4 = [name] + cone3 check_list = cone4 df = pd.DataFrame(columns=check_list) #これで関連銘柄情報の取得は終わり #for文でグラフを作るために配列を用意 num =[] s_name=[] y_t = [] y_f = [] # enumerateでインデックスを振る for i,stock_name in enumerate(check_list): ticker = Ticker(stock_name) #PERを含む株式情報の取得 for k, v in ticker.summary_detail.items(): df[stock_name] = pd.Series(v) #PERの情報を取得 y1_t = np.array([df[stock_name]['trailingPE']] ) #PER(予測)の情報を取得 y1_f = np.array([df[stock_name]['forwardPE']] ) #グラフでプロットするために配列に追加していく num.append(i+1) s_name.append(stock_name) y_t.append(int(y1_t)) y_f.append(int(y1_f)) #グラフプロット width = 0.3 num1 = np.arange(len(y_t)) plt.figure(figsize=(18, 9)) plt.bar(num1, y_t, color='r', width=width, align='center') plt.bar(num1 + width, y_f, color='b', width=width, align='center') plt.yticks(fontsize=20) plt.xticks(num1 + width/2, s_name,fontsize=20) leg = ['trailingPE','forwardPE'] plt.legend(leg,fontsize=20) plt.show()
コード詳細
主要な部分を説明します
関連銘柄の取得
# 銘柄の指定(カスタマイズするところ) name='AAPL' analyze = Ticker(name) #関連銘柄の取得 cone=analyze.recommendations
で取得しています。
定義して変数:coneを出力してみると↓になります。
{‘AAPL’: {‘symbol’: ‘AAPL’, ‘recommendedSymbols’: [{‘symbol’: ‘AMZN’, ‘score’: 0.301199}, {‘symbol’: ‘TSLA’, ‘score’: 0.285517}, {‘symbol’: ‘FB’, ‘score’: 0.277043}, {‘symbol’: ‘GOOG’, ‘score’: 0.275114}, {‘symbol’: ‘NFLX’, ‘score’: 0.2101}]}}
多階層の辞書になっているので、ここからsymbol:で定義されている関連銘柄情報だけ取得します。扱いやすいようにdataFrameを作っておきます。
#辞書の階層が深いので必要な情報を抜き出させるよう処理 cone1 = cone[name] cone2 = cone1['recommendedSymbols'] cone3 = [d.get('symbol') for d in cone2] cone4 = [name] + cone3 check_list = cone4 df = pd.DataFrame(columns=check_list)
もっと少ない行で綺麗に変換できる気がしますが、一旦これで進めます。
銘柄情報の取得
↓のコードで取得できます。
ticker.summary_detail.items()
check_list
にアップルと関連銘柄を格納しているので、for文で銘柄一つ一つの情報を取得します。
csvに出力すると↓のようになります。
csv出力結果
AAPL | AMZN | TSLA | FB | GOOG | NFLX | |
maxAge | 1 | 1 | 1 | 1 | 1 | 1 |
priceHint | 2 | 2 | 2 | 2 | 2 | 2 |
previousClose | 143.43 | 3343.63 | 739.38 | 357.48 | 2792.93 | 573.14 |
open | 144.45 | 3351 | 743.5263 | 347.23 | 2801.01 | 579.69 |
dayLow | 143.7001 | 3341.05 | 739.18 | 340.6901 | 2789.76 | 579.69 |
dayHigh | 146.43 | 3388.945 | 753.6699 | 349.84 | 2831.67 | 595.59 |
regularMarketPreviousClose | 143.43 | 3343.63 | 739.38 | 357.48 | 2792.93 | 573.14 |
regularMarketOpen | 144.45 | 3351 | 743.5263 | 347.23 | 2801.01 | 579.69 |
regularMarketDayLow | 143.7001 | 3341.05 | 739.18 | 340.6901 | 2789.76 | 579.69 |
regularMarketDayHigh | 146.43 | 3388.945 | 753.6699 | 349.84 | 2831.67 | 595.59 |
dividendRate | 0.88 | |||||
dividendYield | 0.0061 | |||||
exDividendDate | 8/6/2021 9:00 | |||||
payoutRatio | 0.16309999 | 0 | 0 | 0 | 0 | 0 |
fiveYearAvgDividendYield | 1.27 | |||||
beta | 1.201965 | 1.143558 | 1.961244 | 1.295305 | 1.004366 | 0.759279 |
trailingPE | 28.553251 | 58.89102 | 396.3838 | 25.48715 | 30.57665 | 61.20091 |
forwardPE | 25.498253 | 50.40337 | 106.3564 | 21.33064 | 26.63992 | 45.96498 |
volume | 76404341 | 2405861 | 15126272 | 43692859 | 1102937 | 4021845 |
regularMarketVolume | 76404341 | 2405861 | 15126272 | 43692859 | 1102937 | 4021845 |
averageVolume | 79712090 | 3256506 | 19709434 | 14037237 | 1033642 | 3286893 |
averageVolume10days | 96040875 | 3064662 | 19391375 | 19128737 | 1335812 | 3156400 |
averageDailyVolume10Day | 96040875 | 3064662 | 19391375 | 19128737 | 1335812 | 3156400 |
bid | 147.32 | 3394.06 | 757.5 | 346.2 | 2833.74 | 590.03 |
ask | 147.04 | 3398.84 | 759.3 | 346.5 | 2836.99 | 594.5 |
bidSize | 1400 | 800 | 1000 | 1300 | 900 | 900 |
askSize | 1200 | 800 | 1000 | 1400 | 1000 | 1300 |
marketCap | 2.41093E+12 | 1.71E+12 | 7.53E+11 | 9.68E+11 | 1.88E+12 | 2.61E+11 |
fiftyTwoWeekLow | 105 | 2881 | 351.3 | 244.61 | 1409.85 | 463.41 |
fiftyTwoWeekHigh | 157.26 | 3773.08 | 900.4 | 384.33 | 2936.41 | 615.6 |
priceToSalesTrailing12Months | 6.944822 | 3.861502 | 17.99414 | 9.234279 | 8.513091 | 9.476818 |
fiftyDayAverage | 149.03143 | 3371.653 | 722.1486 | 367.2669 | 2824.21 | 557.7377 |
twoHundredDayAverage | 136.01633 | 3348.195 | 671.9044 | 332.5525 | 2496.973 | 526.0561 |
trailingAnnualDividendRate | 0.835 | |||||
trailingAnnualDividendYield | 0.005821656 | |||||
currency | USD | USD | USD | USD | USD | USD |
この中にtrailingPEとforwardPEがありますので、これをグラフ化します。
グラフ化
for文で出力したデータをmatplotlibでグラフ化したかったので、
配列を用意しました。
num =[] s_name=[] y_t = [] y_f = []
この配列にfor文で出力したデータをappendを使用して格納していきます。
num.append(i+1) s_name.append(stock_name) y_t.append(int(y1_t)) y_f.append(int(y1_f))
floatだとグラフ化できなかったので、一旦暫定でint型にして対応しています
(ここらへんは別途調査が必要です・・・)
あとは↓のコードでグラフ化して終わりです。
num1 = np.arange(len(y_t)) plt.figure(figsize=(18, 9)) plt.bar(num1, y_t, color='r', width=width, align='center') plt.bar(num1 + width, y_f, color='b', width=width, align='center') plt.yticks(fontsize=20) plt.xticks(num1 + width/2, s_name,fontsize=20) leg = ['trailingPE','forwardPE'] plt.legend(leg,fontsize=20) plt.show()
動画にもしています。
役立つ情報を発信を心掛けていますので、チャンネル登録してくれたら大変嬉しいです
以上になります!!
ではまた。
コメント