脳汁ドバドバどーぱみんっ

ちっぽけな青年による稚拙な文言

Pythonで株価予想を勉強し始めた

市場が荒れている年末年始を受けて、ちょっと興味が強くなったので株価が上がるか下がるかという簡単な程度で予測してみようと思い立った次第。

使うのはPython(というかほかにちょっとでも書けるのRとRubyしかないから選択肢orz) 機械学習も数理的最適化も無知の状態で挑むのはなかなか頭悪い気がするけど、困ってから考えればいいや精神

いろんなサイトを参考にしながら、では行きましょう。

流れとしては 1予想する銘柄と、学習用のデータの2018年分のデータをとってくる

2DataFrameで使いやすい形にする

3ランダムフォレスト

です

1ですが、予想する銘柄はAGC[5201]にします。理由はただ最近名前変わったから。で学習用には上場投資信託の1309, 1326, 1343, 1551を使います。適当です。 とってきたcsvデータをカレントディレクトリにおいて準備万端

import pandas as pd
from sklearn.ensemble import RandomForestClassifier

df = pd.read_csv("5201data.csv")
df.columns=["Date", "Open", "High", "Low", "Close", "Volume", "Trading Value"]
df["index"] = [i for i in range(len(df))]

etf_list = [1309, 1326, 1343, 1551]


for etf in etf_list:
    df_etf = pd.read_csv(str(etf) + 'data.csv')
    df_etf.columns=["Date", "Open", "High", "Low", "Close", "Volume", "Trading Value"]


    dates = []
    closeis = []
    for d in df["Date"]:
        date = df_etf.loc[(df_etf.Date == d), "Date"]
        yesterday_date = date.values[0]
        dates.append(date.values[0])

        close = df_etf.loc[(df_etf.Date == d), "Close"]
        if str(close.values[0]) != str("nan"):
            yesterday_close = close.values[0]
            closeis.append(close.values[0])

        else:
            closeis.append(yesterday_close)

    df_etf2 = pd.DataFrame({"Date_" + str(etf) : dates, "Close_" + str(etf) : closeis})
    df = pd.concat([df, df_etf2], axis=1)
    df["diff_" + str(etf)] = (df["Close_" + str(etf)]/df["Close_" + str(etf)].shift(-1))-1

df = df.drop(0) #初日を削除(前日比がNaNになるから)

これでdfを各日にちのそれぞれの株価の終値がみやすく並んだデータにできました

df = df.sort_values(by=["index"], ascending=False)
df_train = df.iloc[0:len(df)-1]
df_test = df.iloc[len(df)-1:len(df)]

xlist = ["diff_1309","diff_1326","diff_1343","diff_1551"]
x_train=[]
y_train=[]

for s in range(0, len(df_train)-1):
    x_train.append(df_train[xlist].iloc[s])

    if df_train["Close"].iloc[s+1] > df_train["Close"].iloc[s]:
        y_train.append(1)
    else:
        y_train.append(-1)

rf = RandomForestClassifier(n_estimators=len(x_train), random_state=0)
rf.fit(x_train, y_train)
test_x = df_test[xlist].iloc[0]
test_y = rf.predict(test_x.reshape(1,-1))

あとはランダムフォレストするだけ。。。と思いきや最後の行でエラーを吐かれる

なんでやねん!!

ここまでのコードはほとんど先駆者の真似してるんですけどなんでエラー出るのかちょっと考えただけじゃわかんなかったんでまた今度やります