Python ガウス基底関数フィッティング
豪ドル/円チャ-トロ-ソク足表示 gauss/fit
ここまでで、ガウス基底関数フィッティング準備が完了しました。
引き続き、
豪ドル/円チャ-トをロ-ソク足表示し、ガウス基底関数フィッティング処理後の結果と重ね合わせて
表示できるようにします。
Python FFT & IFFT//豪ドル/円チャ-トロ-ソク足表示
からファイル内容を抜粋します。
赤字は一部手直しをした部分です。
なお、ロ-ソク足表示部分の詳細については
ロ-ソク足本体の表示
を参照してください。
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
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
# ガウス基底関数計算はここに挿入
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()
# ガウス基底関数計算結果表示はここに挿入
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')
ガウス基底関数計算
線形基底関数モデル厳密解を求める関数は定義済ですので、 終値を抽出して、正規化して、厳密解を求め、フィティング曲線を作成、逆正規化すれば終りです。
- 終値の抽出
Close0 = xl_df["終値(売り)"].values
Close0 に終値が抽出されました。
簡単ですね。 - 正規化
終値 Close0 を正規化します。
Close1,Close1_min,Close1_max = min_max(Close0)
Close1 = 正規化値
最安値 = Close1_min
最高値 = Close1_max
です。 - ガウス基底関数予測問題点
ガウス基底関数予測での大きな問題点としては データがある部分のフィッティングにのみに引っ張られて データがない予測したい部分はいい加減になってしまうことです。
要するにフィッティングさえできれば満足してしまうのです。
よって予測精度が落ちてしまいます。
そこで、シンプルな予測値をあらかじめ設定することによりこの問題を回避します。
今回採用したのは、N日足の終値は、次のN日足の終値に引き継がれると予測する考えです。
app = Close1[-1:]
app1 = np.hstack((app, app, app, app, app))
Close2 = np.hstack((Close1, app1))
として、この Close2 を解析することによって未来5日間を予測します。
np.hstack((a, b)) は ndarray 配列 a と b を結合してくれます。
Idx は X 軸でデ-タの数だけあります。
Idx5 は未来5日間分の X 軸です。 - 厳密解を求める
M = 12
W, mu, s, m = fit_gauss_func(Idx, Close1, M)
今回は、M の値は 12 としました。
12 個のガウス関数を並べてフィッティングします。
これもすでに関数が定義してあるので簡単ですね。 - フィティング曲線
線形基底関数モデルを使ってフィティング曲線を求めます。
5日先までの X軸 Idx5 を作成
Idx5 = Idx[-5:] + 5
実デ-タが存在する X軸 Idx と合体する
X = np.hstack((Idx, Idx5))
y = gauss_func(W, X)
y がフィティング曲線です。
5日分の予測値が含まれています。 - 逆正規化
正規化された値 y を逆正規化して元の値 val_ch に戻します。
val_ch = y * (Close1_max - Close1_min) + Close1_min
ガウス基底関数計算結果表示
引き続きガウス基底関数計算結果を表示していきます。
plt.plot(
Idx, val_ch[:-5],
Idx5, val_ch[-5:], 'bo')
matplotlib で表示するにはたったこれだけです。
'bo' とすると●印でプロットされます。
予測値格納
予測日とその予測値の一覧表をつくるための CSV ファイルを作成します。
- 予測日/予測値の一覧表作成
予測日 lastday[0] に対応する予測値は val_ch[-5:] となっており ここに5日分のデ-タがあります。
この二つの配列を一緒にして CSV ファイルにすることができれば
「予測日/予測値 一覧」
にすることができます。 - 予測日/予測値の配列を合体
2つの配列を pandas concat 関数を使用して横(列)方向へ連結することにします。
まずは、それぞれの配列を DataFrame 型に変換します。
これで、pandas で操作することが可能になりました。
import pandas as pd
lastday_pd = pd.DataFrame(lastday[0])
valhe_pd = pd.DataFrame(val_ch[-5:],3)
#3桁まで表示
この2つを pandas concat 関数で横(列)方向へ連結します。
横(列)方向指定 axis = 1 を忘れないでください。
df_concat-f = pd.concat([lastday_pd, valhe_pd], axis = 1)
これを csv ファイルとして保存します。
保存するファイルフォルダ名は絶対パスで指定します。
そして、header=False, index=False としてヘッダとインデックスは保存なしとします。
df_concat-f.to_csv(
'/home/yamada/public_html/manep-img/mane_chart_go-gau.csv',header=False,index=False)
ここまで、豪ドル/円チャ-トロ-ソク足表示 gauss/fit ファイルについていろいろと説明してきました。
引き続き、これらの内容をまとめます。