[PYTHON] [Introduction à Pandas] J'ai essayé d'augmenter les données d'échange par interpolation de données ♬

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.

Ce que j'ai fait

・ Formule d'interpolation de Lagrange ・ Interpolation des données Pandas ・ Création de données de 6 heures à 10 minutes ・ Voir la précision

・ Formule d'interpolation de Lagrange

【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.

・ Interpolation des données Pandas

À 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()

・ Création de données de 6 heures à 10 minutes

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. hokan_USDJPY.gif

・ Voir la précision

Il est facile de le comparer avec la barre réelle de 10 minutes, mais il semble qu'aucun site ne puisse l'obtenir.

Résumé

・ 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.

Code entier

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)

Recommended Posts

[Introduction à Pandas] J'ai essayé d'augmenter les données d'échange par interpolation de données ♬
[Introduction à la simulation] J'ai essayé de jouer en simulant une infection corona ♬
[Introduction à la simulation] J'ai essayé de jouer en simulant une infection corona ♬ Partie 2
[Pandas] J'ai essayé d'analyser les données de ventes avec Python [Pour les débutants]
J'ai essayé l'analyse de données IRMf avec python (Introduction au décodage des informations cérébrales)
J'ai essayé de programmer la bulle de tri par langue
J'ai essayé d'obtenir une image en grattant
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé de classer les boules de dragon par adaline
[Introduction au PID] J'ai essayé de contrôler et de jouer ♬
J'ai essayé de récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
[Introduction à Docker] J'ai essayé de résumer diverses connaissances Docker acquises en étudiant (Windows / Python)
J'ai essayé de déboguer.
Je veux donner un group_id à une trame de données pandas
J'ai essayé de prédire le match de la J League (analyse des données)
[Introduction à Pytorch] J'ai essayé de catégoriser Cifar10 avec VGG16 ♬
J'ai essayé de résumer comment utiliser les pandas de python
[Introduction à AWS] J'ai essayé de jouer avec la conversion voix-texte ♪
[Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant l'arbre de dichotomie
[Première science des données ⑤] J'ai essayé d'aider mon ami à trouver la première propriété par analyse de données
J'ai essayé de prédire les courses de chevaux en faisant tout, de la collecte de données à l'apprentissage en profondeur
[Introduction] J'ai essayé de l'implémenter moi-même tout en expliquant pour comprendre la dichotomie
J'ai essayé d'agréger et de comparer les données de prix unitaires par langue avec Real Gachi by Python
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
J'ai créé une fonction pour récupérer les données de la colonne de base de données par colonne en utilisant sql avec sqlite3 de python [sqlite3, sql, pandas]
Django super introduction par les débutants Python! Partie 6 J'ai essayé d'implémenter la fonction de connexion
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
J'ai essayé d'apprendre PredNet
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé d'implémenter la détection d'anomalies par apprentissage de structure clairsemée
[J'ai essayé d'utiliser Pythonista 3] Introduction
J'ai essayé d'organiser SVM.
J'ai essayé d'accélérer la création vidéo en traitant en parallèle
J'ai essayé d'implémenter PCANet
Introduction à l'optimisation non linéaire (I)
[Django] J'ai essayé d'implémenter des restrictions d'accès par héritage de classe.
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé de classer MNIST par GNN (avec PyTorch géométrique)
[Introduction au modèle de maladie infectieuse] J'ai essayé de m'adapter et de jouer
J'ai essayé de réintroduire Linux
J'ai essayé de présenter Pylint
J'ai essayé le Sql Upsert de Pandas
Mongodb Shortest Introduction (3) J'ai essayé d'accélérer même des millions
J'ai essayé de résumer SparseMatrix
J'ai essayé d'analyser les données scRNA-seq en utilisant l'analyse des données topologiques (TDA)
jupyter je l'ai touché
J'ai essayé d'implémenter StarGAN (1)
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
J'ai essayé de créer un pointage de crédit simple avec régression logistique.
J'ai essayé de visualiser l'ensemble de données de préférence de boisson par décomposition tenseur.
J'ai essayé d'implémenter la classification des phrases par Self Attention avec PyTorch
J'ai essayé de visualiser les données BigQuery à l'aide de Jupyter Lab avec GCP
J'ai essayé de résumer les commandes utilisées par les ingénieurs débutants aujourd'hui
J'ai fait apprendre à RNN la vague de péché et j'ai essayé de prédire
J'ai essayé de visualiser Boeing de la performance du violon par estimation de pose
J'ai essayé de résoudre le problème de planification des équipes par diverses méthodes
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc Préparation 1