Dieser Artikel befasst sich mit Oracle-Datenbank-, PL / SQL-, SQL-, MATCH_RECOGNIZE-, MODEL-Klausel-, Aggregat- und Pipeline-Funktionen.
Die technische Analyse (TA) der MĂ€rkte wurde als Funktionsbereich verwendet. Zuerst eine kleine, oberflĂ€chliche EinfĂŒhrung zum Handel mit MĂ€rkten, dann Berechnungen.
Technische Analyse - eine Reihe von Tools zur Vorhersage wahrscheinlicher PreisÀnderungen auf der Grundlage von Mustern vergangener PreisÀnderungen. Theoretisch ist die technische Analyse in jedem Markt anwendbar. Die am weitesten verbreitete technische Analyse war jedoch in hochliquiden freien MÀrkten, beispielsweise an Börsen.
Viele SQL-Anweisungen, -Prozeduren und -Diagramme wurden entwickelt. Teil - unten, vollstÀndiger Code - auf GitHub unter dem Link am Ende des Artikels.
Technische Marktindikatoren (TIRs) - zusĂ€tzliche Diagramme fĂŒr Preisdiagramme,
die auf der Grundlage der Umrechnung der im Basispreisdiagramm enthaltenen Werte erstellt wurden . In der Regel handelt es sich dabei um verschiedene Arten der Mittelwertbildung (der nĂ€chste Punkt des Diagramms wird als Durchschnittswert einer bestimmten Anzahl vorheriger Preiswerte berechnet, z. B. als gleitender Durchschnitt), Beziehungen (der nĂ€chste Punkt ist das Ergebnis des Vergleichs einer bestimmten Anzahl frĂŒherer Preise - deren Differenz, Ableitung einer Ănderung ĂŒber einen Zeitraum) oder Verzögerungen ( Verzögerungen). Die Indikatoren zeigen deutlich einige nicht offensichtliche Informationen, die in der Statistik der PreisĂ€nderungen enthalten sind, und können Empfehlungen zu HandelsauftrĂ€gen bilden - KAUFEN / VERKAUFEN. Indikatoren haben mindestens einen variablen Parameter, von dessen Wert sich das Ergebnis Ă€ndert.
Um echte Transaktionen zu eröffnen, werden in der Regel nach Ermessen des HĂ€ndlers mehrere Indikatoren zusammen mit zusĂ€tzlichen Informationen verwendet.Einer der GrundsĂ€tze der Technischen Analyse lautet âGeschichte wiederholt sichâ: Marktteilnehmer verhalten sich unter Ă€hnlichen UmstĂ€nden ungefĂ€hr gleich und bilden eine Ă€hnliche Dynamik von PreisĂ€nderungen. Und es ist natĂŒrlich anzunehmen, dass das Marktverhalten in der Zukunft hauptsĂ€chlich die in der Vergangenheit auftretenden Muster wiederholen wird. Nach dieser Aussage kann der Anleger aus den möglichen TIR-Parametern diejenigen auswĂ€hlen, die sich in den vergangenen Perioden als am besten erwiesen haben.
In diesem Artikel wird ein Diagramm der Handelsleistung erstellt, wenn jeder Indikator fĂŒr den Wert des TIR-Parameters verwendet wird. Dies erfolgt in einer zweidimensionalen Darstellung. TatsĂ€chlich werde ich jedoch eine dreidimensionale Darstellung einbauen, um auch die Auswirkung der Verzögerung bei der AusfĂŒhrung der Bestellung auf das Ergebnis zu bewerten. Der Parameter ist also die X-Achse (Abszisse), die Verzögerung ist die Y-Achse (Ordinate), das Ergebnis ist die Z-Achse (Anwendung). Dies ist ein Versuch, den Effekt des âSchlupfesâ zu bewerten, der leider immer auftritt. Anstelle eines echten âSchlupfesâ entlang der Y-Achse verschiebe ich die AusfĂŒhrung des Kauf- / Verkaufsauftrags um einen Zeitraum von 1 bis 5 ZeitrĂ€umen.
Wenn in diesem Diagramm ein globales Maximum hervorgehoben ist und das Diagramm selbst wie ein Hut aussieht (im Allgemeinen wird es als âNormalverteilungâ bezeichnet, es wird jedoch eine strikte Symmetrie um die vertikale Achse vorausgesetzt), sind auch der Kegel und die Pyramide geeignet - dies bedeutet, dass Sie einen bestimmten Parameterwert dafĂŒr auswĂ€hlen können , die das höchste Ergebnis anzeigen, und mit diesem Indikator können Sie versuchen, zu handeln. Wenn das Leistungsdiagramm je nach Parameter einer âPalisadeâ Ă€hnelt, ist es unmöglich, den optimalen Parameterwert auszuwĂ€hlen, und es macht keinen Sinn, diese
TIR im Handel zu verwenden.
Wir können sagen, dass ich in diesem Artikel nur den âTrefferprozentsatzâ der Indikatoren berechne. Das Problem, zu bewerten, wie viel man "verdienen" kann, habe ich nicht gewagt.Der erfolgreiche Abschluss des beschriebenen Tests ist einer der notwendigen, aber nicht ausreichenden Faktoren fĂŒr einen effektiven Handel.Zur Information ... Im Gegensatz zur Technischen Analyse bezeichnet die Fundamentalanalyse (FA) Methoden zur Vorhersage des Marktwerts (Tauschwerts) von Instrumenten auf der Grundlage der Analyse von Finanz- und Produktionsleistungsindikatoren.
Der âinnere Wertâ der
FA stimmt in den meisten FĂ€llen nicht mit dem Aktienkurs des Unternehmens ĂŒberein, der durch das VerhĂ€ltnis von Angebot und Nachfrage an der Börse bestimmt wird. Anleger, die die
FA fĂŒr ihre AktivitĂ€ten nutzen, sind hauptsĂ€chlich an Situationen interessiert, in denen der "innere Wert" der Aktien des Unternehmens den Preis der Aktien an der Börse ĂŒbersteigt. Solche Aktien gelten als unterbewertet, was bedeutet, dass ihr Preis steigen wird, und sie sind potenzielle Anlageziele.
Einer der bekanntesten Investoren, die Fundamental Analysis verwenden, ist Warren Buffett.
Schauen Sie sich den Trailer an:
https://www.youtube.com/watch?v=SqE8fnvmV1YWir haben also zwei diametral entgegengesetzte AnsÀtze -
TA und
FA .
FA interessiert in der Regel langfristige Anleger, TA - kurz- und mittelfristig und wird fĂŒr spekulative Transaktionen verwendet, wenn das Thema des Handels des HĂ€ndlers nicht interessiert ist.
Und die Ziele dieses Artikels sind zwei ...
ZusĂ€tzlich zu den oben beschriebenen Diskussionen ĂŒber
TA und
FA wollte ich
die FĂ€higkeiten von Oracle Database untersuchen und zeigen, um Berechnungen technischer Marktindikatoren durchzufĂŒhren .
Ich prÀsentiere diese Möglichkeiten dem Urteil der Leser.
Wenn Sie meine Berechnungen wiederholen möchten, laden Sie den Code von GitHub unter dem Link unten im Artikel herunter. Code ĂŒberprĂŒft auf Version 12.2.0.1.
Erstellen Sie zuerst freigegebene Objekte. Das erste sind die Tabellen und die Ansicht. In derselben Datei befindet sich ein Transaktionsmodellierungspaket.
Der zweite Schritt ist die Erstellung von Funktionen, die die Berechnung von
TIR durchfĂŒhren .
Der dritte Schritt sind die Berechnungen.
Alle Funktionen zur Berechnung aller
TIRs geben einen Cursor mit den folgenden Feldern zurĂŒck: STOCK_NAME, ADATE, ACLOSE (Tagesschlusskurs), AACTION (Verkaufs- / Kaufauftrag)
Das Paket enthÀlt drei tabellarische Modellierungsfunktionen, die einen Eingabecursor aus den oben beschriebenen
TIR- Berechnungsfunktionen ĂŒbernehmen: Offset (Verzögerung bei der AuftragsausfĂŒhrung, Verzögerung) und Anfangskapital, standardmĂ€Ăig 1000 USD. Paketfunktionen werden folgendermaĂen aufgerufen:
select * from HABR_TRADEMODELLING_P.TRADE_LOG (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1) order by 1, 2; select * from HABR_TRADEMODELLING_P.CALC_ACTIONS (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1); select * from HABR_TRADEMODELLING_P.CALC_ACTIONS_TOTALS (cursor (select STOCK_NAME, ADATE, ACLOSE, AACTION from table (HABR_MARKETINDEXES_XXXXXXXX_F_CALC (10))), p_lag => 1);
Dabei ist XXXXXXXX der Name des
TIR .
Alle Funktionen berechnen das Ergebnis des Handels, sofern der Gewinn vollstÀndig reinvestiert wird, ohne Transaktionskosten und Steuern sowie ohne Inflation und Diskontierung.Die erste Funktion
TRADE_LOG
bildet das Transaktionsprotokoll eines vereinfachten HÀndlers. Mit dieser Funktion können Sie die gesamte Transaktionskette verfolgen. Befindet sich der Anleger am Ende des Zeitraums in Wertpapieren, simuliert die Funktion zur Berechnung des WÀhrungssaldos (Finanzergebnis) den Verkauf aller Wertpapiere zum letzten Schlusskurs und bildet die entsprechende Marke im Feld IN_STOCK.
Die zweite Funktion
CALC_ACTIONS
gibt dieselben Spalten wie der aufgerufene
TIR- Berechnungscursor zurĂŒck und fĂŒgt die folgenden Spalten hinzu:
AACTION_LAG
(Auftrag mit Offset),
BALANCE_CURRENCY
(Kontostand des HĂ€ndlers in bar),
BALANCE_STOCK
(Anzahl der Instrumente in offenen Positionen). AbhÀngig vom Wert des Feldes
AACTION_LAG
wird ein Kauf oder Verkauf zu einem Schlusskurs simuliert und dementsprechend der Saldo in der WÀhrung und die Anzahl der offenen Positionen geÀndert.
In der letzten Zeile jedes Instruments sehen Sie das Handelsergebnis fĂŒr jedes Instrument sowie in der vorherigen Funktion. Wenn sich der Anleger in Wertpapieren befindet, wird ein Verkauf simuliert, um den Saldo in FremdwĂ€hrung zu berechnen
Die dritte Funktion
CALC_ACTIONS_TOTALS
macht dasselbe wie die zweite, gibt jedoch nur die letzte Zeile zurĂŒck - das Ergebnis des Handels fĂŒr jedes Instrument. Es wird bei der Modellierung verwendet.
Daten herunterladen
FĂŒr solche MĂ€rkte und Indizes werden Berechnungen durchgefĂŒhrt: S & P500, NYSE, Brent, BTCUSD, EURUSD.
Die ersten 4 wurden von Yahoo Finance heruntergeladen, die letzten von einer anderen Quelle. Die Berechnungsergebnisse fĂŒr Kurse aus anderen Quellen können variieren.
Bitte beachten Sie, dass die ZeitrÀume der Kurse jedes Instruments unterschiedlich sind, nÀmlich:
- S & P500 - 03/01/1950 ... 29/01/2019, 69 Jahre alt;
- NYSE - 31/12/1965 ... 22/03/2019, 54 Jahre alt;
- Brent - 17/05/1991 ... 06/02/2019, 28 Jahre alt;
- BTCUSD - 16/07/2010 ... 29/01/2019, 9 Jahre alt;
- EURUSD - 16/02/2001 ... 27/05/2019, 18 Jahre alt.
Daher ist es unmöglich, die erzielte RentabilitÀt von Instrumenten miteinander zu vergleichen, aber es ist möglich, die RentabilitÀt jedes Instruments anhand verschiedener Indikatoren zu vergleichen.
Die Download-Datei (SQL * Loader) kann auch von GitHub unter dem Link am Ende des Artikels abgerufen werden.
Gleitende Durchschnitte
Es gibt mindestens drei Haupttypen von gleitenden Durchschnitten:
- linear (einfacher gleitender Durchschnitt, SMA),
- Exponentieller gleitender Durchschnitt (EMA) und
- linear gewichtet (Weighted Moving Average, WMA).
Sie unterscheiden sich in den Gewichten ihrer Bestandteile. Bei einem linearen gleitenden Durchschnitt sind die Gewichte gleich, bei exponentiellen und linear gewichteten Gewichten nehmen sie ab, wenn sich die Komponente weiter vom rechten Rand des Fensters entfernt - exponentiell oder linear.
Der lineare gleitende Durchschnitt ist am einfachsten zu berechnen. In Oracle ist dies die Funktion
avg (VALUE) over (partition by STOCK_NAME order by ADATE rows between 9 preceding and current row)
- ein gleitender Durchschnitt mit einem Mittelungsfenster von 10 Werten.
Der lineare gleitende Durchschnitt hat Nachteile. Erstens reagieren solche Durchschnittswerte langsam auf Marktumkehrungen. Da viele Werte gemittelt werden, von denen jeder das gleiche Gewicht hat, erfolgt die durchschnittliche Antwort hÀufig mehrere ZeitrÀume nach einer Umkehrung des Vermögenspreises.
Auch der lineare gleitende Durchschnitt ist nicht sehr effektiv, da er zweimal auf das Signal reagiert: als der Indikator das Schiebefenster betrat und es verlieĂ. Der Rest reagiert nur auf die Eingabe des Indikators und entfernt ihn reibungslos aus der Berechnung, wenn Sie sich vom rechten Rand des Fensters nach links bewegen.
Bei der Berechnung der
TIR werden alle drei Arten von gleitenden Durchschnitten verwendet. FĂŒr exponentielle und linear gewichtete in diesem Artikel werden die Aggregatfunktionen
EMA
und
WMA
entwickelt, die in analytischer Form verwendet werden. ZusÀtzlich können diese gleitenden Durchschnitte durch Rekursion oder Modell (Ausdruck
MODEL
) berechnet werden.
Eine Berechnung von EMA und WMA ohne Rekursion oder Modelka nur durch Analyse in der Oracle-Datenbank ist offensichtlich unmöglich.
Aber immer noch Vorbehalte gegen gleitende Durchschnitte:
- Je kĂŒrzer die Mittelungsperiode ist und je empfindlicher das Verfahren auf Windungen reagiert, desto mehr gibt es falsche Signale.
- Je kĂŒrzer die Mittelungsperiode ist, desto mehr Signale werden erzeugt, desto gröĂer ist der Transaktionsaufwand, der sehr bedeutend werden kann.
Technische Marktindikatoren
FĂŒr fast jeden Indikator werden verschiedene Berechnungsmethoden angegeben: CALC - Berechnung mit PL / SQL-Code, SIMP - Berechnung durch einen Operator oder RECU - Berechnung durch Rekursion, AGRF - Berechnung mit der Aggregatfunktion, MODE - Berechnung nach Modell.
Es gibt GrĂŒnde fĂŒr die Entwicklung mehrerer Methoden. Erstens können Sie durch Berechnen des
TIR mit mehreren Methoden und Vergleichen der Indikatoren bei gleichen Indikatoren sicher sein, dass die Berechnungen korrekt durchgefĂŒhrt wurden (unter BerĂŒcksichtigung der verschiedenen Methoden zum Runden und Verarbeiten der NULL- und "0" -Werte). In diesem Artikel werde ich die Hashes von Stichproben verschiedener Methoden vergleichen, sodass die Ăbereinstimmung mit Bits und die gleiche Verarbeitung durch alle Algorithmen garantiert ist.
Ich glaube, dass Oracle mit der Entwicklung von
TIR mit der SIMP-Methode beginnen muss - Berechnung durch einen Bediener. Wenn dies erledigt ist, hat der Orakeloid einen Plan- und Berechnungsalgorithmus im Kopf und kann leicht in PL / SQL oder in eine andere prozedurale Sprache ĂŒbertragen werden.
Ich stelle fest, dass die CALC-Berechnungsmethode fĂŒr PL / SQL hier schneller ist als die SIMP-Methode (mit einem Operator), wenn die gesamte Berechnung in einem Durchgang entlang des Cursors durchgefĂŒhrt werden kann. Wenn Sie jedoch fĂŒr die Berechnung temporĂ€re Tabellen oder Sammlungen erstellen mĂŒssen oder mehr als 1 Cursor ĂŒbergeben mĂŒssen, wird sich die Methode mit einem Operator meiner Meinung nach als schneller und weniger ressourcenintensiv herausstellen.
FĂŒr alle Methoden, einschlieĂlich der SIMP-Methode (âone operatorâ), werde ich die Operatoren in Funktionen einfĂŒgen, damit die Berechnung mit einem Parameter aufgerufen werden kann, um den optimalen Wert auszuwĂ€hlen.
Die Berechnungen werden fĂŒr sieben
TIRs durchgefĂŒhrt : Moving Average Intersection (EMASIMPLE), Goldene und tödliche Kreuze (CROSSES), Balance-Volumen (OBV), Keltner-Kanal (KELTNER), Preis- und Volumentrend (PVT), Indikator fĂŒr die Bewegungsfreiheit der Arme (EMV) ), Commodity Channel Index (CCI).
FĂŒr die sieben Indikatoren dieser beiden Artikel gibt es einen Parameter âMittelung der FenstergröĂeâ und den zweiten Parameter - Verschiebung (Verzögerung). Die Verschiebung gibt an, wie viele Balken Sie benötigen, um die AusfĂŒhrung des Kauf- / Verkaufsauftrags zu verschieben - wie viele Balken, um den Schlusskurs zu verschieben (alle Bestellungen werden zum Schlusskurs des Balkens ausgefĂŒhrt). Dies ist Ă€hnlich wie "Schlupf", aber es ist nicht genau "Schlupf". Slippage ist normalerweise nicht zugunsten des Kunden, und unsere Verzögerung kann sich sowohl als nicht zugunsten des Kunden als auch zugunsten des Kunden herausstellen. Die Verwendung der Modellierung mit einer Verzögerung von 1 bis 5 Balken fĂŒr einige Indikatoren zeigt jedoch, dass ein Schlupf einen signifikanten Einfluss auf das Ergebnis hat. Und fĂŒr einige Indikatoren sind Verzögerung und Schlupf nicht so wichtig.
Die Methoden SIMP ("Einzeloperator") und RECU ("Rekursion")
MATCH_RECOGNIZE
aktiv den Ausdruck
MATCH_RECOGNIZE
, um das
MATCH_RECOGNIZE
/ VERKAUFEN basierend auf dem Ein- / Ausstieg des berechneten
TIR in den angegebenen Bereich oder dessen Verhalten relativ zu seinem gleitenden Durchschnitt zu generieren.
Detaillierte Beschreibungen aller TIRs finden Sie auf Wikipedia oder in Robert Colbys Buch Encyclopedia of Technical Market Indicators.Der Schnittpunkt des exponentiellen gleitenden Durchschnitts
Die Methode zum Schneiden exponentieller gleitender Durchschnitte ist die einfachste
TIR .
Die Methode beinhaltet: Kaufen (Eröffnen einer Long-Position), wenn der Preiswert seinen exponentiellen gleitenden Bottom-Up-Durchschnitt (ESA) ĂŒberschreitet; Verkaufen (SchlieĂen einer Long-Position), wenn der Preis sein ESS von oben nach unten ĂŒberschreitet.
Short-Positionen sowie der Margin-Handel im Allgemeinen werden in diesem Artikel nicht berĂŒcksichtigt.
In Zukunft kann dieser Indikator als Standard fĂŒr den Vergleich mit anderen verwendet werden. Ein Vergleich mit dieser
TIR ist besser als ein Vergleich mit der Buy and Hold-Strategie, da diese Strategie in fallenden MĂ€rkten nicht rentabel ist.
Der einzige
TIR- Parameter ist die LĂ€nge des gleitenden Durchschnitts.
Berechnung mit PL / SQL
create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_CALC (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T pipelined is l_result HABR_MARKETINDEXES_RESULT_LIST_T; EMA number; prev_EMA number; prev_TYPICAL_PRICE number; retval HABR_MARKETINDEXES_RESULT_T := HABR_MARKETINDEXES_RESULT_T (null, null, null, null, null, null, null, null, null); prev_STOCK_NAME varchar2(256); l_alpha number; begin l_alpha := 2 / (p_averaging_window_width + 1); for c1 in (select STOCK_NAME, ADATE, TYPICAL_PRICE, ACLOSE from LOAD_YAHOO_V order by 1, 2) loop retval.ADATE := c1.ADATE; retval.ACLOSE := c1.ACLOSE; if prev_STOCK_NAME is null or prev_STOCK_NAME <> c1.STOCK_NAME then retval.STOCK_NAME := c1.STOCK_NAME; EMA := c1.TYPICAL_PRICE; prev_EMA := null; else EMA := round (c1.TYPICAL_PRICE * l_alpha + EMA * (1 - l_alpha), 20); end if; if prev_TYPICAL_PRICE < prev_EMA and c1.TYPICAL_PRICE > EMA then retval.AACTION := 'BUY'; elsif prev_TYPICAL_PRICE > prev_EMA and c1.TYPICAL_PRICE < EMA then retval.AACTION := 'SELL'; else retval.AACTION := null; end if; retval.IND_VALUE := EMA; pipe row (retval); prev_STOCK_NAME := c1.STOCK_NAME; prev_EMA := EMA; prev_TYPICAL_PRICE := c1.TYPICAL_PRICE; end loop; end;
Berechnung durch einen rekursiven Operator
create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_RECU (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 (STOCK_NAME, ADATE, TYPICAL_PRICE, EMA, ACLOSE, RN) as (select STOCK_NAME, ADATE, TYPICAL_PRICE, round (TYPICAL_PRICE, 20), ACLOSE, RN from LOAD_YAHOO_V where RN = 1 union all select b.STOCK_NAME , b.ADATE , b.TYPICAL_PRICE , round (b.TYPICAL_PRICE * 2 / (p_averaging_window_width + 1) + a.EMA * (1 - 2 / (p_averaging_window_width + 1)), 20) , b.ACLOSE , b.RN from T1 a, LOAD_YAHOO_V b where b.RN = a.RN + 1 and b.STOCK_NAME = a.STOCK_NAME) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null, AACTION) bulk collect into l_result from T1 match_recognize (partition by STOCK_NAME order by ADATE measures classifier() as AACTION all rows per match with unmatched rows pattern (BUY+ | SELL+) define BUY as (prev (TYPICAL_PRICE) < prev (EMA) and TYPICAL_PRICE > EMA) , SELL as (prev (TYPICAL_PRICE) > prev (EMA) and TYPICAL_PRICE < EMA) ) MR; return l_result; end;
Berechnung mit dem Ausdruck MODELL
Funktionstext HABR_MARKETINDEXES_EMASIMPLE_F_MODE create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_MODE (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 as (select * from LOAD_YAHOO_V model dimension by (STOCK_NAME, RN) measures (ADATE, TYPICAL_PRICE, ACLOSE, to_number(null) as EMA) rules (EMA[any, any] = round (TYPICAL_PRICE [cv(), cv()] * 2 / (p_averaging_window_width + 1) + nvl(EMA [cv(), cv() - 1], TYPICAL_PRICE [cv(), cv()]) * (1 - 2 / (p_averaging_window_width + 1)), 20))) , T2 as (select STOCK_NAME, ADATE, ACLOSE , TYPICAL_PRICE, LAG (TYPICAL_PRICE) over (partition by STOCK_NAME order by ADATE) as PREV_TYPICAL_PRICE , EMA, lag (EMA) over (partition by STOCK_NAME order by ADATE) as PREV_EMA from T1) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null , case when prev_TYPICAL_PRICE < prev_EMA and TYPICAL_PRICE > EMA then 'BUY' when prev_TYPICAL_PRICE > prev_EMA and TYPICAL_PRICE < EMA then 'SELL' end) bulk collect into l_result from T2 order by STOCK_NAME, ADATE; return l_result; end;
Berechnung mit der Aggregatfunktion
Der Text der EMA-Aggregatfunktion und der Funktion HABR_MARKETINDEXES_EMASIMPLE_F_AGRF create or replace type EMA_DATA_T as object (AVALUE number, AVERAGING_WINDOW integer); create or replace type EMA_IMPL_T as object ( l_window_width integer, l_ema number, static function ODCIAggregateInitialize (sctx in out EMA_IMPL_T) return number, member function ODCIAggregateIterate (self in out EMA_IMPL_T, value in EMA_DATA_T) return number, member function ODCIAggregateMerge (self in out EMA_IMPL_T, ctx2 in EMA_IMPL_T) return number, member function ODCIAggregateTerminate (self in EMA_IMPL_T, returnValue out number, flags in number) return number ); create or replace type body EMA_IMPL_T is static function ODCIAggregateInitialize (sctx in out EMA_IMPL_T) return number is begin sctx := EMA_IMPL_T (null, null); return ODCIConst.Success; end; member function ODCIAggregateIterate (self in out EMA_IMPL_T, value in EMA_DATA_T) return number is begin if value.AVALUE is not null then if l_window_width is null then l_window_width := value.AVERAGING_WINDOW; self.l_ema := value.AVALUE; else self.l_ema := round (value.AVALUE * 2 / (l_window_width + 1) + self.l_ema * (1 - 2 / (l_window_width + 1)), 20); end if; end if; return ODCIConst.Success; end; member function ODCIAggregateMerge(self in out EMA_IMPL_T, ctx2 in EMA_IMPL_T) return number is begin return ODCIConst.Error; end; member function ODCIAggregateTerminate(self in EMA_IMPL_T, returnValue out number, flags in number) return number is begin returnValue := self.l_ema; return ODCIConst.Success; end; end; create or replace function EMA (input EMA_DATA_T) return number aggregate using EMA_IMPL_T; create or replace function HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (p_averaging_window_width integer) return HABR_MARKETINDEXES_RESULT_LIST_T is l_result HABR_MARKETINDEXES_RESULT_LIST_T; begin with T1 as (select STOCK_NAME, ADATE, TYPICAL_PRICE, ACLOSE , round (EMA (EMA_DATA_T (TYPICAL_PRICE, p_averaging_window_width)) over (partition by STOCK_NAME order by ADATE), 20) as EMA from LOAD_YAHOO_V) select HABR_MARKETINDEXES_RESULT_T (STOCK_NAME, ADATE, ACLOSE, EMA, null, null, null, null, AACTION) bulk collect into l_result from T1 match_recognize (partition by STOCK_NAME order by ADATE measures classifier() as AACTION all rows per match with unmatched rows pattern (BUY+ | SELL+) define BUY as (prev (TYPICAL_PRICE) < prev (EMA) and TYPICAL_PRICE > EMA) , SELL as (prev (TYPICAL_PRICE) > prev (EMA) and TYPICAL_PRICE < EMA) ) MR; return l_result; end;
Vergleichen Sie die Berechnungsergebnisse mit einem Parameter:
select COLUMN_VALUE as ALG, dbms_sqlhash.gethash (COLUMN_VALUE, 2) as RECORDSET_HASH from table (sys.odcivarchar2list ('select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_CALC (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_RECU (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_MODE (15)) order by 1, 2' , 'select * from table (HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (15)) order by 1, 2'));
Alle Hashes mĂŒssen fĂŒr alle vier Methoden ĂŒbereinstimmen.
Wenn die Hashes nicht ĂŒbereinstimmen, können Sie mit diesem Operator genau herausfinden, wo sich die Diskrepanz gebildet hat (ersetzen Sie die Namen der Funktionen, die Sie vergleichen möchten):
select coalesce (a.STOCK_NAME, b.STOCK_NAME) as STOCK_NAME, coalesce (a.ADATE, b.ADATE) as ADATE , a.ACLOSE as CALC_ACLOSE, b.ACLOSE as AGRF_CLOSE , a.IND_VALUE as CALC_EMA, b.IND_VALUE as AGRF_EMA , a.AACTION as CALC_AACTION, b.AACTION as AGRF_AACTION from table (HABR_MARKETINDEXES_EMASIMPLE_F_CALC (15)) a full outer join table (HABR_MARKETINDEXES_EMASIMPLE_F_AGRF (15)) b on a.STOCK_NAME = b.STOCK_NAME and a.ADATE = b.ADATE
Auswahl der ParameterDas
TIR selbst verwendet einen Parameter, fĂŒr diesen und fĂŒr alle anderen
TIRs Ă€ndere ich ihn im Bereich von 1 bis 200, aber um ein dreidimensionales Bild fĂŒr die AbhĂ€ngigkeit und auch fĂŒr die Verzögerung zu berechnen, werden wir einen zweiten Parameter einfĂŒhren, der von 1 bis 5 variiert.
Der Operator öffnet 200 * 5 = 1000 Cursor, sodass Oracle
OPEN_CURSORS möglicherweise geÀndert werden muss
Die folgende Abfrage fĂŒhrt das kartesische Produkt einer Tabelle mit Zahlen von 1 bis 200 mit einer Tabelle mit Zahlen von 1 bis 5 aus, und Cartesian multipliziert all dies durch Aufrufen der Tabellenfunktion
HABR_TRADEMODELLING_P.CALC_ACTIONS_TOTALS
.
Nach einigen weiteren Manipulationen in MATLAB erhalten wir eine 200 * 5-Matrix, wobei in den Matrixzellen fĂŒr jeden Wert jedes der beiden Parameter ein Gesamtkapitalwert angegeben wird. Als nĂ€chstes erstellen wir in MATLAB ein dreidimensionales Bild.
rollback; delete HABR_MARKETINDEXES_PARMSEL_RESULTS where INDICATOR_NAME = 'HABR_MARKETINDEXES_EMASIMPLE_F_CALC'; commit; insert into HABR_MARKETINDEXES_PARMSEL_RESULTS (INDICATOR_NAME, PARM1, PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) with TP1 as (select rownum as PARM1 from dual connect by level <= &&AVERAGING_INTERVAL) , TP2 as (select rownum as PARM2 from dual connect by level <= &&LAG_MODELLING_DEPTH) select
PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) rollback; delete HABR_MARKETINDEXES_PARMSEL_RESULTS where INDICATOR_NAME = 'HABR_MARKETINDEXES_EMASIMPLE_F_CALC'; commit; insert into HABR_MARKETINDEXES_PARMSEL_RESULTS (INDICATOR_NAME, PARM1, PARM2, STOCK_NAME, ADATE_MIN, ADATE_MAX, DEALS_COUNT, BALANCE_RESULT, DEALS_PROFIT_AMOUNT, DEALS_LOSS_AMOUNT, DEALS_PROFIT_COUNT, DEALS_LOSS_COUNT, IN_STOCK) with TP1 as (select rownum as PARM1 from dual connect by level <= &&AVERAGING_INTERVAL) , TP2 as (select rownum as PARM2 from dual connect by level <= &&LAG_MODELLING_DEPTH) select
Alle Berechnungen in diesem Artikel werden langsam durchgefĂŒhrt, bis zu 20 Minuten. Dies ist auf das Ăffnen einer groĂen Anzahl von Cursorn zurĂŒckzufĂŒhren.
Ich habe auch eine schnellere Simulationsmethode mit einem Cursor entwickelt, ohne 1000 Cursor zu öffnen, aber sie ist so umfangreich, dass sie die HĂ€lfte des Artikels in Anspruch nehmen wĂŒrde. Deshalb werde ich ihn nicht hierher bringen.
Das Ergebnis der Modellierung des Schnittpunkts des gleitenden Durchschnitts (alle Diagramme sind anklickbar):

Die zweite Zeile der Diagramme ist dieselbe wie die erste Zeile, aber die Diagramme sind leicht gedreht. Diagramme mit unterschiedlichen Verzögerungen sind nacheinander angeordnet. Auf diese Weise können Sie die Auswirkung der Verzögerung auf das Ergebnis bewerten.
Im Allgemeinen reagiert der Indikator nicht sehr empfindlich auf Verzögerungen. FĂŒr die MĂ€rkte S & P500 und NYSE muss der
TIR- Parameter ausgewĂ€hlt werden, je mehr, desto besser. FĂŒr den Brent-Markt sind es rund 25. In den beiden anderen MĂ€rkten besteht keine Korrelation zwischen der RentabilitĂ€t und dem Parameter.
Tödliche und goldene Kreuze
In der Implementierung unter Oracle ist dieser Indikator dem vorherigen sehr Àhnlich, nur dass hier zwei gleitende Durchschnitte verwendet werden und nicht einer. Daher werde ich nur eine Berechnungsoption geben.
Das Wiki beschreibt den Ichimoku-Indikator. Dies ist ein komplexer Indikator. "Kreuze" sind einer der Bestandteile. Aber der Indikator ist im Wiki schlecht beschrieben, insbesondere ist zu beachten, dass die Linien Tenkan und Kijun in völlig unterschiedlichen Worten beschrieben werden, obwohl es tatsÀchlich dasselbe ist, aber mit unterschiedlichen ZeitrÀumen.
Im Buch von Robert Colby wird dieser Indikator ebenfalls nicht beschrieben.
Japanische Analysten nennen den Schnittpunkt von Durchschnittswerten, wenn der kurzfristige Durchschnitt den langfristigen von unten nach oben kreuzt, das Goldene Kreuz (Goldenes Kreuz) und die entgegengesetzte Situation, wenn der kurzfristige gleitende Durchschnitt den langfristigen von oben nach unten kreuzt - das Tote Kreuz.
Der Autor bemerkte, dass dieser Indikator im Artikel
âFutures for American Oil bildete einâ tödliches Kreuz ââ beschrieben wurde und begann, seine Beschreibung und Verwendung zu googeln.
Dieser Indikator wird an der Börse als ernst angesehen, auch weil er selten Signale gibt.
Am hĂ€ufigsten werden gleitende Durchschnittswerte fĂŒr 50 und 200 Perioden verwendet.
Bei der Modellierung der folgenden Leistung nehmen wir den Zeitraum des langen gleitenden Durchschnitts gleich der Vierfachperiode des kurzen gleitenden Durchschnitts und simulieren die LĂ€nge des kurzen von 1 bis 200 Tagen (fĂŒr den langen Zeitraum 4 bis 800 Tage).
Code zur Berechnung auf GitHub.

Der Indikator reagiert nicht sehr empfindlich auf Verzögerungen. FĂŒr den S & P500-Markt gibt es Höchstwerte bei 48 (192 fĂŒr eine lange SS) und 98 Tagen (392 fĂŒr eine lange SS). Beachten Sie, dass das erste Maximum sehr nahe an den Zahlen 50x200 liegt. Es ist davon auszugehen, dass Sie, wenn Sie diese Parameter 1 und 2 weniger als andere Marktteilnehmer wĂ€hlen, versuchen können, sie allein mit diesem Indikator zu schlagen.
Es gibt 4 Hochs an der NYSE. In den MĂ€rkten Brent und BTCUSD funktioniert der Indikator nicht.
Auch fĂŒr den EURUSD-Markt sollte der Parameter fĂŒr eine kurze SS etwas weniger als 50 gewĂ€hlt werden. Der Indikator liefert jedoch keinen Gewinn auf diesem Markt. Es kann nur als zusĂ€tzlicher Indikator verwendet werden.
Ausgleichsvolumen, Gleichgewichtsvolumen, On-Balance-Volumen (OBV)
Der OBV-Indikator ist ein kumuliertes gleitendes durchschnittliches Handelsvolumen mit einem Pluszeichen bei einem wachsenden Markt und einem Minuszeichen bei einem fallenden Markt.
Hier verwenden wir diese Methode zur Interpretation des Werts von Indikatoren: Kaufen, wenn der OBV seinen gleitenden Durchschnitt von unten nach oben ĂŒberschreitet, verkaufen, wenn der OBV seinen gleitenden Durchschnitt von oben nach unten ĂŒberschreitet.
Mehr auf
Wiki oder Colby

Auf dem S & P500-Markt reagiert der Indikator sehr empfindlich auf Verzögerungen (Verzögerungen). Sie können jedoch versuchen, einen Parameter nach dem Prinzip âJe mehr desto besserâ zu wĂ€hlen, um eine gewisse RentabilitĂ€t zu erzielen. An der NYSE kann keine RentabilitĂ€t erreicht werden. Auf dem Brent-Markt können Sie einen Parameterwert zwischen 20 und 100 auswĂ€hlen. Auf dem BTCUSD-Markt gibt es keine klare lineare Beziehung, aber die Auswahl eines Parameterwerts von weniger als 40 ist unpraktisch. FĂŒr den EURUSD-Markt muss der Wert des Parameters âje mehr desto besserâ gewĂ€hlt werden, aber die RentabilitĂ€t kann nicht erreicht werden.
Keltner-Kanal
TIR besteht aus zwei BĂ€ndern oberhalb und unterhalb des gleitenden Durchschnittspreises, deren Breite als Bruchteil der durchschnittlichen PreisĂ€nderung fĂŒr den Zeitraum bestimmt wird. Der Preis ist ein typischer Preis.Die Mittellinie der Indikatorlinie ist ein einfacher gleitender Durchschnitt des typischen Preises.Die oberen und unteren Linien des Indikators sind von der Mittellinie um einen Betrag getrennt, der dem einfachen gleitenden Durchschnitt der tĂ€glichen Handelsspanne entspricht.In unseren Berechnungen wird das TIR- Signal wie folgt gebildet: Kaufen, wenn der Preis die obere Linie ĂŒberschreitet, Verkaufen, wenn der Preis die untere Linie ĂŒberschreitet.
Es gibt Hochs fĂŒr die MĂ€rkte S & P500 und NYSE. Auf dem Brent-Markt besteht keine AbhĂ€ngigkeit des Ergebnisses vom Parameter, und der gesamte Handel ist ratlos. Es gibt Hochs auf dem BTCUSD-Markt, aber enge, und es ist schwierig, in diese hineinzukommen. Auf dem EURUSD-Markt ist die AbhĂ€ngigkeit des Ergebnisses vom ParameterPreis- und Volumentrend, Preis- und Volumentrend, Preis - Volumentrend, PVT
Der Wert des PVT-Indikators reprĂ€sentiert die kumulierte Summe des Produkts des aktuellen Handelsvolumens durch den gegenĂŒber der Vorperiode verringerten Preisanstieg.Wir werden hier Handelssignale wie folgt generieren: Kaufen, wenn der PVT seinen gleitenden Durchschnitt von unten nach oben ĂŒberschreitet, Verkaufen, wenn der PVT seinen gleitenden Durchschnitt von oben nach unten ĂŒberschreitet.Mehr im Wiki . Colby fand nicht. FĂŒr den S & P500, den Wert des Parameters âje gröĂer desto besserâ, besteht fast keine AbhĂ€ngigkeit von der NYSE, fĂŒr Brent gibt es ein Maximum im Bereich von 50, fĂŒr BTCUSD ist der Indikator nur mit minimalen Verzögerungen von 1-2 und mit minimalen Parameterwerten von bis zu 50 wirksam FĂŒr EURUSD nimmt die AbhĂ€ngigkeit zu.
Leichtigkeit der Bewegung, Leichtigkeit der Waffen Bewegungswert, EMV
TIR EMV ist ein numerischer Ausdruck dafĂŒr, wie leicht sich ein Preis in einem Markt Ă€ndert. Je stĂ€rker die PreisĂ€nderung und je geringer der Umsatz, desto leichter steigt oder fĂ€llt der Markt.Hier bilden wir die HandelsauftrĂ€ge wie folgt: Kaufen, wenn der gleitende Durchschnitt EMV ĂŒber Null steigt, Verkaufen, wenn der gleitende Durchschnitt EMV unter Null fĂ€llt.Mehr auf Wiki oder Colby. Auf den S & P- und NYSE-MĂ€rkten gibt es Hochs, auf dem Brent-Markt ist der Indikator in einer Vielzahl von Parameterwerten wirksam. Auf den BTCUSD- und EURUSD-MĂ€rkten ist der Indikator unwirksam.
Warenkanalindex, CCI
TIR CCI ist ein Indikator, der auf der Analyse der aktuellen Ănderung der Preisabweichung von ihrem Durchschnittswert fĂŒr einen bestimmten Zeitraum und dem durchschnittlichen Absolutwert dieses Parameters basiert. TIR gilt fĂŒr alle FinanzmĂ€rkte.Wir werden die HandelsauftrĂ€ge wie folgt bilden: Kaufen, wenn der CCI ĂŒber 100 steigt, Verkaufen, wenn der CCI unter 100 fĂ€llt.Mehr auf Wiki oder Colby. In den MĂ€rkten S & P500, NYSE, Brent besteht keine AbhĂ€ngigkeit des Handelsergebnisses vom Wert des Parameters. Es besteht eine AbhĂ€ngigkeit vom BTCUSD-Markt (zwei deutliche HöchststĂ€nde), und Sie können versuchen, ihn im realen Handel zu fangen. Auf dem EURUSD-Markt wird der Indikator fĂŒr das Ergebnis nicht bringen. Quellen auf Github verfĂŒgbar
Erstellen Sie gemeinsame Objekte, laden Sie Daten hoch, entweder meine (wie ich bereits sagte, alle MĂ€rkte auĂer den letzten stammen von Yahoo Finance), oder erstellen Sie eigene Funktionen zum Berechnen, Berechnen von Handelsleistungsdaten (wie bereits erwĂ€hnt, Berechnen jedes Indikators fĂŒr bis zu 20 Minuten) .Die allgemeine Schlussfolgerung bezĂŒglich der TIR : Die Verwendung nur eines Gewinnindikators ist unmöglich. Unterschiedliche Indikatoren sind in verschiedenen MĂ€rkten unterschiedlich wirksam. Die Möglichkeit, mit mehreren gut abgestimmten Indikatoren und zusĂ€tzlichen externen Informationen Gewinne zu erzielen, ist nicht ausgeschlossen.Optional:
Es wurden drei weitere Indikatoren analysiert, die nicht im Artikel enthalten sind. Aber sie konnten kein Ergebnis erzielen. Vielleicht wird ihr Studium fortgesetzt.Es ist sehr praktisch , Berechnungen und komplexe Modellierungen von TIR- und FinanzaktivitĂ€ten im Allgemeinen in Oracle Database durchzufĂŒhren .