Perry J. Kaufman - 3-jų dienų sandorio peržiūra

Aug 20
Viena iš autoriaus mėgstamiausių prekybos strategijų. Ar galima pagerinti jos rezultatus, atnaujinus parametrus?

Perry J. Kaufman

Be abejonės, mano mėgstamiausias trumpalaikis prekybos metodas – 3 dienų sandoris. Tai supaprastinta Džordžo Daglaso Teiloro prekybos metodo versija, pirmą kartą paskelbta 1950 metais. Tik pagalvokite – prieš 75 metus! Tuo metu iš ateities sandorių rinkų egzistavo tik grūdų rinka.

Pilną Teiloro metodo versiją galima rasti internete.


Strategijos esmė paprasta: pirkti trečiosios kritimo dienos pabaigoje, išlaikyti poziciją dvi dienas ir išeiti iš rinkos. Trumpajai pozicijai galioja atvirkštinė taisyklė: parduoti trečiosios kilimo dienos pabaigoje ir išpirkti poziciją po dviejų dienų. Pirminėje versijoje numatytos papildomos sąlygos, visų pirma skirtos prekybai grūdais.


Teiloras taip pat turėjo taisykles, nurodančias praleisti atskiras dienas. Siekdamas atsižvelgti į kainų pokyčių seką ir volatilumą, jis naudojo specialią įrašų sistemą („book method“). Tokio grafiko pavyzdį galima rasti bet kurioje iš mano knygų „Prekybos sistemos ir metodai“. Visiškai įgyvendinti Teiloro metodą nėra paprasta, tačiau šiuolaikinės priemonės leidžia palengvinti užduotį ir atnaujinti strategiją.

Bazinio modelio naudojimas

Pirmiausia pažiūrėkime, kaip bazinės 3 dienų sandorio taisyklės veikia akcijų indekse. Pasirenkame indeksą, nes jis, kaip daugelio akcijų vidurkis, yra labiau „triukšmingas“ – jame vyrauja chaotiški kainos svyravimai aukštyn ir žemyn. Atskiros akcijos, pavyzdžiui, „Amazon“, „Tesla“ ar „Nvidia“, dažniau rodo ilgesnes nei trijų dienų serijas ir todėl mažiau tinka grįžimo prie vidurkio strategijai.

Nuo 2000 m. taikydami ilgųjų ir trumpųjų sandorių taisykles biržiniam fondui SPY, gauname signalus, parodytus 1 paveiksle. Strategijos rezultatai pateikti 2 paveiksle.

Mano nuomone, rezultatas įspūdingas: taisyklės buvo suformuluotos 1950 m., o pritaikytos rinkai, kurios tuomet dar nebuvo. Trumpųjų pozicijų sandoriai duoda tik nedidelį pelną, tačiau to buvo galima tikėtis, remiantis patirtimi su trendinėmis ir kitomis strategijomis. Akcijų kainos turi ilgalaikę augimo tendenciją, todėl uždirbti iš trumpųjų pozicijų yra sudėtingiau.
1 Pav. STRATEGIJOS TAIKYMAS AKCIJŲ INDEKSUI. Kaip ši strategija veikia prekiaujant akcijų indeksu? Pateikiami pavyzdžiai, kai duodami ilgalaikio ir trumpalaikio pozicijų atidarymo signalai dėl SPY – biržinio fondo, susijusio su S&P 500 indeksu – įeinant į rinką po trijų dienų kainos judėjimo ir išeinant iš rinkos po dviejų dienų.
2 PAV. STRATEGIJOS REZULTATAI. 1 pav. pateiktos strategijos pradinio testo bendrųjų rezultatų pavyzdys nuo 2000 m. Rezultatai neblogi – bet ar juos galima pagerinti?

Tipinių taisyklių pridėjimas

Apžvelkime taisykles, kurios gali būti naudingos beveik bet kuriai strategijai: 

  • šiek tiek kitokie įėjimo ir išėjimo laikotarpiai
  • trendo filtras
  • pelno fiksavimas, jei iki planuojamo išėjimo kaina patiria ekstremalius svyravimus
  • įėjimo filtras esant žemam volatilumui
  • įėjimo filtras esant ekstremaliai aukštam volatilumui
  • atsisakymas įeiti tam tikrą savaitės dieną

Mano asmeninė taisyklė: nepridėti nieko, kas nesuteikia esminio pagerėjimo. Kitaip strategija tik be reikalo tampa sudėtingesnė. Kuo mažiau taisyklių, tuo paprastai patikimesnė sistema. Turėkime tai omenyje.

Įėjimo ir išėjimo laikotarpiai

Įėjimo ir išėjimo laikotarpių pakeitimas turėtų turėti didžiausią įtaką. Optimizavimas rodo, kad geriausias laikas atidaryti ilgąją poziciją yra po vienos dienos kainos kritimo, o išeiti – po dviejų dienų; toliau tai žymėsime kaip 1×2. Trumpųjų sandorių atveju geriausias derinys pasirodė esąs 3×3. Palyginti su pradinėmis taisyklėmis, tiek pelnas, tiek rizika pastebimai padidėja (3 pav.).

Optimizuotos taisyklės – pirkimas po vienos dienos kritimo – pasinaudoja stabilia SPY augimo tendencija, atidarant ilgąją poziciją bet kurią kritimo dieną. Rezultatas – 1 882 sandoriai, palyginti su 140 pagal pradines taisykles. Trumpųjų sandorių rezultatai gerėja, tačiau taip pat didėja nuostolių amplitudė. Vis dėlto 20 773 dolerių pelnas gerokai viršija 7 762 dolerius. Tokį rezultatą sunku ignoruoti. Toliau lygiagrečiai tikrinsime abu parametrų rinkinius.
3 PAV. ĮĖJIMO IR IŠĖJIMO LAIKOTARPIŲ OPTIMIZAVIMAS. Ar pakeitus įėjimo ir išėjimo laikotarpius pagerėja rezultatas? Lyginamos pradinės taisyklės ir strategija su optimizuotais laikotarpiais. Optimizuotos strategijos pelningumas didesnis, tačiau didesnė ir rizika.

Trendo filtras

Trendo filtras padeda daugumai trumpalaikių strategijų. Čia atskirai išbandome du variantus. Pradinei strategijai 3×2 / 3×2 optimizacija pasirinko 80 dienų laikotarpį, o variantui 1×2 / 3×3 – 120 dienų. Rezultatai pateikti 4 pav. Pradinė strategija pagerėjo pagal visus parametrus, o optimizuota strategija pasirodė geriau trumpalaikių sandorių atveju, tačiau prarado bendrą pelną ir pelno koeficientą. Kitaip tariant, pradinė strategija laimėjo taikant trendo filtrą, o optimizuota – ne. Mano nuomone, optimizuoto varianto rezultatas yra pernelyg optimizuotas ir nepakankamai stabilus.

Atkreipkite dėmesį ir į 4 pav. – pradinės strategijos rodikliai dabar yra labai panašūs tiek ilgosioms, tiek trumposioms pozicijoms. Optimizuotos strategijos atveju ilgųjų pozicijų rezultatai pablogėjo, o trumpųjų – pagerėjo. Kaip elgtis toliau?

Paliksiu pradinį modelį su 80 dienų trendo filtru, o iš optimizuoto modelio filtrą pašalinsiu.

Įterptinyje „Modifikuotas 3 dienų sandoris „EasyLanguage“ kalba“ pateiktas programos kodas su visomis šiomis galimybėmis. Jas galima testuoti atskirai arba kartu.
4 Pav. TRENDO FILTRAS. Toks filtras paprastai padeda trumpalaikėms strategijoms. Ar tendencijos periodo įtraukimas pagerina pradines ir optimizuotas taisykles? 80 dienų filtras iš esmės pagerino pradinę strategiją iš 1 pav. , o 120 dienų filtras nesuteikė bendro optimizuotos strategijos iš 3 pav. pagerinimo.

Volatilumo filtras

Žemas volatilumas paprastai reiškia nedidelį pelną ir, tikėtina, dažnesnius nuostolius. Didelis volatilumas susijęs su didele rizika.
Galbūt viršutinė ir apatinė ribos leis pagerinti abu rodiklius – patikrinkime jas kartu.

Šiame teste volatilumas skaičiuojamas kaip dabartinio realaus diapazono ir vidutinio realaus diapazono per N dienų santykis, t. y. naudojama santykinis volatilumas. Vietoj jo galima rinktis numanomą volatilumą – pavyzdžiui, VIX indeksą.

Pradiniam 3×2 variantui geriausiais pasirodė 15 dienų laikotarpis, apatinė riba 0,25 ir viršutinė riba 3,25. Optimizuotam variantui – 30 dienų laikotarpis, apatinė riba 0,75 ir viršutinė riba 3,75.

Pagerėjimas buvo nedidelis, tačiau jis paveikė visas sandorių grupes (5 pav.). Todėl aš naudoju šį filtrą.
5 Pav. VOLATILUMAS. Ar viršutinės ir apatinės volatilumo ribos nustatymas pagerina pradines ir optimizuotas taisykles? Rezultatai rodo nedidelį pagerėjimą visose sandorių grupėse.

Pelno fiksavimas

Sandorio metu kaina visada gali staigiai šoktelėti. Tokioje situacijoje aš linkstu fiksuoti pelną prieš galimą trendo apsisukimą. Patikrinkime pelno tikslą, apskaičiuotą kaip vidutinį tikrąjį diapazoną (ATR), padaugintą iš koeficiento, kuris paprastai yra mažesnis nei 4,0.

Naudojant pradinius parametrus 3×2 (kairėje 6 pav. lentelėje) rezultatai yra nevienareikšmiški. Geriausias pelno tikslo koeficientas buvo 1,25 tiek ilgosioms, tiek trumposioms pozicijoms – šiek tiek daugiau nei vienas ATR. Optimizuotoje strategijoje geriausiais pasirodė 2,0 ilgosioms ir 1,0 trumposioms pozicijoms.
Pelningumas šiek tiek sumažėjo, pelningų sandorių dalis šiek tiek padidėjo, o trumpųjų sandorių rezultatai pagerėjo. Optimizuotame teste (lentelės dešinėje) sumažėjo tiek pelningumas, tiek nuosmukis.

Pati idėja gali būti naudinga, tačiau optimizuotos versijos rezultatai nėra įtikinami. Pradinėje versijoje šį elementą vis dėlto galima išlaikyti.
6 Pav. PELNO FIKSAVIMAS. Ar verta fiksuoti pelną po staigaus kainos šuolio, atsižvelgiant į galimą trendo apsisukimą? Pradinės strategijos, pateiktos 1 pav. atveju, geriausias tikslo koeficientas buvo 1,25 tiek ilgosioms, tiek trumposioms pozicijoms; optimizuotos strategijos, pateiktos 3 pav., atveju – 2,0 ilgosioms ir 1,0 trumposioms pozicijoms. Pradinės strategijos rezultatai yra priimtini, o optimizuotos – ne pernelyg įtikinami.

Savaitės diena

Galiausiai patikrinsime, ar egzistuoja dėsningumas, dėl kurio kuri nors savaitės diena yra mažiau tinkama įeiti į rinką. Programa iš įterptinio teksto „Modifikuota 3 dienų sandorio strategija EasyLanguage kalba“ leidžia pašalinti tik vieną dieną. Jei norite, kodą galima pakeisti ir išbandyti kiekvieną dieną atskirai, tačiau aš linkęs pašalinti vienintelę blogiausią dieną.

7 pav. matyti, kad antradienio pašalinimas suteikia nedidelį bendrą beveik visų rodiklių pagerėjimą, išskyrus pelningumą. Padidėja pelno koeficientas – pelno ir nuostolio santykis – bei pelningų sandorių skaičius. Palyginti su 5 pav. pateiktais duomenimis, pagerėjimai yra panašūs tiek pradinėje, tiek optimizuotoje versijose. Nors efektas ir nedidelis, tačiau atsisakymas įeiti į rinką antradieniais suteikia jums dar vieną laisvadienį!
7 Pav. SAVAITĖS DIENA. Ar rezultatai pagerės, jei bus atsižvelgiama į įėjimo dieną? Atmetus įėjimus antradieniais, gaunamas nedidelis bendras pagerėjimas tiek pradinėje, tiek optimizuotoje strategijoje.

Galutiniai rezultatai

Bendri SPY rezultatai pateikti 8 pav. Į pradinę 3×2 versiją įtraukėme trendo filtrą ir volatilumo ribas, taip pat pašalinome antradienius. Taip pat buvo galima išlaikyti pelno fiksavimą. Optimizuotoje versijoje naudojamos volatilumo ribos ir pašalinti antradieniai.

Pasirinkimas priklauso nuo jūsų. Optimizuota versija duoda dvigubai daugiau pelno nei pradinė, tačiau didžiausią dėmesį skiria ilgosioms pozicijoms. Trumposios pozicijos gali būti visiškai pašalintos. Tačiau tuomet rezultatai taps labai panašūs į trendinę sistemą, o strategija neužtikrins portfelio, sudaryto iš kelių sistemų, diversifikacijos.

Atlikus nedidelius patobulinimus, pradinė versija parodė didesnį pelningumą ir geresnius bendrus statistinius rodiklius. Ilgųjų ir trumpųjų sandorių rezultatai joje yra panašūs, todėl ji, tikėtina, užtikrins gerą diversifikaciją. Aš pasirinkčiau pradinę versiją, atlikęs tik keletą pakeitimų.

Jei norite, galite atlikti savo bandymus naudodami programą iš įterptinio lango.
8 Pav. „3 DIENŲ SANDORIO“ STRATEGIJA SU ATNAUJINTAIS PARAMETRAIS: DU VARIANTAI. Pradinės strategijos su atnaujintais parametrais ir optimizuotos versijos palyginimas. Bendri pradinės strategijos statistiniai rodikliai yra geresni, tačiau abu variantai turi savo privalumų ir kompromisų.

Modifikuotas 3-jų dienų sandoris EasyLanguage kalba

Ši programa leidžia pasinaudoti prieš kelis dešimtmečius sukurta „3 dienų sandorio“ strategija ir išbandyti įvairius parametrus, galinčius pagerinti rezultatus. Kodą galima testuoti trendo periodą, viršutinę ir apatinę volatilumo ribas, pelno tikslo koeficientą bei draudimą įeiti į rinką tam tikrą savaitės dieną.
P. J. Kaufman – modifikuotas 3 dienų sandoris
EasyLanguage kodas
EasyLanguage
// PJK: modifikuotas 3 dienų sandoris
// © P. J. Kaufman, 2018, 2020, 2023–2024. Visos teisės saugomos.
// ATRprofitfactor — naudoti ATR periodą pelno tikslui apskaičiuoti
// Dayofweek: 1 = sekmadienis
inputs: longentry(3), longexit(2), shortentry(4), shortexit(2),
trendper(0), profperiod(5), longproffactor(0), shortproffactor(0), longonly(true), dontusedayofweek(0),
usestocks(false), maxvol(0), minvol(0), volperiod(20);
vars: currentdir(0), upcount(0), downcount(0), prevupcount(0),
prevdowncount(0), trend(0), size(1), prevdir(0), positionATR(0), stockinvestment(10000), volOK(false), futuresinvestment(25000), basisperiod(20), DOW(0), avol(0), ATR(0), volratio(0), ATRprofit(0), raw(0);
if trendper > 0 then begin
if high > highest(high[1],trendper) then trend = 1 else if low < lowest(low[1],trendper) then trend = -1;
end;
DOW = dayofweek(date);
// ATR pagrįstas volatilumas
if volperiod <> 0 then begin
ATR = avgtruerange(volperiod);
if ATR[1] <> 0 then volratio = truerange/ATR[1];
end;
// pozicijos dydis
if usestocks then begin
size = stockinvestment/close[1];
end
else begin
positionATR = avgtruerange(basisperiod);
if positionATR <> 0 then
size = futuresinvestment/ (positionATR*bigpointvalue);
end;
// ATR pagrįstas pelno tikslas
if profperiod <> 0 then ATRprofit = avgtruerange(profperiod);
// serijos ilgio ir jos krypties skaičiavimas
prevupcount = upcount; prevdowncount = downcount;
prevdir = currentdir;
if close > close[1] then begin
if close[1] > close[2] then
upcount = upcount + 1 else begin
currentdir = 1;
upcount = 1;
downcount = 0;
end;
end
else if close < close[1] then begin
if close[1] < close[2] then
downcount = downcount + 1
else begin
currentdir = -1;
downcount = 1;
upcount = 0;
end;
end;
// išėjimai
if marketposition > 0 and ((barssinceentry >= longexit) or (trendper <> 0 and trend < 0)) then
sell ("Lexit") all contracts this bar on close
else if marketposition < 0 and ((barssinceentry >= shortexit) or
(trendper <> 0 and trend > 0)) then buy to cover ("Sexit") all contracts this bar on close;
// pelno fiksavimas antrąją dieną
if marketposition > 0 and profperiod <> 0 and longproffactor <> 0 then
sell ("LongPT2") all contracts next bar at entryprice + longproffactor*ATRprofit limit;
if marketposition < 0 and profperiod <> 0 and shortproffactor <> 0 then
buy to cover ("ShortPT2") all contracts next bar at entryprice - shortproffactor*ATRprofit limit;
// nauja ilgoji pozicija uždarymo metu arba kito atidarymo metu
// ankstesnė kryptis buvo žemyn, o serijos ilgis pasiekė nustatytą reikšmę
if currentdir <= 0 and downcount >= longentry then begin 
// uždaryti ankstesnę trumpąją poziciją
if marketposition < 0 then buy to cover ("Lreverse") all contracts this bar on close;
// patikrinti kitos dienos sąlygas
volOK = volperiod = 0 or ((minvol = 0 or volratio > minvol) and
(maxvol = 0 or volratio < maxvol));
if (trendper = 0 or trend > 0) and (dontusedayofweek = 0 or dontusedayofweek <> DOW) and volOK then begin
// pavedimas uždarymo metu
buy ("upday") size contracts this bar on close;
// nustatyti pelno tikslą
if profperiod <> 0 and longproffactor <> 0 then
sell ("LongPT") all contracts next bar at entryprice + longproffactor*ATRprofit limit;
end;
end
// nauja trumpoji pozicija
else if longonly = false and currentdir >= 0 and upcount
>= shortentry then begin
// uždaryti ankstesnę ilgąją poziciją
if marketposition > 0 then sell ("Sreverse") all contracts this bar on close;
if (trendper = 0 or trend < 0) and (dontusedayofweek
= 0 or dontusedayofweek <> DOW)
and volOK then begin
// pavedimas uždarymo metu
sell short ("downday") size contracts this bar on close;
// nustatyti pelno tikslą
if profperiod <> 0 and shortproffactor <> 0 then
buy to cover ("ShortPT") all contracts next bar at entryprice - shortproffactor*ATRprofit limit;
end;
end;
// naujos pozicijos šiandienos uždarymo metu
if marketposition = 0 and currentdir[1] <= 0 and
downcount[1] >= longentry and (trendper =
0 or trend[1] > 0) then begin
if close < close[1] and volOK[1] then begin
buy size contracts this bar on close;
end;
end
else if marketposition = 0 and longonly = false and currentdir >= 0 and
upcount[1] >= shortentry and (trendper = 0 or trend[1] < 0) then begin
if close > close[1] and volOK then begin
sell short size contracts this bar on close;
end;
end;

Apie autorių

Perry J. Kaufmanas – treideris ir finansų inžinierius, daugelio knygų apie treidingą ir rinkų analizę autorius. Tarp jų – šeštasis leidimas „Prekybos sistemų ir metodų“ (2020 m.; pirmasis leidimas, išleistas 1978 m., tapo vienu iš pagrindinių veikalų apie techninę analizę), „Kaufman Constructs Trading Systems“ (2020 m.) ir „Learn To Trade“ (2022 m.). Klausimai ir komentarai: www.kaufmansignals.com

Beje, Perry J. Kaufmanas 1995 metais yra sukūręs Adaptive Moving Average (AMA) slankųjį vidurkį. Plačiau apie tai skaitykite straipsnį.

Straipsnio kodas

Straipsnio kodą galima rasti skyriuje „Article Code“ svetainėje Traders.com

Papildoma literatūra

Kaufman, Perry J. (2022). „Learn To Trade“. „Amazon“.
Kaufman, Perry J. (2020). „Trading Systems and Methods“, 6-asis leidimas. „Wiley“.
Kaufman, Perry J. (2020). „Kaufman Constructs Trading Systems“. „Amazon“.
Perry J. Kaufman
Išversta Spekuliantas.biz
Sukurta su