[株とPython] 関連銘柄のPERを比較するコード

Python
スポンサーリンク

こんにちはーーー

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出力結果

AAPLAMZNTSLAFBGOOGNFLX
maxAge111111
priceHint222222
previousClose143.433343.63739.38357.482792.93573.14
open144.453351743.5263347.232801.01579.69
dayLow143.70013341.05739.18340.69012789.76579.69
dayHigh146.433388.945753.6699349.842831.67595.59
regularMarketPreviousClose143.433343.63739.38357.482792.93573.14
regularMarketOpen144.453351743.5263347.232801.01579.69
regularMarketDayLow143.70013341.05739.18340.69012789.76579.69
regularMarketDayHigh146.433388.945753.6699349.842831.67595.59
dividendRate0.88
dividendYield0.0061
exDividendDate8/6/2021 9:00
payoutRatio0.1630999900000
fiveYearAvgDividendYield1.27
beta1.2019651.1435581.9612441.2953051.0043660.759279
trailingPE28.55325158.89102396.383825.4871530.5766561.20091
forwardPE25.49825350.40337106.356421.3306426.6399245.96498
volume764043412405861151262724369285911029374021845
regularMarketVolume764043412405861151262724369285911029374021845
averageVolume797120903256506197094341403723710336423286893
averageVolume10days960408753064662193913751912873713358123156400
averageDailyVolume10Day960408753064662193913751912873713358123156400
bid147.323394.06757.5346.22833.74590.03
ask147.043398.84759.3346.52836.99594.5
bidSize140080010001300900900
askSize12008001000140010001300
marketCap2.41093E+121.71E+127.53E+119.68E+111.88E+122.61E+11
fiftyTwoWeekLow1052881351.3244.611409.85463.41
fiftyTwoWeekHigh157.263773.08900.4384.332936.41615.6
priceToSalesTrailing12Months6.9448223.86150217.994149.2342798.5130919.476818
fiftyDayAverage149.031433371.653722.1486367.26692824.21557.7377
twoHundredDayAverage136.016333348.195671.9044332.55252496.973526.0561
trailingAnnualDividendRate0.835
trailingAnnualDividendYield0.005821656
currencyUSDUSDUSDUSDUSDUSD

この中に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()

動画にもしています。
役立つ情報を発信を心掛けていますので、チャンネル登録してくれたら大変嬉しいです

以上になります!!

ではまた。

コメント

タイトルとURLをコピーしました