La stratégie d'inversion de P-Signal est une stratégie de trading quantitative construite sur la base de paramètres statistiques et de fonctions d'erreur pour construire un espace de signal probabiliste.
L'indicateur de base de cette stratégie est le signal P, qui combine les paramètres statistiques des moyennes mobiles et des écarts types et les cartographie dans la plage de -1 à 1 via la fonction d'erreur de Gauss pour former un indicateur de jugement quantifié.
Les paramètres de la stratégie comprennent la cardinalité, ΔErf et le temps d'observation.
L'avantage majeur de la stratégie d'inversion du signal P est qu'elle repose sur les distributions de probabilité des paramètres statistiques, qui peuvent évaluer efficacement les points caractéristiques du marché et saisir les opportunités d'inversion.
En outre, la conception paramétrifiée de la stratégie est bien régulée, ce qui permet aux utilisateurs d'ajuster l'espace paramétrique en fonction de leurs propres besoins pour trouver la combinaison optimale.
Le principal risque de la stratégie d'inversion du signal P est qu'elle repose trop sur les paramètres de la distribution de probabilité, qui est facilement affectée par des données anormales entraînant des jugements erronés.
L'augmentation du paramètre de cardinalité pour augmenter la taille de l'échantillon peut réduire l'impact des anomalies des données.
La stratégie d'inversion du signal P peut être optimisée dans les aspects suivants:
Incorporer d'autres indicateurs pour filtrer les signaux anormaux, tels que les augmentations brusques du volume.
Valider les signaux sur plusieurs délais pour améliorer la stabilité du jugement.
Augmenter les stratégies de stop loss pour réduire les pertes uniques.
Optimiser les paramètres pour trouver la meilleure combinaison et améliorer la rentabilité.
Incorporer l'apprentissage automatique pour le réglage des paramètres dynamiques.
La stratégie d'inversion du signal P établit un cadre de trading quantitatif basé sur des distributions de probabilité avec des conceptions de paramètres flexibles et une convivialité. Elle juge efficacement les caractéristiques statistiques des marchés et capte les opportunités d'inversion.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 // ********************************************************************************************************** // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // P-Signal Strategy RVS © Kharevsky // ********************************************************************************************************** strategy('P-Signal Strategy RVS.', precision=3, process_orders_on_close=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.2) // Parameters and const of P-Signal. nPoints = input.int(title='Cardinality:', defval=4, minval=4, maxval=200, group='Parameters of strategy.') ndErf = input.float(title='|ΔErf|:', defval=0, minval=0, maxval=1, step=0.01, group='Parameters of strategy.') tStartDate = input(title='Start date:', defval=timestamp('30 Dec 1957 00:00 +0300'), group='Observation time.') int nIntr = nPoints - 1 // Horner's method for the error (Gauss) & P-Signal functions. fErf(x) => nT = 1.0 / (1.0 + 0.5 * math.abs(x)) nAns = 1.0 - nT * math.exp(-x * x - 1.26551223 + nT * (1.00002368 + nT * (0.37409196 + nT * (0.09678418 + nT * (-0.18628806 + nT * (0.27886807 + nT * (-1.13520398 + nT * (1.48851587 + nT * (-0.82215223 + nT * 0.17087277))))))))) x >= 0 ? nAns : -nAns fPSignal(ser, int) => nStDev = ta.stdev(ser, int) nSma = ta.sma(ser, int) nStDev > 0 ? fErf(nSma / nStDev / math.sqrt(2)) : math.sign(nSma) // Data. float nPSignal = ta.sma(fPSignal(ta.change(ohlc4), nIntr), nIntr) float ndPSignal = math.sign(nPSignal[0] - nPSignal[1]) bool isStartDate = true // Reversal Strategy. strategy.entry('short', strategy.short, when=isStartDate and nPSignal > ndErf and ndPSignal < 0) strategy.entry('long', strategy.long, when=isStartDate and nPSignal < -ndErf and ndPSignal > 0) // Plotting. hline(+1.0, color=color.new(color.orange, 70), linestyle=hline.style_dotted, editable=false) hline(-1.0, color=color.new(color.orange, 70), linestyle=hline.style_dotted, editable=false) hline(-ndErf, color=color.new(color.orange, 70), linestyle=hline.style_dotted, editable=false) hline(ndErf, color=color.new(color.orange, 70), linestyle=hline.style_dotted, editable=false) plot(nPSignal, color=color.new(color.blue, 0), style=plot.style_line) // Table of state. if barstate.isconfirmed var Table = table.new(position=position.bottom_right, columns=3, rows=1, frame_color=color.new(color.orange, 70), frame_width=1, border_color=color.new(color.orange, 70), border_width=1) table.cell(table_id=Table, column=0, row=0, text=strategy.position_size > 0 ? 'Long: ' + str.tostring(strategy.position_size) : 'Short: ' + str.tostring(strategy.position_size), text_color=strategy.position_size > 0 ? color.green : color.red) table.cell(table_id=Table, column=1, row=0, text='Net P/L: ' + str.tostring(strategy.netprofit, '#.#'), text_color=strategy.netprofit > 0 ? color.green : color.red) table.cell(table_id=Table, column=2, row=0, text='Open P/L: ' + str.tostring(strategy.openprofit, '#.#'), text_color=strategy.openprofit > 0 ? color.green : color.red) // The end.