L'Apprentissage Automatique dans le trading : théorie, modèles, pratique et trading algo - page 267
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Et si, au lieu d'ajouter NA à la fin de"Y" puis de supprimer ce même NA, je supprime simplement la dernière ligne de SomeData, cela ne revient-il pas au même ?
Je ne comprends vraiment pas la différence, peut-être que j'ai déjà fait une surchauffe complète ((
Je ne suis pas désolé, mais je ne sais pas comment, il ne fonctionne tout simplement pas, combien de fois ai-je essayé, vous essayez à votre façon, qui cible j'ai fait vous le savez, et dites-moi comment vous le faites
Vous emballez tout avec n'importe quel emballeur et vous joignez le fichier
J'ai essayé plusieurs fois, ça ne marche pas, ça me jette hors du forum et c'est tout...
Prenez mes codes, j'ai tout affiché, le premier code est la création des caractéristiques, le second est l'entraînement du modèle, vous serez exactement le même, faites l'entraînement et montrez ce que vous avez obtenu.
J'ai essayé plusieurs fois, ça ne marche pas, ça me jette hors du forum et c'est tout...
Prenez mes codes, j'ai tout affiché, le premier code est la création des caractéristiques, le second est l'entraînement du modèle, vous serez exactement le même, faites l'entraînement et montrez ce que vous avez obtenu.
Lors de la différenciation, le changement est automatique car la série devient plus courte d'un élément, il suffit alors de raccourcir l'échantillon (tableau d'observations) du dernier élément.
Il y a deux choses dans le code qui me mettent mal à l'aise :
1) puisque ohlc est utilisé pour la prédiction, la toute dernière barre ne peut pas être utilisée pour la prédiction, puisque nous ferons la prédiction au début de la barre, et le hlc changera pendant la durée de vie de la barre entière. Nous enseignons donc le modèle en utilisant la dernière barre entièrement formée, puis nous prédisons en utilisant la barre non formée. Ce n'est pas juste. Nous devrions décaler la cible de 2 barres au lieu d'une.
Un décalage de la cible à 1 barre serait acceptable, si vous utilisez uniquement le prix ouvert pour la prédiction, en ignorant le haut, le bas et la fermeture.
2) Vous utilisez Close au lieu de Open pour la cible. Est-ce important pour une sorte de stratégie, ou juste pour le plaisir ? Après tout, nous entrons généralement dans une transaction au début d'une barre, puis sur la nouvelle barre suivante, nous retournons, quittons ou sortons. Et il est important que le modèle formé prédise l'augmentation du prix entre l'ouverture actuelle et l'ouverture suivante.
La clôture de la barre actuelle ne coïncide pas nécessairement avec l'ouverture de la barre suivante, c'est-à-dire qu'en prenant la clôture comme cible, vous pouvez éviter la première erreur, mais peut-être obtenir des incréments erronés à la place. Maintenant, j'ai regardé, généralement la clôture dans le tableau des prix ne coïncide pas avec l'ouverture de la barre suivante, donc vos valeurs cibles sont très douteuses.
Si le chandelier est surdimensionné, vous devez le contourner.
Prenez une fenêtre mobile, les cent premières barres (100 est juste un nombre aléatoire, pour votre code le nombre minimal de barres = 23, et si moins que cela les chandeliers font des erreurs), trouvez les valeurs des indicateurs, ne laissez que les dernières d'entre elles, trouvez la cible pertinente, ajoutez le tout au tableau final. Nous déplaçons la fenêtre vers l'avant d'une mesure, et nous répétons. Tout cela est des dizaines de fois plus lent que de compter tout en une fois, mais c'est plus sûr. Nous pourrons alors comparer les deux résultats et conclure s'il y a ou non un renversement.
Il serait bon de modifier la taille de la fenêtre coulissante, et de voir si les résultats changent. Si elles changent - alors l'indicateur utilise ses propres valeurs précédentes pour calculer les nouvelles, dans ce cas la largeur de la fenêtre fonctionnera comme une sorte de période exponentielle dans l'indicateur lui-même. Si le résultat change, la largeur de la fenêtre doit être augmentée jusqu'à ce que le résultat ne change plus. L'indicateur peut avoir sa propre limite interne sur le nombre de barres utilisées, par exemple zigzag dans mt5 a cette valeur = 100 barres, c'est-à-dire qu'une largeur de fenêtre supérieure à cent n'affecte pas le résultat.
Tout d'abord, essayez ce code pour créer un tableau de formation/test. Comparez-le avec votre tableau, s'il est 100% congruent, vous ne verrez pas de surimpression, vous pouvez faire confiance au chandelier pour utiliser les valeurs précédentes afin d'en identifier de nouvelles.
Ensuite, essayez d'augmenter indicatorDepth - largeur de la fenêtre coulissante, voyez si cela change le résultat, et si vous pouvez trouver une telle valeur de indicatorDepth, quand même l'augmenter n'affecte pas le résultat.
if(!require(rusquant)){ install.packages("rusquant", repos="http://r-forge.r-project.org", dependencies = TRUE); library(rusquant) }
if(!require(candlesticks)){ install.packages("candlesticks", repos="http://r-forge.r-project.org", dependencies = TRUE); library(candlesticks) }
tryCatch({
load("SPFB.RTS.rdata")
}, error = function(e){
getSymbols("SPFB.RTS", src = "Finam", period="5min", from = Sys.Date()-500)
save(SPFB.RTS, finam.stock.list, file = "SPFB.RTS.rdata")
SPFB.RTS <<- SPFB.RTS
finam.stock.list <<- finam.stock.list
})
chart_Series(tail(SPFB.RTS, 100))
indicatorDepth <- 23
tryCatch({
load("trainData.rdata")
}, error=function(e){
trainData <<- matrix(NA, ncol=60, nrow = nrow(SPFB.RTS)-2)
for(i in (indicatorDepth+1):(nrow(SPFB.RTS)-2)){
X1 <- as.numeric(tail(CandleBodyLength(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X2 <- as.numeric(tail(CandleLength(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X3 <- as.numeric(tail(CSPDarkCloudCover(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X4 <- as.numeric(tail(CSPDoji(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X5 <- as.numeric(tail(CSPEngulfing(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X6 <- as.numeric(tail(CSPGap(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X7 <- as.numeric(tail(CSPHammer(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X8 <- as.numeric(tail(CSPHarami(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X9 <- as.numeric(tail(CSPInsideDay(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X10 <- as.numeric(tail(CSPInvertedHammer(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X11 <- as.numeric(tail(CSPKicking(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X12 <- as.numeric(tail(CSPLongCandle(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X13 <- as.numeric(tail(CSPLongCandleBody(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X14 <- as.numeric(tail(CSPMarubozu(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X15 <- as.numeric(tail(CSPNHigherClose(SPFB.RTS[max(1, i-indicatorDepth):i,],N = 3), 1))
X16 <- as.numeric(tail(CSPNLowerClose(SPFB.RTS[max(1, i-indicatorDepth):i,],N = 3), 1))
X17 <- as.numeric(tail(CSPOutsideDay(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X18 <- as.numeric(tail(CSPPiercingPattern(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X19 <- as.numeric(tail(CSPShortCandle(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X20 <- as.numeric(tail(CSPShortCandleBody(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X21 <- as.numeric(tail(CSPStar(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X22 <- as.numeric(tail(CSPStomach(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X23 <- as.numeric(tail(CSPTasukiGap(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X24 <- as.numeric(tail(CSPThreeInside(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X25 <- as.numeric(tail(CSPThreeMethods(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X26 <- as.numeric(tail(CSPThreeOutside(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X27 <- as.numeric(head(tail(nextCandlePosition(SPFB.RTS[max(1, i-indicatorDepth):i,]), 2), 1))
X28 <- as.numeric(tail(TrendDetectionChannel(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
X29 <- as.numeric(tail(TrendDetectionSMA(SPFB.RTS[max(1, i-indicatorDepth):i,]), 1))
target <- as.numeric(SPFB.RTS[i+2,"SPFB.RTS.Open"]) - as.numeric(SPFB.RTS[i+1,"SPFB.RTS.Open"])
trainData[i,] <<- c(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,target)
cat(i, "/", nrow(SPFB.RTS)-2, "\n")
}
colnames(trainData)[-ncol(trainData)] <- paste0("pred",1:(ncol(trainData)-1))
colnames(trainData)[ncol(trainData)] <- "target"
save(trainData, file="trainData.rdata")
})
# trainData <- trainData[-(1:indicatorDepth),]
Je suis préoccupé par deux choses dans le code :
1) Puisque nous utilisons ohlc pour la prévision, la dernière barre ne peut pas être utilisée pour faire une prédiction car nous ferons la prédiction au début de la barre et hlc changera pendant la durée de vie de la barre. Nous enseignons donc le modèle en utilisant la dernière barre entièrement formée, puis nous prédisons en utilisant la barre non formée. Ce n'est pas juste. Nous devrions décaler la cible de 2 barres au lieu d'une.
Si vous déplacez l'objectif à 1 barre, vous pouvez utiliser uniquement le prix ouvert pour faire une prévision en ignorant le haut, le bas et la fermeture.
Je ne comprends pas le problème : on prédit la position de la fermeture actuelle par rapport à la fermeture précédente, on ne connaît pas la bougie actuelle, on connaît la précédente car elle est déjà fermée, donc c'est la précédente, alors tous les prix OHLC ont déjà été formés, je ne comprends pas quelle est la prudence, quelle est l'erreur
2) Vous utilisez Close au lieu de Open pour la cible. Est-ce important pour une sorte de stratégie ou juste pour le plaisir ? ........
Pris absolument pour rien, pour la vitesse et la commodité
Si le chandelier est à découvert, vous devez le contourner.........
Je ne comprends pas cette pièce, à quoi sert-elle ? Qu'est-ce queSPFB.RTS.rdata ?
d'où vient-il ? et pourquoi est-il écrasé ? aucune idée du tout(
tryCatch({
load("SPFB.RTS.rdata")
}, error = function(e){
getSymbols("SPFB.RTS", src = "Finam", period="5min", from = Sys.Date()-500)
save(SPFB.RTS, finam.stock.list, file = "SPFB.RTS.rdata")
SPFB.RTS <<- SPFB.RTS
finam.stock.list <<- finam.stock.list
})
Et surtout, si vous avez essayé d'enseigner quelque chose en utilisant les données, pourquoi ne pas le mentionner ?
Et surtout, vous avez dû essayer d'enseigner quelque chose en utilisant les données, pourquoi ne pas le mentionner ?
L'avancement du tableau de formation est de 16527 sur 55857. Dès qu'il sera créé, j'essaierai de l'enseigner.
Prédire la position de la cloche actuelle par rapport à la cloche précédente
C'est vous qui décidez. C'est juste étrange, comme les stratégies habituelles prennent des décisions et ouvrent des transactions au début d'une nouvelle barre.
Et vous devez ensuite faire une prédiction et ouvrir une transaction juste à la fin de la barre. C'est un peu gênant, un nouveau bar dans le terminal est facile à attraper. Mais "ouvrir une transaction à la fin de la barre actuelle, une seconde avant l'ouverture d'une nouvelle barre, avec l'espoir que le prix de clôture actuel est déjà définitif" est trop vague pour moi.
Je ne comprends pas cette pièce, à quoi sert-elle ? Qu'est-ce queSPFB.RTS.rdata ?
Citations téléchargées. Téléchargés, sauvegardés dans rdata ; ne pas se gâcher à chaque fois que l'on exécute ce script et ne pas attendre quelques secondes qu'ils soient téléchargés. S'ils ont été téléchargés plus tôt et sauvegardés dans le fichier rdata - alors ils en sont extraits.
Merci.
Il y a deux choses dans le code qui me mettent mal à l'aise :
1) parce que nous utilisons ohlc pour la prédiction, nous ne pouvons pas utiliser la dernière barre pour la prédiction, car nous le ferons au début de la barre et hlc changera pendant la durée de vie de la barre. Nous enseignons donc le modèle en utilisant la dernière barre entièrement formée, puis nous prédisons en utilisant la barre non formée. Ce n'est pas juste. Nous devrions décaler la cible de 2 barres au lieu d'une.
Un décalage de la cible à 1 barre serait acceptable, si vous utilisez uniquement le prix ouvert pour la prédiction, en ignorant le haut, le bas et la fermeture.
2) Vous utilisez Close au lieu de Open pour la cible. Est-ce important pour une sorte de stratégie, ou juste pour le plaisir ? Après tout, nous entrons généralement dans une transaction au début d'une barre, puis sur la nouvelle barre suivante, nous retournons, quittons ou sortons. Et il est important que le modèle formé prédise l'augmentation du prix entre l'ouverture actuelle et l'ouverture suivante.
La clôture de la barre actuelle ne coïncide pas nécessairement avec l'ouverture de la barre suivante, c'est-à-dire qu'en prenant la clôture comme cible, vous pouvez éviter la première erreur, mais peut-être obtenir des incréments erronés à la place. Maintenant que j'ai regardé, la clôture dans le tableau des prix ne coïncide généralement pas avec l'ouverture de la barre suivante, donc les valeurs cibles sont très douteuses.
Il me semble que vous compliquez les choses.
1. Le premier problème est étroitement lié au second. Si nous utilisons Close comme objectif, les trois autres prix sont formés et ne changent pas. Lorsque vous prévoyez une étape à l'avance, vous devez décaler la cible d'une position.
2. Je ne peux pas non plus accepter vos arguments sur la différence entre les prix de clôture et d'ouverture. C'est sur quel TF ou jour de la semaine. Si nous prenons H1, alors nous avons trois variantes différentes :
C'est juste ce qui me vient à l'esprit. Et il pourrait y avoir bien d'autres situations. Ils disent tous que le trading réel est très différent du modèle. Pour l'instant, il est plus utile de se concentrer sur une version idéalisée, et de programmer le reste des traînées et autres séparément.
3. Au sujet de la surenchère.
Vache sacrée de l'AT. Il est considéré comme une vérité immuable depuis des siècles.
Sur quelle base ?
Pour tous les praticiens de l'ANALYSE, il est inacceptable de modifier les données sur lesquelles ils tirent leurs conclusions d'époque sur le passé. Une fois de plus : le passé est inacceptable.
Nous sommes dans le domaine de la prévision, et notre vision du passé non seulement peut, mais doit, changer en fonction des nouvelles données disponibles. Il y a un prix à payer pour les données qui ne se redessinent pas : le décalage.
Voici une nouvelle barre, qui est l'annonce d'un retournement de marché. Mais nous, tout en continuant à nourrir la vache sacrée, ne changeons pas notre vision de l'histoire au nom d'une idée tirée de la section "analyse".
Nous ne devons pas avoir peur des changements d'indicateurs.
Un nouveau bar est arrivé. Et à son arrivée, nous devons prendre des décisions dans les conditions que cette nouvelle barre a créées. Nous devons prévoir l'avenir jusqu'à la prochaine prévision avec une erreur minimale. Je n'ai vu aucune publication liant l'ampleur de l'erreur de prédiction à des changements dans le type d'indicateurs dans l'histoire.
Ce ne sont que des paroles en l'air. Nous devrions construire un modèle et obtenir son estimation. C'est ce que je vais faire.
Créer un petit ensemble de données de 5000 prix
Le script n'a pas fonctionné correctement.
Quand tout a été compté, j'ai reçu un avertissement.
....
....
5677 / 5688
5678 / 5688
5679 / 5688
5680 / 5688
5681 / 5688
5682 / 5688
5683 / 5688
5684 / 5688
5685 / 5688
5686 / 5688
5687 / 5688
5688 / 5688
Warning message:
In readChar(con, 5L, useBytes = TRUE) :
cannot open compressed file 'trainData.rdata', probable reason 'No such file or directory'
les données elles-mêmes
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[1,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> target
[1,] NA NA NA NA NA NA NA NA NA
[2,] NA NA NA NA NA NA NA NA NA
[3,] NA NA NA NA NA NA NA NA NA
[4,] NA NA NA NA NA NA NA NA NA
[5,] NA NA NA NA NA NA NA NA NA
[6,] NA NA NA NA NA NA NA NA NA
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 8.621061e-05 10 0.0016378604 190 0 1 0 0 0 0 0 0 0
[5684,] 6.036304e-04 70 0.0010346611 120 0 0 0 0 0 1 0 0 0
[5685,] 1.208355e-03 140 0.0018122977 210 0 0 0 0 0 0 0 0 0
[5686,] 6.911447e-04 80 0.0019009764 220 0 0 0 0 0 0 0 0 0
[5687,] 2.592577e-04 30 0.0007778402 90 0 0 0 0 0 0 0 0 0
[5688,] 9.501188e-04 110 0.0016415396 190 0 0 0 0 0 0 0 0 0
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
[5684,] 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
[5685,] 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
[5686,] 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
[5687,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[5688,] 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
[5683,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[5684,] 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[5685,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
[5686,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[5687,] 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
[5688,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
<NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> target
[5683,] NA NA NA NA NA NA 0 1 0 0 0 0 1 -1 -70
[5684,] NA NA NA NA NA NA 0 1 0 0 0 0 1 -1 -140
[5685,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 -90
[5686,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 20
[5687,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 100
[5688,] NA NA NA NA NA NA 0 0 1 -1 0 0 1 -1 50
Il y a toujours de l'AN dans les données, bien que je n'exclue pas de l'avoir fait moi-même.