Salah satu soalan yang paling kerap saya terima dalam beg mel adalah
Pertama, komponen utama sistem dagangan algoritma akan dipertimbangkan, seperti alat penyelidikan, pengoptimuman portfolio, pengurus risiko dan enjin pelaksanaan. Kemudian, strategi dagangan yang berbeza akan diperiksa dan bagaimana mereka mempengaruhi reka bentuk sistem. Khususnya kekerapan dagangan dan jumlah dagangan yang mungkin akan dibincangkan.
Apabila strategi perdagangan telah dipilih, adalah perlu untuk membina keseluruhan sistem. Ini termasuk pilihan perkakasan, sistem operasi (s) dan ketahanan sistem terhadap kejadian yang jarang berlaku, berpotensi bencana. Semasa seni bina sedang dipertimbangkan, pertimbangan yang sewajarnya harus dibayar kepada prestasi - kedua-dua kepada alat penyelidikan serta persekitaran pelaksanaan langsung.
Apakah Sistem Perdagangan Cuba Lakukan?
Sebelum memutuskan bahasa
Penyelidikan berkaitan dengan penilaian prestasi strategi terhadap data sejarah. Proses menilai strategi perdagangan terhadap data pasaran sebelumnya dikenali sebagai backtesting. Saiz data dan kerumitan algoritma akan memberi kesan besar terhadap intensiti pengiraan backtester. Kelajuan CPU dan serentak sering menjadi faktor yang mengehadkan dalam mengoptimumkan kelajuan pelaksanaan penyelidikan.
Generasi isyarat berkaitan dengan menjana satu set isyarat perdagangan dari algoritma dan menghantar pesanan tersebut ke pasaran, biasanya melalui broker. Untuk strategi tertentu, tahap prestasi yang tinggi diperlukan. Isu I / O seperti lebar jalur rangkaian dan latensi sering menjadi faktor yang mengehadkan dalam mengoptimumkan sistem pelaksanaan. Oleh itu, pilihan bahasa untuk setiap komponen keseluruhan sistem anda mungkin sangat berbeza.
Jenis, kekerapan dan jumlah strategi
Jenis strategi algoritma yang digunakan akan mempunyai kesan yang besar terhadap reka bentuk sistem. Adalah perlu untuk mempertimbangkan pasaran yang didagangkan, sambungan ke vendor data luaran, kekerapan dan jumlah strategi, pertukaran antara kemudahan pembangunan dan pengoptimuman prestasi, serta mana-mana perkakasan tersuai, termasuk pelayan tersuai yang terletak bersama, GPU atau FPGA yang mungkin diperlukan.
Pilihan teknologi untuk strategi ekuiti AS frekuensi rendah akan sangat berbeza dengan strategi arbitrase statistik frekuensi tinggi yang berdagang di pasaran niaga hadapan.
Ia perlu untuk mempertimbangkan kesambungan dengan vendor, struktur mana-mana API, ketepatan masa data, keperluan penyimpanan dan ketahanan dalam menghadapi vendor yang tidak berhubung. Ia juga bijak untuk mempunyai akses cepat kepada beberapa vendor! Pelbagai instrumen semuanya mempunyai ciri penyimpanan mereka sendiri, contohnya termasuk simbol ticker berbilang untuk ekuiti dan tarikh luput untuk niaga hadapan (belum lagi data OTC tertentu). Ini perlu diambil kira dalam reka bentuk platform.
Frekuensi strategi mungkin menjadi salah satu pemacu terbesar bagaimana timbunan teknologi akan ditakrifkan. Strategi yang menggunakan data lebih kerap daripada bar minit atau kedua memerlukan pertimbangan yang signifikan dari segi prestasi.
Strategi yang melebihi bar kedua (iaitu data tik) membawa kepada reka bentuk yang didorong oleh prestasi sebagai keperluan utama. Untuk strategi frekuensi tinggi, sejumlah besar data pasaran perlu disimpan dan dinilai. Perisian seperti HDF5 atau kdb + biasanya digunakan untuk peranan ini.
Untuk memproses jumlah data yang luas yang diperlukan untuk aplikasi HFT, backtester dan sistem pelaksanaan yang dioptimumkan secara meluas mesti digunakan. C / C ++ (mungkin dengan beberapa pengumpul) mungkin menjadi calon bahasa yang paling kuat. Strategi frekuensi ultra tinggi hampir pasti memerlukan perkakasan tersuai seperti FPGA, penempatan bersama pertukaran dan penyesuaian antara muka kernel / rangkaian.
Sistem Penyelidikan
Sistem penyelidikan biasanya melibatkan campuran pembangunan interaktif dan skrip automatik. Yang pertama sering berlaku dalam IDE seperti Visual Studio, MatLab atau R Studio. Yang terakhir melibatkan pengiraan berangka yang luas ke atas pelbagai parameter dan titik data. Ini membawa kepada pilihan bahasa yang menyediakan persekitaran yang mudah untuk menguji kod, tetapi juga memberikan prestasi yang mencukupi untuk menilai strategi ke atas pelbagai dimensi parameter.
IDE biasa dalam ruang ini termasuk Microsoft Visual C ++ / C #, yang mengandungi utiliti debugging yang luas, keupayaan penyelesaian kod (melalui
Untuk pengujian belakang berangka, semua bahasa di atas sesuai, walaupun tidak perlu menggunakan GUI / IDE kerana kod akan dijalankan
Bahasa yang ditafsirkan seperti Python sering menggunakan perpustakaan berprestasi tinggi seperti NumPy / panda untuk langkah backtesting, untuk mengekalkan tahap daya saing yang munasabah dengan setara yang disusun. Pada akhirnya bahasa yang dipilih untuk backtesting akan ditentukan oleh keperluan algoritma tertentu serta pelbagai perpustakaan yang tersedia dalam bahasa (lebih lanjut mengenai itu di bawah).
Pembinaan Portfolio dan Pengurusan Risiko
Komponen pembinaan portfolio dan pengurusan risiko sering diabaikan oleh peniaga algoritma runcit. Ini hampir selalu menjadi kesilapan. Alat-alat ini menyediakan mekanisme di mana modal akan dipelihara. Mereka bukan sahaja berusaha untuk mengurangkan bilangan pertaruhan
Versi canggih komponen ini boleh memberi kesan yang ketara terhadap kualiti dan konsistensi keuntungan. Ia adalah mudah untuk mewujudkan strategi yang stabil kerana mekanisme pembinaan portfolio dan pengurus risiko dapat dengan mudah diubah suai untuk mengendalikan pelbagai sistem. Oleh itu, mereka harus dianggap sebagai komponen penting pada permulaan reka bentuk sistem dagangan algoritma.
Tugas sistem pembinaan portfolio adalah untuk mengambil satu set dagangan yang dikehendaki dan menghasilkan satu set dagangan sebenar yang meminimumkan churn, mengekalkan pendedahan kepada pelbagai faktor (seperti sektor, kelas aset, turun naik dan lain-lain) dan mengoptimumkan peruntukan modal kepada pelbagai strategi dalam portfolio.
Pembinaan portfolio sering dikurangkan kepada masalah aljabar linear (seperti faktorisasi matriks) dan oleh itu prestasi sangat bergantung kepada keberkesanan pelaksanaan aljabar linear numerik yang tersedia. Perpustakaan biasa termasuk uBLAS, LAPACK dan NAG untuk C ++. MatLab juga mempunyai operasi matriks yang dioptimumkan secara meluas. Python menggunakan NumPy / SciPy untuk pengiraan tersebut. Portfolio yang selalunya diseimbangkan semula memerlukan perpustakaan matriks yang disusun (dan dioptimumkan dengan baik!) untuk menjalankan langkah ini, supaya tidak menghalang sistem perdagangan.
Pengurusan risiko adalah satu lagi bahagian yang sangat penting dalam sistem perdagangan algoritma. Risiko boleh datang dalam pelbagai bentuk: peningkatan turun naik (walaupun ini mungkin dilihat sebagai wajar untuk strategi tertentu!), peningkatan korelasi antara kelas aset, kegagalan pihak lawan, gangguan pelayan, peristiwa
Komponen pengurusan risiko cuba menjangkakan kesan turun naik yang berlebihan dan korelasi antara kelas aset dan kesan seterusnya pada modal dagangan. Selalunya ini berkurangan kepada satu set pengiraan statistik seperti ujian tekanan Monte Carlo. Ini sangat serupa dengan keperluan pengiraan enjin penetapan harga derivatif dan dengan itu akan terikat CPU. Simulasi ini sangat paralel (lihat di bawah) dan, hingga tahap tertentu, adalah mungkin untuk membuang perkakasan pada masalah tersebut.
Sistem Pelaksanaan
Tugas sistem pelaksanaan adalah untuk menerima isyarat dagangan yang ditapis dari komponen pembinaan portfolio dan pengurusan risiko dan menghantarnya ke broker atau cara lain untuk mengakses pasaran. Bagi kebanyakan strategi dagangan algoritma runcit, ini melibatkan sambungan API atau FIX ke broker seperti Broker Interaktif. Pertimbangan utama ketika memutuskan bahasa termasuk kualiti API, ketersediaan pembungkus bahasa untuk API, kekerapan pelaksanaan dan kebocoran yang dijangkakan.
Kebanyakan API akan menyediakan antara muka C ++ dan / atau Java. Biasanya terserah kepada komuniti untuk membangunkan pembungkus bahasa khusus untuk C #, Python, R, Excel dan MatLab. Perhatikan bahawa dengan setiap pemalam tambahan yang digunakan (terutamanya pembungkus API) terdapat ruang untuk bug merayap ke dalam sistem. Sentiasa menguji pemalam jenis ini dan memastikan mereka dikekalkan secara aktif. Pengukur yang berbaloi adalah untuk melihat berapa banyak kemas kini baru kepada pangkalan kod yang telah dibuat dalam beberapa bulan kebelakangan ini.
Frekuensi pelaksanaan adalah sangat penting dalam algoritma pelaksanaan. Perhatikan bahawa beratus-ratus pesanan boleh dihantar setiap minit dan sebagai prestasi yang kritikal. Slippage akan timbul melalui sistem pelaksanaan yang buruk dan ini akan mempunyai kesan dramatik terhadap keuntungan.
Bahasa-bahasa dengan jenis statik (lihat di bawah) seperti C ++ / Java umumnya optimum untuk pelaksanaan tetapi terdapat pertukaran dalam masa pembangunan, pengujian dan kemudahan penyelenggaraan. Bahasa-bahasa dengan jenis dinamik, seperti Python dan Perl kini umumnya cukup cepat.
Proses Perancangan dan Pembangunan Seni Bina
Komponen sistem perdagangan, kekerapan dan keperluan jumlahnya telah dibincangkan di atas, tetapi infrastruktur sistem masih belum dilindungi. Mereka yang bertindak sebagai peniaga runcit atau bekerja dalam dana kecil mungkin akan
Memisahkan Kebimbangan
Salah satu keputusan yang paling penting yang perlu dibuat pada mulanya adalah bagaimana untuk
Dengan mendedahkan antara muka pada setiap komponen, mudah untuk menukar bahagian sistem untuk versi lain yang membantu prestasi, kebolehpercayaan atau penyelenggaraan, tanpa mengubah suai kod pergantungan luaran. Ini adalah
Membuat peta komponen sistem dagangan algoritma bernilai artikel itu sendiri. Walau bagaimanapun, pendekatan yang optimum adalah untuk memastikan terdapat komponen yang berasingan untuk input data pasaran sejarah dan masa nyata, penyimpanan data, API akses data, backtester, parameter strategi, pembinaan portfolio, pengurusan risiko dan sistem pelaksanaan automatik.
Sebagai contoh, jika simpanan data yang digunakan kini kurang berprestasi, walaupun pada tahap pengoptimuman yang ketara, ia boleh ditukar dengan penulisan semula yang minimum untuk pengambilan data atau API akses data.
Satu lagi faedah komponen berasingan ialah ia membolehkan pelbagai bahasa pengaturcaraan digunakan dalam sistem keseluruhan. Tidak perlu terhad kepada satu bahasa jika kaedah komunikasi komponen adalah bebas bahasa. Ini akan berlaku jika mereka berkomunikasi melalui TCP / IP, ZeroMQ atau beberapa protokol bebas bahasa lain.
Sebagai contoh konkrit, pertimbangkan kes sistem backtesting yang ditulis dalam C ++ untuk prestasi
Pertimbangan Prestasi
Prestasi adalah pertimbangan penting untuk kebanyakan strategi perdagangan. Untuk strategi frekuensi yang lebih tinggi, ia adalah faktor yang paling penting.
Kebijaksanaan yang berlaku seperti yang dinyatakan oleh Donald Knuth, salah seorang bapa Sains Komputer, adalah bahawa
Alat profil digunakan untuk menentukan di mana kemacetan timbul. Profil boleh dibuat untuk semua faktor yang disenaraikan di atas, sama ada dalam persekitaran MS Windows atau Linux. Terdapat banyak alat sistem operasi dan bahasa yang tersedia untuk melakukannya, serta utiliti pihak ketiga.
C ++, Java, Python, R dan MatLab semuanya mengandungi perpustakaan berprestasi tinggi (baik sebagai sebahagian daripada standard mereka atau secara luaran) untuk struktur data asas dan kerja algoritma. C ++ kapal dengan Perpustakaan Templat Standard, manakala Python mengandungi NumPy / SciPy. Tugas matematik biasa terdapat di perpustakaan ini dan jarang bermanfaat untuk menulis pelaksanaan baru.
Satu pengecualian adalah jika seni bina perkakasan yang sangat disesuaikan diperlukan dan algoritma menggunakan banyak sambungan proprietari (seperti cache tersuai). Walau bagaimanapun, sering kali
Latensi sering menjadi isu sistem pelaksanaan kerana alat penyelidikan biasanya terletak di mesin yang sama. Untuk yang pertama, latensi boleh berlaku di beberapa titik di sepanjang laluan pelaksanaan. Pangkalan data mesti dikonsultasikan (latensi cakera / rangkaian), isyarat mesti dihasilkan (sistem operasi, latensi mesej kernel), isyarat perdagangan yang dihantar (latensi NIC) dan pesanan yang diproses (latensi dalaman sistem pertukaran).
Untuk operasi frekuensi yang lebih tinggi adalah perlu untuk menjadi akrab dengan pengoptimuman teras serta pengoptimuman penghantaran rangkaian.
Caching sangat berguna dalam toolkit pembangun perdagangan kuantitatif. Caching merujuk kepada konsep menyimpan data yang sering diakses dengan cara yang membolehkan akses prestasi yang lebih tinggi, dengan mengorbankan potensi staleness data. Kes penggunaan biasa berlaku dalam pembangunan web apabila mengambil data dari pangkalan data hubungan yang disokong cakera dan meletakkannya ke dalam memori.
Untuk situasi dagangan, caching boleh sangat bermanfaat. Sebagai contoh, keadaan semasa portfolio strategi boleh disimpan dalam cache sehingga ia diseimbangkan semula, sehingga senarai tidak perlu diperbaharui pada setiap gelung algoritma dagangan.
Walau bagaimanapun, caching tidak tanpa masalah sendiri. Penjanaan semula data cache sekaligus, kerana sifat volatilie penyimpanan cache, boleh meletakkan permintaan yang signifikan pada infrastruktur. Masalah lain adalah dog-stacking, di mana beberapa generasi salinan cache baru dijalankan di bawah beban yang sangat tinggi, yang membawa kepada kegagalan cascade.
Peruntukan memori dinamik adalah operasi yang mahal dalam pelaksanaan perisian. Oleh itu, adalah penting bagi aplikasi perdagangan prestasi yang lebih tinggi untuk mengetahui dengan baik bagaimana memori diperuntukkan dan tidak diperuntukkan semasa aliran program. Piawaian bahasa yang lebih baru seperti Java, C # dan Python semua melakukan pengumpulan sampah automatik, yang merujuk kepada pemisahan memori yang diperuntukkan secara dinamik apabila objek keluar dari skop.
Pengumpulan sampah sangat berguna semasa pembangunan kerana mengurangkan kesilapan dan membantu ketara. Walau bagaimanapun, ia sering kurang optimum untuk strategi perdagangan frekuensi tinggi tertentu. Pengumpulan sampah tersuai sering dikehendaki untuk kes ini. Di Java, misalnya, dengan menyesuaikan pengumpul sampah dan konfigurasi timbunan, adalah mungkin untuk mendapatkan prestasi yang tinggi untuk strategi HFT.
C ++ tidak menyediakan pengumpul sampah asli dan oleh itu perlu mengendalikan semua peruntukan memori / pemindahan sebagai sebahagian daripada pelaksanaan objek. Walaupun berpotensi terdedah kepada ralat (yang berpotensi membawa kepada penunjuk yang menggantung), sangat berguna untuk mempunyai kawalan halus tentang bagaimana objek muncul di tumpukan untuk aplikasi tertentu. Apabila memilih bahasa pastikan untuk mengkaji bagaimana pengumpul sampah berfungsi dan sama ada ia boleh diubah suai untuk mengoptimumkan untuk kes penggunaan tertentu.
Banyak operasi dalam sistem dagangan algoritma boleh disatukan. Ini merujuk kepada konsep menjalankan beberapa operasi programatik pada masa yang sama, iaitu dalam
Algoritma lain hanya sebahagiannya dapat disamakan. Simulasi dinamik cecair adalah contoh seperti itu, di mana domain pengiraan boleh dibahagikan, tetapi akhirnya domain ini mesti berkomunikasi antara satu sama lain dan dengan itu operasi sebahagiannya berurutan. Algoritma yang dapat disamakan tertakluk kepada Hukum Amdahl, yang menyediakan had atas teori peningkatan prestasi algoritma yang disamakan apabila tertakluk kepada proses NN yang berasingan (misalnya pada teras atau benang CPU).
Paralelisasi telah menjadi semakin penting sebagai cara pengoptimuman sejak kelajuan jam pemproses telah terhenti, kerana pemproses yang lebih baru mengandungi banyak teras untuk melakukan pengiraan selari.
Perkakasan GPU seperti ini biasanya hanya sesuai untuk aspek penyelidikan kewangan kuantitatif, sedangkan perkakasan lain yang lebih khusus (termasuk Array Gate Field-Programmable - FPGA) digunakan untuk (U) HFT. Pada masa kini, kebanyakan bahasa moden menyokong tahap serentak / multithreading. Oleh itu, mudah untuk mengoptimumkan backtester, kerana semua pengiraan umumnya bebas dari yang lain.
Peningkatan skala dalam kejuruteraan perisian dan operasi merujuk kepada keupayaan sistem untuk mengendalikan beban yang semakin meningkat secara konsisten dalam bentuk permintaan yang lebih besar, penggunaan pemproses yang lebih tinggi dan peruntukan memori yang lebih banyak. Dalam perdagangan algoritma, strategi dapat meningkat jika dapat menerima jumlah modal yang lebih besar dan masih menghasilkan pulangan yang konsisten.
Walaupun sistem mesti direka untuk berskala, seringkali sukar untuk meramalkan terlebih dahulu di mana kelewatan akan berlaku. Logging, pengujian, profil dan pemantauan yang ketat akan sangat membantu dalam membolehkan sistem berskala. Bahasa sendiri sering digambarkan sebagai
Salah satu cara untuk menguruskan skala adalah untuk memisahkan kebimbangan, seperti yang dinyatakan di atas. Untuk memperkenalkan lagi keupayaan untuk mengendalikan
Daripada permintaan hilang, mereka hanya disimpan dalam timbunan sehingga mesej ditangani. Ini sangat berguna untuk menghantar dagangan ke enjin pelaksanaan. Jika enjin mengalami latensi yang tinggi maka ia akan membuat sandaran dagangan. Antrian antara penjana isyarat perdagangan dan API pelaksanaan akan meringankan masalah ini dengan mengorbankan kemungkinan seluncur perdagangan. Broker antrian mesej sumber terbuka yang dihormati adalah RabbitMQ.
Perkakasan dan Sistem Operasi
Perkakasan yang menjalankan strategi anda boleh memberi kesan yang signifikan terhadap keuntungan algoritma anda. Ini bukan masalah yang terhad kepada pedagang frekuensi tinggi juga. Pilihan yang tidak baik dalam perkakasan dan sistem operasi boleh menyebabkan kerosakan mesin atau memulakan semula pada saat yang paling tidak sesuai. Oleh itu, perlu mempertimbangkan di mana aplikasi anda akan tinggal. Pilihan biasanya antara mesin desktop peribadi, pelayan jauh, penyedia
Mesin desktop mudah dipasang dan diuruskan, terutamanya dengan sistem operasi mesra pengguna yang lebih baru seperti Windows 7/8, Mac OSX dan Ubuntu. Sistem desktop mempunyai beberapa kelemahan penting, bagaimanapun. Yang paling penting adalah bahawa versi sistem operasi yang direka untuk mesin desktop mungkin memerlukan reboot / patching (dan sering pada masa yang paling buruk!).
Menggunakan perkakasan di persekitaran rumah (atau pejabat tempatan) boleh membawa kepada masalah sambungan internet dan masa operasi kuasa. Manfaat utama sistem desktop adalah bahawa kuasa kuda pengkomputeran yang signifikan boleh dibeli untuk sebahagian kecil daripada kos pelayan khusus jauh (atau sistem berasaskan awan) dengan kelajuan yang setanding.
Pelayan berdedikasi atau mesin berasaskan awan, walaupun sering lebih mahal daripada pilihan desktop, membolehkan infrastruktur redundansi yang lebih besar, seperti sandaran data automatik, keupayaan untuk memastikan uptime dan pemantauan jauh dengan lebih mudah.
Dalam Windows ini biasanya melalui GUI Remote Desktop Protocol (RDP). Dalam sistem berasaskan Unix baris perintah Secure SHell (SSH) digunakan.
Pelayan bersama, seperti ungkapan yang digunakan di pasaran modal, hanyalah pelayan khusus yang berada di dalam pertukaran untuk mengurangkan latensi algoritma perdagangan.
Aspek terakhir untuk pilihan perkakasan dan pilihan bahasa pengaturcaraan adalah platform-kemerdekaan. Adakah terdapat keperluan untuk kod untuk dijalankan di pelbagai sistem operasi yang berbeza? Adakah kod direka untuk dijalankan pada jenis seni bina pemproses tertentu, seperti Intel x86/x64 atau adakah mungkin untuk dijalankan pada pemproses RISC seperti yang dihasilkan oleh ARM? Isu-isu ini akan sangat bergantung kepada kekerapan dan jenis strategi yang dilaksanakan.
Ketahanan dan Ujian
Salah satu cara terbaik untuk kehilangan banyak wang dalam perdagangan algoritma adalah dengan membuat sistem tanpa ketahanan. Ini merujuk kepada ketahanan sistem apabila tertakluk kepada peristiwa yang jarang berlaku, seperti muflis broker, volatiliti berlebihan tiba-tiba, waktu henti di seluruh rantau untuk pembekal pelayan awan atau penghapusan secara tidak sengaja keseluruhan pangkalan data perdagangan. Tahun keuntungan boleh dihapuskan dalam beberapa saat dengan seni bina yang direka dengan buruk. Adalah sangat penting untuk mempertimbangkan isu-isu seperti debugging, pengujian, logging, sandaran, ketersediaan tinggi dan pemantauan sebagai komponen teras sistem anda.
Ia mungkin bahawa dalam mana-mana aplikasi perdagangan kuantitatif tersuai yang agak rumit sekurang-kurangnya 50% masa pembangunan akan dibelanjakan untuk debug, ujian dan penyelenggaraan.
Hampir semua bahasa pengaturcaraan sama ada dihantar dengan debugger yang berkaitan atau mempunyai alternatif pihak ketiga yang dihormati. Pada dasarnya, debugger membolehkan pelaksanaan program dengan memasukkan titik putus sewenang-wenang dalam laluan kod, yang sementara menghentikan pelaksanaan untuk menyiasat keadaan sistem. Manfaat utama debugging adalah bahawa mungkin untuk menyiasat tingkah laku kod sebelum titik kerosakan yang diketahui.
Debugging adalah komponen penting dalam kotak alat untuk menganalisis kesilapan pengaturcaraan. Walau bagaimanapun, ia lebih banyak digunakan dalam bahasa yang dikompilasi seperti C ++ atau Java, kerana bahasa yang ditafsirkan seperti Python sering lebih mudah untuk debug kerana LOC yang lebih sedikit dan pernyataan yang kurang bersuara. Walaupun kecenderungan ini, Python menghantar dengan pdb, yang merupakan alat debugging yang canggih.
Pengujian dalam pembangunan perisian merujuk kepada proses menggunakan parameter dan hasil yang diketahui kepada fungsi, kaedah dan objek tertentu dalam pangkalan kod, untuk mensimulasikan tingkah laku dan menilai pelbagai laluan kod, membantu memastikan bahawa sistem berkelakuan seperti yang sepatutnya. Paradigma yang lebih baru dikenali sebagai Pembangunan Bergerak Ujian (TDD), di mana kod ujian dibangunkan terhadap antara muka yang ditentukan tanpa pelaksanaan. Sebelum penyelesaian pangkalan kod sebenar semua ujian akan gagal.
TDD memerlukan reka bentuk spesifikasi awal yang luas serta tahap disiplin yang sihat untuk dilaksanakan dengan berjaya. Dalam C ++, Boost menyediakan kerangka pengujian unit. Di Java, perpustakaan JUnit wujud untuk memenuhi tujuan yang sama. Python juga mempunyai modul unittest sebagai sebahagian daripada perpustakaan standard. Banyak bahasa lain memiliki kerangka pengujian unit dan sering terdapat pelbagai pilihan.
Dalam persekitaran pengeluaran, logging yang canggih adalah sangat penting. Logging merujuk kepada proses output mesej, dengan pelbagai tahap keparahan, mengenai tingkah laku pelaksanaan sistem ke fail rata atau pangkalan data. Log adalah
Kedua-dua Microsoft Windows dan Linux datang dengan keupayaan log sistem yang luas dan bahasa pengaturcaraan cenderung untuk dihantar dengan perpustakaan log standard yang merangkumi kebanyakan kes penggunaan.
Walaupun logging sistem akan memberikan maklumat tentang apa yang telah berlaku pada masa lalu, pemantauan aplikasi akan memberikan gambaran tentang apa yang sedang berlaku sekarang. Semua aspek sistem harus dipertimbangkan untuk pemantauan. Metrik peringkat sistem seperti penggunaan cakera, memori yang tersedia, lebar jalur rangkaian dan penggunaan CPU memberikan maklumat beban asas.
Metrik perdagangan seperti harga / jumlah yang tidak normal, penarikan tiba-tiba yang cepat dan pendedahan akaun untuk sektor / pasaran yang berbeza juga harus dipantau secara berterusan.
Pemantauan sistem sering merupakan domain pentadbir sistem atau pengurus operasi. Walau bagaimanapun, sebagai pemaju perdagangan tunggal, metrik ini mesti ditubuhkan sebagai sebahagian daripada reka bentuk yang lebih besar.
Bekap dan ketersediaan yang tinggi harus menjadi perhatian utama sistem perdagangan. Pertimbangkan dua soalan berikut: 1) Jika keseluruhan pangkalan data pengeluaran data pasaran dan sejarah perdagangan dipadamkan (tanpa sandaran) bagaimana algoritma penyelidikan dan pelaksanaan akan terjejas? 2) Jika sistem perdagangan mengalami gangguan untuk tempoh yang panjang (dengan kedudukan terbuka) bagaimana ekuiti akaun dan keuntungan berterusan akan terjejas? Jawapan kepada kedua-dua soalan ini sering membimbangkan!
Adalah penting untuk meletakkan sistem untuk membuat sandaran data dan juga untuk menguji pemulihan data tersebut. Ramai individu tidak menguji strategi pemulihan. Jika pemulihan daripada kemalangan tidak diuji dalam persekitaran yang selamat, apakah jaminan yang ada bahawa pemulihan akan tersedia pada saat yang paling buruk?
Begitu juga, ketersediaan yang tinggi perlu
Memilih Bahasa
Perincian yang cukup sekarang telah diberikan mengenai pelbagai faktor yang timbul ketika membangunkan sistem perdagangan algoritma berprestasi tinggi.
Sistem Jenis
Apabila memilih bahasa untuk timbunan dagangan, perlu mempertimbangkan sistem jenis. Bahasa yang menarik bagi perdagangan algoritma sama ada secara statik atau dinamik. Bahasa yang ditypkan secara statik melakukan pemeriksaan jenis (contohnya bilangan bulat, terapung, kelas tersuai dan lain-lain) semasa proses penyusunan. Bahasa-bahasa tersebut termasuk C ++ dan Java. Bahasa yang ditypkan secara dinamik melakukan sebahagian besar pemeriksaan jenisnya pada masa berjalan. Bahasa-bahasa tersebut termasuk Python, Perl dan JavaScript.
Untuk sistem yang sangat berangka seperti enjin dagangan algoritma, pemeriksaan jenis pada masa penyusunan boleh sangat bermanfaat, kerana ia dapat menghilangkan banyak bug yang sebaliknya akan membawa kepada ralat berangka. Walau bagaimanapun, pemeriksaan jenis tidak menangkap segala-galanya, dan di sinilah penanganan pengecualian datang kerana keperluan untuk menangani operasi yang tidak dijangka.
Satu lagi faedah bahasa bertipe statik ialah pengkompiler dapat membuat banyak pengoptimuman yang tidak tersedia untuk bahasa bertipe dinamik, hanya kerana jenis (dan dengan itu keperluan memori) diketahui pada masa kompilasi.
Sumber Terbuka atau Pemilik?
Salah satu pilihan terbesar yang tersedia untuk pemaju perdagangan algoritma adalah sama ada untuk menggunakan teknologi hak milik (komersial) atau sumber terbuka. Terdapat kelebihan dan kekurangan untuk kedua-dua pendekatan. Adalah perlu untuk mempertimbangkan seberapa baik bahasa disokong, aktiviti komuniti yang mengelilingi bahasa, kemudahan pemasangan dan penyelenggaraan, kualiti dokumentasi dan sebarang kos pelesenan / penyelenggaraan.
Tumpukan Microsoft.NET (termasuk Visual C ++, Visual C #) dan MathWorks
Microsoft dan MathWorks sama-sama menyediakan dokumentasi berkualiti tinggi yang luas untuk produk mereka. Selanjutnya, komuniti di sekitar setiap alat sangat besar dengan forum web aktif untuk kedua-duanya. Perisian.NET membolehkan integrasi yang kohesif dengan pelbagai bahasa seperti C ++, C # dan VB, serta penghubung mudah ke produk Microsoft lain seperti pangkalan data SQL Server melalui LINQ. MatLab juga mempunyai banyak pemalam / perpustakaan (beberapa percuma, beberapa komersial) untuk hampir mana-mana domain penyelidikan kuantitatif.
Terdapat juga kelemahan. Dengan kedua-dua perisian, kosnya tidak tidak penting untuk peniaga tunggal (walaupun Microsoft menyediakan versi Visual Studio peringkat kemasukan secara percuma). Alat Microsoft bermain dengan baik antara satu sama lain, tetapi mengintegrasikan kurang dengan kod luaran. Visual Studio juga mesti dijalankan pada Microsoft Windows, yang boleh dikatakan jauh kurang berprestasi daripada pelayan Linux yang setara yang disesuaikan dengan optimum.
MatLab juga tidak mempunyai beberapa pemalam utama seperti pembungkus yang baik di sekitar API Broker Interaktif, salah satu daripada beberapa broker yang dapat melakukan perdagangan algoritma berprestasi tinggi. Masalah utama dengan produk proprietari adalah kekurangan ketersediaan kod sumber. Ini bermaksud bahawa jika prestasi ultra benar-benar diperlukan, kedua-dua alat ini akan jauh kurang menarik.
Alat sumber terbuka telah menjadi kelas industri untuk beberapa waktu. Kebanyakan ruang aset alternatif menggunakan Linux sumber terbuka, MySQL / PostgreSQL, Python, R, C ++ dan Java dalam peranan pengeluaran berprestasi tinggi. Walau bagaimanapun, mereka jauh dari terhad kepada domain ini. Python dan R, khususnya, mengandungi banyak perpustakaan berangka yang luas untuk melakukan hampir semua jenis analisis data yang dapat dibayangkan, sering pada kelajuan pelaksanaan yang setanding dengan bahasa yang disusun, dengan peringatan tertentu.
Manfaat utama menggunakan bahasa yang ditafsirkan adalah kelajuan masa pembangunan. Python dan R memerlukan lebih sedikit baris kod (LOC) untuk mencapai fungsi yang sama, terutamanya kerana perpustakaan yang luas.
Memandangkan masa sebagai pemaju sangat berharga, dan kelajuan pelaksanaan sering kurang (kecuali dalam ruang HFT), ia bernilai memberi pertimbangan yang luas kepada timbunan teknologi sumber terbuka. Python dan R mempunyai komuniti pembangunan yang signifikan dan sangat disokong dengan baik, kerana popularitinya. Dokumen sangat baik dan bug (sekurang-kurangnya untuk perpustakaan teras) masih jarang berlaku.
Peranti sumber terbuka sering mengalami kekurangan kontrak sokongan komersial khusus dan berjalan dengan optimum pada sistem dengan antara muka pengguna yang kurang memaafkan. Pelayan Linux biasa (seperti Ubuntu) sering kali sepenuhnya berorientasikan baris arahan. Di samping itu, Python dan R boleh perlahan untuk tugas pelaksanaan tertentu.
Walaupun perisian hak cipta tidak kebal terhadap masalah pergantungan / versi, ia jauh kurang biasa untuk berurusan dengan versi perpustakaan yang tidak betul dalam persekitaran tersebut.
Saya akan berani pendapat peribadi saya di sini dan menyatakan bahawa saya membina semua alat dagangan saya dengan teknologi sumber terbuka. Khususnya saya menggunakan: Ubuntu, MySQL, Python, C ++ dan R. Kematangan, saiz komuniti, keupayaan untuk
Bateri Termasuk?
Header bahagian ini merujuk kepada
C ++ terkenal dengan Perpustakaan Templat Standard (STL) yang mengandungi banyak struktur data dan algoritma prestasi tinggi
Di luar perpustakaan standard, C ++ menggunakan perpustakaan Boost, yang mengisi
Python mempunyai kombinasi perpustakaan analisis data berprestasi tinggi NumPy / SciPy / Panda, yang telah mendapat penerimaan luas untuk penyelidikan perdagangan algoritma. Selanjutnya, plugin berprestasi tinggi wujud untuk mengakses pangkalan data hubungan utama, seperti MySQL ++ (MySQL / C ++), JDBC (Java / MatLab), MySQLdb (MySQL / Python) dan psychopg2 (PostgreSQL / Python). Python bahkan boleh berkomunikasi dengan R melalui pemalam RPy!
Satu aspek sistem perdagangan yang sering diabaikan semasa dalam peringkat penyelidikan dan reka bentuk awal adalah sambungan ke API broker. Kebanyakan API secara asli menyokong C ++ dan Java, tetapi ada juga yang menyokong C # dan Python, sama ada secara langsung atau dengan kod pembungkus yang disediakan oleh komuniti ke API C ++. Khususnya, Broker Interaktif boleh disambungkan melalui pemalam IBPy. Jika prestasi tinggi diperlukan, broker akan menyokong protokol FIX.
Kesimpulan
Seperti yang jelas sekarang, pilihan bahasa pengaturcaraan untuk sistem perdagangan algoritma tidak mudah dan memerlukan pemikiran yang mendalam. pertimbangan utama adalah prestasi, kemudahan pembangunan, ketahanan dan pengujian, pemisahan kebimbangan, keakraban, penyelenggaraan, ketersediaan kod sumber, kos pelesenan dan kematangan perpustakaan.
Manfaat seni bina yang berasingan adalah bahawa ia membolehkan bahasa untuk dihubungkan untuk aspek yang berbeza dari timbunan perdagangan, apabila dan apabila keperluan berubah.