Concernant l'interpolation des données, nous avons déjà traité des données de séries chronologiques ordinaires. Cette fois, en interpolant les données quotidiennes à des fins de backtesting, nous avons créé des données de 6 heures, 4 heures, 1 heure et 10 minutes et vérifié leur exactitude.
・ Formule d'interpolation de Lagrange ・ Interpolation des données Pandas ・ Création de données de 6 heures à 10 minutes ・ Voir la précision
【référence】 ・ [Interpolation] Interpolation de l'interpolation linéaire à l'interpolation quadratique et à l'interpolation de Lagrange ♬ Tout d'abord, la fonction d'interpolation linéaire passant par (x0, y0), (x1, y1) peut être calculée par la fonction suivante.
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)
Une fonction d'interpolation quadratique qui passe par trois points (x0, y0), (x1, y1), (x2, y2) peut être calculée comme suit.
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
En combinant ces derniers, si le traitement du point final est une fonction qui passe par les deux points ci-dessus et que les autres fonctions qui passent par trois points sont utilisées, la fonction qui interpole 10 points entre les deux points est la suivante.
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)
La dernière fois, j'ai dit qu'une interpolation d'ordre n est également possible, mais en interpolation réelle, une fonction lisse est obtenue avec la fonction ci-dessus qui combine une interpolation quadratique, donc j'adopterai cette fois également la fonction ci-dessus. Cette fois, en remplaçant la variable y de cette fonction par des données Pandas, nous créerons des données d'interpolation pour les données d'échange et de stock.
À partir de la conclusion, les fonctions d'interpolation linéaire et d'interpolation quadratique ne changent pas. Ensuite, le calcul du point de division m peut être calculé par la fonction suivante. Tout d'abord, lisez les données d'échange avec pandas.DataReader.
df=DataReader.get_data_yahoo("{}".format("JPY=X"),start,end)
Ensuite, si vous remplacez y par df ["Fermer"] et calculez séquentiellement comme indiqué ci-dessous, vous pouvez également calculer les données Pandas.
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)
Ensuite, dfsigxm calculé en changeant m par la fonction ci-dessus est tracé par la fonction plot_fig (data_df, dfsig, m, end) suivante.
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()
Vous pouvez calculer 6 heures de données avec m = 4, 4 heures avec m = 6, 1 heure avec m = 24 et 10 minutes avec m = 24 * 6. Les résultats sont les suivants. Puisque m = 1 est un graphique droit, les points finaux restent, mais à part cela, il n'y a presque aucun changement, y compris la vue agrandie ci-dessous, mais la densité du tracé a augmenté, et si vous regardez de près, les nombres sur l'axe horizontal ont augmenté Je comprends.
Il est facile de le comparer avec la barre réelle de 10 minutes, mais il semble qu'aucun site ne puisse l'obtenir.
・ Des données de 6 heures, 4 heures, 1 heure et 10 minutes ont été créées en acquérant des données d'échange quotidiennes avec des pandas et en les interpolant. ・ Une chaîne de données fluide a été créée
・ Malheureusement, il n'a pas été possible de comparer et de vérifier avec les données réelles.
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)