A Pyne piaci adatokkal dolgozó programok készítésére szolgáló rendszer. A benne írt programokkal kiszámolhatod és megjelenítheted az árfolyamokból származó értékeket, vagy megadhatod egy kereskedési stratégia szabályait. Ebben a könyvben a program megírásától az eredmény ellenőrzéséig végigjárjuk ezt a munkát.

Mit nevezünk Pyne code-nak?

A programokat Pyne code-ban írjuk. Ez egy önálló, piaci adatok feldolgozására kialakított programozási nyelv. A kód írja le, mit számoljon a rendszer, mit jelenítsen meg, és milyen feltételekhez kössön egy műveletet.

Egy indikátor például kiszámolhatja az utolsó tíz gyertya átlagárát, és vonalat rajzolhat belőle az árfolyamgrafikonra. Az árfolyamgrafikon (angolul chart) az árak időbeli változását jeleníti meg. A stratégia belépési és kilépési szabályokat is megad: például vételi pozíciót nyit, amikor egy feltétel teljesül. Ha történelmi adatokon futtatod, megvizsgálhatod, milyen kötéseket eredményeztek volna ezek a szabályok a megadott végrehajtási feltételekkel. Ezt backtestnek nevezzük.

A könyvben először egyszerű indikátorokat készítünk. Ezeken tanulod meg az adatokat és a nyelvet, mielőtt kereskedési szabályokat írnál.

A Pyne code a Python írási szabályait használja. Ezeket a szabályokat szintaxisnak nevezzük: meghatározzák például, hová kerülnek a zárójelek, és hogyan jelöljük az összetartozó sorokat. Nem kell előtte Pythont tanulnod; a szükséges szabályokat a könyv példáin keresztül ismered meg.

A fájlok ezért a Pythonban szokásos .py végződést kapják. A Pyne code Python futtatóban is futtatható a telepített PyneCore-ral. A Python biztosítja a futtatókörnyezetet, a PyneCore pedig a Pyne saját működését és függvénytárát.

Hogyan dolgozik a program az adatokon?

A piaci adatot a példákban gyertyák sorozataként kapjuk meg. Egy gyertya egy időszak adatait foglalja össze: többek között a nyitóárát és a záróárát. A napi adatokban egy gyertya egy napot jelent.

A PyneCore sorban végrehajtja a program számításait ezeken a gyertyákon. Egy átlagot például minden gyertyánál újra kiszámolhat, az addig rendelkezésre álló árakból. Közben kezeli a számítások előző értékeit és a gyertyák között megőrzendő adatokat is.

Ez a működés eltér egy szokásos Python-programétól. A fájl elején az @pyne jelölés mondja meg a PyneCore-nak, hogy a kódot ennek megfelelően készítse elő és futtassa. A kódot magyarázó fejezetben megnézzük a jelölés pontos formáját és a könyv példáiban mellette szereplő edge jelentését.

Miben más, mint a vektoros feldolgozás?

A Python-alapú kereskedési keretrendszerek között gyertyánkénti és vektoros megoldásokat is találsz. A vektoros feldolgozás során teljes számsorokon végzel műveleteket: például egyszerre számítod ki az összes gyertyához tartozó átlagot és vételi jelzést. Az adatot ilyenkor gyakran táblázatokban vagy tömbökben kezeled.

A PyneCore-ban az aktuális gyertyánál írod le a teendőt. A rendszer végrehajtja, majd továbblép a következő gyertyára. A számítások előzményeit és a megőrzendő állapotot a Pyne saját nyelvi szabályai szerint kezeli.

Egyszerű függvénybe írod a lépéseket

Több gyertyánként működő keretrendszerben a saját stratégiádhoz egy osztályt kell létrehoznod. Az osztály összefogja a hozzá tartozó adatokat és műveleteket; a benne megadott függvényeket metódusoknak nevezzük. Ilyenkor a keretrendszer által előírt metódusokba írod a beállításokat és a kereskedési szabályokat, és az osztályhoz tartozó adatokon keresztül éred el az árakat vagy a pozíciót.

A Pyne code példáiban egy main() függvénybe írod, mit szeretnél kiszámítani és milyen feltételnél szeretnél cselekedni. A függvény sorai minden feldolgozott gyertyán egymás után futnak le: először kiszámítasz egy értéket, majd ellenőrzöl egy feltételt, végül kirajzolsz egy jelzést vagy megbízást adsz. A gyertyák bejárását a PyneCore intézi.

A kezdéshez így nem kell megtanulnod az osztályok létrehozását és az öröklődést, vagy egy keretrendszer metódusai között elosztanod a programodat. Az egyszerű példákhoz a változók, függvényhívások és feltételek ismerete elegendő; ezeket a következő fejezetekben tanulod meg.

A szabályt időrendben követheted

Ez közel áll ahhoz, ahogyan egy kereskedési döntést végiggondolsz: „Megnézem a mostani árat és az eddigi mozgását. Ha teljesül a feltételem, belépek. Amíg van pozícióm, figyelem a kilépési feltételt.” A kódban is ebben a sorrendben követheted az eseményeket, és a debuggerrel egy adott gyertyánál megvizsgálhatod a változókat.

Nehezebb véletlenül a jövőből számolni

Vektoros feldolgozásnál a teljes adatsor rendelkezésre állhat. Egy rossz irányú eltolás vagy hibásan megválasztott átlag ezért olyan árat is bevonhat a számításba, amely a döntés időpontjában még nem volt ismert. Például a teljes év átlagára a januári döntésekhez a későbbi hónapok árait is felhasználná. A program ettől még lefuthat, és meggyőző eredményt mutathat; a hibát nehéz lehet észrevenni. Ezt jövőbe látási torzításnak, angolul look-ahead biasnak nevezik.

A Pyne saját idősorai az aktuális és a már feldolgozott gyertyák értékeit teszik elérhetővé. Az előzmények lekérésével nem tudod kiolvasni a következő gyertya árát. Ez csökkenti a jövőbeli adatok véletlen felhasználásának esélyét, és könnyebben ellenőrizhetővé teszi, miből született egy döntés.

Az adat előkészítésére ettől még figyelni kell. Ha egy külső adatban már eleve szerepel egy később ismertté vált információ, azt a gyertyánkénti futtatás önmagában nem tudja felismerni.

A sebességben lehet kompromisszum

A gyertyánkénti végrehajtás egyes programoknál lassabb lehet, mint egy jól megírt vektoros számítás. Ez különösen akkor számíthat, ha nagy adatsoron sok stratégia- vagy paraméterváltozatot próbálsz ki. A vektoros rendszerek az ilyen tömeges számításokat gyakran optimalizált számítási könyvtárakkal gyorsítják. A tényleges különbség a programtól és az adatmennyiségtől függ.

A könyvben a gyertyánkénti működést tanulod meg: az időrendben megfogalmazott szabályokat és azt, hogyan ellenőrizheted egy-egy döntés előzményeit.

Kitekintés más megoldásokra: vektoros feldolgozás a VectorBT-ben, illetve gyertyánkénti stratégiák a Backtraderben (angolul).

Mire való a PyneIDE és a PyneCore?

A PyneIDE a Visual Studio Code szerkesztő kiegészítője. Ebben írod a programot, választasz hozzá adatot, és indítod el a futtatást. Itt nézed meg az eredményt a grafikonon, és itt keresed meg a hibákat is.

A PyneCore a futtatást végző rendszer. Betölti és előkészíti a programot, feldolgozza vele a gyertyákat, majd elkészíti a számítások és a kötések eredményeit. A PyneIDE a háttérben ezt használja, és megjeleníti az eredményeket.

A következő fejezetben beállítod a PyneIDE-t, és elkészíted az első projektedet. A tanuláshoz mintaadatot használunk, így ugyanazt a programot újra lefuttathatod, és összehasonlíthatod a saját módosításaid eredményét.