Trading Systems Coding System Design. Det första steget när du kodar någon applikation är designfasen Oavsett om du kodar en programvara eller ett handelssystem, försiktig design och planering hjälper dig att slutföra på kortare tid med färre fel Vi kommer att använda en enkel tre stegs process för att designa vårt handelssystem. Steg 1 Skapa ditt handelssystem Regler Det första steget när du utformar ett handelssystem är helt enkelt att komma överens med de regler som ditt system ska fungera. Det bör finnas fyra grundläggande regler för varje handelssystem. - Identifiera när du vill köpa en position. Sell - Identifiera när du vill sälja en position. Stop - Identifiera när du vill skära dina förluster. Target - Identifiera när du vill boka en gain. So, till exempel. Buy - När 30-dagars glidande genomsnittet MA passerar över 60-dagars MA. Sell - När 30-dagars MA passerar under 60-dagars MA. Stop - Maximal förlust på 10 units. Target - Target of 10 units. This exempelsystem kommer att köpa och sälja baserat på 30- och 60-dagars movi ng medelvärden och bokar automatiskt vinster efter ett vinst på 10 enheter eller säljer med förlust efter en 10-enhetsträva i motsatt riktning. Steg 2 Identifiera komponenterna i varje regel Nu när vi har våra regler nere måste vi identifiera komponenter som är inblandade i varje regel Varje komponent ska innehålla två element. Indikatorn eller studien används. Inställningarna för indikatorn eller studien. Dessa komponenter ska konstrueras genom att skriva in kortnamnet för studien följt av inställningarna inom parantes. Dessa inställningar inom parentes refereras till som parametrar för indikatorn eller studien Ibland kan en studie ha flera parametrar, i så fall separerar du dem enkelt med kommatecken. Låt oss ta en titt på några exempel. MA 25 - 25-dagars glidande medelvärde. RSI 25 - 25-dagars relativ styrka index. MACD Stäng 0, 5,5 - Flyttande genomsnittlig konvergensdivergensuppsättning baserad på dagens s close, med en fem dagars snabb längd och en fem dagars långsam längd. Om du är osäker på hur många parametrar en viss komponent r Equates, du kan helt enkelt konsultera dokumentationen för ditt handelsprogram, som listar dessa komponenter tillsammans med de värden som måste fyllas i. Till exempel kan vi se att Tradecision berättar att vi behöver tre parametrar med MACD. So, för det angivna exemplet i steg ett skulle vi använda. MA 30 - Betydande 30-dagars glidande medelvärde. MA 60 - Betydande 60-dagars glidande medel. Steg 3 Lägg till åtgärd Nu lägger vi till åtgärder enligt våra regler Varje åtgärd följer följande grundläggande format. IF Villkoren WHILE Villkor THEN Action. Typiskt kommer villkoret att bestå av de komponenter och parametrar du skapade ovan, medan åtgärden kommer att bestå av köp eller sälja Villkor kan också bestå av enkel engelsk om ingen komponent är närvarande. Observera att komponenten är valfri. Här är några exempel som hjälper till att illustrera denna punkt. IF MA 30 Kryssningar ovanför MA 60 THEN Köp. IF MA 30 Korsar under MA 60 HUR VOLUME 20 000 THEN Sälj. IF EMA 25 är större än MA 5 THEN Sälj. IF RSI 20 är lika Till 50 THEN Köp. Så, fo r det exempel vi har använt, vi d enkelt list. IF MA 30 Kors över MA 60 THEN Köp. IF MA 30 Korsar under MA 60 THEN Sälj. IF Vår handel har 10 enheter av vinst THEN Sell. IF Vår handel har 10 enheter av förlust THEN Sell. What s Nästa Nästa ska vi titta på att konvertera dessa regler till en kod som din dator kan förstå. Trading Systems Coding. Trading-system är helt enkelt uppsättningar av regler som handlare använder för att bestämma sina poster och utgångar från en position Utveckling och användning av handelssystem kan hjälpa handelsmän att uppnå jämn avkastning samtidigt som riskbegränsning I en idealisk situation bör handlare känna sig som robotar, genomföra affärer systematiskt och utan känslor. Så kanske du frågade dig själv Vad är det för att stoppa en robot från att handla mitt system? svara ingenting Denna handledning kommer att presentera dig för de verktyg och tekniker som du kan använda för att skapa ditt eget automatiserade handelssystem. Hur skapas automatiserade handelssystem Automatiserade handelssystem skapas genom att konvertera ditt handelssystem s regler i kod som din dator kan förstå Din dator kör sedan dessa regler genom din handelsprogramvara, som letar efter affärer som följer dina regler. Slutligen placeras handlarna automatiskt med din mäklare. Denna handledning kommer att fokusera på den andra och tredje delen av denna process där dina regler omvandlas till en kod som din handelsprogramvara kan förstå och använda. Vad handelsprogramvara stöder automatiserade handelssystem Det finns många handelsprogram som stöder automatiserade handelssystem. Vissa kommer automatiskt generera och placera affärer med din mäklare. Andra kommer att automatiskt hitta affärer som passar dina kriterier men kräver att du lägger orderna med din mäklare manuellt Dessutom kräver helt automatiska handelsprogram ofta att du använder specifika mäklarfirmor som stöder sådana funktioner. Du kan också behöva fylla i en kompletterande auktoriseringsblankett. Tillägg och nackdelar Automatiserade handelssystem har flera fördelar, men de har också sina downsides Om allt hade ett handelssystem som automatiskt tjänade pengar hela tiden, skulle han eller hon bokstavligen ha en penningmaskin. Ett automatiserat system tar emot känslan och upptaget arbete, vilket gör att du kan fokusera på att förbättra din strategi och penninghanteringsregler. När ett lönsamt system utvecklas krävs det inget arbete för din del förrän det bryts eller marknadsförutsättningarna kräver en förändring. Om systemet inte är korrekt kodat och testat kan stora förluster ske mycket snabbt. Ibland det är omöjligt att sätta vissa regler i kod vilket gör det svårt att utveckla ett automatiserat handelssystem. I den här handledningen lär du dig att planera och designa ett automatiserat handelssystem, hur man översätter denna design till kod som din dator förstår, hur man testar din plan för att säkerställa optimal prestanda och slutligen hur du ska använda ditt system. Ta reda på om du tar vägen mindre reste kommer att fungera till din fördel - eller mot det. Ett handelssystem kan spara tid en nd ta emot känslan ur handel, men adoptera man tar skicklighet och resurser - läs mer här. De flesta mäklare kommer att förse dig med handelsrekord, men det är också viktigt att hålla reda på dina egna. Dessa steg kommer att göra dig mer disciplinerad, smartare och i slutändan rikare frågor. När du gör en hypotekslån, är det betalda beloppet en kombination av en ränteavgift och huvudbetalning över. Läs om att skilja mellan kapitalvaror och konsumtionsvaror och se varför kapitalvaror kräver besparingar och investeringar. Ett derivat är ett avtal mellan två eller flera parter vars värde baseras på en överenskommen underliggande finansiell tillgång. Termen ekonomisk vallgrav, myntade och populariserad av Warren Buffett, avser en affärsförmåga att behålla konkurrensfördelar. Ofta ställda frågor. När du gör en hypotekslån, är det betalda beloppet en kombination av en ränteavgift och huvudstolpenning. Läs om att skilja mellan kapitalvaror och konsumentvaror och se varför kapitalvaror kräver besparingar och investeringar. Ett derivat är ett avtal mellan två eller flera parter vars värde baseras på en överenskommen underliggande finansiell tillgång. Termen ekonomisk vallgrav, myntade och populariserad av Warren Buffett, hänvisar till till en affärsförmåga att behålla konkurrensfördelar. Mest programmerande språk för algoritmiska handelssystem. En av de vanligaste frågorna jag får i QS-brevlådan är Vad är det bästa programmeringsspråket för algoritmisk handel? Det korta svaret är att det inte finns något bästa språkstrategi parametrar, prestanda, modularitet, utveckling, elasticitet och kostnad måste alla övervägas. I denna artikel beskrivs de nödvändiga komponenterna i en algoritmisk handelssystemarkitektur och hur besluten om implementering påverkar språkvalet. Först kommer de viktigaste komponenterna i ett algoritmiskt handelssystem att betraktas som forskningsverktyg, portföljoptimerare, riskhanterare och utförande eng ine Därefter kommer olika handelsstrategier att undersökas och hur de påverkar systemets utformning. I synnerhet kommer frekvensen av handel och den sannolika handelsvolymen att diskuteras. När handelsstrategin har valts är det nödvändigt att arkitektera hela systemet Detta inkluderar val av hårdvara, operativsystem s och systemets elasticitet mot sällsynta, potentiellt katastrofala händelser. Medan arkitekturen övervägs måste hänsyn tas till prestanda både för forskningsverktygen och för levande exekveringsmiljön. Vad är The Handelssystem som försöker göra. Innan du bestämmer dig för det bästa språket som du ska skriva ett automatiserat handelssystem är det nödvändigt att definiera kraven. Om systemet ska vara rent exekveringsbaserat. Kommer systemet att kräva en riskhantering eller portföljkonstruktion. kräva en högpresterande backtester För de flesta strategier kan handelssystemet delas upp i två kategorier Rese arch och signal generation. Research handlar om utvärdering av en strategisk prestanda över historiska data Processen att utvärdera en handelsstrategi över tidigare marknadsdata kallas backtesting. Datastorleken och den algoritmiska komplexiteten kommer att ha stor inverkan på beräkningsintensiteten hos backtestern CPU-hastighet och samtidighet är ofta de begränsande faktorerna för att optimera forskningsexekveringshastigheten. Signalgenerering handlar om att generera en uppsättning handelssignaler från en algoritm och skicka sådana order till marknaden, vanligtvis via en mäklare. För vissa strategier är en hög prestationsnivå krävs IO-problem som nätverksbandbredd och latens är ofta den begränsande faktorn för optimering av exekveringssystem Således kan språkvalet för varje komponent i hela ditt system vara ganska annorlunda. Typ, frekvens och volym av strategi. Den typ av algoritmisk strategi som används har en väsentlig inverkan på systemets utformning. Det kommer att vara nödvändigt att con marknaderna handlas, anslutningen till externa datasäljare, frekvensen och volymen av strategin, avvägningen mellan enkel utveckling och prestandaoptimering, liksom anpassad hårdvara, inklusive samplade anpassade servrar, GPU eller FPGA Det kan vara nödvändigt. Teknologierna för en lågfrekvent amerikanska aktiestrategi kommer att vara väldigt annorlunda än en högfrekvent statistisk arbitragestrategihandel på terminsmarknaden. Före språkvalet måste många dataleverantörer utvärderas som hänför sig till en strategi för hand. Det kommer att vara nödvändigt att överväga anslutning till säljaren, strukturen för alla API: er, aktuell data, lagringskrav och elasticitet i ansiktet av en leverantör som går offline. Det är också klokt att ha snabb tillgång till flera leverantörer Olika instrument har alla sina egna lagringsegenskaper, exempel på vilka inkluderar flera tickersymboler för aktier och utgångsdatum för terminer för att inte nämna några speciella ific OTC-data Detta måste ingå i plattformens design. Frekvensen av strategin kommer sannolikt att vara en av de största drivkrafterna för hur tekniken ska definieras. Strategier som använder data oftare än minutiöst eller i andra steg kräver betydande hänsyn när det gäller prestanda. En strategi som överstiger andra stavar, dvs kryssdata leder till en prestationsdriven design som det primära kravet. För högfrekventa strategier måste en stor mängd marknadsdata lagras och utvärderas. Programvara som HDF5 eller kdb används vanligtvis för dessa roller. För att kunna bearbeta de omfattande volymerna av data som behövs för HFT-applikationer, måste ett omfattande optimerat backtester och exekveringssystem användas. CC möjligen med en viss monteringsenhet är sannolikt den starkaste språkkandidaten. Ultrahögfrekvensstrategier kommer nästan säkert att kräva anpassad hårdvara som FPGA , utbyte samlokalisering och kärnnätverksgränssnittsinställning. Research Systems. Research systems involverar vanligtvis en blandning av interaktiv utveckling och automatiserad skript. Den tidigare sker ofta inom en IDE, såsom Visual Studio, MatLab eller R Studio. Den senare innefattar omfattande numeriska beräkningar över många parametrar och datapunkter. Detta leder till ett språkval som ger en enkel miljö till testkod, men ger också tillräcklig prestanda för att utvärdera strategier över flera parameterdimensioner. Typiska IDE i detta utrymme inkluderar Microsoft Visual CC, som innehåller omfattande felsökningsverktyg, kodkompletteringsfunktioner via Intellisense och enkla översikter över hela projektstapeln via databasen ORM, LINQ MatLab som är konstruerad för omfattande numerisk linjär algebra och vektoriserade operationer, men på ett interaktivt konsol sätt R Studio som omsluter R statistiska språkkonsolen i en fulländig IDE Eclipse IDE för Linux Java och C och semi-proprietary IDEs som Enthought Baldakin för Python, som inkluderar da ta analysbibliotek som NumPy SciPy scikit-lär och pandor i en enda interaktiv konsolmiljö. För numerisk backtesting är alla ovanstående språk lämpliga, men det är inte nödvändigt att använda ett GUI IDE, eftersom koden kommer att utföras i bakgrunden Det primära övervägandet i detta skede är det med körhastigheten Ett sammanställt språk som C är ofta användbart om parametrarna för backtestingparametrar är stora. Kom ihåg att det är nödvändigt att vara försiktig med sådana system om så är fallet. Interpreterade språk som Python ofta utnyttja högpresterande bibliotek som NumPy pandor för backtesting-steget för att upprätthålla en rimlig grad av konkurrenskraft med kompilerade ekvivalenter. Slutligen kommer det språk som valts för backtesting att bestämmas av specifika algoritmiska behov samt utbudet av tillgängliga biblioteken på språket mer på det nedan Men språket som används för backtester och forskningsmiljöer kan vara helt ind oberoende av dem som används i portföljkonstruktion, riskhantering och exekveringskomponenter, vilket kommer att ses. Portföljkonstruktion och riskhantering. Portföljkonstruktion och riskhanteringskomponenter är ofta förbisedda av detaljhandelsalgoritmiska handlare Detta är nästan alltid ett misstag Dessa verktyg tillhandahåller mekanism genom vilket kapital kommer att bevaras De försöker inte bara minska antalet riskabla satsningar, men minimerar också churnen i branschen, vilket minskar transaktionskostnaderna. Sofistikerade versioner av dessa komponenter kan ha en betydande inverkan på lönsamhetens kvalitet och konsistens. är enkelt att skapa stabila strategier, eftersom portföljbyggnadsmekanismen och riskhanteraren enkelt kan modifieras för att hantera flera system. Därför bör de betraktas som väsentliga komponenter vid början av utformningen av ett algoritmiskt handelssystem. Arbetet med portföljkonstruktionssystemet är att ta en uppsättning av önskade affärer och producera uppsättningen av verkliga verksamheter som minimerar klyftan, behåller exponeringar mot olika faktorer som sektorer, tillgångsklasser, volatilitet mm och optimerar fördelningen av kapital till olika strategier i en portfölj. Portföljkonstruktion reduceras ofta till ett linjärt algebraproblem, såsom en matrisfaktorisering och därmed prestanda är starkt beroende av effektiviteten av den numeriska linjära algebra-implementeringen tillgänglig. Gemensamma bibliotek innehåller uBLAS LAPACK och NAG för C MatLab har också omfattande optimerade matrisoperationer. Python använder NumPy SciPy för sådana beräkningar. En ofta återbalanserad portfölj kräver ett kompilerat och väloptimerat matrisbibliotek Risken kan komma i många former Ökad volatilitet, även om detta kan ses som önskvärt för vissa strategier, ökade korrelationer mellan tillgången klasser, motpart de fel, serveravbrott, svarta svanhändelser och oupptäckta fel i handelskoden, för att nämna några. Riskhanteringskomponenter försöker förutse effekterna av överdriven volatilitet och korrelation mellan tillgångsklasser och deras efterföljande effekter s på handelskapitalet. Detta minskar ofta till en uppsättning statistiska beräkningar som Monte Carlo stresstester Detta liknar mycket beräkningsbehoven hos en derivatprissättningsmotor och som sådan kommer den att vara CPU-bunden. Dessa simuleringar är mycket parallelliserbara se nedan och i viss mån är det möjligt att kasta hårdvara vid problemet. Utföringssystem. Utförandet av uppdragssystemet är att ta emot filtrerade handelssignaler från portföljkonstruktion och riskhanteringskomponenter och skicka dem vidare till en mäklare eller annan tillgång till marknadstillträde. För de flesta detaljhandelns algoritmiska handelsstrategier involverar en API eller FIX-anslutning till en mäklare som Interactive Brokers. De primära övervägandena när man bestämmer sig för en lång Uage inkluderar API: s kvalitet, tillgänglighet för språkpaket för ett API, exekveringsfrekvens och förväntad glidning. Kvaliteten på API: n refererar till hur väl dokumenterad det är, vilken typ av prestanda det ger, oavsett om det behöver fristående programvara som ska nås eller om en gateway kan etableras på ett huvudlöst sätt, dvs ingen GUI. När det gäller interaktiva mäklare måste Trader WorkStation-verktyget köras i en GUI-miljö för att kunna komma åt deras API. Jag måste en gång installera en Desktop Ubuntu-utgåva på en Amazon-molnservern får åtkomst till Interactive Brokers på distans, endast av den anledningen. De flesta API-er kommer att ge ett C - eller Java-gränssnitt. Det är vanligtvis upp till samhället att utveckla språkspecifika wrappers för C, Python, R, Excel och MatLab. Observera att med varje extra plugin som används speciellt API wrappers finns det utrymme för buggar att krypa in i systemet. Testa alltid pluggar av detta slag och se till att de hålls aktivt. En bra mätare är att se h ow många nya uppdateringar till en codebase har gjorts under de senaste månaderna. Expeditionsfrekvensen är av största vikt i exekveringsalgoritmen Observera att hundratals order kan skickas varje minut och sålunda prestanda är kritiskt. Slippage kommer att uppstå genom en dålig prestanda exekveringssystem och detta kommer att ha en dramatisk inverkan på lönsamheten. Statiskt typade språk se nedan, som C Java är generellt optimalt för exekvering men det finns ett kompromiss i utvecklingstid, testning och enkel underhåll. Dynamiskt typade språk, t. ex. Python och Perl är nu i allmänhet snabba nog. Se alltid till att komponenterna är konstruerade på ett modulärt sätt se nedan så att de kan bytas ut som systemet vågar. Arkitekturplanering och utvecklingsprocess. Komponenterna i ett handelssystem, dess frekvens och volymkraven har diskuterats ovan men systeminfrastruktur har ännu inte täckts. De som handlar som detaljhandlare eller arbetar i en liten fond kommer att likna ely ha på sig många hattar Det kommer att vara nödvändigt att täcka alfamodellen, riskhanteringen och exekveringsparametrarna och även den slutliga implementeringen av systemet. Innan du går in på specifika språk kommer designen av en optimal systemarkitektur att diskuteras. Separation of Concerns. Ett av de viktigaste besluten som måste fattas i början är hur man skiljer sig från ett handelssystems bekymmer. I mjukvaruutveckling innebär detta i huvudsak hur man bryter upp de olika aspekterna av handelssystemet i separata modulära komponenter. Genom att utsätta gränssnitt vid var och en av komponenterna är det enkelt att byta ut delar av systemet för andra versioner som stöder prestanda, tillförlitlighet eller underhåll utan att ändra externt beroendeskod. Detta är den bästa praxis för sådana system. För strategier med lägre frekvenser rekommenderas sådana metoder för ultra högfrekvenshandel regelboken kan behöva ignoreras på bekostnad av att tweaking systemet för ännu mer performan ce Ett mer tätt kopplat system kan vara önskvärt. Att skapa en komponentkarta på ett algoritmiskt handelssystem är värt en artikel i sig. Det är dock ett optimalt tillvägagångssätt att se till att det finns separata komponenter för historiska och realtidsmarknadsdataingångar, data lagring, dataåtkomst API, backtester, strategiparametrar, portföljkonstruktion, riskhantering och automatiserade exekveringssystem. Till exempel, om den datalager som används är för närvarande underpresterande, även vid betydande optimeringsnivåer, kan den bytas ut med minimala omskrivningar till datainsamling eller dataåtkomst-API Så långt som backtester och efterföljande komponenter är det ingen skillnad. En annan fördel med separerade komponenter är att det tillåter en mängd olika programmeringsspråk att användas i det övergripande systemet. Det är inte nödvändigt att begränsas till ett enda språk om kommunikationsmetoden för komponenterna är språkoberoende Detta kommer att bli fallet om de kommunicerar via TCP IP, ZeroMQ eller något annat språkoberoende protokoll. Som ett konkret exempel, överväga att ett backtesting system skrivs i C för talkrävande prestanda, medan portföljhanteraren och exekveringssystemen skrivs i Python med SciPy och IBPy. Performance Överväganden. Performance är ett viktigt övervägande för de flesta handelsstrategier. För högre frekvensstrategier är det den viktigaste faktorn. Prestanda täcker ett brett spektrum av problem, såsom algoritmisk exekveringshastighet, nätverksfördröjning, bandbredd, data IO, parallell parallellitet och skalning. Var och en av dessa Områdena omfattas individuellt av stora läroböcker, så den här artikeln kommer bara att skrapa ytan av varje ämne. Arkitektur och språkval kommer nu att diskuteras med avseende på deras effekter på prestanda. Den rådande visdomen som uttalats av Donald Knuth, en av fäderna för datavetenskap , är att för tidig optimering är roten till allt ont Detta är nästan alltid fallet - förutom när man bygger Inför en högfrekvent handelsalgoritm För de som är intresserade av lägre frekvensstrategier är ett gemensamt förhållningssätt att bygga ett system på det enklaste sättet och bara optimera när flaskhalsar börjar dyka upp. Profileringsverktyg används för att avgöra var flaskhalsar uppstår Profiler kan vara gjord för alla ovannämnda faktorer, antingen i en MS Windows - eller Linux-miljö. Det finns många operativsystem och språkverktyg tillgängliga för att göra det, såväl som tredjepartsverktyg. Språkvalet kommer nu att diskuteras i samband med performance. C, Java, Python, R och MatLab innehåller alla högpresterande bibliotek antingen som en del av sin standard eller externt för grundläggande datastruktur och algoritmiska arbeten C-fartyg med Standard Template Library, medan Python innehåller NumPy SciPy. Vanliga matematiska uppgifter finns i dessa bibliotek och det är sällan bra att skriva en ny implementering. Ett undantag är om mycket anpassad hårdvaruarkitektur krävs och en algoritm använder sig extensivt av proprietära tillägg, såsom anpassade cachar. Men ofta återuppbyggnad av hjulavfallet som skulle kunna användas bättre utveckla och optimera andra delar av handelsinfrastrukturen. Utvecklingstiden är extremt dyrbar, särskilt i samband med ensamutvecklare. Latency är ofta en fråga om exekveringssystemet eftersom forskningsverktygen vanligen ligger på samma maskin För det första kan latens uppträda vid flera punkter längs exekveringsvägen Databaser måste höras i disknätets latentitet, signaler måste genereras operativsystem, kernal messaging latency, handel signaler skickat NIC latens och order bearbetade utbytessystem interna latens. För högre frekvens operationer är det nödvändigt att bli väl bekant med kärnoptimering samt optimering av nätverksöverföring Detta är ett djupt område och ligger betydligt längre än artikelns räckvidd men om en UHFT-algoritm är önskad, var då medveten om djupet av kunskap e krävs. Caching är väldigt användbar i verktygsverktyget för en kvantitativ handelsutvecklare. Caching avser begreppet lagring av ofta åtkomlig data på ett sätt som möjliggör högre prestanda på bekostnad av dataens potentiella stavhet. Ett gemensamt användningsfall uppstår i webbutveckling när du tar data från en diskbaserad relationsdatabas och lägger den i minnet. Alla efterföljande förfrågningar om data behöver inte slå databasen och prestationsvinster kan därför vara betydande. För handelssituationer kan caching vara mycket fördelaktig. Till exempel Nuvarande status för en strategiportefölje kan lagras i en cache tills den är ombalanserad, så att listan inte behöver regenereras på varje slinga i handelsalgoritmen. Sådan regenerering är sannolikt att vara en hög CPU eller disk IO-operation. cachning är inte utan egna problem. Regenerering av cacherdata på en gång, på grund av cachelagrings volatilitet, kan ge betydande efterfrågan på infrastruktur Anothe r-problemet är dog-piling där flera generationer av en ny cache-kopia utförs under extremt hög belastning, vilket leder till kaskadfel. Dynamisk minnesallokering är en dyr operation vid programkörning Således är det absolut nödvändigt att högre prestandahandelsapplikationer är bra - ware hur minne tilldelas och fördelas under programflödet Nya språkstandarder som Java, C och Python utför alla automatiska sopor som refererar till deallokering av dynamiskt tilldelat minne när objekt går utanför scope. Garbage collection är extremt användbar under utveckling som det minskar fel och hjälpmedelläsbarhet Det är emellertid ofta suboptimalt för vissa högfrekventa handelsstrategier. Anpassad sopkollektion är ofta önskad för dessa fall. I Java, exempelvis genom att ställa in sopkollektor och hålkonfiguration, är det möjligt att erhålla hög prestanda för HFT-strategier. C tillhandahåller inte en inbyggd sopsamlare och så är det nödvändigt att ha nolla all allokering av minnesallokering som del av ett objekt s implementering Medan potentiellt felproblem kan leda till danglingpekare är det extremt användbart att ha finkorrigerad kontroll över hur objekt förekommer i höjden för vissa applikationer. När du väljer ett språk, se till att du studerar hur skräpuppsamlaren fungerar och huruvida den kan modifieras för att optimera för ett visst användningsfall. Många operationer i algoritmiska handelssystem kan användas för parallellisering. Detta avser begreppet att utföra flera programmatiska operationer samtidigt, dvs parallellt. Så kallad pinsamma parallella algoritmer inkluderar steg som kan beräknas helt oberoende av andra steg Vissa statistiska operationer, som Monte Carlo-simuleringar, är ett bra exempel på embarassingly parallella algoritmer som varje slumpmässig rita och efterföljande banoperation kan beräknas utan kännedom om andra banor. Övrigt algoritmer är endast delvis parallella. Vätskedynamik simula satser är ett exempel där beräkningsdomänen kan delas upp men i slutändan måste domänerna kommunicera med varandra och således är operationerna delvis sekventiella. Parallelliserbara algoritmer är föremål för Amdahls lag som ger en teoretisk övre gräns för prestandahöjningen av en parallelliserad algoritm när den är föremål för N separata processer, t. ex. på en CPU-kärna eller tråd. Parallellisering har blivit allt viktigare som ett sätt att optimera eftersom processorns klockhastigheter har stagnerat, eftersom nyare processorer innehåller många kärnor för att utföra parallella beräkningar. konsumentgrafik hårdvara övervägande för videospel har lett till utvecklingen av grafiska processenheter GPU: er, som innehåller hundratals kärnor för mycket samtidiga operationer. Sådana GPU: er är nu mycket överkomliga Högkvalitativa ramar, till exempel Nvidia s CUDA, har lett till omfattande adoption i akademien och finance. Such GPU hårdvara är i allmänhet bara lämplig för re sökande aspekt av kvantitativ finansiering, medan andra mer specialiserade hårdvaror inklusive Fältprogrammerbara Gate Arrays - FPGAs används för U HFT Numera stöder de flesta moderna långauges en grad av samtidighet multithreading Således är det enkelt att optimera en backtester eftersom alla beräkningar är vanligtvis oberoende av de andra. Scaling i mjukvaruutveckling och operationer avser systemets förmåga att hantera konsekvent ökande belastningar i form av större förfrågningar, högre processoranvändning och mer minnesallokering. I algoritmisk handel kan en strategi skala om den kan acceptera större kapitalmängder och fortfarande producera konsekventa avkastningar. Handelsteknikstakten vågar om den kan tåla större handelsvolymer och ökad latens utan flaskhalsning. Även om system måste utformas för att skala, är det ofta svårt att förutsäga i förväg där en flaskhals kommer att uppstå. Fast loggning, testning, profilering och övervakning kommer att hjälpa till med att tillåta en syste m att skala Språk själva beskrivs ofta som oskalbart Detta är vanligtvis ett resultat av felaktig information, snarare än svårt. Det är den totala tekniken stacken som bör fastställas för skalbarhet, inte språket. Tydligt vissa språk har större prestanda än andra i synnerhet användarfall , men ett språk är aldrig bättre än någon annan i alla avseenden. Ett sätt att hantera skalan är att skilja problem som nämnts ovan För att ytterligare införa förmågan att hantera spikar i systemet, dvs plötslig volatilitet som utlöser en flotta affärer är användbar för att skapa en meddelandekurarkitektur Det innebär helt enkelt att ett meddelandekössystem ska placeras mellan komponenter så att beställningar staplas om en viss komponent inte kan hantera många förfrågningar. I stället för att förfrågningar förloras hålls de helt enkelt i en stapel tills meddelandet hanteras Detta är särskilt användbart för att skicka handlar till en körmotor Om motorn lider under tung latens då det kommer att säkerhetskopiera affärer En kö mellan handelssignalgenerern och körnings API kommer att lindra denna fråga på bekostnad av potentiell handelsladdning. En väl respekterad öppen källkodsmeddelare är RabbitMQ. Hardware och operativsystem. Den hårdvara som driver din strategi kan har en betydande inverkan på lönsamheten för din algoritm Detta är inte ett problem begränsat till högfrekventa handlare antingen Ett dåligt val i hårdvaru och operativsystem kan leda till maskinkrasch eller omstart vid det mest oupphörliga ögonblicket. Det är därför nödvändigt att överväga var din application will reside The choice is generally between a personal desktop machine, a remote server, a cloud provider or an exchange co-located server. Desktop machines are simple to install and administer, especially with newer user friendly operating systems such as Windows 7 8, Mac OSX and Ubuntu Desktop systems do possess some significant drawbacks, however The foremost is that the versions of operating systems des igned for desktop machines are likely to require reboots patching and often at the worst of times They also use up more computational resources by the virtue of requiring a graphical user interface GUI. Utilising hardware in a home or local office environment can lead to internet connectivity and power uptime problems The main benefit of a desktop system is that significant computational horsepower can be purchased for the fraction of the cost of a remote dedicated server or cloud based system of comparable speed. A dedicated server or cloud-based machine, while often more expensive than a desktop option, allows for more significant redundancy infrastructure, such as automated data backups, the ability to more straightforwardly ensure uptime and remote monitoring They are harder to administer since they require the ability to use remote login capabilities of the operating system. In Windows this is generally via the GUI Remote Desktop Protocol RDP In Unix-based systems the command-line Se cure SHell SSH is used Unix-based server infrastructure is almost always command-line based which immediately renders GUI-based programming tools such as MatLab or Excel to be unusable. A co-located server, as the phrase is used in the capital markets, is simply a dedicated server that resides within an exchange in order to reduce latency of the trading algorithm This is absolutely necessary for certain high frequency trading strategies, which rely on low latency in order to generate alpha. The final aspect to hardware choice and the choice of programming language is platform-independence Is there a need for the code to run across multiple different operating systems Is the code designed to be run on a particular type of processor architecture, such as the Intel x86 x64 or will it be possible to execute on RISC processors such as those manufactured by ARM These issues will be highly dependent upon the frequency and type of strategy being implemented. Resilience and Testing. One of the best ways to lose a lot of money on algorithmic trading is to create a system with no resiliency This refers to the durability of the sytem when subject to rare events, such as brokerage bankruptcies, sudden excess volatility, region-wide downtime for a cloud server provider or the accidental deletion of an entire trading database Years of profits can be eliminated within seconds with a poorly-designed architecture It is absolutely essential to consider issues such as debuggng, testing, logging, backups, high-availability and monitoring as core components of your system. It is likely that in any reasonably complicated custom quantitative trading application at least 50 of development time will be spent on debugging, testing and maintenance. Nearly all programming languages either ship with an associated debugger or possess well-respected third-party alternatives In essence, a debugger allows execution of a program with insertion of arbitrary break points in the code path, which temporarily h alt execution in order to investigate the state of the system The main benefit of debugging is that it is possible to investigate the behaviour of code prior to a known crash point. Debugging is an essential component in the toolbox for analysing programming errors However, they are more widely used in compiled languages such as C or Java, as interpreted languages such as Python are often easier to debug due to fewer LOC and less verbose statements Despite this tendency Python does ship with the pdb which is a sophisticated debugging tool The Microsoft Visual C IDE possesses extensive GUI debugging utilities, while for the command line Linux C programmer, the gdb debugger exists. Testing in software development refers to the process of applying known parameters and results to specific functions, methods and objects within a codebase, in order to simulate behaviour and evaluate multiple code-paths, helping to ensure that a system behaves as it should A more recent paradigm is known as Tes t Driven Development TDD , where test code is developed against a specified interface with no implementation Prior to the completion of the actual codebase all tests will fail As code is written to fill in the blanks , the tests will eventually all pass, at which point development should cease. TDD requires extensive upfront specification design as well as a healthy degree of discipline in order to carry out successfully In C , Boost provides a unit testing framework In Java, the JUnit library exists to fulfill the same purpose Python also has the unittest module as part of the standard library Many other languages possess unit testing frameworks and often there are multiple options. In a production environment, sophisticated logging is absolutely essential Logging refers to the process of outputting messages, with various degrees of severity, regarding execution behaviour of a system to a flat file or database Logs are a first line of attack when hunting for unexpected program runtime b ehaviour Unfortunately the shortcomings of a logging system tend only to be discovered after the fact As with backups discussed below, a logging system should be given due consideration BEFORE a system is designed. Both Microsoft Windows and Linux come with extensive system logging capability and programming languages tend to ship with standard logging libraries that cover most use cases It is often wise to centralise logging information in order to analyse it at a later date, since it can often lead to ideas about improving performance or error reduction, which will almost certainly have a positive impact on your trading returns. While logging of a system will provide information about what has transpired in the past, monitoring of an application will provide insight into what is happening right now All aspects of the system should be considered for monitoring System level metrics such as disk usage, available memory, network bandwidth and CPU usage provide basic load information. Tradin g metrics such as abnormal prices volume, sudden rapid drawdowns and account exposure for different sectors markets should also be continuously monitored Further, a threshold system should be instigated that provides notification when certain metrics are breached, elevating the notification method email, SMS, automated phone call depending upon the severity of the metric. System monitoring is often the domain of the system administrator or operations manager However, as a sole trading developer, these metrics must be established as part of the larger design Many solutions for monitoring exist proprietary, hosted and open source, which allow extensive customisation of metrics for a particular use case. Backups and high availability should be prime concerns of a trading system Consider the following two questions 1 If an entire production database of market data and trading history was deleted without backups how would the research and execution algorithm be affected 2 If the trading syste m suffers an outage for an extended period with open positions how would account equity and ongoing profitability be affected The answers to both of these questions are often sobering. It is imperative to put in place a system for backing up data and also for testing the restoration of such data Many individuals do not test a restore strategy If recovery from a crash has not been tested in a safe environment, what guarantees exist that restoration will be available at the worst possible moment. Similarly, high availability needs to be baked in from the start Redundant infrastructure even at additional expense must always be considered, as the cost of downtime is likely to far outweigh the ongoing maintenance cost of such systems I won t delve too deeply into this topic as it is a large area, but make sure it is one of the first considerations given to your trading system. Choosing a Language. Considerable detail has now been provided on the various factors that arise when developing a cust om high-performance algorithmic trading system The next stage is to discuss how programming languages are generally categorised. Type Systems. When choosing a language for a trading stack it is necessary to consider the type system The languages which are of interest for algorithmic trading are either statically - or dynamically-typed A statically-typed language performs checks of the types e g integers, floats, custom classes etc during the compilation process Such languages include C and Java A dynamically-typed language performs the majority of its type-checking at runtime Such languages include Python, Perl and JavaScript. For a highly numerical system such as an algorithmic trading engine, type-checking at compile time can be extremely beneficial, as it can eliminate many bugs that would otherwise lead to numerical errors However, type-checking doesn t catch everything, and this is where exception handling comes in due to the necessity of having to handle unexpected operations Dynamic languages i e those that are dynamically-typed can often lead to run-time errors that would otherwise be caught with a compilation-time type-check For this reason, the concept of TDD see above and unit testing arose which, when carried out correctly, often provides more safety than compile-time checking alone. Another benefit of statically-typed languages is that the compiler is able to make many optimisations that are otherwise unavailable to the dynamically - typed language, simply because the type and thus memory requirements are known at compile-time In fact, part of the inefficiency of many dynamically-typed languages stems from the fact that certain objects must be type-inspected at run-time and this carries a performance hit Libraries for dynamic languages, such as NumPy SciPy alleviate this issue due to enforcing a type within arrays. Open Source or Proprietary. One of the biggest choices available to an algorithmic trading developer is whether to use proprietary commercial or ope n source technologies There are advantages and disadvantages to both approaches It is necessary to consider how well a language is supported, the activity of the community surrounding a language, ease of installation and maintenance, quality of the documentation and any licensing maintenance costs. The Microsoft stack including Visual C , Visual C and MathWorks MatLab are two of the larger proprietary choices for developing custom algorithmic trading software Both tools have had significant battle testing in the financial space, with the former making up the predominant software stack for investment banking trading infrastructure and the latter being heavily used for quantitative trading research within investment funds. Microsoft and MathWorks both provide extensive high quality documentation for their products Further, the communities surrounding each tool are very large with active web forums for both The software allows cohesive integration with multiple languages such as C , C and V B, as well as easy linkage to other Microsoft products such as the SQL Server database via LINQ MatLab also has many plugins libraries some free, some commercial for nearly any quantitative research domain. There are also drawbacks With either piece of software the costs are not insignificant for a lone trader although Microsoft does provide entry-level version of Visual Studio for free Microsoft tools play well with each other, but integrate less well with external code Visual Studio must also be executed on Microsoft Windows, which is arguably far less performant than an equivalent Linux server which is optimally tuned. MatLab also lacks a few key plugins such as a good wrapper around the Interactive Brokers API, one of the few brokers amenable to high-performance algorithmic trading The main issue with proprietary products is the lack of availability of the source code This means that if ultra performance is truly required, both of these tools will be far less attractive. Open source t ools have been industry grade for sometime Much of the alternative asset space makes extensive use of open-source Linux, MySQL PostgreSQL, Python, R, C and Java in high-performance production roles However, they are far from restricted to this domain Python and R, in particular, contain a wealth of extensive numerical libraries for performing nearly any type of data analysis imaginable, often at execution speeds comparable to compiled languages, with certain caveats. The main benefit of using interpreted languages is the speed of development time Python and R require far fewer lines of code LOC to achieve similar functionality, principally due to the extensive libraries Further, they often allow interactive console based development, rapidly reducing the iterative development process. Given that time as a developer is extremely valuable, and execution speed often less so unless in the HFT space , it is worth giving extensive consideration to an open source technology stack Python and R p ossess significant development communities and are extremely well supported, due to their popularity Documentation is excellent and bugs at least for core libraries remain scarce. Open source tools often suffer from a lack of a dedicated commercial support contract and run optimally on systems with less-forgiving user interfaces A typical Linux server such as Ubuntu will often be fully command-line oriented In addition, Python and R can be slow for certain execution tasks There are mechanisms for integrating with C in order to improve execution speeds, but it requires some experience in multi-language programming. While proprietary software is not immune from dependency versioning issues it is far less common to have to deal with incorrect library versions in such environments Open source operating systems such as Linux can be trickier to administer. I will venture my personal opinion here and state that I build all of my trading tools with open source technologies In particular I use Ubu ntu, MySQL, Python, C and R The maturity, community size, ability to dig deep if problems occur and lower total cost ownership TCO far outweigh the simplicity of proprietary GUIs and easier installations Having said that, Microsoft Visual Studio especially for C is a fantastic Integrated Development Environment IDE which I would also highly recommend. Batteries Included. The header of this section refers to the out of the box capabilities of the language - what libraries does it contain and how good are they This is where mature languages have an advantage over newer variants C , Java and Python all now possess extensive libraries for network programming, operating system interaction, GUIs, regular expressions regex , iteration and basic algorithms. C is famed for its Standard Template Library STL which contains a wealth of high performance data structures and algorithms for free Python is known for being able to communicate with nearly any other type of system protocol especially the web , mostly through its own standard library R has a wealth of statistical and econometric tools built in, while MatLab is extremely optimised for any numerical linear algebra code which can be found in portfolio optimisation and derivatives pricing, for instance. Outside of the standard libraries, C makes use of the Boost library, which fills in the missing parts of the standard library In fact, many parts of Boost made it into the TR1 standard and subsequently are available in the C 11 spec, including native support for lambda expressions and concurrency. Python has the high performance NumPy SciPy Pandas data analysis library combination, which has gained widespread acceptance for algorithmic trading research Further, high-performance plugins exist for access to the main relational databases, such as MySQL MySQL C , JDBC Java MatLab , MySQLdb MySQL Python and psychopg2 PostgreSQL Python Python can even communicate with R via the RPy plugin. An often overlooked aspect of a trading system while in the initial research and design stage is the connectivity to a broker API Most APIs natively support C and Java, but some also support C and Python, either directly or with community-provided wrapper code to the C APIs In particular, Interactive Brokers can be connected to via the IBPy plugin If high-performance is required, brokerages will support the FIX protocol. As is now evident, the choice of programming language s for an algorithmic trading system is not straightforward and requires deep thought The main considerations are performance, ease of development, resiliency and testing, separation of concerns, familiarity, maintenance, source code availability, licensing costs and maturity of libraries. The benefit of a separated architecture is that it allows languages to be plugged in for different aspects of a trading stack, as and when requirements change A trading system is an evolving tool and it is likely that any language choices will evolve along with it. Just Getting St arted with Quantitative Trading.
Comments
Post a Comment