さくら VPS Python 豪ドル/円 4時間足予測
Numpy polyfit 関数で豪ドル/円4時間足予測
ここまでで
Numpy polyfit 関数 Python 多項式フィッティング
を実行する準備ができましたので、これを用いて豪ドル/円を予測します。
まずは暫定予測値を作成します。
確定している終値は
Close = xl_df["終値(売り)"].values
でした。
多項式フィッティング予測での大きな問題点としては データがある部分のフィッティングにのみに引っ張られて
データがない予測したい部分はいい加減になってしまうことです。
要するにフィッティングさえできれば満足してしまうのです。
よって予測精度が落ちてしまいます。
そこで、シンプルな予測値をあらかじめ設定することによりこの問題を回避します。
今回採用したのは、N番目の4時間足の終値は、次のN+1番目の4時間足の終値に引き継がれると予測する考えです。
app = Close[-1:]
app1 = np.hstack((app, app, app, app, app, app))
Close1 = np.hstack((Close, app1))
として、この Close1 を解析することによって未来6番目の4時間足を予測します。
np.hstack((a, b)) は ndarray 配列 a と b を結合してくれます。
Idx は X 軸でデ-タの数だけあります。
Idx6 は未来4時間足6本分の X 軸です。
Idx = xl_df.index
Idx6 = Idx[-6:] + 6
Idxlg = np.r_[Idx, Idx6]
np.r_ : 配列の結合
関数ではないので引数とかを指定するのではなく[ ]の中に結合したい配列を指定します。
Idxlg は未来値も含めたト-タル数になります。
これで、Numpy polyfit 関数 Python 多項式フィッティングの準備完了です。
あとは、以下のコマンドでフィッティングしてくれます。
z = np.polyfit(Idxlg, Close1, 9)
p = np.poly1d(z)
p_pand = np.round(p(Idx6),3)
print("予測値=最終4時間足 +1~+6日")
print(np.round(p(Idx6),3))
たったこれだけです。
フィッティング関数 np.polyfit()
z = np.polyfit(Idx, Close, 9)
を設定します。
第1引数には x 軸値の配列
第2引数には y 軸値の配列
第3引数には 多項式関数の次数
を設定します。
今回次数は 9 としました。
なぜ、多項式関数の次数が 9 なのか難しい質問ですね。
数年の経験値から 100個ぐらいのデ-タの場合は4~9次ぐらいが良いようです。
急激な変化があったときは、4次ぐらいでもそれなりの結果がでます。
あまり変化のないときは7~9次ぐらいをお薦めします。
固定値にするなら5次をお薦めします。
フィッティング結果(予測値)は、np.poly1d() 関数で求めることができます。
p = np.poly1d(z)
このままだと小数点以下が長く見にくい値ですので、Numpy round 関数を使ってこれを小数点以下3桁の数値に整形して見やすくします。
np.round(p(Idx6),3) で小数点以下3桁で丸めています。
第2引数の 3 は小数点以下の桁数指定です。
print 文2行の結果は
予測値=最終4時間足 +1~+6日
[83.111 83.144 **.*** **.*** 83.598 84.141]
のように表示されます。
豪ドル/円 CSV ダウンロ-ドデ-タをロ-ソク足表示
ダウンロ-ドした
manep_4h/mane_chart_go_4h.csv
デ-タをロ-ソク足表示していきます。
ロ-ソク足表示に必要なデ-タは
Open = xl_df["始値(売り)"].values
High = xl_df["高値(売り)"].values
Low = xl_df["安値(売り)"].values
Close = xl_df["終値(売り)"].values
Date = xl_df["日付"].values
Idx = xl_df.index
の6列です。
なお Close と Idx は多項式フィッティングの為にすでに読込み済みです。
X 軸日付処理
manep_4h/mane_chart_go_4h.csv デ-タの中の日付は
2020/10/20 00:00:00
のようになっており、そのまま X 軸日付表示をさせるには文字列が長すぎます。
よってこれを 10/20 のように短縮します。
抜き出す日付は、時刻が 00:00:00 となっている日付すなわち
例) 2022/02/15 00:00:00
の年月日時です。
- 型変換
Pandas で抜き取った Date は リスト型になっています。
これを str 型 に変換します。
変換しても CSV 書式がそのまま残っていますので、
2020/02/15 00:00:00
のように変換されます。
余計な文字列が沢山ありますので、これを削除していきます。
必要なのは、月日の /02/15 です。
左から 0~3 の 4 文字と10文字以降は必要ないので
e4 = str(Date[i])[4:10]
とすると、6文字が取得され
e4 には /10/20 が入ります。 - 月日が1桁の時
月日が1桁の時は、/01 のような形をしています。
0 は余計なのでこれを削除します。
Python 組込関数 replace()を使って、一旦 /0 を / に置き換えます。
第一引数に置換元文字列、第二引数に置換先文字列を指定します。
e6 = e4.replace("/0", "/")
e6 には /2/15 が入りました。
もし /10/20 だったら /10/20 が e6 に入ります。 - 左端の / を削除
Python 組込関数 lstrip() で、左端の / を削除します。
e8 = e6.lstrip("/")
e8 には 2/15 が入りました。 - 繰返して X 軸日付処理
xData は X 軸の目盛り日付です。
そして、Python 組込関数 enumerate()を使って Date デ-タがある限り、i = 0 から 順番に for 分で処理を繰り返します。
Date の中に 101個のデ-タが存在するとすれば、i は 0~100 まで変化します。
今回は、中1日ごとに(2日に一回、00:00:00 を見つけたら) X 軸日付を付与します。
中1日ごとに 00:00:00 を探すために、フラグ dayf(最初は dayf = 0)を設定します。
このフラグが 0 なら X 軸日付を付与し、dayf = 1 とします。
フラグが 1 なら付与せず、dayf = 0 とします。 - ラストの X 軸日付処理
実デ-タが存在し、かつ dayf == 0 の時はラスト(最新)の日付には時刻表示を含めた X 軸日付を付与します。
if(dayf == 0): e4l = tstr[7:14] e6l = e4l.replace("/0", "/") e8l = e6l.lstrip("/") xDate.append(e8l) xD.append(i)
X 軸日付処理についてここまでをまとめると以下のようになります。
xDate = [] xD = [] dayf = 0 for i, key in enumerate(Date): day00 = str(key)[11:19] if((dayf == 1) and (day00 == '00:00:00')): dayf = 0 else: if((dayf == 0) and (day00 == '00:00:00')): e4 = str(key)[4:10] e6 = e4.replace("/0", "/") e8 = e6.lstrip("/") xDate.append(e8) xD.append(i) dayf = 1 if(dayf == 0): e4l = tstr[7:14] e6l = e4l.replace("/0", "/") e8l = e6l.lstrip("/") xDate.append(e8l) xD.append(i)
ここまでで
豪ドル/円4時間足 CSV ダウンロ-ドデ-タのロ-ソク足表示の X 軸日付処理が終了しました。
引き続き、X 軸日付予測4時間足最終日時を取得します。