bt - Flexibel Backtesting för Python Vad är bt bt är ett flexibelt backtesting-ramverk för Python som används för att testa kvantitativa handelsstrategier. Backtesting är processen att testa en strategi över en viss dataset. Denna ram låter dig enkelt skapa strategier som blandar och matchar olika Algos. Det syftar till att främja skapandet av lätt testbara, återanvändbara och flexibla block av strategisk logik för att underlätta den snabba utvecklingen av komplexa handelsstrategier. Målet: att rädda kusiner från att återuppfinna hjulet och låta dem fokusera på den viktiga delen av jobbet - strategiutveckling. Bt är kodad i Python och ansluts till ett pulserande och rikt ekosystem för dataanalys. Många bibliotek finns för maskininlärning, signalbehandling och statistik och kan hanteras för att undvika att uppfinna hjulet - något som händer alltför ofta när man använder andra språk som inte har samma mängd högkvalitativa open source-projekt. bt är byggt atop ffn - ett finansiellt funktionsbibliotek för Python. Kolla in ett snabbt exempel Här är en snabb smak av bt: En enkel strategi Backtest Let8217s skapar en enkel strategi. Vi kommer att skapa en månatlig ombalanserad, långsiktig strategi där vi placerar lika vikt på varje tillgång i vårt universum av tillgångar. Först kommer vi att ladda ner några data. Som standard laddar bt. get (alias for ffn. get) den justerade stängningen från Yahoo Finance. Vi laddar ner några data från och med den 1 januari 2010 för denna demonstration. När vi har vår data kommer vi att skapa vår strategi. Strategiobjektet innehåller strategidogiken genom att kombinera olika Algos. Slutligen kommer vi att skapa en Backtest. vilken är den logiska kombinationen av en strategi med en dataset. När detta är klart kan vi köra backtestet och analysera resultaten. Nu kan vi analysera resultaten av vår backtest. Resultatobjektet är en tunn omslag runt ffn. GroupStats som lägger till några hjälpar metoder. Ändra en strategi Nu, vad händer om vi körde denna strategi varje vecka och använde också någon riskparitystypsinriktning genom att använda vikter som är proportionella mot inversen av varje asset8217s volatilitet. Allt vi behöver göra är att plugga in några olika algos. Se nedan: Strategiblogiken är som du kan se lätt att förstå och viktigare, lätt att ändra. Idén att använda enkla, komposibla Algos för att skapa strategier är ett av grundblocken för bt. Trädstrukturen underlättar konstruktionen och sammansättningen av komplexa algoritmiska handelsstrategier som är modulära och återanvändbara. Dessutom har varje trädkod sitt eget prisindex som kan användas av Algos för att bestämma en Node8217s fördelning. Algos och AlgoStacks är en annan kärnfunktion som underlättar skapandet av modulär och återanvändbar strategilogik. På grund av deras modularitet är dessa logikblock också enklare att testa - ett viktigt steg i att bygga robusta finansiella lösningar. bt ger också många användbara kartläggningsfunktioner som hjälper till att visualisera backtestresultat. Vi planerar också att lägga till fler diagram, tabeller och rapportformat i framtiden, som automatiskt genererade PDF-rapporter. Dessutom beräknar bt en massa statistik som gäller en backtest och erbjuder ett snabbt sätt att jämföra dessa olika statistik över många olika backtest via resultatvisningsmetoder. Framtida utvecklingsinsatser kommer att inriktas på: På grund av den flexibla karaktären hos bt måste ett avvägning göras mellan användbarhet och prestanda. Användbarhet kommer alltid att vara prioriterad, men vi vill förbättra prestanda så mycket som möjligt. Vi kommer också att utveckla fler algoritmer när tiden går vidare. Vi uppmanar också någon att bidra med egna algos också. Detta är ett annat område vi vill ständigt förbättra eftersom rapportering är en viktig aspekt av jobbet. Diagram och rapportering underlättar också att hitta buggar i strategidogiken. Översikt Vad är bt Ett snabbt exempel Funktioner Vägkarta Installationsguide Allt om Algos Trädstruktur exemplen API Github SnabbsökningEventdriven Backtesting med Python - Del I Weve har de senaste månaderna på QuantStart backtesting olika handelsstrategier som använder Python och pandas. Den vektoriserade naturen av pandor säkerställer att vissa operationer på stora dataset är extremt snabba. Men de former av vektoriserad backtester som vi har studerat hittills lider av några nackdelar i det sättet att handelens utförande simuleras. I denna serie artiklar kommer vi att diskutera ett mer realistiskt förhållningssätt till historisk strategisimulering genom att bygga en händelsesdriven backtesting miljö med Python. Event-Driven Software Innan vi gräver in i utvecklingen av en sådan backtester behöver vi förstå konceptet av händelsesdrivna system. Videospel ger en naturlig användning för händelsesdriven programvara och ger ett enkelt exempel att utforska. Ett videospel har flera komponenter som interagerar med varandra i realtidsinställningar vid höga framerater. Detta hanteras genom att köra hela uppsättningen beräkningar inom en oändlig slinga som kallas händelse-loop eller spel-loop. Vid varje kryss i spelslingan kallas en funktion för att ta emot den senaste händelsen. vilket kommer att ha genererats av någon motsvarande tidigare åtgärd inom spelet. Beroende på händelsens art, som kan innefatta en knapptryckning eller ett musklick, tas några efterföljande åtgärder som antingen kommer att avsluta slingan eller generera några ytterligare händelser. Processen fortsätter sedan. Här är några exempel pseudokod: Koden kontrollerar kontinuerligt efter nya händelser och utför sedan åtgärder baserat på dessa händelser. I synnerhet tillåter man illusionen av realtidshantering eftersom koden kontinuerligt är loopad och händelser kontrolleras. Som det kommer att bli klart är det just det vi behöver för att utföra högfrekvent handelsimulering. Varför En Event-Driven Backtester Event-driven system ger många fördelar jämfört med ett vektoriserat tillvägagångssätt: Code Reuse - En händelsesdriven backtester, med design, kan användas för både historisk backtesting och live trading med minimal utbyte av komponenter. Detta gäller inte vektoriserade backtestrar där alla data måste vara tillgängliga samtidigt för att utföra statistisk analys. Lookahead Bias - Med en händelsesdriven backtester finns det ingen lookahead-bias eftersom marknadsmottagningen behandlas som en händelse som måste hanteras. Således är det möjligt att droppa mata en händelsesdriven backtester med marknadsdata, vilket replikerar hur ett orderhanterings - och portföljsystem skulle uppträda. Realism - Event-driven backtestrar möjliggör en avsevärd anpassning av hur beställningar exekveras och transaktionskostnader uppkommer. Det är enkelt att hantera grundläggande marknads - och begränsningsorder, samt marknadsförda (MOO) och Market-Close (MOC), eftersom en anpassad börshanterare kan byggas. Även om händelsestyrda system har många fördelar, har de två stora nackdelar med enklare vektoriserade system. För det första är de betydligt mer komplicerade att genomföra och testa. Det finns mer rörliga delar som leder till en större chans att införa buggar. För att mildra denna korrekta mjukvarutestningsmetod kan testdriven utveckling användas. För det andra är de långsammare att utföra jämfört med ett vektoriserat system. Optimala vektoriserade operationer kan inte användas vid utförande av matematiska beräkningar. Vi kommer att diskutera sätt att övervinna dessa begränsningar i senare artiklar. Event-Driven Backtester-översikt För att tillämpa ett händelsestyrt tillvägagångssätt till ett backtesting-system är det nödvändigt att definiera våra komponenter (eller objekt) som hanterar specifika uppgifter: Händelse - Händelsen är den grundläggande klassenheten i det händelsestyrda systemet. Den innehåller en typ (som MARKNAD, SIGNAL, ORDER eller FILL) som bestämmer hur det ska hanteras inom händelse-loop. Event Queue - Event Queue är ett Python Que-objekt i minnet som lagrar alla Objektets underklassobjekt som genereras av resten av programvaran. DataHandler - DataHandler är en abstrakt basklass (ABC) som presenterar ett gränssnitt för hantering av både historisk eller levande marknadsdata. Detta ger stor flexibilitet eftersom strategierna och portföljmodulerna kan återanvändas mellan båda metoderna. DataHandler genererar en ny MarketEvent på varje hjärtslag i systemet (se nedan). Strategi - Strategin är också en ABC som presenterar ett gränssnitt för att ta marknadsdata och generera motsvarande SignalEvents, som i slutändan utnyttjas av Portfolio-objektet. En SignalEvent innehåller en tickersymbol, en riktning (LONG eller SHORT) och en tidsstämpel. Portfölj - Detta är en ABC som hanterar orderhanteringen i samband med nuvarande och efterföljande positioner för en strategi. Det utövar också riskhantering över portföljen, inklusive branschexponering och positionering. I ett mer sofistikerat genomförande kan detta delegeras till en RiskManagement-klass. Portföljen tar SignalEvents från köen och genererar OrderEvents som läggs till i köen. ExecutionHandler - ExecutionHandler simulerar en anslutning till en mäklare. Hanterarens jobb är att ta OrderEvents från köen och genomföra dem, antingen via en simulerad tillvägagångssätt eller en faktisk anslutning till en levermäklare. När order har utförts skapar handlaren FillEvents, som beskriver vad som faktiskt handlades, inklusive avgifter, provision och slippa (om modellerad). Loop - Alla dessa komponenter är inslagna i en händelsesslinga som hanterar alla händelsetyper på rätt sätt, dirigerar dem till lämplig komponent. Detta är en ganska grundläggande modell för en handelsmotor. Det finns ett betydande utrymme för expansion, särskilt när det gäller hur Portfolio används. Dessutom kan olika transaktionskostnadsmodeller också abstraheras till sin egen klasshierarki. I detta skede introducerar det onödigt komplexitet inom denna serie artiklar så vi diskuterar inte det för tillfället ytterligare. I senare tutorials kommer vi sannolikt att expandera systemet för att inkludera ytterligare realism. Här är ett utdrag av Python-kod som visar hur backtestern fungerar i praktiken. Det finns två slingor som förekommer i koden. Den yttre slingan används för att ge backtesteren ett hjärtslag. För direkt handel är det frekvensen vid vilken nya marknadsdata är pollade. För backtesting-strategier är detta inte absolut nödvändigt eftersom backtestern använder marknadsdata som tillhandahålls i droppmatningsform (se linjen bars. updatebars ()). Innerslingan hanterar faktiskt händelserna från händelsekö-objektet. Särskilda händelser delegeras till respektive komponent och därefter läggs nya händelser till i köen. När händelsekön är tom fortsätter hjärtslagsslingan: Detta är den grundläggande översikten av hur en händelsestyrd backtester är utformad. I nästa artikel kommer vi att diskutera Händelseklasshierarkin. Just Komma igång med Kvantitativ TradingAn ansökan om backtest av grundläggande handelsstrategier för valutamarknaden, baserat på historiska data. Koden är skrivet för Python 2.7 och är inte kompatibel med Python 3. Förutsättningar: Tkinter För att köra programmet, ladda ner alla filer, behåll samma katalogstruktur och kör filen input handling. py från Python tolken. Parameterns inställningar är följande: StartEndatum: de datum som binder de historiska data som ska testas. Initial insättning: Mängden pengar (USD) i mäklarkontot för att börja med TimeFrame: bredden på varje stapel i den historiska Data som ska testas Detta är tidsramen som används för varje strategi Symbol: Stöd för endast EURUSD, USDJPY, GBPUSD och USDCHF med inkluderad data Position till handel: Begränsa backtestet för att endast omfatta långa positioner, korta positioner eller båda Trading Kriterium: Den huvudsakliga strategin som används för att simulera historiska affärer (Moving Average Crossover och Stochastics included). Hävstångseffekt (marginal): Maximal hävstångsförhållande tillåtet. Önskat partistorlek: En fast delstorlek som ska handlas när en position öppnas. Om fri marginal begränsar partiets storlek till att bli mindre, kommer den att justeras under testet. Spread Modeling Technique: Genomsnittlig Spridning - antar att spridningarna håller sig konstanta under historiska data. Handelshanteringsteknik: TPSL - Ställ in en fast vinst och stoppa förlustnivån i pips från ingångspriset. Pris SL - Ställ stoppförlusten som en procent av priset och Uppdatera varje stapel När dessa parametrar har angetts kommer programmet att köra en rudimentär backtest med hjälp av stapelanalys för att bestämma vad det slutliga kontosaldot kommer att bli. Detta program kan förlängas genom att lägga till fler handelsstrategier. De bör genomföra samma gränssnitt som de rörliga genomsnitts - och stokastiska strategierna. Du kan inte utföra den åtgärden just nu. Du loggade in med en annan flik eller ett fönster. Uppdatera för att uppdatera din session. Du loggade ut i en annan flik eller ett fönster. Uppdatera för att uppdatera din session. QSForex är en öppen källkodshändelsesdrivet backtesting och live trading plattform för användning på valutamarknaden (forex) marknader, för närvarande i ett alfanumeriskt tillstånd. Det har skapats som en del av Forex Trading Diary-serien på QuantStart för att ge det systematiska handelsgemenskapen en robust handelsmotor som möjliggör enkel implementering och testning av forexstrategier. Programvaran tillhandahålls under en tillåten MIT-licens (se nedan). Open Source - QSForex har släppts under en extremt permissiv MIT-licens med öppen källkod, som tillåter fullständig användning i både forskning och kommersiella applikationer, utan begränsning, men utan någon garanti alls. Gratis - QSForex är helt gratis och kostar inget att ladda ner eller använda. Samarbete - Eftersom QSForex är öppen källkod samarbetar många utvecklare för att förbättra programvaran. Nya funktioner läggs till ofta. Eventuella buggar är snabbt bestämda och fixerade. Programutveckling - QSForex är skrivet i Python programmeringsspråk för enkel plattformsupport. QSForex innehåller en serie enhetstester för majoriteten av sin beräkningskod och nya tester läggs hela tiden till nya funktioner. Event-Driven Architecture - QSForex är helt händelsestyrt både för backtesting och live trading, vilket leder till en enkel övergång av strategier från en researchtesting-fas till en live trading implementation. Transaktionskostnader - Spridningskostnader ingår som standard för alla backtestedstrategier. Backtesting - QSForex har flera dagars multi-day par-backtesting för intradagskryssningsupplösning. Trading - QSForex stöder för närvarande direkt intraday trading med hjälp av OANDA Brokerage API över en portfölj av par. Prestationsmetoder - QSForex stöder för närvarande grundläggande prestationsmätning och visuell visualisering via Matplotlib och Seaborn visualiseringsbibliotek. Installation och användning 1) Besök oanda och konfigurera ett konto för att få API-autentiseringsuppgifter, vilket du behöver utföra direkt handel. Jag förklarar hur man bär detta ut i den här artikeln: quantstartarticlesForex-Trading-Diary-1-Automated-Forex-Trading-med-the-OANDA-API. 2) Klona detta gitförvar i en lämplig plats på din maskin med följande kommando i din terminal: git klon githubmhallsmooreqsforex. git. Alternativt kan du ladda ner zip-filen i den nuvarande huvudgrenen på githubmhallsmooreqsforexarchivemaster. zip. 3) Skapa en uppsättning miljövariabler för alla inställningar som finns i filen Settings. py i programmets rotkatalog. Alternativt kan du svårt koda dina specifika inställningar genom att skriva över os. environ. get (.) Samtal för varje inställning: 4) Skapa en virtuell miljö (virtualenv) för QSForex-koden och använd pip för att installera kraven. Till exempel i ett Unix-baserat system (Mac eller Linux) kan du skapa en sådan katalog enligt följande genom att ange följande kommandon i terminalen: Detta skapar en ny virtuell miljö för att installera paketen i. Om du antar att du hämtade QSForex gitförvaret i en exempellista som projectsqsforex (ändra den här katalogen nedan till var du installerade QSForex), för att installera paketen måste du köra följande kommandon: Det tar lite tid som NumPy, SciPy, Pandas, Scikit-Learn och Matplotlib måste sammanställas. Det finns många paket som krävs för att detta ska fungera, så ta en titt på dessa två artiklar för mer information: Du måste också skapa en symbolisk länk från din sajtpaketkatalog till din QSForex installations katalog för att kunna ringa importera qsforex inom koden. För att göra detta behöver du ett kommando som liknar följande: Se till att du ändrar projectsqsforex till din installationskatalog och venvqsforexlibpython2.7site-paket till din virtuella webbplatspaketkatalog. Du kommer nu att kunna köra kommandon på rätt sätt korrekt. 5) Om du helt enkelt vill utöva träning eller leva handel så kan du köra python tradingtrading. py. som kommer att använda standardstrategin för handelsstrategier. Detta köper eller säljer en valutapar varje femte kryssning. Det är rent för testning - använd det inte i en levande handelsmiljö Om du vill skapa en mer användbar strategi skapar du helt enkelt en ny klass med ett beskrivande namn, t. ex. MeanReversionMultiPairStrategy och se till att det har en calculatesignals metod. Du måste passera den här klassen parlistan samt evenemangskön, som i tradingtrading. py. Vänligen se strategystrategy. py för detaljer. 6) För att kunna göra någon backtesting är det nödvändigt att generera simulerade forexdata eller ladda ner historiska fältdata. Om du vill helt enkelt prova programvaran, är det snabbaste sättet att generera ett exempel-backtest att generera viss simulerad data. Det nuvarande dataformatet som används av QSForex är detsamma som det som tillhandahålls av DukasCopy Historical Data Feed vid dukascopyswissenglishmarketwatchhistorical. För att generera några historiska data, se till att inställningen CSVDATADIR i settings. py är inställd på en katalog där du vill att den historiska data ska leva. Därefter måste du köra generatesimulatedpair. py. som finns under skriptkatalogen. Det förväntar sig ett enda kommandoradsargument, vilket i detta fall är valutaparet i BBBQQQ-format. Till exempel: I det här skedet är skriptet hårdkodat för att skapa en enda månadsdata för januari 2014. Det vill säga att du kommer att se enskilda filer, av formatet BBBQQQYYYYMMDD. csv (t. ex. GBPUSD20140112.csv) visas i din CSVDATADIR för alla arbetsdagar i den månaden. Om du vill ändra månadstiden för datautmatningen, ändrar du bara filen och kör igen. 7) Nu när den historiska data har genererats är det möjligt att göra en backtest. Backtest-filen är lagrad i backtestbacktest. py. men det här innehåller bara Backtest-klassen. För att faktiskt genomföra en backtest måste du instansera den här klassen och ge den nödvändiga modulerna. Det bästa sättet att se hur det här görs är att titta på exemplet Moving Average Crossover implementation i filen examplemac. py och använd det som en mall. Detta använder sig av MovingAverageCrossStrategy som finns i strategystrategy. py. Den här standarden handlar både om GBPUSD och EURUSD för att visa flera valutaparanvändning. Den använder data som finns i CSVDATADIR. För att utföra exemplet backtest, kör helt enkelt följande: Det tar lite tid. På mitt Ubuntu-skrivbordssystem hemma, med de historiska data som genereras via generatesimulatedpair. py. Det tar cirka 5-10 minuter att springa. En stor del av denna beräkning sker vid slutet av den faktiska backtesten, när nedräkningen beräknas, så kom ihåg att koden inte har hängt upp Vänligen lämna det tills det är klart. 8) Om du vill se resultatet av backtestet kan du helt enkelt använda output. py för att se en egenkapitalkurva, periodens retur (dvs tick-to-tick return) och en drawdown-kurva: Och det är det. I det här skedet är du redo att börja skapa egna backtests genom att ändra eller lägga till strategier i strategystrategy. py och använda verkliga data som hämtas från DukasCopy (dukascopyswissenglishmarketwatchhistorical). Om du har några frågor om installationen kan du gärna maila mig på mikequantstart. Om du har några buggar eller andra problem som du tycker kanske beror på kodbasen är du välkommen att öppna ett Githubproblem här: githubmhallsmooreqsforexissues Copyright (c) 2015 Michael Halls-Moore Tillstånd ges härmed gratis till någon person skaffa en kopia av denna programvara och tillhörande dokumentationsfiler (Programvaran) för att handla i Programvaran utan begränsning, inklusive, men inte begränsat, rätten att använda, kopiera, modifiera, fusionera, publicera, distribuera, sublicense och eller sälja kopior av Programvaran, Och att tillåta personer till vilka Programvaran är avsedd att göra det, under förutsättning att följande villkor är uppfyllda: Ovanstående upphovsrättsmeddelande och detta meddelande om tillstånd ska inkluderas i alla kopior eller väsentliga delar av Programvaran. PROGRAMVARAN GIVAS SOM ÄR, UTAN GARANTI AV NÅGON KÄN, UTTRYCKLIGT ELLER UNDERFÖRSTÅDD, INKLUSIVE MEN INTE BEGRÄNSAT TILL GARANTIER FÖR SALGBARHET, EGNETHET FÖR ET SÄRSKILT SYFTE OCH NONINFRINGEMENT. INNEHÅLLSINTERSÄTTARE ELLER UPPHOVSRÄTTARE ÄR INTE HÄNDIGT FÖR ANSVAR, SKADOR ELLER ANNAN ANSVAR, OM EN ÅTGÄRDER AV KONTRAKT, TORT ELLER ANNANSÄTT, FRÅN, UTAN ELLER I SAMBAND MED PROGRAMVARAN ELLER ANVÄNDNINGEN ELLER ANDRA FÖRHANDLINGAR I PROGRAMVARA. Forex Trading Ansvarsbegränsning Valutakurshandel på margin ger hög risk och kan inte vara lämplig för alla investerare. Tidigare resultat är inte en indikation på framtida resultat. Den höga hävstångsgraden kan fungera mot dig såväl som för dig. Innan du bestämmer dig för att investera i utländsk valuta bör du noga överväga dina investeringsmål, nivå av erfarenhet och risk aptit. Möjligheten finns att du kan bibehålla en förlust av vissa eller alla dina initiala investeringar och därför borde du inte investera pengar som du inte har råd att förlora. Du bör vara medveten om alla risker som är förknippade med valutahandel och söka råd från en oberoende finansiell rådgivare om du är osäker.
No comments:
Post a Comment