Koneoppiminen ja algoritmit treidauksen tukena

Tämä projekti on jatkunut välipäivinä aivan älyttömän hyvin tuloksin.

Treenasin 11.2 M parametrit transformerin noin 12 miljardilla osakehinta-tokenilla. Joku reilu 3 vrk ajoa CSC:n supertietokoneella kunnes perplexity ei enää tippunut kuin marginaalisesti tuurilla kerran 4-5 tunnissa.

Ja pikainen tarkistus siitä, mitä malli ennustaa, loksautti kyllä leuat. Tässä 25 tickerille kullekin 50 t+20 ennustetta (mediaani ja 95% luottamusväli - himmeällä myös jokainen ennustepolku):

Malli ei siis tiedä ollenkaan mitä tikkeriä se ennustaa - se näkee ainoastaan end-of-day OHLC-lukemat 60 viimeiseltä päivältä. Kyseessä out-of-sample data: malli treenattu 04/20 päättyvällä aineistolla ja ennusteessa viimeisin kurssidata.

Aika hienosti malli hiffaa:

  • Trendin / momentumin (toisaalta uskaltaa myös paikoin kontrata trendiä)
  • Korkean ja matalan volatiliteetin osakkeet (esim. JNJ:n kapea tunneli vs. Teslan joka suuntaan menevät ennusteet)
  • Epävarmuuden muodon (vs. tyypillinen symmetriseen keskihajontaan perustuva riskiprofiili)

Koodin laitan jakoon lähiaikoina, jos joku haluaa jatkojalostaa omiin tarpeisiinsa.

Seuraavaksi ajatuksena on katsoa, voisiko tällä tehdä tuottoa ja missä tilanteissa.

Mahdollinen jatkoajatus on vielä reinforcement learningilla fine-tunata tämä niin, että laittaisi mallin oikeasti treidaamaan ja palkitsisi sitä tuotoista ja rankaisisi tappioista. Katsotaan milloin nämä valmistuisi.

11 tykkäystä

Tähän voisi hyvinkin sopia Reinforcement Learning jatkokehityprojekti. Syötteeksi malli saisi osakkeen kaikki ennustepolut ja ennustaisi niiden perusteella Osta-, Myy- ja Pidä-suositusten todennäköisyyksiä. Sitten, kun suositus vaihtuu vastakkaiselle puolelle niin lasketaan toteutuneet tuotot ja opetetaan mallia niiden perusteella.

3 tykkäystä

Laita ihmeessä jakoon! Näyttää todella jännältä. Uskon että itselle olisi hyvä ensimmäinen askel lähtemään työstää koneoppimista treidauksessa :slight_smile:

2 tykkäystä

Onko tuossa ennusteessa myös se toteutunut kehitys? Ja mistä tuollaisen 12 miljardin osakehintatokenin datasetin saa?

Käytin tätä datasettiä: Stock Market Dataset | Kaggle

12 miljardia tokenia (tai tarkemmin 11.2 B) tulee seuraavista parametreistä:

  • 689k backpropagation iteraatiota
  • 64 batch size
  • 256 context window

689k x 64 x 256 = 11.2B tokenia

Tuossa data setissä on joku 300M havaintoa, joten ajoin opetusta jonkun 37 epochia siis, kun validation setin loss tuli kivasti alas ilman overfitting oireita.

Tässä samankaltainen kuva kuin yllä, mutta ei ennusteta tulevaa kehitystä, vaan otetaan annetaan syötteeksi 80-20 päivän takaiset hinnat ja verrataan ennustetta 20-0 päivän takaiseen kehitykseen (vihreä).

Nuo viivakuvat eivät ehkä ole parhaat, joten tässä vähän toisenlainen vertailu ristiin toteutuneiden tuottojen ja ennustetun välillä (mukana isompi määrä tikkereitä ja vain yli 2% swingit):

Mallilla selvästi tendenssi arpoa ylioptimistisia kehityksiä 20 päivän jaksolle. Directional accuracy vieläkin isommalle tikkerimassalle neljän vuoden ajalta on selvästi kolikon heittoa parempi, mutta pitäisi vielä analysoida, johtuuko se tästä tendenssistä, joka näyttäisi korreloivan markkinan yleisen suunnan kanssa.

Muutama muukin alustava backtesti tuolla koodissa on, jos kiinnostaa kurkkia. Treenattu malli löytyy myös reposta, että voi sitä suoraan ajaa halutessaan. Raakadata on taas niin iso, että se ei Githubiin mahdu

PS. repo päivittyy hitaasti tässä samalla tätä kirjoittaessa - sen verran isoa tiedostoa mukana.

5 tykkäystä

Projekti alkaa olemaan loppusuoralla. Backtestit tosin vasta tehty noin 30% koko 10 000 tickerin avaruudesta, mutta eiköhän tästä käsissä olevasta +10M out-of-sample datapisteen backtest-otoksesta voi jo todeta tulokset, jotka ovat:

  • Mallilla pystyy tuottamaan tilastollisesti merkityksellistä alphaa (ajoin backtest tulokset esim. monte-carlo simulointeja vastaan, joista yksikään ei päässyt yhtä hyviin tuloksiin esim. Sharpella mitattuna - malli tuottaa sopivilla kalibroinneilla >2.0 Sharpe-ration)
  • Malli toimii etenkin monen päivän swing tradeissa (johtunee käytetystä daily price datasta ja sen kyvyttömyydestä erottaa päivän sisäistä kohinaa signaalista ilman intra-day tai volatiliteetti featuretietoa - vähän harmittaa, että volan jätin pois, mutta enää ei riitä GPU-resut ajamaan hommaa uusiksi). Näissä korkean luottamuksen tradesignaalit antavat 52% buy/sell osumatarkkuuden
  • Mittaan mallin sisäistä itsevarmuutta (conviction ja confidence) tarkistamalla softmax-jakauman todennäköisyysmassan luonteen ja logittien intensiteetin. Hieno ominaisuus on se, että tällä perusteella annettu signaali tuottaa myös tarkemman suuntaennusteen. Tällä perusteella voi siis valita odotusarvollisesti tuottavimma tradet.
  • Ja kun edellisen perusteella laatii ns. sniper-strategian, jossa a) valitaan sopivimmat tradet ja b) panostetaan signaalin voimakkuuden perusteella, saan vakioisilla (voisi vielä testata myös dynaamisuutta) stop-losseilla ja profit taking -thresholdeilla aikaan satojen prosenttien per annum tuottoja varsin minimaalisella drawdownilla. Jostain syystä malli on erityisen hyvä shorttaamaan ja aika paljon huonompi erittäin härkäisessä markkinassa.

On pitänyt hieroa silmiä muutaman kerran kun näitä tuloksia on käynyt läpi. Teoreettisiahan nämä ovat siinä mielessä, että slippage, path dependency ja pari muuta tosielämän constrainttia puuttuu mallinnuksesta. Mutta kyllä tämän perusteella pystynee sanoa, että transformerilla voisi olla kohtalaisen hyvää utilitya teknisen analyysin tukena.

Lopulliset tutkimustulokset lienee valmiina noin kk sisällä.

8 tykkäystä

Mielenkiintoista seurata tätä.

Kommenttina tuohon polkuriippuvuuden puutteeseen, oletko tutustunut sellaiseen kuin ”rough paths” teoria? Siihen liittyy sellainen konsepti kuon path signature, joka on kasvattanut suosiota viimevuosina nimenomaan koneoppimispiireissä sillä periaatteessa se kuvaa stokastisen prosessin polkurealisaation varsin vähäulotteiseen avaruuteen. Jos jatkat työtä tämän parissa vielä gradun jälkeen, suosittelen tutustumaan. Alla rough paths teorian kehittäjän yhteenveropaperi aiheesta. Olen itse jotain rahoitusliitännäksiä kokeiluja toteuttanut noiden pohjalle ja sain varsin hyviä tuloksia. Valitettavasti ne koodit on työnantajan omaisuutta, niin en voi jakaa.

3 tykkäystä

Path dependencylla tarkoitin oman projektini kontekstissa sitä, että backtest-tuloksiin liittyy mallintamatonta intra-day sekvenssiepävarmuutta tai “suoritusjärjestysepäloogisuus” - ts. path dependecy -puute. Eli kun operoin backtesteissä vain open ja close -tuottoluvuilla, on mahdollista, että esim. stop-lossit ja profit taking thresholdit olisivat tosielämässä tulleet vastaan intradayssa, jolloin tietysti strategioiden tuottoluvut ovat jossain määrin vääristyneitä. En edes yritä nyt tämän tutkielmaprojektin scopessa tätä lähteä koodaamaan, vaikka se olisikin datasta löytyvien päivän sisäisten High / Low featureiden avulla mahdollista.

Rough paths -teoria on karkean konseptuaalisesti tuttu, enkä sitä itse ole koskaan soveltanut - olen enemmän markovilaisen koulukunnan kasvatti tämän tyyppisessä mallinnuksessa :grinning_face: . Sinänsä securities kontekstissa sama käyttökohde kuin mun projektissa - paradigma vain eri.

1 tykkäys

Ei varmaan saa tai halua osakepyynnöillä häiritä, mutta minkälaista signaalia tuo antaisi tickerille “EQR.ASX”?

En nyt tiedä, päätyikö tämä satunnaisotannalla backtestin ticker-avaruuteen.

Enkä lähtisi tällä mallilla tekemään suoria osakepoimintoja tai ennustamaan yksittäistä tikkereitä ajanhetkellä X. Tässä genressä suunta-arvauskin on parhaimmillaan vain hieman parempi kuin kolikonheitto yksittäisessä treidissä.

Malli toimii, kun Law of Large Numbers alkaa riitävällä otoskoolla tuottamaan tulosta. Vähän kuin kasinon house edge esim. ruletissa: rulettipöydässä kasino ei tiedä, mihin kohtaan pallo pysähtyy seuraavalla kerralla, eikä se edes yritä arvata sitä. Kasino luottaa siihen, että säännöt on asetettu niin, että tuhansien pyöräytysten jälkeen tilasto kääntyy talon eduksi.

Sama pätee tässä: tavoitteena ei ole mun ML setupissa osua oikeaan jonkin osakkeen kohdalla, vaan operoida tuhansia kertoja sellaisella tilastollisella edulla, jolla edge kääntyy mallin eduksi :slight_smile:

5 tykkäystä

Nyt on tutkimus valmis. Lopullinen malli 3.45M parametrin transformer, jota treenattiin melkein 40 miljardin token passilla. Backtestaus tehtiin lopulta noin 7 miljoonalla testi-tradella. Malli treenattiin +6000 tickerin otannalla vuosien 1999-2016 hintahistorialla. Validoinnin aikaväli oli 2017-2020 ja backtestaus 2021-2024 (vajaa 3000 tickeriä).

Ihan hyviltähän tulokset lopulta näyttävät:

  • Daily datalla markkina on liian kohinainen “always-on” ennustamiseen - ilman suodatusta tuotot jäivät lähelle satunnaista. Friction-rangaistuksen (mm. kulut) vuoksi tuotot koko otannalle negatiivisia.
  • Kun mukaan lisättiin monivaiheinen signaalisuodatus (mallin confidence + conviction + sektorit + markkina-arvo), tulokset paranivat merkittävästi.
    • Suodatetuissa signaaleissa suuntaennuste ylitti markkinoiden 50 % tehokkuusrajan ja tuotti positiivista riskikorjattua ylituottoa.
    • Sharpe = 3.7 ja Sortino = 5.7 Multifactor-suodatuksella (tässä toki pieni overfitting ansa mahdollisesti).
  • Ilahduttavasti Transformer pystyi tuottamaan positiivista tuottoa läpi bull- ja bear-markkinoiden (siis ilman erillistä kalibrointia tmv.).
  • Erityisesti mallin confidence - eli siis mallin token-ennusteen todennäköisyysjakauman keskittymisen mittari - näyttäisi olevan hyvä indikaattori tuottoisalle tradelle.
    • Puolestaan conviction - eli voimakkuus, jolla malli kertoo traden suunnan - oli puolestaan negatiivinen signaali tuoton kannalta. Eli ehkä yksinkertaisesti: mallin kannattaa olla suunnasta varma, mutta ei välttämättä “liian dramaattinen” signaalin voimakkuuden suhteen.
  • Simppelin ARIMA-benchmarkin suoriutuminen yllätti myös - erityisesti tietyissä markkinaolosuhteissa. Erityisen kiinnostava oli että, kun treidasi Transformer Multifactor + Arima ensablella, se tuotti melkein 70% suuntatarkkuuden (20d horisontti) :hushed_face: .

Transformer ei siis näyttäisi olevan kaiken tietävä kristallipallo (ainakaan tällä setupilla), vaan työkalu harvinaisten korkean odotusarvon tilanteiden löytämiseen. Erityisen hyvä se on pienien (lue epälikvidien) osakkeiden hintaliikkeen odotusarvon mallintamisessa.

Mallin treenaus ml. arkkitehtuuri-etsintä olisi maksanut kaupallisilla ehdoilla GPU-resursseina vajaa 5k€ (CSC:n Puhti-supertietokone). Backtestauksen inferenssi vei lopulta vajaa 10k€. Eli ihan halpaa puuhaa tällaisen setupin rakentaminen ei ole. Erityisesti inferenssin set-up vaati isoa musitiallokaatiota, mikä nosti CSC:n credit-kulutusta. Homma olisi mahtunut helposti kyllä esim. Nvidian DGX Sparkin spekseihin (hinta noin 5.5k€).

Tulokset ja (spagetti)koodi treenaukselle ja backtestaukselle löytyvät täältä:

PS. ja tosiaan luovuin tuosta aiemmin tässä ketjussa pohditusta Zero shot -ajatuksesta domain-treenatun mallin lisäksi sen vuoksi, että nuo CSC:n opiskelijakäytön resurssirajat tulivat tässäkin projektissa aika pahasti vastaan. RL finetunaus jäi myös jatkokehitykseen - jos vaikka joskus haluaa lähteä vielä tavoittelemaan miekkaa ja silinteriä :smiley: .

10 tykkäystä

Vielä keskeiset tulokset taulukoina ja kuvaajina:

  1. Aggregate tulokset koko otannalle (100%) ja valikoiduille confidence-persentiileille. Negatiivista tuottoa tosiaan tulee läpi linjan, kun tuottoja rankaistaan friction-raahauksella. ARIMA toimii lopulta yllättävänkin hyvin, vaikka suuntatarkkuus on surkea (luokkaa 25-26%)

2. Tuotot suhteessa treidatun tickerin market cappiin. Kuten näkyy, nopeasti laskee tuotot, kun siirrytään micro-yhtiöistä vähänkään suurempiin yhtiöihin. Ilmeisesti markkinat ovat kohtuu tehokkaat. Isoissa yhtiöissä ei auta, vaikka malli olisi kuinka varma suunnasta, mutta ilahduttavasti mallin varmuudessa on monotoninen korrelaatio varmuuden ja tuoton suhteen.

3. Tästä näkyy hyvin, miten Transformer toimii varsin kivasti läpi markkinaregiimin (bull vs. bear) läpi. Tasaista suorittamista 0.5 suuntatarkkuuden tuntumassa. ARIMA taas täysin katastrofi, kun pitäisi osata ennustaa jotain muuta kuin UP-signaalia.

4. Mallin sisäinen itsevarmuus. Kuten näkyy, confidencen avulla pystyy nätisti ottamaan signaalin korkean tuotto-odotuksen treideistä

5. Erityyppisten filtteröinti-strategioiden vertailua. ARIMA-tosiaan yllättävän kova vastus (kun filtteröitiin vain ne treidit, joissa malli ennusti suurinta liikettä jompaan kumpaan suuntaan).

6. Kun Multifactorille asetti stop-lossit ja profit-taking rajat (käytettiin ehkä snadisti overfittavaa grid searchia optimaalisten rajojen etsimiseen) ja ehdollisti treidin suuruuden signaalivoimakkuudelle , päästiin ihan koviin tuottoihin (100k alkupääoma)

7. Transformer-ARIMA ensamble tosiaan tuotti inhimillisellä määrällä treidejä kohtuu kovaa 70% suuntatarkkuutta

11 tykkäystä

Olen tässä hiljattain rakentanut tekoälypohjaisen työkalun joka analysoi Yhdysvaltalaisten osakkeiden markkinatunnelmaa. Ei hintaennusta, vaan tunnelma analyysiä. Työkalu siis käy läpi satoja lähteitä kuten analyytikkoraportit, uutiset ja sosiaalista mediaa. Näistä lähteistä se kokoaa strukturoidun yhteenvedon: kokonaissentimentti, härkä- vs. karhu argumentit ja tärkeimmät teemat valitulta ajanjaksolta. Kuten aikaisemmin mainittu työkalu toimii tällä hetkellä parhaiten yhdysvaltalaisilla osakkeilla, mutta suunnitelmissa on myös laajentaa eurooppalaisille markkinoille, mukaan lukien Helsingin pörssiin.

Työkalua voi kokeilla täysin ilmaiseksi osoitteessa valovest.vercel.app
->Kuulisin mielelläni muidenkin sijoittajien mielipiteitä ja kehitysajatuksia tästä.

10 tykkäystä

Vaikutti ihan hyvältä mutta jäin kaipaamaan lähdeluetteloa eli mitä tai kenen tuottamaa dataa käytti johtopäätöksen tekemiseen näissä mainituissa kategorioissa.

2 tykkäystä

Hyvä pointti ja kiitos vastuksesta! Lähdelistaus on ehdottomasti kehityslistalla — tavoitteena on tulevaisuudessa näyttää tarkasti mistä lähteistä kukin johtopäätös on tehty. Kiitos palautteesta!

3 tykkäystä

Päivitys: lähdeosio on nyt lisätty! Klikkaamalla “Sources” -painiketta analyysin lopussa näkee mistä lähteistä analyysi on tehty. Kiitos palautteesta, tämä oli hyvä kehitysehdotus!

3 tykkäystä

No nyt antaa paljon paremman kuvan mistä tunnelmat on johdettu

3 tykkäystä

Hyvältä näyttää!

Kehitysajatus pyydettäessä: Tämä appin analyze-endpoint näyttää olevan käytettävissä myös suoraan ulkoisista työkaluista (sain itse tavarat ulos ihan simppelillä PowerShellin iwr-kutsulla). Jos sen on tarkoitus olla vain sovelluksen sisäinen API, suosittelen lisäämään varsinaisen autentikoinnin (esim. session-/token-pohjaisen suojauksen), eikä luottamaan esim. selainheaderien perusteella rajoittamiseen. Varmaan kuitenkin jonkun taustalla olevan kielimallin kulutus ei ole ihan ilmaista ja nyt mahdollista varmaankin tykittää massiivinen määrä kutsuja ja hakea sun piikkiin oma sentiment-database tai kaataa palvelu :slight_smile: (en toki testannut pahantahtoista loopattua kutsua- eli voi olla, että joku harness on olemassa)

5 tykkäystä

Kiitos vastauksesta ja kehitysideasta. Lisäämme kehityslistalle!

3 tykkäystä

Päivitys tehty ja rajoitus asennettu! (20 hakua / tunti)