よちよちpython

独習 python/Qpython/Pydroid3/termux

Numpyだけで回帰分析その2。株価グラフにフィット【Python機械学習】

Numpyだけで回帰分析その2。
株価の変動を追っかけるテスト。
説明的なもの無し。



実行環境


Androidスマホ
termux
Python3.8
JupyterNotebook

  • 使用するPythonライブラリ
    • Numpy
    • Pandas
    • matplotlib



目的


  • Numpy.polyfit()Numpy.poly1d()の使い方にとりあえず慣れる。

  • 株価のデータにどのようなフィットがなされるか観察する。

  • グラフ描画に慣れる。



実験スタート


file = "nikkei_monthly.csv"
import numpy as np
import pandas as pd
df = pd.read_csv(
    file, 
    encoding="shiftjis",
    index_col=0,
    skipfooter=1, 
    engine='python',
    usecols=[0,1],
)
df.isnull().sum()
終値    0
dtype: int64
x = np.arange(df.shape[0]) + 1
x.size
241
y = np.array(df.iloc[:,0])

時間軸x,株価軸yの配列ができた。

import matplotlib.pyplot as plt

plt.plot(x, y)

plt.xlabel("Days")
plt.ylabel("Price")
plt.title("Nikkei Stock Average")
plt.grid()

plt.savefig("stock_price.png")
plt.show()

f:id:chayarokurokuro:20200120145349p:plain



ここから回帰分析


多項式 1次まで

func = np.polyfit(x, y ,1)
func
array([  36.3398427 , 9910.40143983])
y_new = np.poly1d(func)(x)
import matplotlib.pyplot as plt

plt.plot(x, y)
plt.plot(x, y_new, color="red")

plt.xlabel("Days")
plt.ylabel("Price")
plt.title("Nikkei Stock Average")
plt.grid()

plt.savefig("stock_price_1.png")
plt.show()

f:id:chayarokurokuro:20200120145429p:plain

多項式 2次まで

# --- 2次
func = np.polyfit(x, y ,2)
y_new = np.poly1d(func)(x)

# --- グラフ描画 ---
import matplotlib.pyplot as plt

# 株価グラフ
plt.plot(x, y)
# 回帰グラフ
plt.plot(x, y_new, color="red")

plt.xlabel("Days")
plt.ylabel("Price")
plt.title("Nikkei Stock Average")
plt.grid()

plt.savefig("stock_price_2.png")
plt.show()

f:id:chayarokurokuro:20200120145534p:plain

多項式 n次まで

# --- 1次
func = np.polyfit(x, y ,1)
y_new = np.poly1d(func)(x)
# --- 2次
func2 = np.polyfit(x, y ,2)
y_new2 = np.poly1d(func2)(x)
# --- 3次
func3 = np.polyfit(x, y ,3)
y_new3 = np.poly1d(func3)(x)
# --- 4次
func4 = np.polyfit(x, y ,4)
y_new4 = np.poly1d(func4)(x)
# --- 10次
func10 = np.polyfit(x, y ,10)
y_new10 = np.poly1d(func10)(x)
# --- 20次
func20 = np.polyfit(x, y ,20)
y_new20 = np.poly1d(func20)(x)


# --- グラフ描画 ---
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(12,8))

# 株価グラフ
ax = fig.add_subplot(111)
# 回帰グラフ
#ax1 = fig.add_subplot(722)
#ax2 = fig.add_subplot(723)

ax.plot(x,y, color="black", label="PRICE")
ax.plot(x, y_new, color="blue", label="1")
ax.plot(x, y_new2, color="red" , label="2")
ax.plot(x, y_new3, color="green", label="3")
ax.plot(x, y_new4, color="pink", label="4")
ax.plot(x, y_new10, color="orange", label="10")
ax.plot(x, y_new20, color="purple", label="20")

ax.set_xlabel("Days")
ax.set_ylabel("Price")
ax.set_title("Nikkei Stock Average")
ax.legend()

plt.style.use("ggplot")
plt.savefig("stock_price_3.png")
plt.show()
/data/data/com.termux/files/home/py3.8/lib/python3.8/site-packages/IPython/core/interactiveshell.py:3319: RankWarning: Polyfit may be poorly conditioned
  exec(code_obj, self.user_global_ns, self.user_ns)


多項式の次数を上げていく時にサンプルポイントの間隔が不適切な場合やなんかにこの警告が出るのだと。Numpyのpolyfit()関数。

python - How to fixed "polyfit maybe poorly conditioned" in numpy? - Stack Overflow


f:id:chayarokurokuro:20200120145633p:plain