Python ガウス基底関数フィッティング
豪ドル/円チャ-トロ-ソク足表示 gauss/fit ファイルまとめ
ここまで、豪ドル/円チャ-トロ-ソク足表示 gauss/fit ファイルについていろいろと説明してきました。
まとめると以下のようになります。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import datetime
def addBusinessDays(from_date, add_days):
cur_date8 = [] # 21/03/30
cur_date4 = [] # 3/30
business_days_to_add = add_days
current_date = from_date
while business_days_to_add > 0:
current_date += datetime.timedelta(days=1)
weekday = current_date.weekday()
if weekday >= 5: # sunday = 6
continue
#土日は以下はスキップ
# 年/月/日として文字列にする
#例 21/03/30
e11 = current_date.strftime("%y/%m/%d")
e22 = e11.replace("/0", "/")
e33 = e22[3:] # 21/ 削除
cur_date8.append(e22)
cur_date4.append(e33)
business_days_to_add -= 1
return cur_date8, cur_date4
import pandas as pd
import numpy as np
from datetime import datetime as dt
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick_ohlc
#ガウス関数定義
def gauss(x, mu, s):
return np.exp(-(x - mu)**2 / (2 * s**2))
"""
線形基底関数モデル ----------------
y(x,w) = w0Φo(x) + w1Φ1(x) + w2Φ2(x) + w3
なら len(w) = 4 ∴ m = 3
mu = np.linspace(0, xx, m)
s = mu[1] - mu[0]
s は隣り合ったガウス関数の中心間の距離
設計者が決定
s と mu の値は w 同様あらかじめ
線形基底関数モデル厳密解
で計算しておく
"""
def gauss_func(w, x):
# m = len(w) - 1
# xx = len(x) - 1
y = np.zeros_like(x) # x と同じサイズで要素が 0 の行列 y を作成
for j in range(m):
y = y + w[j] * gauss(x, mu[j], s)
y = y + w[m]
return y
# 線形基底関数モデル 厳密解 -----------------
def fit_gauss_func(x, t, m):
x1 = len(x) - 1
mu = np.linspace(0, x1, m)
s = mu[1] - mu[0]
n = x.shape[0]
psi = np.ones((n, m+1))
for j in range(m):
psi[:, j] = gauss(x, mu[j], s)
psi_T = np.transpose(psi)
b = np.linalg.inv(psi_T.dot(psi))
c = b.dot(psi_T)
w = c.dot(t)
return w, mu, s, m
# np.dot(A, B) と A.dot(B) は同じ
def min_max(xx, axis = None): # 配列の軸方向は考えない
min = xx.min(axis=axis,keepdims=True) # 次元は減らさない
max = xx.max(axis=axis,keepdims=True)
result = (xx-min)/(max-min)
return result, min ,max
# Start
xl_df = pd.read_csv("/home/yamada/public_html/manep/mane_chart_go.csv", encoding="cp932")
Open = xl_df["始値(売り)"].values
High = xl_df["高値(売り)"].values
Low = xl_df["安値(売り)"].values
Date = xl_df["日付"].values
Idx = xl_df.index
tstr = Date[-1]
tdatetime = dt.strptime(tstr, '%Y/%m/%d %H:%M:%S')
# 文字列をdatetimeに変換するのがstrptime()関数
# datetime.datetime.strptime(文字列, 書式指定文字列)
lastday = addBusinessDays(tdatetime, 5)
xDate = []
xD = []
for i, key in enumerate(Date):
if(i % 10 == 0):
e4 = str(key)[4:10]
e6 = e4.replace("/0", "/")
e8 = e6.lstrip("/")
xDate.append(e8)
xD.append(i)
xDate.append(lastday[1][4])
xD.append(i + 5)
Close0 = xl_df["終値(売り)"].values
Close1,Close1_min,Close1_max = min_max(Close0)
# Close1=正規化値
# 最安値(Close1_min)
# 最高値(Close1_max)
app = Close1[-1:]
app1 = np.hstack((app, app, app, app, app))
Close2 = np.hstack((Close1, app1))
# メイン ----------------------------------
M = 12
Idx5 = Idx[-5:] + 5
X = np.hstack((Idx, Idx5))
W, mu, s, m = fit_gauss_func(Idx, Close1, M)
y = gauss_func(W, X)
val_ch = y * (Close1_max - Close1_min) + Close1_min
ohlc = zip(
Idx, Open, High, Low, Close0)
fig = plt.figure(
figsize=(8.34, 5.56))
# python スクリプトと Jupyter とでは、
# matplotlib の図のサイズが違うので注意
ax = fig.add_subplot(1,1,1)
ax.grid()
# GAUSS 解析結果表示
plt.plot(
Idx, val_ch[:-5],
Idx5, val_ch[-5:], 'bo')
# ----------------
candlestick_ohlc(
ax, ohlc, width=0.5, alpha = 1,
colorup='r', colordown='g')
plt.xticks(xD, xDate)
plt.title('AUS$ / JPY chart')
plt.xlabel('Date')
plt.ylabel('Yen')
# plt.show()
plt.savefig(
'/home/yamada/public_html/manep-img/mane_chart_go-gau.png')
print("予測値=最終日+1~+5日")
valhe = np.round(val_ch[-5:], 3)#3桁まで表示
valhe_pd = pd.DataFrame(valhe)
# pandas concat 関数で横(列)方向へ連結する、axis=1 を忘れないこと
lastday_pd = pd.DataFrame(lastday[0])
df_concat = pd.concat([lastday_pd, valhe_pd], axis = 1)
print(df_concat)
df_concat.to_csv(
'/home/yamada/public_html/manep-img/mane_chart_go-gau.csv',
header=False, index=False)
ここまでで、豪ドル/円チャ-トロ-ソク足表示 gauss/fit ファイルがまとまりました。
引き続きこのファイルの動作確認をしていきます。