Tuesday 31 October 2017

Backtesting handelsstrategier in r


Backtesting: Tolkning Tidigare Backtesting är en nyckelkomponent i effektiv handelssystemutveckling. Det uppnås genom att rekonstruera, med historiska data, affärer som skulle ha inträffat i det förflutna med hjälp av regler definierade av en given strategi. Resultatet erbjuder statistik som kan användas för att mäta strategins effektivitet. Med hjälp av denna data kan handlare optimera och förbättra sina strategier, hitta tekniska eller teoretiska brister och få förtroende för sin strategi innan de appliceras på de verkliga marknaderna. Den bakomliggande teorin är att varje strategi som fungerade bra i det förflutna sannolikt kommer att fungera bra i framtiden, och omvänt sett är det sannolikt att någon strategi som utförde dåligt i det förflutna sannolikt kommer att fungera dåligt i framtiden. Den här artikeln tar en titt på vilka applikationer som används för att backtest, vilken typ av data som erhålls och hur man använder den Data och verktygen Backtesting kan ge mycket värdefull statistisk återkoppling om ett visst system. Några universella backtesting-statistik inkluderar: Nettoresultat eller förlust - Netto procentuell vinst eller förlust. Tidsram - Tidigare datum där testning inträffade. Universum - Lager som inkluderades i backtest. Volatilitetsåtgärder - Max procent upp och ner. Medelvärden - Procentuell genomsnittlig vinst och genomsnittlig förlust, medelstänger hålls. Exponering - Andel av investerat kapital (eller exponerat för marknaden). Förhållanden - vinst-till-förlustförhållande. Årlig avkastning - Procentuell avkastning över ett år. Riskjusterad avkastning - Procentuell avkastning som en funktion av risken. Typiskt kommer backtesting programvara att ha två skärmar som är viktiga. Den första tillåter näringsidkaren att anpassa inställningarna för backtesting. Dessa anpassningar inkluderar allt från tidsperiod till provisionkostnader. Här är ett exempel på en sådan skärm i AmiBroker: Den andra skärmen är den faktiska backtestingresultatrapporten. Här kan du hitta all statistik som nämns ovan. Återigen, här är ett exempel på den här skärmen i AmiBroker: I allmänhet innehåller de flesta handelsprogrammen liknande element. Vissa avancerade program innehåller även ytterligare funktioner för att utföra automatisk positionering, optimering och andra mer avancerade funktioner. De 10 buden Det finns många faktorer som handlare uppmärksammar när de backtesting handelsstrategier. Här är en lista över de 10 viktigaste sakerna att komma ihåg vid backtesting: Ta hänsyn till de brett marknadstrender inom tidsramen där en viss strategi testades. Till exempel, om en strategi bara backtestades 1999-2000, kanske det inte går bra på en björnmarknad. Det är ofta en bra idé att backtest över en lång tidsram som omfattar flera olika typer av marknadsförhållanden. Ta hänsyn till universum där backtesting inträffade. Till exempel, om ett brett marknadssystem testas med ett universum bestående av tekniska lager, kan det misslyckas att fungera bra i olika sektorer. Som en allmän regel, om en strategi riktar sig mot en viss genre av lager, begränsa universum till den genren, men i alla andra fall behålla ett stort universum för teständamål. Volatilitetsåtgärder är extremt viktiga att överväga när man utvecklar ett handelssystem. Detta gäller särskilt för hyrda konton, som utsätts för marginalanrop om deras eget kapital sjunker under en viss punkt. Traders bör försöka hålla volatiliteten låg för att minska risken och möjliggöra enklare övergångar in och ut ur ett visst lager. Det genomsnittliga antalet barer som hålls är också mycket viktigt att titta på när man utvecklar ett handelssystem. Även om de flesta backtestingprogrammen innehåller provisionkostnader i de slutliga beräkningarna, betyder det inte att du bör ignorera denna statistik. Om det är möjligt kan du höja ditt genomsnittliga antal barer som hålls, minska provisionskostnaderna och förbättra din övergripande avkastning. Exponering är ett dubbelkantigt svärd. Ökad exponering kan leda till högre vinst eller högre förluster, medan minskad exponering innebär lägre vinst eller lägre förluster. Men i allmänhet är det en bra idé att hålla exponeringen under 70 för att minska risken och möjliggöra enklare övergångar in och ut ur ett visst lager. Den genomsnittliga vinstlösningsstatistiken, kombinerad med vinst-till-förlustförhållandet, kan vara användbar för att bestämma optimal positionsbestämning och pengarhantering med hjälp av tekniker som Kelly-kriteriet. (Se Money Management med hjälp av Kelly-kriteriet.) Traders kan ta större positioner och minska provisionskostnaderna genom att öka sina genomsnittliga vinster och öka deras vinst-till-förlustförhållande. Årlig avkastning är viktig eftersom den används som ett verktyg för att benchmarka systemets avkastning mot andra investeringsplatser. Det är viktigt att inte bara titta på den totala årliga avkastningen utan också ta hänsyn till ökad eller minskad risk. Detta kan göras genom att titta på den riskjusterade avkastningen, som står för olika riskfaktorer. Innan ett handelssystem antas måste det överträffa alla andra placeringsplatser med lika eller mindre risk. Backtesting anpassning är oerhört viktigt. Många backtesting-applikationer har inmatning för provisionsbelopp, runda (eller fraktionerade) partstorlekar, kryssstorlekar, marginalkrav, räntor, antaganden för slipning, positioneringsstorleksregler, same-bar exit-regler, (bakåt) stoppinställningar och mycket mer. För att få de mest exakta backtestingresultaten, är det viktigt att ställa in dessa inställningar för att efterlikna mäklaren som kommer att användas när systemet går live. Backtesting kan ibland leda till något som kallas överoptimering. Det här är ett villkor där resultatresultatet är så högt anpassat till det förflutna att de inte längre är lika exakta i framtiden. Det är generellt en bra idé att genomföra regler som gäller för alla aktier eller en vald uppsättning riktade lager och är inte optimerade i den utsträckning reglerna inte längre är förståeliga av skaparen. Backtesting är inte alltid det mest exakta sättet att mäta effektiviteten i ett visst handelssystem. Ibland misslyckas strategier som fungerade bra tidigare i dag. Tidigare resultat är inte en indikation på framtida resultat. Var noga med att handla ett system som har testats framgångsrikt innan du går live för att vara säker på att strategin fortfarande gäller i praktiken. Slutsats Backtesting är en av de viktigaste aspekterna av att utveckla ett handelssystem. Om det skapas och tolkas ordentligt kan det hjälpa handlare att optimera och förbättra sina strategier, hitta några tekniska eller teoretiska brister, samt få förtroende för sin strategi innan de appliceras på den verkliga världsmarknaden. Resources Tradecision (tradecision) - High-end Trading Systemutveckling AmiBroker (amibroker) - Budget Trading System Development. En ekonomisk teori om totala utgifter i ekonomin och dess effekter på produktion och inflation. Keynesian ekonomi utvecklades. En innehav av en tillgång i en portfölj. En portföljinvestering görs med förväntan på att få en avkastning på den. Detta. Ett förhållande som utvecklats av Jack Treynor som mäter avkastning som förvärvats över det som kunde ha blivit uppnådd på en risklös. Återköp av utestående aktier (återköp) av ett företag för att minska antalet aktier på marknaden. Företag. Ett skattebidrag är ett återbetalning på skatter som betalas till en individ eller hushåll när den faktiska skatteskulden är mindre än beloppet. Det monetära värdet av alla färdiga varor och tjänster som produceras inom ett land gränsar under en viss tidsperiod. Jag är väldigt ny på R och försöker backa upp en strategi som Ive redan har programmerat i WealthLab. Flera saker jag förstår inte (och det fungerar inte självklart :) Jag får inte de snygga priserna snyggt i en vektor. eller någon form av vektor men det börjar med struktur och jag förstår inte riktigt vad den här funktionen gör. Det är varför min serie, 1 samtal förmodligen inte fungerar. N-lön (serier) fungerar inte heller, men jag behöver det för Loop Så jag antar att om jag får dessa 2 frågor som svaras ska min strategi fungera. Jag är väldigt tacksam för någon hjälp .. R verkar ganska komplicerat även med programmeringserfarenhet på andra språk ja Jag har kopierat några rader kod från den här handledningen och förstår verkligen inte den här raden. Jag menar serier, 1 Jag trodde skulle tillämpa funktionen f på kvotkvot 1 i serien. Men eftersom denna serie är lite komplicerad med struktur etc. fungerar det inte. I39m pratar om denna handledning: R-bloggersbacktesting-a-trading-strategi ndash MichiZH Jun 6 13 på 14:22Backtesting a Simple Stock Trading Strategy Obs! Det här inlägget är INTE ekonomisk rådgivning. Det här är bara en rolig väg att utforska några av förmågorna R har för att importera och manipulera data. Jag läste nyligen ett inlägg på ETF-profeten som utforskade en intressant aktiehandelstrategi i Excel. Strategin är enkel: Hitta stockens högsta punkt under de senaste 200 dagarna, och räkna antalet dagar som har förflutit sedan det höga. Om det varit mer än 100 dagar, äger du beståndet. Om it8217s varit mer än 100 dagar äger du inte den. Denna strategi är väldigt enkel, men det ger några imponerande resultat. (Observera dock att det här exemplet använder data som inte har justerats från splittringar eller utdelningar och kan innehålla andra fel. Dessutom ignorerar vi tradingkostnader och utförda förseningar, vilka båda påverkar strategins prestanda.) Genomförandet av denna strategi i R är enkel, och ger många fördelar jämfört med Excel. Det främsta är att det är enkelt att dra in aktiemarknadsdata till R, och vi kan testa denna strategi på ett brett spektrum av index med relativt liten ansträngning. Först av allt laddar vi data för GSPC med hjälp av quantmod. (GSPC står för SampP 500 indexet). Därefter konstruerar vi en funktion för att beräkna antalet dagar sedan n-dagen hög i en tidsserie och en funktion för att genomföra vår handelsstrategi. Den senare funktionen tar 2 parametrar: den högsta dag du vill använda, och antalet dagar över det höga kommer du att hålla behållaren. Exemplet är 200 och 100, men du kan enkelt ändra det till 500-dagars höga och se vad som händer om du håller lageret 300 dagar förbi det innan du springer ut. Eftersom denna funktion är parametrerad kan vi enkelt testa många andra versioner av vår strategi. Vi lägger början på vår strategi med nollor så det kommer att vara lika lång som våra inmatningsdata. (Om du önskar en mer detaljerad förklaring av daysSinceHigh-funktionen, se diskussionen om korsvaliderad). Vi multiplicerar vår position (0,1) vektor med avkastningen från indexet för att få vår strategi8217s avkastning. Nu bygger vi en funktion för att returnera lite statistik om en handelsstrategi och jämföra vår strategi med referensvärdet. Något godtyckligt bestämde I8217ve att man skulle se kumulativ avkastning, genomsnittlig årlig avkastning, skarpt förhållande, vinnande, genomsnittlig årlig volatilitet, max drawdown och max längd drawdown. Annan statistik skulle vara lätt att genomföra. Som du kan se, jämför denna strategi positivt med standardmetoden 8220buy-and-hold8221. Slutligen testar vi vår strategi på 3 andra index: FTSE som representerar Irland och Storbritannien, Dow Jones Industrial Index. som går tillbaka till 1896 och N225. som representerar Japan. I8217ve har funktionaliserat hela processen så att du kan testa varje ny strategi med 1 rad kod: Aldrig missa en uppdatering Prenumerera på R-bloggare för att få e-post med de senaste R-inläggen. (Du kommer inte att se det här meddelandet igen.) November 30, 2016, 12:34 För några månader sedan pekar en läsare mig på det nya sättet att ansluta R och Excel. Jag vet inte hur länge det här har funnits, men jag kom aldrig över det och I8217ve har aldrig sett något blogginlägg eller en artikel om den. Så jag bestämde mig för att skriva ett inlägg som verktyget är verkligen värt det och innan någon frågar, är I8217m inte relaterad till företaget på något sätt. BERT står för Basic Excel R Toolkit. It8217s är gratis (licensierad enligt GPL v2) och den har utvecklats av Structured Data LLC. Vid skrivandet är den nuvarande versionen av BERT 1,07. Mer information finns här. Från ett mer tekniskt perspektiv är BERT utformat för att stödja körning av R-funktioner från Excel-kalkylark celler. I Excel-termer, it8217s för att skriva användardefinierade funktioner (UDF) i R. I det här inlägget kommer I8217m inte att visa dig hur R och Excel interagerar via BERT. Det finns mycket bra handledning här. här och här. Istället vill jag visa dig hur jag använde BERT för att bygga ett 8220control tower8221 för min handel. Mina handelssignaler genereras med en lång lista med R-filer, men jag behöver flexibiliteten i Excel för att visa resultat snabbt och effektivt. Som ovan kan BERT göra det för mig men jag vill också skräddarsy applikationen till mina behov. Genom att kombinera kraften i XML, VBA, R och BERT kan jag skapa en snygg och kraftfull applikation i form av en Excel-fil med minsta VBA-kod. I slutändan har jag en enda Excel-fil som samlar alla nödvändiga uppgifter för att hantera min portfölj: databasuppdatering, signalgenerering, beställning inlämning etc8230 Min metod kunde brytas ner i de tre stegen nedan: Använd XML för att skapa användardefinierade menyer och knappar i ett Excel fil. Ovanstående menyer och knappar är huvudsakligen samtal till VBA-funktioner. Dessa VBA-funktioner är wrapup runt R-funktioner definierade med BERT. Med detta tillvägagångssätt kan jag hålla en klar skillnad mellan kärnan i min kod som hålls i R, SQL och Python och allt som används för att visa och formatera resultat som hålls i Excel, VBA amp XML. I nästa avsnitt presenterar jag förutsättningen att utveckla ett sådant tillvägagångssätt och en stegvis guide som förklarar hur BERT kan användas för att enkelt överföra data från R till Excel med minimal VBA-kod. 1 8211 Hämta och installera BERT från den här länken. När installationen är klar bör du ha en ny tilläggsmeny i Excel med knapparna som visas nedan. Så här har BERT materialiserats i Excel. 2 8211 Hämta och installera anpassad UI-editor. Den anpassade gränssnittredigeraren tillåter att skapa användardefinierade menyer och knappar i Excel-bandet. Ett steg för steg förfarande finns tillgängligt här. Steg för steg guide 1 8211 R Kod: Nedan R-funktionen är en mycket enkel kod för endast illustration. Det beräknar och returnerar rester från en linjär regression. Det här är vad vi vill hämta i Excel. Spara det i en fil som heter myRCode. R (något annat namn är bra) i en katalog som du väljer. 2 8211 funktioner. R i BERT. Från Excel välj Add-Ins - gt Home Directory och öppna filen som heter functions. R. I den här filen klistra in följande kod. Se till att du sätter in rätt väg. Detta är bara att köpa in i BERT R-filen du skapade ovan. Spara och stäng sedan filfunktionerna. R. Om du vill göra någon ändring i R-filen som skapats i steg 1 måste du ladda om den med hjälp av BERT-knappen 8220Reload Startup File8221 från menyn Add-Ins i Excel 3 8211 I Excel: Skapa och spara en fil som heter myFile. xslm (något annat namn är bra). Det här är en makroaktiverad fil som du sparar i den katalog du vill ha. När filen är sparad stäng den. 4 8211 Öppna filen som skapats ovan i Custom UI-editor: När filen är öppen klistra in underkoden. Du borde ha något liknande i XML-editor: I grunden skapar denna del av XML-kod en extra meny (RTrader), en ny grupp (My Group) och en användardefinierad knapp (New Button) i Excel-bandet. När you8217re är klar öppnar du myFile. xslm i Excel och stänger anpassad UI Editor. Du borde se något så här. 5 8211 Öppna VBA-redigeraren. I myFile. xlsm sätt in en ny modul. Klistra in koden nedan i den nyskapade modulen. Detta raderar tidigare resultat i arbetsbladet innan man klarar av nya. 6 8211 Klicka på Ny knapp. Gå nu tillbaka till kalkylbladet och klicka på knappen 8220New Button8221 i RTRAder-menyn. Du borde se något som nedan visas. Guiden ovan är en mycket grundläggande version av vad som kan uppnås med hjälp av BERT, men det visar hur du kombinerar kraften i flera specifika verktyg för att bygga din egen anpassade applikation. Ur mitt perspektiv är intresset för ett sådant tillvägagångssätt förmågan att limma tillsammans R och Excel självklart, men också att inkludera XML-kod (och batch) kodstycken från Python, SQL och mer. Detta är precis vad jag behövde. Slutligen skulle jag vara nyfiken på att veta om någon har någon erfarenhet av BERT 19 augusti 2016, kl 9:26. När man testar handelsstrategier är ett gemensamt förhållningssätt att dela upp den ursprungliga datamängden i provdata: den del av data som är avsedd att kalibrera modellen och ur provdata: den del av data som används för att validera kalibreringen och se till att prestanda som skapas i urvalet kommer att återspeglas i den verkliga världen. Som en tumregel kan omkring 70 av de ursprungliga data användas för kalibrering (dvs i prov) och 30 för validering (dvs ur prov). Då hjälper en jämförelse av in och ut ur provdata att avgöra om modellen är robust nog. Det här inlägget syftar till att gå ett steg längre och ger en statistisk metod för att bestämma huruvida exempeldata är i linje med vad som skapades i provet. I diagrammet nedan representerar det blå området ut ur provresultatet för en av mina strategier. En enkel visuell inspektion visar en bra passform mellan in och ut ur provprestandan, men vilken grad av förtroende har jag i detta. I detta skede inte mycket och det här är frågan. Det som verkligen behövs är ett mått på likhet mellan in och ut ur provdataset. I statistiska termer kan detta översättas som sannolikheten för att in och ut ur provresultatet kommer från samma fördelning. Det finns ett icke-parametriskt statistiskt test som gör just detta: Kruskall-Wallis-testet. En bra definition av detta test kunde hittas på R-Tutor 8220A-samlingen av dataprøver är oberoende om de kommer från obestämda populationer och proverna påverkar inte varandra. Använda Kruskal-Wallis-testet. vi kan bestämma om befolkningsfördelningarna är identiska utan att de antar att de följer den normala fördelningen.8221 Den extra fördelen med detta test förutsätter inte en normal fördelning. Det finns andra tester av samma natur som kan passa in i den ramen. Mann-Whitney-Wilcoxon-testet eller Kolmogorov-Smirnov-testen passar perfekt ramverket beskriver här men det ligger utanför denna artikels omfattning för att diskutera fördelarna och nackdelarna med var och en av dessa test. En bra beskrivning tillsammans med R exempel finns här. Here8217s koden som användes för att generera diagrammet ovan och analysen: I exemplet ovan är det i provperioden längre än ur provperioden därför skapade jag slumpmässigt 1000 delmängder av i provdata, var och en av dem har samma längd som ut av provdata. Sedan testade jag var och en i provunderuppsättningen mot provdata och jag registrerade p-värdena. Denna process skapar inte ett enda p-värde för Kruskall-Wallis-testet utan en distribution som gör analysen mer robust. I detta exempel är medelvärdet av p-värdena långt över noll (0,488) vilket indikerar att nollhypotesen bör godtas: det finns starka bevis på att in och ut ur samplingsdata kommer från samma fördelning. Som vanligt är det som presenteras i det här inlägget ett leksaksexempel som bara reporar problemets yta och ska skräddarsys för individuella behov. Men jag tror att det föreslår en intressant och rationell statistisk ram för att utvärdera ur provresultat. Detta inlägg inspireras av följande två papper: Vigier Alexandre, Chmil Swann (2007), Effekter av olika optimeringsfunktioner utan resultat Prövning av genetiskt utvecklade handelsstrategier, prognos finansmarknadskonferens Vigier Alexandre, Chmil Swann (2010), An optimeringsprocess för att förbättra inehållet av konsistens, en aktiemarknadsfråga, JP Morgan Cazenove Equity Quantitative Conference, London oktober 2010 13 december 2015 kl 14:03 Att göra kvantitativ forskning innebär mycket dataskrävande och man behöver rena och tillförlitliga data till uppnå detta. Det som verkligen behövs är ren data som är lättillgänglig (även utan internetanslutning). Det mest effektiva sättet att göra det här för mig har varit att behålla en uppsättning csv-filer. Självklart kan denna process hanteras på många sätt men jag hittade mycket effektiv och enkel övertid för att behålla en katalog där jag lagrar och uppdaterar csv-filer. Jag har en csv-fil per instrument och varje fil heter efter det instrument som den innehåller. Anledningen till att jag gör det är dubbelt: För det första vill jag inte ladda ner (pris) data från Yahoo, Google etc8230 varje gång jag vill testa en ny idé men ännu viktigare när jag identifierat och fixat ett problem, vill jag inte gör det igen nästa gång jag behöver samma instrument. Enkelt men väldigt effektivt hittills. Processen sammanfattas i tabellen nedan. I allt som följer antar jag att data kommer från Yahoo. Koden måste ändras för data från Google, Quandl etc8230 Dessutom presenterar jag processen med att uppdatera dagliga prisuppgifter. Inställningen kommer att vara annorlunda för högre frekvensdata och annan typ av dataset (dvs olika från priser). 1 8211 Initial data nedladdning (listOfInstruments. R amp historicalData. R) FillistanOfInstruments. R är en fil som bara innehåller listan över alla instrument. Om ett instrument isn8217t är en del av min lista (det vill säga ingen csv-fil i min datakatalog) eller om du gör det för första gången måste du hämta den ursprungliga historiska datasatsen. Nedanstående exempel laddar ned en uppsättning ETFs dagliga priser från Yahoo Finance tillbaka till januari 2000 och lagrar data i en csv-fil. 2 8211 Uppdatera befintliga data (updateData. R) Koden nedan börjar från befintliga filer i den dedikerade mappen och uppdaterar dem alla efter varandra. Jag brukar springa denna process varje dag förutom när I8217m på semester. För att lägga till ett nytt instrument, kör du bara steg 1 ovan för detta instrument ensam. 3 8211 Skapa en batchfil (updateDailyPrices. bat) En annan viktig del av jobbet är att skapa en batchfil som automatiserar uppdateringsprocessen ovan (I8217m en Windows-användare). Detta undviker att öppna RRStudio och köra koden därifrån. Koden nedan är placerad på en. bat-fil (sökvägen måste ändras med läsaren8217s inställning). Observera att jag lagt till en utdatafil (updateLog. txt) för att spåra utförandet. Processen ovan är extremt enkel eftersom det bara beskriver hur man uppdaterar dagliga prisuppgifter. I8217 har använt det här ett tag och det har funnits mycket smidigt för mig hittills. För mer avancerade data och högre frekvenser kan saker bli mycket svårare. Som vanligt välkomna kommentarer 23 mars 2015, 20:55 När det gäller att hantera en portfölj av aktier jämfört med en riktmärke, är problemet väldigt annorlunda än att definiera en absolut avkastningsstrategi. I den förstnämnda måste man hålla fler lager än i det senare, där inga aktier alls kan hållas om det inte finns tillräckligt bra möjligheter. Anledningen till detta är spårningsfelet. Detta definieras som standardavvikelsen för portföljavkastningen minus referensräntan. Ju mindre bestånd hålls jämfört med en jämförelse desto högre spårningsfel (t ex högre risk). Analysen som följer är till stor del inspirerad av bok 8220Active Portfolio Management8221 av Grinold amp Kahn. Detta är bibeln för alla som är intresserade av att driva en portfölj mot ett riktmärke. Jag uppmuntrar starkt alla med intresse för ämnet att läsa boken från början till slutet. It8217s mycket välskrivna och lägger grunden för systematisk aktiv portföljhantering (jag har ingen anknytning till redaktören eller författarna). 1 8211 Faktoranalys Här försöker vi att rangordna så mycket som möjligt lagren i investeringsuniverset på en framåtriktad retur. Många människor kom med många verktyg och otaliga varianter av dessa verktyg har utvecklats för att uppnå detta. I det här inlägget fokuserar jag på två enkla och mycket använda mätvärden: Informationskoefficient (IC) och Quantile Return (QR). 1.1 8211 Informationskoefficient Horisonten för den framtida avkastningen måste definieras av analytikern och it8217s är en funktion av strategi8217s omsättning och alfabetet (det har varit föremål för omfattande forskning). Självklart måste IC: er vara så höga som möjligt i absoluta termer. För den skarpa läsaren, i boken av Grinold amp Kahn ges en formel som länkar informationsfrekvens (IR) och IC: med bredd är antalet oberoende satsningar (trades). Denna formel kallas den grundläggande lagen om aktiv förvaltning. Problemet är att det ofta inte är lika enkelt att definiera bredd som det låter. 1,2 8211 Kvantilväxling För att få en mer exakt uppskattning av faktorens prediktiva kraft, behöver it8217s för att gå ett steg längre och gruppera bestånd genom kvant av faktorvärden, sedan analysera den genomsnittliga framåtriktad avkastning (eller någon annan central tendensmått) för var och en av dessa kvantiler. Användbarheten av det här verktyget är enkelt. En faktor kan ha en bra IC men dess prediktiva kraft kan begränsas till ett litet antal bestånd. Det här är inte bra, eftersom en portföljförvaltare måste välja aktier inom hela universum för att kunna uppfylla sina spårningsfelbegränsningar. God kvantilväxling präglas av ett monotont förhållande mellan de individuella kvantilerna och framåtriktad avkastning. Samtliga aktier i SampP500-indexet (vid skrivningstidpunkten). Självklart finns det ett överlevnadsskyttförhållande: Listan över bestånd i indexet har ändrats avsevärt mellan början och slutet av provperioden, men it8217s är tillräckligt bra för illustrationsändamål. Koden nedan laddar ned individuella aktiekurser i SampP500 mellan jan 2005 och idag (det tar ett tag) och de råa priserna returneras de senaste 12 månaderna och den senaste månaden. Den förra är vår faktor, den senare kommer att användas som framåtriktad returåtgärd. Nedan är koden för att beräkna informationskoefficienten och kvantilväntningen. Observera att jag använde quintiles i det här exemplet men någon annan gruppmetod (terciler, deciles etc8230) kan användas. det beror egentligen på provstorleken, vad du vill fånga och om du vill ha en bred översikt eller fokusera på distributionssvansar. För att uppskatta avkastningen inom varje kvintil har median använts som den centrala tendensestimatorn. Denna åtgärd är mycket mindre känslig för avvikare än aritmetisk medelvärde. Och äntligen koden för att producera Quantiles Return diagrammet. 3 8211 Hur man utnyttjar informationen ovan I diagrammet ovan är Q1 lägst över 12 månader tillbaka och Q5 högst. Det finns en nästan monotonisk ökning av kvantilgången mellan Q1 och Q5 vilket tydligt visar att lager som faller till Q5 överträffar de som faller till Q1 med cirka 1 per månad. Detta är väldigt viktigt och kraftfullt för en så enkel faktor (inte riktigt en överraskning though8230). Därför finns det större chanser att slå indexet genom att övervaka lagerstockarna som faller till Q5 och underviktiga de som faller till Q1 i förhållande till referensvärdet. En IC på 0,0206 kanske inte betyder en hel del i sig, men it8217s skiljer sig avsevärt från 0 och indikerar en bra förutsägande kraft under de senaste tolv månaderna. Formella signifikanstester kan utvärderas men detta ligger utanför ramen för denna artikel. 4 8211 Praktiska begränsningar Ovannämnda ramverk är utmärkt för att utvärdera investeringarna faktor8217s kvalitet, men det finns ett antal praktiska begränsningar som måste åtgärdas för genomförandet av verkliga realiteter: Rebalancing. I beskrivningen ovan antog it8217s att i slutet av varje månad är portföljen fullständigt ombalanserad. Det innebär att alla aktier som faller under första kvartalet är underviktiga och alla aktier som faller under fjärde kvartalet är överviktiga jämfört med referensvärdet. Det här är inte alltid möjligt av praktiska skäl: vissa lager kan uteslutas från investeringsuniverset, det finns begränsningar för industrins eller sektors vikt, det finns begränsningar för omsättning etc8230 Transaktionskostnader. Detta har inte beaktats i analysen ovan och det här är en allvarlig broms för verklig implementering. Omsättningshantering implementeras vanligtvis i verkligheten i form av straff på faktorkvalitet. Överföringskoefficient. Detta är en förlängning av den grundläggande lagen om aktiv förvaltning och det släpper ut antagandet om Grinold8217s modell att chefer inte står inför några hinder som hindrar dem från att översätta sina investeringar insikter direkt i portföljbett. Och slutligen är I8217m förvånad över vad som kan uppnås på mindre än 80 koder med R8230. Som vanligt välkomnas kommentarer 14 mars 2014, 13:07 Frågan man alltid bör fråga sig om man använder tekniska indikatorer är vad som skulle vara ett mål kriterier för att välja indikatorparametrar (t. ex. varför man använder en 14 dagars RSI istället för 15 eller 20 dagar). Genetiska algoritmer (GA) är väl lämpade verktyg för att svara på den frågan. I detta inlägg visar I8217ll dig hur du ställer in problemet i R. Innan jag fortsätter den vanliga påminnelsen: Vad jag presenterar i detta inlägg är bara ett leksaksexempel och inte en inbjudan att investera. Det är inte en färdig strategi, utan en forskningside som behöver undersökas, utvecklas och skräddarsys för individuella behov. Vad är genetiska algoritmer Den bästa beskrivningen av GA jag kom över kommer från Cybernatic Trading en bok av Murray A. Ruggiero. 8220Genetic Algorithms uppfanns av John Holland i mitten av 1970 för att lösa hårda optimeringsproblem. Denna metod använder naturligt urval, överlevnad av fittest8221. Den allmänna processen följer stegen nedan: Koda problemet till kromosomer Använd kodningen och utveckla en träningsfunktion för användning vid utvärdering av varje kromosom8217s värde för att lösa ett givet problem. Initiera en kromosom population. Utvärdera varje kromosom i befolkningen Skapa nya kromosomer genom att para två kromosomer. Detta görs genom att mutera och rekombinera två föräldrar för att bilda två barn (föräldrarna väljs slumpmässigt men fördjupade av deras skicklighet) Utvärdera den nya kromosomen Ta bort en medlem av befolkningen som är mindre passform än den nya kromosomen och sätt in den nya kromosomen i befolkningen . Om stoppkriterierna är uppnådda (maximalt antal generationer är konditionskriterierna tillräckligt bra8230) returnera sedan den bästa kromosomen alternativt gå till steg 4 Från ett handelsperspektiv är GA mycket användbar eftersom de är bra på att hantera mycket olinjära problem. Men de uppvisar några otäcka egenskaper som är värda att nämna: Övermontering: Detta är huvudproblemet och it8217s ner till analytikern för att ställa upp problemet på ett sätt som minimerar risken. Datortid. Om problemet isn8217t är korrekt definierat kan det vara extremt långt att nå en anständig lösning och komplexiteten ökar exponentiellt med antalet variabler. Därför är det nödvändigt att noggrant välja parametrarna. Det finns flera R-paket som handlar om GA, jag valde att använda den vanligaste: rgenoud Daily closing-priser för de flesta likvida ETF-er från Yahoo Finance går tillbaka till januari 2000. Den samlade perioden går från januari 2000 till december 2010. Out of provperioden börjar i januari 2011. Logiken är som följer: Fitnessfunktionen optimeras under provperioden för att få en uppsättning optimala parametrar för de valda tekniska indikatorerna. Prestandan av dessa indikatorer utvärderas sedan under provperioden. Men innan det görs måste de tekniska indikatorerna väljas. Aktiemarknaden har två huvudegenskaper som är bekanta för alla med viss handelserfarenhet. Långsiktigt momentum och kortvarig omkastning. Funktionerna kan översättas i takt med tekniska indikatorer genom att flytta medelvärden över och RSI. Detta representerar en uppsättning av 4 parametrar: Look-back-perioder för långa och kortsiktiga glidande medelvärden, återkallningsperiod för RSI och RSI-tröskeln. Parametersätten är kromosomerna. Det andra nyckelelementet är träningsfunktionen. Vi kanske vill använda något som: Maximal avkastning eller Sharpe-förhållande eller minsta genomsnittliga Drawdown. I det följande valde jag att maximera Sharpe-förhållandet. R-implementeringen är en uppsättning av 3 funktioner: fitnessfunktion. definierar träningsfunktionen (t ex maximal Sharpe-förhållande) som ska användas inom GA-motorns handelsstatistik. Sammanfattning av handelsstatistik för in och ut ur provperioder för jämförelseändamål genoud. GA-motorn från rgenoud-paketet Genoud-funktionen är ganska komplicerad men I8217m kommer inte att förklara vad varje parameter betyder eftersom jag vill behålla denna post kort (och dokumentationen är riktigt bra). I tabellen nedan presenterar jag för varje instrument de optimala parametrarna (RSI-återköpsperiod, RSI-tröskel, Korttidsflyttande medelvärde och Långsiktigt rörligt medelvärde) tillsammans med in och ut ur statistik för handel med handel. Innan jag kommenterar ovanstående resultat vill jag förklara några viktiga punkter. För att matcha logiken definierad ovan begränsade jag parametrarna för att se till att återkallningsperioden för det långsiktiga glidande medlet är alltid längre än det kortare glidande medlet. Jag begränsade också optimisten att bara välja lösningarna med mer än 50 branscher under provperioden (t ex statistisk signifikans). Sammantaget är resultatet av urvalet långt ifrån imponerande. Avkastningen är låg även om antalet branscher är liten för att göra resultatet väldigt signifikant. Men there8217s en signifikant effektivitetsförlust mellan in och ut ur provperioden för Japan (EWJ) vilket med stor sannolikhet betyder övermontering. Detta inlägg är avsett att ge läsaren verktygen för att korrekt använda GA i en kvantitativ handelsram. Återigen är It8217 bara ett exempel som behöver förbättras ytterligare. Några möjliga förbättringar att utforska skulle vara: fitnessfunktion. maximera Sharpe-förhållandet är mycket förenklat. En 8220smarter8221-funktion skulle säkert förbättra det exemplarhandelstatistikmönstret. vi försöker fånga ett mycket enkelt mönster. En mer djupgående mönsterforskning behövs definitivt. optimering. Det finns många sätt att förbättra hur optimeringen utförs. Detta skulle förbättra både beräkningshastigheten och rationaliteten i resultaten. Koden som används i detta inlägg finns tillgänglig på ett Gist-arkiv. Som vanligt välkomnas kommentarer 28 februari 2014, 15:52 Det finns en enorm litteraturvetenskap både akademisk och empirisk om marknadsprognoser. För det mesta mixar det två marknadsfunktioner: Magnitude and Direction. I denna artikel vill jag bara fokusera på att identifiera marknadsriktningen bara. Målet jag satte mig är att identifiera marknadsförhållandena när oddsen är betydligt partisk mot en uppåt eller en nedåtgående marknad. Detta inlägg ger ett exempel på hur CART (klassificering och regressionsträd) kan användas i detta sammanhang. Innan jag fortsätter den vanliga påminnelsen: Vad jag presenterar i detta inlägg är bara ett leksaksexempel och inte en inbjudan att investera. Det är inte en färdig strategi, utan en forskningside som behöver undersökas, utvecklas och skräddarsys för individuella behov. 1 8211 Vad är CART och varför använder den Från statistik är CART en uppsättning tekniker för klassificering och förutsägelse. Tekniken syftar till att producera regler som förutspår värdet av ett resultat (mål) - variabel från kända värden av prediktor (förklarande) variabler. Det finns många olika implementeringar men de delar alla en allmän karaktäristik och det är det jag är intresserad av. Från Wikipedia arbetar algoritmer för att bygga besluts träd vanligtvis uppifrån, genom att välja en variabel vid varje steg som bäst delar upp uppsättningen artiklar. Olika algoritmer använder olika mätvärden för mätning av 8220best8221. Dessa mäter i allmänhet målvariabelns homogenitet inom delmängden. Dessa mätvärden appliceras på varje kandidatsubsättning och de resulterande värdena kombineras (t ex medeltal) för att ge ett mått på delarnas kvalitet. CART-metodiken uppvisar vissa egenskaper som är mycket väl lämpade för marknadsanalys: icke parametrisk. CART kan hantera alla typer av statistiska utdelningar, icke linjära. CART kan hantera ett stort spektrum av beroende mellan variabler (t ex inte begränsat till linjära relationer). Robust till avvikare Det finns olika R-paket som hanterar Rekursiv partitionering, jag använder här rpart för trädestimering och rpart. plot för trädritning. 2 8211 Data Amp Experiment Design Dagliga OHLC-priser för de flesta likvida ETFs från januari 2000 till december 2013 extraherade från Google Finance. I provperioden går från januari 2000 till december 2010 är resten av datamängden utanför provperioden. Innan du kör någon typ av analys måste datasetet förberedas för uppgiften. Målvariabeln är ETF: s veckovisa retur, definierad som två tillstånd i världsresultatet (UP eller DOWN). Om veckovis framåt returnerar 0, då marknad i UP-tillstånd, NED anger annars. De förklarande variablerna är en uppsättning tekniska indikatorer härledda från den första dagliga OHLC-datasatsen. Varje indikator representerar ett väl dokumenterat marknadsbeteende. För att minska bruset i data och försöka identifiera robusta relationer anses varje oberoende variabel ha ett binärt resultat. Volatilitet (VAR1). Hög volatilitet är vanligtvis förknippad med en nedåtgående marknad och låg volatilitet med en uppåtgående marknad. Volatilitet definieras som 20 dagar rå ATR (Average True Range) spridas till sitt glidande medelvärde (MA). Om rå ATR gt MA då VAR1 1, annars VAR1 -1. Kortvarigt momentum (VAR2). Aktiemarknaden uppvisar kortsiktigt momentumbeteende som fångats här med 5 dagars enkla glidande medelvärden (SMA). Om Pris gt SMA då VAR2 1 annat VAR2 -1 Långtidsdrift (VAR3). Aktiemarknaden uppvisar långsiktigt momentumbeteende som fångas här med 50 dagars enkla glidande medelvärden (LMA). Om Pris gt LMA då VAR3 1 annat VAR3 -1 Kortvarig omkastning (VAR4). Detta fångas av CRTDR som står för nära förhållande till dagligt intervall och beräknas enligt följande:. Om CRTDR gt 0.5, VAR4 1 annat VAR4 -1 Autocorrelation regime (VAR5). Aktiemarknaden tenderar att gå igenom perioder med negativa och positiva autokorrelationssystem. Om returnerar autokorrelation under de senaste 5 dagarna gt 0 sedan VAR5 1 else VAR5 -1 Jag lägger under ett trädexempel med några förklaringar. I trädet ovan är vägen för att nå nod 4: VAR3 gt0 (Long Term Momentum gt 0) och VAR4 gt 0 (CRTDR gt 0). Den röda rektangeln indikerar att detta är ett NED-löv (t ex terminalnod) med en sannolikhet på 58 (1 8211 0,42). I marknadsvillkor betyder detta att om långsiktigt moment är upp och CRTDR är gt 0,5 så är sannolikheten för en positiv avkastning nästa vecka 42 baserat på de samplingsprovdata. 18 indicates the proportion of the data set that falls into that terminal node (e. g. leaf). There are many ways to use the above approach, I chose to estimate and combine all possible trees. From the in sample data, I collect all leaves from all possible trees and I gather them into a matrix. This is the 8220rules matrix8221 giving the probability of next week beeing UP or DOWN. I apply the rules in the above matrix to the out of sample data (Jan 2011 8211 Dec 2013) and I compare the results to the real outcome. The problem with this approach is that a single point (week) can fall into several rules and even belong to UP and DOWN rules simultaneously. Therefore I apply a voting scheme . For a given week I sum up all the rules that apply to that week giving a 1 for an UP rule and -1 for a DOWN rule. If the sum is greater than 0 the week is classified as UP, if the sum is negative it8217s a DOWN week and if the sum is equal to 0 there will be no position taken that week (return 0) The above methodology is applied to a set of very liquid ETFs. I plot below the out of sample equity curves along with the buy and hold strategy over the same period. Initial results seem encouraging even if the quality of the outcome varies greatly by instrument. However there is a huge room for improvement. I put below some directions for further analysis Path optimality . The algorithm used here for defining the trees is optimal at each split but it doesn8217t guarantee the optimality of the path. Adding a metric to measure the optimality of the path would certainly improve the above results. Other variables . I chose the explanatory variables solely based on experience. It8217s very likely that this choice is neither good nor optimal. Backtest methodology . I used a simple In and Out of sample methodology. In a more formal backtest I would rather use a rolling or expanding window of in and out sample sub-periods (e. g. walk forward analysis) As usual, any comments welcomeIm very new to R and trying to backtest a strategy Ive programmed already in WealthLab. Several stuff I dont understand (and it doesnt work obviously:) I dont get the Close Prices nicely into a vector. or some kind of vector but it starts with structure and I dont really understand what this function does. Thats why my series,1 call probably doesnt work. n lt - nrow(series) doesnt work either, but I need that for the Loop So I guess if I get These 2 questions answered my strategy should work. Im very thankful for any help..R seems quite complicated even with programming experience in other languages yeah I Kind of copied some lines of code from this tutorial and don39t really understand this line. I mean series,1 I thought would apply the function f onto quotcolumnquot 1 of the series. But since this series is some compley with structure etc. it doesn39t work. I39m talking about this tutorial: r-bloggersbacktesting-a-trading-strategy ndash MichiZH Jun 6 13 at 14:22This is the third post in the Backtesting in Excel and R series and it will show how to backtest a simple strategy in R. It will follow the 4 steps Damian outlined in his post on how to backtest a simple strategy in Excel . Step 1: Get the data The getSymbols function in quantmod makes this step easy if you can use daily data from Yahoo Finance. There are also methods (not in the strict sense) to pull data from other sources (FRED, Google, Oanda, R save files, databases, etc.). You could also use them as a template to write a custom function for a particular vendor you use. run the command below if quantmod isnt already installed use the quantmod package (loads TTR, xts, and zoo) pull SPX data from Yahoo (getSymbols returns an xts object) Step 2: Create your indicator The TTR package contains a multitude of indicators. The indicators are written to make it easy to combine them in creative and unconventional ways. Starting with revision 106 on R-forge, TTR has a DVI indicator . calculate DVI indicator dvi lt - DVI(Cl(GSPC)) Cl() extracts the close price column Step 3: Construct your trading rule Since this trading rule is simple--were long 100 if the DVI is below 0.5 and short 100 otherwise--it can be written in a single line. More elaborate rules andor position sizings can be done as well, but require more code (RSI(2) with Position Sizing is an example of more complex position sizing rules). Also notice that the signal vector is lagged, which avoids look-ahead bias. create signal: (long (short) if DVI is below ( above ) 0.5) lag so yesterdays signal is applied to todays returns sig lt - Lag(ifelse(dvidvi lt 0.5, 1, -1)) Step 4: The trading rulesequity curve As in Damians example, the code below is a simplified approach that is frictionless and does not account for slippage. The code below takes todays percentage return and multiplies it by yesterdays signal position size (always - 100 in this example). I also subset the system returns to match the results in the Excel file . calculate signal-based returns ret lt - ROC(Cl(GSPC))sig subset returns to match data in Excel file ret lt - ret2009-06-022010-09-07 Step 5: Evaluate strategy performance Damian mentioned the importance of evaluating your strategy. Fortunately for R users, the PerformanceAnalytics package makes this easy. With a few lines of code we can view the drawdowns, downside risks, and a performance summary. use the PerformanceAnalytics package create table showing drawdown statistics create table of downside risk estimates chart equity curve, daily performance, and drawdowns Thats all there is to backtesting a simple strategy in R. It wasnt that intimidating, was it Please leave feedback if youre moving your backtesting from Excel to R and theres something youre hung up on or you have an awesome tip youd like to share. Heres a succinct version of the code in the above post if you want to be able to copy paste it all in one block:I follow those There seems to be some perverse human characteristic that likes to make easy things difficult. (buffett) Jag kan ge dig en bestämd kanske. ( Samuel Goldwyn ) If the numbers were all we had, the common belief would be that marriage is the chief cause of divorce. (Zvika Harel) I Gud litar vi på att alla andra måste ta med data. (Edwards Deming) Den ultimata inspirationen är deadline. (Nolan Bushnell) Boredom är rasande spridning tunn. (Paul Tillich) Verkligheten är det som, när du slutar tro på det, går inte bort. (Philip K. Dick) Outside show är en dålig ersättning för inre värde. (Aesop) Erkännande är den största motivatorn. (Gerard C. Eakedale) TV är tuggummi för ögonen. (Frank Lloyd Wright) Droger är verkligheten juridiska smuthullar. (Jeremy Preston Johnson) Exempel är inte det viktigaste att påverka andra. Det är det enda. (Albert Schweitzer) Bra människor är bra för att de kommer till visdom genom misslyckande. (William Saroyan) Om människor är bara bra för att de fruktar straff och hoppas på belöning, så är vi verkligen ledsna. (Albert Einstein) Jag lärde mig för länge sedan, aldrig att brottas med en gris. Du blir smutsig, och dessutom gillar grisen det. (George Bernard Shaw) Det är alltid modigt att säga vad alla tycker. (Georges Duhamel) Det har varit min upplevelse att folk som inte har några laster har väldigt få dygder. ( Abraham Lincoln ) Too much of a good thing is just that. (Brian J. Dent) Framtiden är här. Det är inte helt distribuerat än. (William Gibson) För att göra nöjen behagliga, förkorta dem. (Charles Buxton) Verkligheten är det som, när du slutar tro på det, går inte bort. (Philip K. Dick) Den som slutar lära sig är gammal, oavsett tjugo eller åttio. There must be more to life than having everything ( Maurice Sendak ) Silence is one of the hardest arguments to refute. ( Josh Billings ) Backtesting trading strategies with RHow to Backtest a Strategy in R Were going to explore the backtesting capabilities of R. In a previous post we developed some simple entry opportunities for the USDCAD using a machine-learning algorithm and techniques from a subset of data mining called association rule learning. In this post, we are going to explore how to do a full backtest in R using our rules from the previous post and implementing take profits and stop losses. Lets dive right in: Note: the backtest is built off the 4-hour bars in our data set and doesnt have a more granular view. The CAGR (compounded annual growth rate) is the percentage gainloss annualized, meaning it smooths out the growth into equal instalments each year. Since our test was over Lets see if we can improve the performance by adding a stop loss and take profit. With just a stop loss, performance went down. It looks like we are getting taken out of our trades before they are able to recover. In order to lock in our profits, lets go ahead and implement a take profit. Locking in our gains with a take profit slightly improved the performance, but not drastically. Lets incorporate both a stop loss and a take profit. Now lets compare the baseline Long Short strategy, with just a stop loss, just a take profit, and both a take stop loss and take profit. Now you know how to add a take profit and stop loss, I recommend you play around with the data and test different values based on your own personal risk parameters and using your own rules. Even with powerful algorithms and sophisticated tools, it is difficult to build a successful strategy. For every good idea, we tend to have many more bad ones. Armed with the right tools and knowledge, you can efficiently test your ideas until you get to the good ones. We have streamlined this process in TRAIDE. Weve developed a testing infrastructure that allows you to see where the patterns are in your data are and in real-time see how they would have performed over your historical data. Well be releasing TRAIDE for 7 major pairs in the FX market with technical indicators in two weeks. If you are interested in testing the software and providing feedback, please send an email to infoinovancetech. We have 50 spots available.

No comments:

Post a Comment