![見出し画像](https://assets.st-note.com/production/uploads/images/144364719/rectangle_large_type_2_639132ddc39030efcc328659e1ca2a73.png?width=800)
Photo by
shiny_mango917
日本の自動車メーカーの株価を分析してみよう5
背景
ホンダ株(7262.T)と組み合わせるポートフォリオ探しは一旦置いといて、コードの修正をします。
呼び出すたびにyfinanceのデータをダウンロードするのは効率的ではない
pandasの列数に制限がありワーニングが出る
スクリプト
最初にyfinanceを使ってデータをダウンロードする。それを何度も使う方針にします。では、データのダウンロード。
import yfinance as yf
import statistics
import nk225dict
# ダウンロードしたい株式のティッカーシンボル
keys = nk225dict.my_dict.keys()
ticker = list(keys)
# 任意のを比較してみよう
#ticker = ['7267.T', '8411.T', '6702.T', '6752.T']
# データをダウンロード
def download_fdata():
data = yf.download(ticker, start='2016-01-01', end='2023-01-01', interval = "1wk")['Adj Close']
print(type(data))
print(data.iat[0, 0])
print(data)
return(data)
# 関数呼び出し
data = download_fdata()
# 株価データのClose列を辞書で置換
data.rename(columns=nk225dict.my_dict, inplace=True)
# データをファイルに保存
data.to_csv('N225_stockdata.csv', index=True, mode='w')
上を実行すると、N225_stockdata.csv ファイルが保存されるはずです。
次にClassを使ってデータの計算を整理します。
import yfinance as yf
import matplotlib.pyplot as plt
import pandas as pd
import math
import random
import statistics
import nk225dict
#=======================================Func, Class
def N225_fileroad():
data = pd.read_csv('N225_stockdata.csv',index_col=0)
return data
class N225_dataclass():
class_data = 0
class_nomdata = 0
ticker_name = ''
def __init__(self):
self.ticker = ['']
self.fst_price = []
self.end_price = []
self.growth = []
self.varia = []
def set(self, data):
self.class_data = data
def ticker(self):
self.ticker_name = self.class_data.columns
return(self.ticker_name)
def fist_value(self, n):
return (self.class_data.iat[0, n])
def end_value(self, n):
return (self.class_data.iat[-1, n])
def growth_all(self):
for i in range(len(self.class_data.columns)):
self.ticker.append(1)
self.fst_price.append(1)
self.end_price.append(1)
self.growth.append(1)
self.ticker[i] = self.class_data.columns[i]
self.fst_price[i] = self.class_data.iat[0, i]
self.end_price[i] = self.class_data.iat[-1, i]
self.growth[i] = self.end_price[i] / self.fst_price[i]
tiker_growth_dict = dict(zip(self.ticker, self.growth))
self.class_nomdata = self.class_data / self.fst_price
return (tiker_growth_dict)
def PF3_vale(self, pf1, pf2, pf3):
pf_value = (self.growth[pf1] + self.growth[pf2] + self.growth[pf3]) / 3.0
return (pf_value)
def var_all(self):
var_n = self.class_nomdata.var()
return (var_n)
#=======================================Main
# 関数呼び出し
data = N225_fileroad()
# クラス生成
class1 = N225_dataclass()
# dataロード
class1.set(data)
# Growthは?
growth = class1.growth_all()
#print(growth)
# 数値のみを取り出す
numeric_values1 = [value for value in growth.values() if isinstance(value, (int, float))]
#print(numeric_values)
# 3PF銘柄の場合
pf_samplenum = 10000
preturn = [0] * pf_samplenum
tiker_num = data.shape[1]
for i in range(pf_samplenum):
m1 = random.randrange(0, tiker_num)
m2 = random.randrange(0, tiker_num)
m3 = random.randrange(0, tiker_num)
preturn[i] = class1.PF3_vale(m1, m2, m3)
numeric_values2 = preturn
#nanを除去
cleaned_data1 = [x for x in numeric_values1 if not (isinstance(x, (int, float)) and math.isnan(x))]
cleaned_data2 = [x for x in numeric_values2 if not (isinstance(x, (int, float)) and math.isnan(x))]
# 3.0以上の要素を排除
cleaned_data1 = [x for x in cleaned_data1 if x < 3.0]
cleaned_data2 = [x for x in cleaned_data2 if x < 3.0]
# 平均を計算
average1 = statistics.mean(cleaned_data1)
print("単一銘柄の平均:", average1)
average2 = statistics.mean(cleaned_data2)
print("3PFの平均:", average2)
# 分散を計算
var_score1 = statistics.pvariance(cleaned_data1)
print("単一銘柄のGrowthの分散は", var_score1, "です。")
var_score2 = statistics.pvariance(cleaned_data2)
print("3PFのGrowthの分散は", var_score2, "です。")
#ヒストグラム x1 = cleaned_data1
x2 = cleaned_data2
#plt.hist(x1, range=[0.1, 3], bins=100, alpha=0.5, label="non PF", color='c')
plt.hist(x2, range=[0.1, 3], bins=100, alpha=0.5, label="3 PF", color='c')
plt.legend(loc="upper left")
plt.title('Asset Growth')
plt.show()
実行結果
単一銘柄の平均: 1.3316754402788267
3PFの平均: 1.503179891799661
単一銘柄のGrowthの分散は 0.3106975547638515 です。
3PFのGrowthの分散は 0.22205592977390637 です。
以前の(荒い)コードと結果は同じなので、計算は合ってるのでしょう。
ヒストグラム
![](https://assets.st-note.com/img/1718618929020-dE6S7DntkQ.png?width=800)
![](https://assets.st-note.com/img/1718618995168-sm7cIOqqnE.png?width=800)
所感
コーディングは作業
この記事が気に入ったらサポートをしてみませんか?