Olisiko kiinnostusta MtGoxin kurssidata-aikasarjoille?

Väsäilen tällä hetkellä itselleni J:llä toteutettua MtGoxin BTC/USD -kurssidatan historiallista tietokantaa. Tarkoituksena on tallentaa ensin tietokantaan (toteutettu J:n mapped file-tekniikalla, nopea) kurssidatat minuuttitasolla viimeisen vuoden ajalta ja mahdollisesti päivitellä myöhemmällä datalla. Tallennettavia kenttiä olisivat Bitcoinchartsin tyylisesti:

  • date (vvvvkkpp)
  • time (hhmmss, oikeastaan tässä sekunnit turhia)
  • open (*100000, tallennus integerinä)
  • high (sama^)
  • low (sama^)
  • close (sama^)
  • volume USD (*100, int)
  • volume BTC (*100, int)
  • weighed price (*100, int)

Ideana on siis muuntaa kaikki kentät kokonaisluku-tyyppisiksi kertomalla desimaalit pois ja saada näin aikaan säästöä levytilassa ja hakuajoissa. Haku J:n komentotulkista käsin toimii jo nyt, jatkossa on tarkoitus koodailla käyrien piirtelyä ja teknisiä analysaattoreita, joita voisi vapaasti yhdistellä tiettyyn aikasarjakuvaan. Itselläni on tarkoitus käyttää tätä treidausstrategioiden suunnitteluun mutta tietokanta taipuu varmaan moneen muuhunkin käyttöön, jossa on jokin mtgox-kurssidatakytkös. Kenties laitan työni tulokset jakeluun Open Source-periaatteella, en ole vielä asiaa päättänyt. J602:n voi ladata ja asentaa veloituksetta www.jsoftware.com:sta. J-ohjelmat ovat muuten siirrettäviä win/mac/linux -ympäristöissä, mutta tuo mapped files database taisi pelittää pelkästään windowsissa. On muuten nopea, J:stä löytyy demo, jossa tuolla on toteutettu miljoonan tietueen “ajoneuvotietokanta”, josta haut ovat sekunnin kymmenyksien luokkaa.

Olen työtön ohjelmoija ja kiinnostunut keskustelemaan, jos jollakulla on tarjota tämänsuuntaisia hommia. Koodailen pääasiassa APL:n eri murteilla ja J:llä.

Tuossa on hieman otetta sessiolokista, meneillään raakadatan siivoilu, 0-rivien ja peräkkäisten duplikaattirivien typistäminen. Tietueita kaikkiaan 364593 riviä. Aikaa tuohon boolean-vektorilla ohjattuun typistykeen meni silmänräpäys, ehkä 0.1 sekuntia. Hyvältä vaikuttaa ainakin vasteaikojen suhteen.

[font=courier] bb=: goxDuplRows ‘’
#bb
364630

+/bb
37
bb#i.#bb
94776 96270 97182 102760 104328 115889 117996 119966 121545 124209 130789 134263 137082 140282 142007 151156 152807 153749 161229 162801 227276 231349 232417 234608 242525 244247 245381 248041 249373 250610 253126 260018 260948 262072 263430 264751 282923
(i. #VR) raportoi 124209+ i.5
┌────────┬───────┬──────────┬──────────┬──────────┬──────────┬────────┬────────┬────────┐
│Date │Time │Open │High │Low │Close │Volume │VolUSD │Wgtprice│
├────────┼───────┼──────────┼──────────┼──────────┼──────────┼────────┼────────┼────────┤
│20120914│1000000│ 1.13990│ 1.13990│ 1.13990│ 1.13990│ 20.21│ 230.42│ 11.40 │
│20120914│1000000│ 1.13990│ 1.13990│ 1.13990│ 1.13990│ 20.21│ 230.42│ 11.40 │
│20120914│1000100│ 1.13990│ 1.13900│ 1.13210│ 1.13210│ 26.00│ 294.42│ 11.32 │
│20120914│1000200│ 1.13210│ 1.13990│ 1.13900│ 1.13900│ 20.18│ 230.00│ 11.40 │
│20120914│1000400│ 1.13900│ 1.13990│ 1.13990│ 1.13990│ 9.29│ 105.88│ 11.40 │
└────────┴───────┴──────────┴──────────┴──────────┴──────────┴────────┴────────┴────────┘
goxDropWhere bb
Typistettiin 37 tietuetta.
ROWS
364593
VR
┌─────┬─────┬─────┬─────┬────┬──────┬────┬───────┬───────┐
│gdate│gtime│gopen│ghigh│glow│gclose│gvol│gvolusd│gwprice│
└─────┴─────┴─────┴─────┴────┴──────┴────┴───────┴───────┘
unmapall_jmf_ ‘’
0 0 0 0 0 0 0 0 0[/font]

Nyt mulla on valmiina funktiot tietyltä aikajanalta poimitun kurssi/volyymidatan plottaukseen. Jotain teknisiä analysaattoreita voisi vielä koodailla ja ajaa tuohon päälle, pitäisi vaan keksiä mitkä analysaattorit purisivat Goxin tapaiseen markkinaan parhaiten.

Sitten vielä keksitään toimiva trading-strategia. Simuloidaan ja kenties laitetaan tuotantoon siellä missä p**ka osuu tuulettimeen. Ja rikastutaan…


[quote=“Kurdeli, post:3, topic:923”]Nyt mulla on valmiina funktiot tietyltä aikajanalta poimitun kurssi/volyymidatan plottaukseen. Jotain teknisiä analysaattoreita voisi vielä koodailla ja ajaa tuohon päälle, pitäisi vaan keksiä mitkä analysaattorit purisivat Goxin tapaiseen markkinaan parhaiten.

Sitten vielä keksitään toimiva trading-strategia. Simuloidaan ja kenties laitetaan tuotantoon siellä missä p**ka osuu tuulettimeen. Ja rikastutaan…[/quote]

Osaatko sattumoisin sanoa paljonko MtGoxin bid-ask spread on keskimäärin? Tämä vaikuttaa strategian toimivuuteen olennaisesti, vaikka kysessä olisi SP500:n kaltainen erittäin likvidi markkina. Toki MtGoxissa on suurempi volatiliteetti.

Spreadi on itse asiassa nähtävissä joidenkin päivien kurssikäyrissä, perstuntumani on että se olisi voimakkaasti kytköksissä mtGoxin perimiin palvelumaksuihin, olikohan 0.55% sekä myydessä että ostettaessa. Jollain argoritmilla sen voisi varmaan laskea tuosta raakadatasta, jotain tyyliin “suodatetaan 2 tyypillisintä arvokeskittymää aikajanalla t ja lasketaan näiden erotus”. Vaatinee “flat trading rangen” tai lievää trendausta.


Niin, siis noi x-akselin arvot on suoria indeksejä tietovektoreihin, pitäisi saada jotain pvm/hh:mm -selitteitä aikaiseksi jahka ehdin.
Ehkä voisi olla hyvä idea laskea joku kausitasoitettu sarja tuohon rinnalle, vaikka 30 havainnon liukuva keskiarvo tms.

Noi 636624*60 -alkioiset tietokannat vievät levytilaa hieman yli 14MB per integer-kenttä. Allokoin 6 vuoden tarpeisiin, joten kasvuvaraa on vielä.

[font=courier]
goxPlotRangeVol 20130516 20130516.1225
#gclose NB. tietojen lkm tietokannassa
364683[/font]

Tuommoisen aika-navigaattorin sain tehdyksi. Sillä voi askeltaa tiettyä aikajanaa halutunkokoisia askeleita eteen ja taaksepäin ja lisäksi noihin aikakenttiin voi syöttää aikajanan päätepisteet muodossa vvvvkkpp.hhmm. Kuvaa voi käyttää myöhemmin analyysityökalun osana, se voisi esim. automaattisesti fokusoitua kuvaajan kiintoisiin kohtiin, joissa indikaattori antaa buy/sell -signaaleja.


Koodailin ensin n arvon liukuvan keskiarvon laskevan funktion, joka päivittää samalla tuohon gema-nimeen liitetyn mapped filen:

[font=courier]NB. päivittää Ema-kentän liukuvalla keskiarvolla
NB. goxEma jaks
goxEma=: 3 : 0
5 goxEma y
:
k=.x
jak=. y
p=.<.jak%2
gema=:ROWS$0
for_i. i.(#ghigh)-jak-1 do.
ii=.i+i.jak NB. indeksit
a=.<.(+/ii{ghigh)%jak
gema=:a (i+p)}gema
end.
p
) [/font]

Sitten huomasin että J:ssä on valmiiksi tuollainen “osajoukko-scan”-adverbi, jota käyttämällä koodista saa tiiviimpää:

[font=courier]LKA=: 4 : ‘x%~ x+/\y’ NB. siinä koko määrittely!

koe=: ?15#100
koe
90 47 58 29 22 32 55 5 55 73 58 50 40 5 69
10 LKA koe
68.5 52.5 43.5 25.5 27 43.5 30 30 64 65.5 54 45 22.5 37
10 LKA koe
46.6 43.4 43.7 41.9 39.5 44.2
[/font]

Sitten laskettuna koko aikasarjalle:

[font=courier] #gclose NB. alkioiden määrä
364683

aa=: 10 LKA gclose
#aa
364674

0.00001*20{. aa

4.626555 5.141555 5.143015 5.144975 5.144977 5.146437 5.144839 5.146398 5.146401 5.146462 5.146063 5.145563 5.145563 5.145562 5.146662 5.146662 5.148221 5.148221 5.148221 5.147761
[/font]
Tuo LKA on laskettu käsittelemättömästä raakadatasta, pitää jakaa 100000:lla niin päästään oikeaan suuruusluokkaan.

Vaikuttaa yllättävän nopealta, liukujakson kasvatus esim. 6000 arvoon ei tunnu näkyvän suoritusajassa juuri lainkaan.