In Bezug auf die Dateninterpolation haben wir uns zuvor mit gewöhnlichen Zeitreihendaten befasst. Dieses Mal haben wir durch Interpolation der täglichen Daten zum Zweck des Backtests 6-Stunden-, 4-Stunden-, 1-Stunden- und 10-Minuten-Daten erstellt und deren Richtigkeit überprüft.
・ Lagrange-Interpolationsformel ・ Interpolation von Pandas-Daten ・ 6 Stunden bis 10 Minuten Datenerstellung ・ Siehe Genauigkeit
【Referenz】 ・ [Interpolation] Interpolieren von linearer Interpolation zu quadratischer Interpolation und Lagrange-Interpolation ♬ Zunächst kann die durch (x0, y0), (x1, y1) gehende lineare Interpolationsfunktion durch die folgende Funktion berechnet werden.
def interpolation(x0,y0,x1,y1,x):
dn = (x0-x1)
return y0*(x-x1)/dn + y1*(x0-x)/dn
#Lagrange interpolation
# y0*(x-x1)/(x0-x1)+y1*(x-x0)/(x1-x0)
Eine quadratische Interpolationsfunktion, die drei Punkte (x0, y0), (x1, y1), (x2, y2) durchläuft, kann wie folgt berechnet werden.
def interpolation2(x0,y0,x1,y1,x2,y2,x):
dn1 = (x0-x1)*(x0-x2)
dn2 = (x1-x2)*(x1-x0)
dn3 = (x2-x0)*(x2-x1)
return y0*(x-x1)*(x-x2)/dn1+y1*(x-x2)*(x-x0)/dn2+y2*(x-x0)*(x-x1)/dn3
Wenn die Endpunktverarbeitung eine Funktion ist, die die obigen zwei Punkte durchläuft und die anderen Funktionen, die drei Punkte durchlaufen, kombiniert werden, ist die Funktion, die 10 Punkte zwischen den beiden Punkten interpoliert, wie folgt.
m=10
sigxm=np.zeros(m*pitch-(m-1))
sigxm[0]=y[0]
sigxm[m*pitch-m]=y[pitch-1]
for i in range(1,m*pitch-m,1):
if i%m==0:
sigxm[i]=y[int(i/m)]
if i > m*pitch-(2*m+1):
sigxm[i] = interpolation(int(i/m),y[int(i/m)],int(i/m)+1,y[int(i/m)+1],int(i/m)+(i%m)/m)
else:
sigxm[i] = interpolation2(int(i/m),y[int(i/m)],int(i/m)+1,y[int(i/m)+1],int(i/m)+2,y[int(i/m)+2],int(i/m)+(i%m)/m)
Letztes Mal habe ich gesagt, dass auch eine Interpolation n-ter Ordnung möglich ist, aber bei der tatsächlichen Interpolation wird eine glatte Funktion mit der obigen Funktion erhalten, die die quadratische Interpolation kombiniert, so dass ich die obige Funktion auch dieses Mal übernehmen werde. Dieses Mal erstellen wir durch Ersetzen der Variablen y dieser Funktion durch Pandas-Daten Interpolationsdaten für Umtausch- und Bestandsdaten.
Aus der Schlussfolgerung heraus ändern sich die linearen Interpolations- und quadratischen Interpolationsfunktionen nicht. Dann kann die Berechnung des m-Teilungspunktes durch die folgende Funktion berechnet werden. Lesen Sie zuerst die Austauschdaten mit pandas.DataReader.
df=DataReader.get_data_yahoo("{}".format("JPY=X"),start,end)
Wenn Sie dann y durch df ["Schließen"] ersetzen und wie unten gezeigt nacheinander berechnen, können Sie auch Pandas-Daten berechnen.
m=24
sigxm=np.zeros(m*pitch-(m-1))
sigxm[0]=df["Close"][0]
sigxm[m*pitch-m]=df["Close"][pitch-1]
for i in range(1,m*pitch-m,1):
if i%m==0:
sigxm[i]=df["Close"][int(i/m)]
if i > m*pitch-(2*m+1):
sigxm[i] = interpolation(int(i/m),df["Close"][int(i/m)],int(i/m)+1,df["Close"][int(i/m)+1],int(i/m)+(i%m)/m)
else:
sigxm[i] = interpolation2(int(i/m),df["Close"][int(i/m)],int(i/m)+1,df["Close"][int(i/m)+1],int(i/m)+2,df["Close"][int(i/m)+2],int(i/m)+(i%m)/m)
dfsigxm = pd.DataFrame()
dfsigxm["sig"] = sigxm
date_df=dfsigxm['sig'].index.tolist()
plot_fig(date_df,dfsigxm,m,end)
Dann wird dfsigxm, berechnet durch Ändern von m durch die obige Funktion, durch die folgende Funktion plot_fig (data_df, dfsig, m, end) aufgezeichnet.
def plot_fig(data_df,dfsig,m,end):
fig, (ax1,ax2) = plt.subplots(2,1,figsize=(1.6180 * 8, 4*2),dpi=100)
ax1.plot(date_df[0:],dfsig["sig"][0:])
ax2.plot(date_df[0:32*m],dfsig["sig"][0:32*m])
ax1.grid()
ax2.grid()
plt.pause(1)
plt.savefig("./fx/{}_{}_{}_{}_.png ".format(m,"interpolate","JPN=X",end))
plt.close()
Sie können 6 Stunden Daten mit m = 4, 4 Stunden mit m = 6, 1 Stunde mit m = 24 und 10 Minuten mit m = 24 * 6 berechnen. Die Ergebnisse sind wie folgt. Da m = 1 ein gerader Graph ist, bleiben die Endpunkte erhalten, aber ansonsten gibt es fast keine Änderung, einschließlich der vergrößerten Ansicht unten, aber die Plotdichte hat zugenommen, und wenn Sie genau hinschauen, haben sich die Zahlen auf der horizontalen Achse erhöht. Ich verstehe.
Das Einfache ist, es mit der tatsächlichen 10-Minuten-Bar zu vergleichen, aber es scheint, dass es keine Website gibt, die es bekommen kann.
・ 6 Stunden, 4 Stunden, 1 Stunde und 10 Minuten Daten wurden erstellt, indem tägliche Austauschdaten mit Pandas erfasst und interpoliert wurden. ・ Es wurde eine glatte Datenzeichenfolge erstellt
・ Leider war es nicht möglich, mit den tatsächlichen Daten zu vergleichen und zu verifizieren.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pandas_datareader.data as DataReader
import datetime as dt
def plot_fig(data_df,dfsig,m,end):
fig, (ax1,ax2) = plt.subplots(2,1,figsize=(1.6180 * 8, 4*2),dpi=100)
ax1.plot(date_df[0:],dfsig["sig"][0:],"o-")
ax2.plot(date_df[0:32*m],dfsig["sig"][0:32*m],"o-")
ax1.grid()
ax2.grid()
plt.pause(1)
plt.savefig("./fx/{}_{}_{}_{}_.png ".format(m,"interpolate","JPN=X",end))
plt.close()
def interpolation(x0,y0,x1,y1,x):
return y0 + (y1 - y0) * (x - x0) / (x1 - x0)
def interpolation2(x0,y0,x1,y1,x2,y2,x):
dn1 = (x0-x1)*(x0-x2)
dn2 = (x1-x2)*(x1-x0)
dn3 = (x2-x0)*(x2-x1)
return y0*(x-x1)*(x-x2)/dn1+y1*(x-x2)*(x-x0)/dn2+y2*(x-x0)*(x-x1)/dn3
def calc_interpolate(df,pitch,m):
sigxm=np.zeros(m*pitch-(m-1))
sigxm[0]=df["Close"][0]
sigxm[m*pitch-m]=df["Close"][pitch-1]
for i in range(1,m*pitch-m,1):
if i%m==0:
sigxm[i]=df["Close"][int(i/m)]
if i > m*pitch-(2*m+1):
sigxm[i] = interpolation(int(i/m),df["Close"][int(i/m)],int(i/m)+1,df["Close"][int(i/m)+1],int(i/m)+(i%m)/m)
else:
sigxm[i] = interpolation2(int(i/m),df["Close"][int(i/m)],int(i/m)+1,df["Close"][int(i/m)+1],int(i/m)+2,df["Close"][int(i/m)+2],int(i/m)+(i%m)/m)
return sigxm
start = dt.date(2020,1,1)
end = dt.date(2020,6,15)
df=DataReader.get_data_yahoo("{}".format("JPY=X"),start,end)
m=1
dfsigxm = pd.DataFrame()
dfsigxm["sig"] = df["Close"]
print(dfsigxm)
date_df=dfsigxm['sig'].index.tolist()
plot_fig(date_df,dfsigxm,m,end)
m=4
pitch = len(df)
sigx2=calc_interpolate(df,pitch,m)
dfsigx2 = pd.DataFrame()
dfsigx2["sig"] = sigx2
print(dfsigx2)
date_df=dfsigx2['sig'].index.tolist()
plot_fig(date_df,dfsigx2,m,end)
m=6
sigxm=calc_interpolate(df,pitch,m)
dfsigxm = pd.DataFrame()
dfsigxm["sig"] = sigxm
print(dfsigxm)
date_df=dfsigxm['sig'].index.tolist()
plot_fig(date_df,dfsigxm,m,end)
m=24
sigxm=calc_interpolate(df,pitch,m)
dfsigxm = pd.DataFrame()
dfsigxm["sig"] = sigxm
print(dfsigxm)
date_df=dfsigxm['sig'].index.tolist()
plot_fig(date_df,dfsigxm,m,end)
m=24*6
sigxm=calc_interpolate(df,pitch,m)
dfsigxm = pd.DataFrame()
dfsigxm["sig"] = sigxm
print(dfsigxm)
date_df=dfsigxm['sig'].index.tolist()
plot_fig(date_df,dfsigxm,m,end)