Mindenki meg akar gazdagodni, minél gyorsabban, annál jobb. A számítástechnika sok lehetőséget és talán valamit is kínál erre a célra. A részvények nagyszerű módja annak, hogy több pénzt szerezzen. Szóval, miért nem készítenek botot?

Az ötlet: készíts egy botot, amely képes észlelni, ha egy részvény emelkedik vagy csökken. Ha az árfolyam növekszik, a botnak gyorsan meg kell vásárolnia a részvényt, de ha csökken, akkor a botnak el kell adnia a részvényt. Egyszerű, igaz?

Írjunk egy kódot, de felosztom a kódot, mert különben nagyon hosszú lesz, ha egyszer megmutatom.

Először is importálunk néhány könyvtárat, amelyek nem annyira izgalmasak, mint a következő rész. Készítünk egy új osztályt három funkcióval. Az elsőben beállítjuk a készpénz összegének számát, majd a kezdő dátumot és a befejezési dátumot. Részvényt adunk magunknak. Azt is meg kell határoznunk, hogy a robotunknak meddig kell visszanéznie az időben. Hogy még jobb legyen, írunk egy max és min.

#region imports
from AlgorithmImports import *
#endregion
import numpy as np

class SimpleBreakoutExample(QCAlgorithm):

    def Initialize(self):
        # Set the cash for backtest
        self.SetCash(100000)

        # Start and end dates for backtest
        self.SetStartDate(2017,9,1)
        self.SetEndDate(2020,9,1)

        # Add asset
        self.symbol = self.AddEquity("SPY", Resolution.Daily).Symbol

        # Lookback length for b/o (in days)
        self.lookback = 20

        # Upper/lower limit for lookback length
        self.ceiling, self.floor = 30, 10       

        # Price offset for stop order
        self.initialStopRisk = 0.98
        self.trailingStopRisk = 0.9
        # Schedule function 20 minutes after every market open

        self.Schedule.On(self.DateRules.EveryDay(self.symbol), \
                        self.TimeRules.AfterMarketOpen(self.symbol, 20), \
                        Action(self.EveryMarketOpen))

Ha eddig tetszik a történet, és érdekel a befektetés, és pénzt szeretnél keresni:

Nézze meg ezt a történetet: "A befektetés új módja, találkozzon az AutoArbs-szel"

A következő függvényekben egy diagramot készítünk.

def OnData(self, data):
        # Plot security's price
        self.Plot("Data Chart", self.symbol, self.Securities[self.symbol].Close)

Ez a funkció a legérdekesebb. A visszatekintés hossza nem egy rögzített érték, változhat. A visszatekintési hossz korlátja is módosítható. A legfontosabb rész, vétel és eladás. Végül ábrázoljuk az eredményeket.

def EveryMarketOpen(self):
        # Dynamically determine lookback length based on 30 day volatility change rate
        close = self.History(self.symbol, 31, Resolution.Daily)["close"]
        todayvol = np.std(close[1:31])
        yesterdayvol = np.std(close[0:30])
        deltavol = (todayvol - yesterdayvol) / todayvol
        self.lookback = round(self.lookback * (1 + deltavol))

        # Account for upper/lower limit of lockback length
        if self.lookback > self.ceiling:
            self.lookback = self.ceiling
        elif self.lookback < self.floor:
            self.lookback = self.floor
        
        # List of daily highs
        self.high = self.History(self.symbol, self.lookback, Resolution.Daily)["high"]
        
        # Buy in case of breakout
        if not self.Securities[self.symbol].Invested and \
                self.Securities[self.symbol].Close >= max(self.high[:-1]):
            self.SetHoldings(self.symbol, 1)
            self.breakoutlvl = max(self.high[:-1])
            self.highestPrice = self.breakoutlvl
        
        # Create trailing stop loss if invested 
        if self.Securities[self.symbol].Invested:
            # Check if the asset's price is higher than highestPrice & trailing stop price not below initial stop price
            if self.Securities[self.symbol].Close > self.highestPrice and \
                    self.initialStopRisk * self.breakoutlvl < self.Securities[self.symbol].Close * self.trailingStopRisk:
                # Save the new high to highestPrice
                self.highestPrice = self.Securities[self.symbol].Close
                # Update the stop price
                updateFields = UpdateOrderFields()
                updateFields.StopPrice = self.Securities[self.symbol].Close * self.trailingStopRisk
                self.stopMarketTicket.Update(updateFields)

                # Print the new stop price with Debug()
                self.Debug(updateFields.StopPrice)

            # Plot trailing stop's price
            self.Plot("Data Chart", "Stop Price", self.stopMarketTicket.Get(OrderField.StopPrice))

A legbonyolultabb rész elkészült. Most pedig vessünk egy pillantást az eredményekre.

Ahogy a grafikán is látszik, a részvény emelkedett, de néhányszor lejjebb is került. Ez normális, minden részvény dinamikus és folyamatosan mozog. Ideje tehát több számot és számjegyet látni. Lépésről lépésre végignézem a legfontosabb eredményeket. A bal felső sarokban kezdem, PSR-rel. A PSR a Probabilistic Sharpe Ratio rövidítése. Nehéz, ezért ha magyarázatot akarsz, nézd meg "ezt". Következő lépésként megvan a kereskedések összege, jelen esetben 9. Ha veszteséges volt, így a részvény értéke csökkent, akkor átlagosan -1,77% volt. Az átlagos nyerési arány sokkal jobb volt: 10,39%. Van még néhány szám, de nem ezek a legérdekesebbek.

A tőzsde kiszámíthatatlan, de ezek az ötletek sokat segíthetnek. Mindenképpen ellenőrizze azt a webhelyet, amely lehetővé tette ezt. (Link lent)

Köszönöm, hogy elolvasta! Ne felejtsen el követni a Médiumon, és olvassa el a többi történetemet is, nagyon hálás lennék érte.

Felelősség kizárása: ennek a projektnek csak oktatási célja van. Ez csak gyakorlat! Csak akkor használjon pénzt részvények vásárlására, ha megengedheti magának a veszteséget, mivel a pénzpiaci kereskedés kockázatos lehet, és elveszítheti az összes befizetett pénzét.
A felsorolt ​​és/vagy a felhasználóknak bármilyen módon továbbított információ ez csak az író személyes véleménye. Ezeket az információkat saját felelősségére használhatja fel. Semmilyen állítás vagy utalás nem történik arra vonatkozóan, hogy alkalmas vagy alkalmas bármilyen célra. Az író nem vállal felelősséget a tanácsai vagy információinak elfogadásából vagy el nem fogadásából eredő veszteségekért. A cikk nem értelmezhető ajánlásként vagy ajánlatként semmilyen értékpapír vételére vagy eladására, vagy bármely befektetési stratégia alkalmasságára. Az írónak nincs engedélye pénzügyi tanácsadás
ra