ããã°ã®Financial Hackerã®èè ã¯ãååŒæã§ã®ååŒã®ããã®é«é »åºŠæŠç¥ãéçºããããã»ã¹ãå®éã«ã©ã®ããã«èª¿æŽãããŠãããã«ã€ããŠè©±ããŸãã-èµ·ããããé 延ã®åæã®éèŠæ§ãããããŒã¿ã®åä¿¡ãšãã¹ãã®åé¡ãŸã§ïŒãã¹ãŠã³ãŒãäŸä»ãïŒã ããšãã°ãç±³åœã®ååŒæã§ã®è£å®ååŒã®æŠç¥ã䜿çšãããŸãã ãã®è³æã®ç¿»èš³çãäœæããŸããã
ã¯ããã«
åŸæ¥ã®ååŒæŠç¥ã§äœ¿çšãããŠããæ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ãŸãã¯ä¿¡å·åŠçã¢ã«ãŽãªãºã ãšæ¯èŒãããšãé«é »åºŠååŒïŒHFTïŒã·ã¹ãã ã¯é©ãã»ã©ã·ã³ãã«ã§ãã 圌ãã¯æ ªåŒã®å°æ¥ã®äŸ¡æ Œãäºæž¬ããããšããå¿ èŠã¯ãããŸãã-圌ãã¯ãã§ã«ãããç¥ã£ãŠããŸãã ããæ£ç¢ºã«ã¯ã圌ãã¯çŸåšã®äŸ¡æ Œãä»ã®ããé ãåžå Žåå è ãããå°ãæ©ãç¥ã£ãŠããŸãã
åžå ŽããŒã¿ãååŸããã»ãšãã©ã®åå è ã®åã«ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããHFTã®å©ç¹ã ã·ã¹ãã ã®ç·åçæ§ã¯ããã®é 延ã®é床ãååŒæã®ãã¬ãŒãã£ã³ã°ã³ã¢ã§ã®èŠç©ããã®ââåä¿¡ããã¢ããªã±ãŒã·ã§ã³ã®å®è¡ãŸã§ã®æéã«äŸåããŸãã ã¬ã€ãã³ã·ã¯ãHFTã·ã¹ãã ãè©äŸ¡ããäžã§æãéèŠãªèŠçŽ ã§ãã ããã¯2ã€ã®æ¹æ³ã§æé©åã§ããŸãïŒäº€æãŸã§ã®ç©ççãªè·é¢ãæå°ã«ããããšãããã³ã·ã¹ãã èªäœã®é床ãäžããããšã ãããŠãæåã®ãã®ã¯2çªç®ã®ãã®ãããã¯ããã«éèŠã§ãã
å Žæ
çæ³çã«ã¯ãHFTãµãŒããŒã¯ååŒæã«çŽæ¥é 眮ããå¿ èŠããããŸãã ãŸããäžçã®ã»ãšãã©ã®ååŒããã¢ã¯ãããŒã¿ã»ã³ã¿ãŒã§ãµãŒããŒãã±ãŒã·ã§ã³ãåãã§è²©å£²ããŠããŸããã¡ã€ã³ã®äº€æãããã¯ãŒã¯ã®ããã«è¿ãã»ã©ããã®å Žæãèæ ®ãããŸãã ã·ãŒã«ãç·ã®é»æ°ä¿¡å·ã¯ãå ã®é床ã®0.7-0.9ã®é床ïŒ300 km / msïŒã§éä¿¡ãããŸãã ä¿¡å·ãœãŒã¹ãŸã§ã®è·é¢ã1ã¡ãŒãã«çããããšãã©ãŠã³ãããªããïŒã¢ããªã±ãŒã·ã§ã³ã®éä¿¡ããå®è¡ã«é¢ããæ å ±ã®åä¿¡ãŸã§ã®æéïŒã§æ倧8ããç§ã®å©ç¹ãåŸãããŸãã 8ããç§ã§éãããšãã§ããååŒæ©äŒã¯ããã€ã§ããïŒ èª°ãç¥ããŸãããã人ã ã¯ç¯çŽãããããç§ããšã«åãã§æ¯æããŸãã
æ®å¿µãªããïŒãŸãã¯å¹žããªããšã«ãçµæžã®èŠ³ç¹ãããååŒæã®ããŒã¿ã»ã³ã¿ãŒãžã®é 眮ã«ã¯å€é¡ã®è²»çšãããããŸãïŒããã®èšäºã§åæãããHFTã·ã¹ãã ã¯ãããã€ãã®çç±ã§ååŒãã©ãããã©ãŒã ã®ããŒã¿ã»ã³ã¿ãŒå ã®ã³ãã±ãŒã·ã§ã³ã«é 眮ã§ããŸããã åæã«ãååŒããã«ã¯ããã¥ãŒãšãŒã¯ã®NYSEååŒæãšCMEïŒã·ã«ãŽïŒããåæã«ããŒã¿ãåä¿¡ããå¿ èŠããããŸãã
é«éã±ãŒãã«ã2ã€ã®éœåžéã§åŒã䌞ã°ããããã€ã¯ãæ³¢ãããã¯ãŒã¯ãåäœããŸãã çè«çã«ã¯ãåæ§ã®èŠä»¶ãæã€ã·ã¹ãã ã®çæ³çãªå Žæã¯ããªãã€ãªå·ãŠã©ãŒã¬ã³ã®çºã§ãã ãã¥ãŒãšãŒã¯ãšã·ã«ãŽã®ã¡ããã©äžéã«äœçœ®ããŠããŸãã é«éå人åãã®ããããããã©ããã¯ããããŸããããäž¡ååŒæãŸã§ã®è·é¢ã357ãã€ã«ãããããåŸåŸ©é 延ãçŽ4ããªç§ã«ãªããŸãã
ãªãã€ãªå·ãŠã©ãŒã¬ã³-HFTå人ã®ã¡ãã«ïŒç»åïŒãžã£ãã¯ãã¢ãŒã¹/ãŠã£ãããã£ã¢ã³ã¢ã³ãºïŒ
ééããªãããã®çŽ æŽãããçºã®ãµãŒããŒã¯ããã¥ãŒãšãŒã¯ã®èšŒåžååŒæã®ã©ãã¯ã«ãããµãŒããŒãããã¯ããã«å®äŸ¡ã§ãã ã¹ã¿ãŒãã¢ããã®ã¢ã€ãã¢ïŒãŠã©ã¬ã³ã§ã¬ã¬ãŒãžãããã€ãè³Œå ¥ãããã¥ãŒãšãŒã¯ãšã·ã«ãŽãçµã¶é«éã±ãŒãã«ã«æ¥ç¶ããŠããµãŒããŒã©ãã¯ãã¬ã³ã¿ã«ããŠãéã皌ããïŒ
ãœãããŠã§ã¢
HFTã·ã¹ãã ã«æé©ãªå Žæãšéä¿¡ãã£ãã«ã®éžæã«ãã§ã«æè³ããŠããå Žåãå¿ èŠãªé床ã«å¯Ÿå¿ãããœãããŠã§ã¢ãå ¥æããå¿ èŠããããŸãã åæ¥ååŒãã©ãããã©ãŒã ã¯éåžžãååã«é«éã§ã¯ãããŸãããããã«ããããã®ã³ãŒãã¯åžžã«éããããŠãããäœãã©ã®ããã«æ©èœãããã¯æ£ç¢ºã«ã¯ããããŸããã ãããã£ãŠãHFTã·ã¹ãã ã¯æ¢åã®ãã©ãããã©ãŒã ã«åºã¥ããŠããããšã¯ã»ãšãã©ãªãããŒãããäœæãããŠããŸãã RãPythonã§ã¯ãªãããé«éãèšèªã®ããããã§ã ãã®ãªã¹ãã«ã¯ä»¥äžãå«ãŸããŸãã
- CãŸãã¯C ++ã¯ãé«ã¬ãã«ãšé«éã®çŽ æŽãããçµã¿åããã§ãã Cã¯èªã¿ããããæ©æ¢°èªãšã»ãŒåããããé«éã§å¹ççã§ãã
- Pentium Assembler-ãã·ã³åœä»€ã䜿çšããŠã¢ã«ãŽãªãºã ãäœæãããšãCã·ã¹ãã ã§ãè¿œãè¶ãããŸãã ãã®ã¢ãããŒãã®ãã€ãã¹é¢ïŒãã®ãããªã³ãŒããç¶æããããšã¯å®¹æã§ã¯ãªãã§ãããããã¹ãŠã®ããã°ã©ããŒã¯ãä»ã®èª°ãã«ãã£ãŠæžãããã¢ã»ã³ãã©ãŒããã°ã©ã ãèªãããšãã©ãã»ã©é£ãããç¥ã£ãŠããŸãã
- CUDAãHLSLããŸãã¯GPUã¢ã»ã³ãã© -ã¢ã«ãŽãªãºã ããã¯ãã«ãŸãã¯è¡åæŒç®ãç©æ¥µçã«äœ¿çšããŠããå Žåããããªã«ãŒãã§å®è¡ããã®ã¯çŽ æŽãããã¢ã€ãã¢ã§ãã
- VHDL-ãœãããŠã§ã¢ãé ãããç¹å®ã®ã¢ã«ãŽãªãºã ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®æåãããç§ã«äŸåããå Žåãããã§ã®ã究極ã®è§£æ±ºçãã¯ããŒããŠã§ã¢ã§ã·ã¹ãã ãçŽæ¥ã³ãŒãã£ã³ã°ããããšã§ãã VHDLã§ã¯ãæ倧æ°çŸã¡ã¬ãã«ãã®ã¯ããã¯é床ã§æŒç®ãŠããããããžã¿ã«ãã£ã«ã¿ãŒãFPGAãããã·ãŒã±ã³ãµãŒãå®çŸ©ã§ããŸãã ãã®ãããªãããã¯ããããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ã«çŽæ¥æ¥ç¶ã§ããŸãã
VHDLãé€ããäžèšã®ãã¹ãŠã¯å€ãã®å°é家ïŒç¹ã«3Dã®ã³ã³ãã¥ãŒã¿ãŒã²ãŒã ã®éçºè ïŒã«éŠŽæã¿ãããã¯ãã§ãã ããããé«åšæ³¢æŠç¥ã®æšæºèšèªã¯C / C ++ãšåŒã°ããŸãã ãã®è³æã§äœ¿çšãããŠããã®ã¯åœŒã§ãã
ã¢ã«ãŽãªãºã
å€ãã®HFTã·ã¹ãã ã¯ããè¿œãè¶ãæ¹æ³ãã䜿çšããŠç«¶åãã¬ãŒããŒããæ¢ãããŸãã 圌ãã¯ããªãã®ã¢ããªã±ãŒã·ã§ã³ã«æ°ä»ããåãè³ç£ãæ°ãã€ã¯ãç§åã«åãäŸ¡æ Œã§è³Œå ¥ããããå°ãé«äŸ¡ã«å£²ã£ãŠãéã皌ããŸãã äžéšã®ååŒæã§ã¯ããã¹ãŠã®åå è ã«å¹³çãªæ¡ä»¶ãäœãåºãããã«ãã®ãããªååŒã¯çŠæ¢ãããŠããŸãããä»ã®ãã©ãããã©ãŒã ã¯ãããèš±å¯ããã³ããã·ã§ã³ã§ããå€ãã皌ãããšãæã¿ãŸãã ãã®èšäºã®äŸã§ã¯ããã®ãããªã¡ã«ããºã ã¯äœ¿çšãããã代ããã«è£å®æŠç¥ã説æãããŸãã ãµãŒããŒããŠã©ãŒã¬ã³ã«ãããã·ã«ãŽãšãã¥ãŒãšãŒã¯ãžã®é«éãªã³ã¯ããããšããŸãã
調åã¯ãéèååESãšSPYã®éã§è¡ãããŸãã ESã¯ãã·ã«ãŽãæ ç¹ãšããSïŒP500å ç©ã§ãã SPYã¯ãã¥ãŒãšãŒã¯ã«æ ç¹ã眮ãETFã§ãããSïŒP500ã«ããªã³ã¯ãããŠããŸãã ESã®1ãã€ã³ãã¯SPYã®10ã»ã³ãã«çãããããESã®äŸ¡æ Œã¯SPYã®çŽ10åã§ãã äž¡æ¹ã®è³ç£ã¯åãã€ã³ããã¯ã¹ã«åºã¥ããŠãããããäŸ¡æ Œã®é«ãçžé¢ãæåŸ ã§ããŸãã ãã®çžé¢é¢ä¿ãçæéã§ãå£ããã ããšãèè ã蚌æããŠããåºçç©ããããŸãã ãããã¢ã¹ã¯ã¹ãã¬ãããè¶ ããES-SPYãã¢éã®çæçãªäŸ¡æ Œå·®ããããšã仲è£ã®æ©äŒãçãŸããŸãã ãã®äŸã®ã¢ã«ãŽãªãºã ã¯ã次ã®æŠç¥ã«åŸã£ãŠæ©èœããŸãã
- éãSPY-ESã決å®ããŸãã
- å¹³åããã®åå·®ã決å®ããŸãã
- åå·®ããããã¢ã¹ã¯ã¹ãã¬ãããè¶ ããç¹å®ã®ãããå€ãè¶ ãããšãESãšSPYã§ããžã·ã§ã³ãå察æ¹åã«éãããŸãã
- åå·®ãæ¹åãå転ããæå®ã®ïŒãããã«å°ããïŒãããå€ãè¶ ãããšãããžã·ã§ã³ã¯ã¯ããŒãºãããŸãã
ã¢ã«ãŽãªãºã ã¯Cã§èšè¿°ãããŠããŸããHFTã³ãŒããèŠãããšããªãå Žåãå°ãå¥åŠã«èŠãããããããŸããã
#define THRESHOLD 0.4 // Entry/Exit threshold // HFT // 0 // 1 ES, SPY // 2 SPY, ES // -1 int tradeHFT(double AskSPY,double BidSPY,double AskES,double BidES) { double SpreadSPY = AskSPY-BidSPY, SpreadES = AskES-BidES; double Arbitrage = 0.5*(AskSPY+BidSPY-AskES-BidES); static double ArbMean = Arbitrage; ArbMean = 0.999*ArbMean + 0.001*Arbitrage; static double Deviation = 0; Deviation = 0.75*Deviation + 0.25*(Arbitrage - ArbMean); static int Position = 0; if(Position == 0) { if(Deviation > SpreadSPY+THRESHOLD) return Position = 1; if(-Deviation > SpreadES+THRESHOLD) return Position = 2; } else { if(Position == 1 && -Deviation > SpreadES+THRESHOLD/2) return Position = 0; if(Position == 2 && Deviation > SpreadSPY+THRESHOLD/2) return Position = 0; } return -1; }
traderHFTé¢æ°ã¯ãç¹å®ã®ãã¬ãŒã ã¯ãŒã¯ïŒèšäºã§ã¯èæ ®ãããŠããŸããïŒããåŒã³åºãããèŠç©ãããåãåãã泚æãéä¿¡ããŸãã ãã©ã¡ãŒã¿ãŒãšããŠãESããã³SPYã§ã®å£²è²·ã®çŸåšã®æè¯äŸ¡æ ŒããªãŒããŒããã¯ã®æäžéšãã䜿çšãããŸãïŒSPYäŸ¡æ Œã«10ãæããŠãäž¡æ¹ã®è³ç£ãåãã¹ã±ãŒã«ã«ãªããšæ³å®ãããŸãïŒã ãã®é¢æ°ã¯ããã¬ãŒã ã¯ãŒã¯ã«ããžã·ã§ã³ããªãŒãã³ãŸãã¯ã¯ããŒãºããããäœãããªãããã«æ瀺ããã³ãŒããè¿ããŸãã ã¢ãŒããã©ãŒãžå€æ°ã¯ãSPYãšESã®å¹³åäŸ¡æ Œå·®ãè¡šããŸãã ãã®å¹³åïŒArbMeanïŒã¯äœéã®ææ°ç§»åå¹³åã«ãã£ãŠãã£ã«ã¿ãŒåŠçãããå¹³åããã®åå·®ãé«é移åå¹³åã«ãã£ãŠãã£ã«ã¿ãŒåŠçãããç®çã®ç¯å²å€ã®çžå Žã«å¯Ÿããåå¿ãé²ããŸãã Positionå€æ°ã¯ãlongãshortãããã³noneã®å€ãåãããšãã§ãããã·ã³ç¶æ ã瀺ããŸãã ããžã·ã§ã³ã«åºå ¥ãããããã®ãããå€ïŒThresholdïŒã¯40ã»ã³ãã«èšå®ãããŠããŸãã ããã¯ãã·ã¹ãã ã®å¯äžã®èª¿æŽå¯èœãªãã©ã¡ãŒã¿ãŒã§ãã æŠç¥ãå®éã®ååŒãç®çãšããŠããå Žåãæ°ãæã®ESããã³SPYããŒã¿ã䜿çšããŠãããå€ãæé©åããããšãå¿ èŠã§ãã
ãã®ãããªæå°éã®ã·ã¹ãã ã¯ãã¢ã»ã³ãã©ãŒã«å€æããããšããFPGAãããã§ããã°ã©ã ããããšãå°é£ã§ã¯ãããŸããã ãã ããããã¯å¿ èŠãããŸãããã³ã³ãã€ã«ã«Zorroãã¬ãŒã ã¯ãŒã¯ã³ã³ãã€ã©ã䜿çšããŠããå Žåã§ãïŒèšäºã®èè ã«ãã£ãŠéçºãããŠããŸãïŒãtradeHFTé¢æ°ã¯ããã750ããç§ã§å®è¡ãããŸãã Microsoft VC ++ãªã©ã®ããé«åºŠãªã³ã³ãã€ã©ã䜿çšããå Žåããã®å€ã650ããç§ã«æžããããšãã§ããŸãã ESã§ã®2ã€ã®åŒçšã®éã®æéã¯10ãã€ã¯ãç§ä»¥äžã§ãããããé床Cã§ååã§ãã
HFTå®éšã§ã¯ã2ã€ã®è³ªåã«çããå¿ èŠããããŸãã ãŸããã¢ãŒããã©ãŒãžå©çãçã¿åºãã®ã«ååãª2ã€ã®ååã®äŸ¡æ Œå·®ã¯æ¬åœã«ãããŸããïŒ ç¬¬äºã«ãã·ã¹ãã ã¯ã©ã®æ倧é 延ã§åäœããŸããïŒ
ããŒã¿
HFTã·ã¹ãã ã®ããã¯ãã¹ãã§ã¯ãéåžžãããŒã«ãŒããç¡æã§ååŸã§ããããŒã¿ã¯é©åã§ã¯ãããŸããã ååŒæã®ã¿ã€ã ã¹ã¿ã³ããå«ããŠãå¿ èŠãªèš±å¯ãŸãã¯BBOïŒBest Bid and OfferïŒããŒã¿ã§æ³šæåž³ã®ããŒã¿ãè³Œå ¥ããå¿ èŠããããŸãã ååŒæã§èŠç©ãåä¿¡ãããæéã«é¢ããæ å ±ããªããšãæ倧é 延ã決å®ããããšã¯ã§ããŸããã
äžéšã®äŒæ¥ã¯ãååŒæããã®ãã¹ãŠã®èŠç©ãããèšé²ãããã®ããŒã¿ã販売ããŠããŸãã ããããã«ç¬èªã®ããŒã¿åœ¢åŒããããããæåã«å ±éã®åœ¢åŒã«ããå¿ èŠããããŸãã ãã®äŸã§ã¯ã次ã®ã¿ãŒã²ããããŒã¿åœ¢åŒã䜿çšããŸãã
typedef struct T1 // single tick { double time; // time stamp, OLE DATE format float fVal; // positive = ask price, negative = bid price } T1;
CME亀æã®ç¶æ³ãç£èŠããŠããäŒæ¥ã®1ã€ã¯ãå€ãã®è¿œå ãã£ãŒã«ããåããCSV圢åŒã§ããŒã¿ãé ä¿¡ããŸããããã®ã»ãšãã©ã¯è§£æ±ºããã¿ã¹ã¯ã«ã¯å¿ èŠãããŸããã 1æ¥ãããã®ãã¹ãŠã®èŠç©ããã¯ã1ã€ã®CSVãã¡ã€ã«ã«ä¿åãããŸãã 以äžã¯ã2016幎12æã®ESããŒã¿ãããã«ãããŠããããT1ã¯ã©ãŒãããŒã¿ã»ããã«å€æããã¹ã¯ãªããã§ãã
////////////////////////////////////////////////////// // Convert price history from Nanotick BBO to .t1 ////////////////////////////////////////////////////// #define STARTDAY 20161004 #define ENDDAY 20161014 string InName = "History\\CME.%08d-%08d.E.BBO-C.310.ES.csv"; // name of a day file string OutName = "History\\ES_201610.t1"; string Code = "ESZ"; // December contract symbol string Format = "2,,%Y%m%d,%H:%M:%S,,,s,,,s,i,,"; // Nanotick csv format void main() { int N,Row,Record,Records; for(N = STARTDAY; N <= ENDDAY; N++) { string FileName = strf(InName,N,N+1); if(!file_date(FileName)) continue; Records = dataParse(1,Format,FileName); // read BBO data printf("\n%d rows read",Records); dataNew(2,Records,2); // create T1 dataset for(Record = 0,Row = 0; Record < Records; Record++) { if(!strstr(Code,dataStr(1,Record,1))) continue; // select only records with correct symbol T1* t1 = dataStr(2,Row,0); // store record in T1 format float Price = 0.01 * dataInt(1,Record,3); // price in cents if(Price < 1000) continue; // no valid price string AskBid = dataStr(1,Record,2); if(AskBid[0] == 'B') // negative price for Bid Price = -Price; t1->fVal = Price; t1->time = dataVar(1,Record,0) + 1./24.; // add 1 hour Chicago-NY time difference Row++; } printf(", %d stored",Row); dataAppend(3,2,0,Row); // append dataset if(!wait(0)) return; } dataSave(3,OutName); // store complete dataset }
ã¹ã¯ãªããã¯æåã«CSVã解æããŠäžéãã€ããªããŒã¿ã»ããã«å€æãã次ã«ãããã¿ãŒã²ããT1圢åŒã«å€æããŸãã ã¿ã€ã ã¹ã¿ã³ãã¯ã·ã«ãŽæéã«æ·»ä»ãããŠããããããã¥ãŒãšãŒã¯æéã«å€æããã«ã¯ãã1æéè¿œå ããå¿ èŠããããŸãã
ãã¥ãŒãšãŒã¯èšŒåžååŒæããã¬ãŒã¹ããäŒç€Ÿã¯ãç¹å¥ã«å§çž®ãããNxCoreããŒã圢åŒã§ããŒã¿ãé ä¿¡ããŸããç¹å¥ãªãã©ã°ã€ã³ã䜿çšããŠã2çªç®ã®T1ãªã¹ãã«å€æããå¿ èŠããããŸãã
////////////////////////////////////////////////////// // Convert price history from Nanex .nx2 to .t1 ////////////////////////////////////////////////////// #define STARTDAY 20161004 #define ENDDAY 20161014 #define BUFFER 10000 string InName = "History\\%8d.GS.nx2"; // name of a single day tape string OutName = "History\\SPY_201610.t1"; string Code = "eSPY"; int Row,Rows; typedef struct QUOTE { char Name[24]; var Time,Price,Size; } QUOTE; int callback(QUOTE *Quote) { if(!strstr(Quote->Name,Code)) return 1; T1* t1 = dataStr(1,Row,0); // store record in T1 format t1->time = Quote->Time; t1->fVal = Quote->Price; Row++; Rows++; if(Row >= BUFFER) { // dataset full? Row = 0; dataAppend(2,1); // append to dataset 2 } return 1; } void main() { dataNew(1,BUFFER,2); // create a small dataset login(1); // open the NxCore plugin int N; for(N = STARTDAY; N <= ENDDAY; N++) { string FileName = strf(InName,N); if(!file_date(FileName)) continue; printf("\n%s..",FileName); Row = Rows = 0; // initialize global variables brokerCommand(SET_HISTORY,FileName); // parse the tape dataAppend(2,1,0,Row); // append the rest to dataset 2 printf("\n%d rows stored",Rows); if(!wait(0)) return; // abort when [Stop] was hit } dataSave(2,OutName); // store complete dataset }
ã³ãŒã«ããã¯é¢æ°ã¯ããœãŒã¹ãã¡ã€ã«ã®åŒçšã«ãã£ãŠåŒã³åºãããŸãããã»ãšãã©ã®ããŒã¿ã¯å¿ èŠãªããããSPYïŒãeSPYãïŒåŒçšã®ã¿ãé€å€ãããŸãã
åžå Žã®éå¹çæ§ã®ç¢ºèª
2ã€ã®ãœãŒã¹ããããŒã¿ãåãåã£ãã®ã§ãESãšSPYã®äŸ¡æ Œãé«è§£å床ã§æ¯èŒã§ããããã«ãªããŸããã äŸ¡æ Œæ²ç·ã®å žåçãª10ç§ã®ãµã³ãã«ã¯æ¬¡ã®ãšããã§ãã
ã¹ãã€ïŒé»ïŒå¯Ÿ ESïŒèµ€ïŒã2017幎10æ5æ¥ã10ïŒ01ïŒ25-10ïŒ01.35
ããã§ã®è§£å床ã¯1ããªç§ã§ãã ESã¯ãã«åäœã§æãããSPYã¯10ã»ã³ãåäœã§æãããŸãã ãã£ãŒãäŸ¡æ Œã¯å£²å€ïŒå£²å€ïŒã§ãã ãã®ãããªçãééã§ãã£ãŠããäŸ¡æ Œã¯éåžžã«çžé¢ããŠããããã§ãã ESã¯å°ãé ããŠããŸãã
仲è£ã®æ©äŒã¯äžå€®ã®ãµã€ãã§çºçããŸã-10:01:30é ãESã¯å€åã«å°ãåå¿ããŸãããããã匷ããªããŸããã ãã®çç±ã¯ãSïŒP 500ã«å«ãŸããæ ªåŒã®1ã€ã®äŸ¡æ Œã®æ¥æ¿ãªäžæã®ãããªäœããã®ã€ãã³ãã§ããå¯èœæ§ããããŸãã ïŒ çæ³çã«ã¯ãããã§ESã販売ããSPYãè³Œå ¥ã§ããŸãã ãã®ããã«ãæã ã¯ä»¥åã«ä»®å®ãããåžå Žã®éå¹çæ§ã®çè«ã確èªããŸããã
é«è§£å床ã°ã©ããã¬ã³ããªã³ã°ããããã®ã¹ã¯ãªããïŒ
#define ES_HISTORY "ES_201610.t1" #define SPY_HISTORY "SPY_201610.t1" #define TIMEFORMAT "%Y%m%d %H:%M:%S" #define FACTOR 10 #define OFFSET 3.575 void main() { var StartTime = wdatef(TIMEFORMAT,"20161005 10:01:25"), EndTime = wdatef(TIMEFORMAT,"20161005 10:01:35"); MaxBars = 10000; BarPeriod = 0.001/60.; // 1 ms plot resolution Outlier = 1.002; // filter out 0.2% outliers assetList("HFT.csv"); dataLoad(1,ES_HISTORY,2); dataLoad(2,SPY_HISTORY,2); int RowES=0, RowSPY=0; while(Bar < MaxBars) { var TimeES = dataVar(1,RowES,0), PriceES = dataVar(1,RowES,1), TimeSPY = dataVar(2,RowSPY,0), PriceSPY = dataVar(2,RowSPY,1); if(TimeES < TimeSPY) RowES++; else RowSPY++; if(min(TimeES,TimeSPY) < StartTime) continue; if(max(TimeES,TimeSPY) > EndTime) break; if(TimeES < TimeSPY) { asset("ES"); priceQuote(TimeES,PriceES); } else { asset("SPY"); priceQuote(TimeSPY,PriceSPY); } asset("ES"); if(AssetBar > 0) plot("ES",AskPrice+OFFSET,LINE,RED); asset("SPY"); if(AssetBar > 0) plot("SPY",FACTOR*AskPrice,LINE,BLACK); } }
æåã«ãã¹ã¯ãªããã¯åã«äœæããå±¥æŽããŒã¿ãå«ã2ã€ã®ãã¡ã€ã«ãèªã¿åãã次ã«ãããã1è¡ãã€è§£æããŸãã
ã·ã¹ãã ãã¹ã
çµæã®HFTã·ã¹ãã ãããã¯ãã¹ãããã«ã¯ãã¹ã¯ãªããããããã«å€æŽããã«ãŒãã§tradeHFTé¢æ°ãåŒã³åºãå¿ èŠããããŸãã
#define LATENCY 4.0 // milliseconds function main() { var StartTime = wdatef(TIMEFORMAT,"20161005 09:30:00"), EndTime = wdatef(TIMEFORMAT,"20161005 15:30:00"); MaxBars = 200000; BarPeriod = 0.1/60.; // 100 ms bars Outlier = 1.002; assetList("HFT.csv"); dataLoad(1,ES_HISTORY,2); dataLoad(2,SPY_HISTORY,2); int RowES=0, RowSPY=0; EntryDelay = LATENCY/1000.; Hedge = 2; Fill = 8; // HFT fill mode; Slippage = 0; Lots = 100; while(Bar < MaxBars) { var TimeES = dataVar(1,RowES,0), PriceES = dataVar(1,RowES,1), TimeSPY = dataVar(2,RowSPY,0), PriceSPY = dataVar(2,RowSPY,1); if(TimeES < TimeSPY) RowES++; else RowSPY++; if(min(TimeES,TimeSPY) < StartTime) continue; if(max(TimeES,TimeSPY) > EndTime) break; if(TimeES < TimeSPY) { asset("ES"); priceQuote(TimeES,PriceES); } else { asset("SPY"); priceQuote(TimeSPY,FACTOR*PriceSPY); } asset("ES"); if(!AssetBar) continue; var AskES = AskPrice, BidES = AskPrice-Spread; asset("SPY"); if(!AssetBar) continue; var AskSPY = AskPrice, BidSPY = AskPrice-Spread; int Order = tradeHFT(AskSPY,BidSPY,AskES,BidES); switch(Order) { case 1: asset("ES"); enterLong(); asset("SPY"); enterShort(); break; case 2: asset("ES"); enterShort(); asset("SPY"); enterLong(); break; case 0: asset("ES"); exitLong(); exitShort(); asset("SPY"); exitLong(); exitShort(); break; } } printf("\nProfit %.2f at NY Time %s", Equity,strdate(TIMEFORMAT,dataVar(1,RowES,0))); }
ãã®ã¹ã¯ãªããã¯ããã¥ãŒãšãŒã¯ã®åå9æ30åããååŸ3æ30åãŸã§ã®1ååŒæ¥ã«ããã¯ãã¹ããå®è¡ããŸãã å®éãHFTé¢æ°ã¯ESããã³SPYäŸ¡æ Œã§åã«åŒã³åºããããã®åŸãç¶æ ãåãæ¿ããã³ãŒããå®è¡ãããŸãã 圌ã¯åè³ç£ã®100åäœã§ããžã·ã§ã³ããªãŒãã³ããŸãïŒESã®å Žåã¯2å¥çŽãSPYã®å Žåã¯1000å¥çŽïŒã é 延ã¯ãEntryDelayå€æ°ã䜿çšããŠèšå®ãããŸãã HFTã¢ãŒãïŒFill = 8ïŒã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¯é 延æéåŸã®æçµäŸ¡æ Œã§ä¿çãããŸãã ããã«ãããã·ãã¥ã¬ãŒã·ã§ã³ãå®éã®æ¡ä»¶ã«è¿ã¥ããããšãã§ããŸãã
次ã®è¡šã¯ãããŸããŸãªé 延å€ã䜿çšããã·ãã¥ã¬ãŒã·ã§ã³ããã®å©çã瀺ããŠããŸãã
é 延 | 0.5ããªç§ | 4.0ããªç§ | 6.0ããªç§ | 10ããªç§ |
---|---|---|---|---|
å©ç/æ¥ | + $ 793 | + 273ãã« | + $ 205 | -15ãã« |
ã芧ã®ãšãããES-SPYã¢ãŒããã©ãŒãžæŠç¥ã¯ã1æ¥ããã800ãã«ã皌ãããšãã§ããŸã-500ãã€ã¯ãç§ã®éçŸå®çãªå°ããªé 延ã§ãã æ®å¿µãªãããNYSEãšCMEã®éã«700ãã€ã«ã®è·é¢ãããå Žåããã®çµæãéæããã«ã¯ã¿ã€ã ãã·ã³ïŒãŸãã¯ããçš®ã®éåãã¬ããŒããŒã·ã§ã³ããŒã«ïŒãå¿ èŠã§ãã ãªãã€ãªå·ãŠã©ãŒã¬ã³ã®ãµãŒããŒã§ãé 延ã4ããªç§ã®å Žåã1æ¥ãããçŽ300ãã«ããããŸãã ãµãŒããŒããã¥ãŒãšãŒã¯ãšã·ã«ãŽã®éã®é«éãã£ãã«ããå°ãé¢ããŠããå Žåãå©çã¯200ãã«ã«ãªããŸãã 貿æã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãããã«é²ãã§ããå ŽåïŒããã·ã¥ãã«ãªã©ïŒãäœãã§ããŸããã
1æ¥300ãã«ã§ã幎éåå ¥ã¯75,000ãã«ã«ãªããŸããããã®çµæãéæããã«ã¯ãããŒããŠã§ã¢ãšãœãããŠã§ã¢ã«å ããŠå€ãã®ãéãå¿ èŠã«ãªããŸãã SPYå¥çŽã®è²»çšã¯250ãã«ã§ã100ãŠãããã®ååŒã§100 * 2500ãã«+ 100 * 10 * 250ãã«= 50äžãã«ã®ååŒéã«ãªããŸãã ãããã£ãŠã幎éã®æè³åççã¯15ïŒ ãè¶ ããŸããã ãã ãã調åçšã®éèååã®ãã¢ãããã«è¿œå ããããšã§ãçµæãæ¹åã§ããŸãã
çµè«
- ã·ã¹ãã ãååã«è¿ éã«å¿çããå Žåãç°ãªãååŒæã®é«åºŠã«çžé¢ããéèååéã®è£å®ååŒãªã©ãéåžžã«åå§çãªæ¹æ³ã§ããç²åŸããããšãã§ããŸãã
- HFTã§ã¯ããµãŒããŒã®ç©ççãªå Žæãéåžžã«éèŠã§ãã
- ES-SPY仲è£ã¯ã©ãããã§ãå®è¡ã§ããŸããã ããªãã¯ãã§ã«ãããããŠãã人ãã¡ãšããããŠãããããªãã€ãªå·ã®ãŠã©ãŒã¬ã³ãã競äºããªããã°ãªããŸããã
ITI Capitalã®éèããã³æ ªåŒåžå Žã«é¢ãããã®ä»ã®è³æïŒ
- åæãšåžå Žã¬ãã¥ãŒ
- ããã¯ãã¥ã¶ãã¥ãŒãã£ãŒïŒå±¥æŽããŒã¿ã䜿çšããååŒããããã®ããã©ãŒãã³ã¹ã®æ€èšŒ
- ã¹ãããããšã®ã€ãã³ãé§ååPythonããã¯ãã¹ãïŒ ããŒã1 ã ããŒã2 ã ããŒã3 ã ããŒã4 ã ããŒã5 ïŒ