見出し画像

日本の自動車メーカーの株価を分析してみよう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 です。

以前の(荒い)コードと結果は同じなので、計算は合ってるのでしょう。

ヒストグラム

単一銘柄のGrowth分布


3銘柄PFのGrowth分布

所感

コーディングは作業


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