Bahasa Pengaturcaraan Terbaik untuk Sistem Perdagangan Algoritma?

Penulis:Kebaikan, Dicipta: 2019-02-12 10:33:36, Dikemas kini:

Salah satu soalan yang paling kerap saya terima dalam beg mel adalah Apakah bahasa pengaturcaraan terbaik untuk perdagangan algoritma?. Jawapan ringkasnya adalah bahawa tidak ada bahasa best. Parameter strategi, prestasi, modulariti, pembangunan, ketahanan dan kos semua mesti dipertimbangkan. Artikel ini akan menggariskan komponen yang diperlukan untuk seni bina sistem perdagangan algoritma dan bagaimana keputusan mengenai pelaksanaan mempengaruhi pilihan bahasa.

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 best untuk menulis sistem dagangan automatik, perlu menentukan keperluan. Adakah sistem akan berasaskan pelaksanaan semata-mata? Adakah sistem memerlukan modul pengurusan risiko atau pembinaan portfolio? Adakah sistem memerlukan backtester prestasi tinggi? Untuk kebanyakan strategi, sistem dagangan boleh dibahagikan kepada dua kategori: Penyelidikan dan penjanaan isyarat.

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 Intellisense) dan gambaran ringkas keseluruhan timbunan projek (melalui pangkalan data ORM, LINQ); MatLab, yang direka untuk aljabar linear numerik yang luas dan operasi vektor, tetapi dengan cara konsol interaktif; R Studio, yang membungkus konsol bahasa Rstatistical dalam IDE penuh; Eclipse IDE untuk Java Linux dan C ++; dan IDE semi-proprietari seperti Enthought Canopy untuk Python, yang merangkumi perpustakaan analisis data seperti NumPy, SciPy, scikit-learn dan panda dalam satu persekitaran interaktif (konsol) tunggal.

Untuk pengujian belakang berangka, semua bahasa di atas sesuai, walaupun tidak perlu menggunakan GUI / IDE kerana kod akan dijalankan di latar belakang. Pertimbangan utama pada peringkat ini adalah kelajuan pelaksanaan. Bahasa disusun (seperti C ++) sering berguna jika dimensi parameter pengujian belakang besar. Ingat bahawa perlu berhati-hati dengan sistem sedemikian jika itu berlaku!

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 beresiko, tetapi juga meminimumkan perubahan perdagangan itu sendiri, mengurangkan kos transaksi.

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 black swan dan bug yang tidak dikesan dalam kod perdagangan, untuk menamakan beberapa.

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.

Kualiti API merujuk kepada seberapa baik dokumentasinya, jenis prestasi yang disediakan, sama ada ia memerlukan perisian bebas untuk diakses atau sama ada gerbang boleh ditubuhkan dengan cara tanpa kepala (iaitu tidak ada GUI). Dalam kes Broker Interaktif, alat Trader WorkStation perlu berjalan dalam persekitaran GUI untuk mengakses API mereka. Saya pernah perlu memasang edisi Ubuntu Desktop ke pelayan awan Amazon untuk mengakses Broker Interaktif dari jauh, semata-mata kerana alasan ini!

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 memakai banyak topi. Adalah perlu untuk merangkumi model alpha, pengurusan risiko dan parameter pelaksanaan, dan juga pelaksanaan akhir sistem. Sebelum menggali bahasa tertentu, reka bentuk seni bina sistem yang optimum akan dibincangkan.

Memisahkan Kebimbangan

Salah satu keputusan yang paling penting yang perlu dibuat pada mulanya adalah bagaimana untuk memisahkan kebimbangan sistem perdagangan. Dalam pembangunan perisian, ini pada dasarnya bermaksud bagaimana untuk memecah aspek yang berbeza sistem perdagangan ke dalam komponen modular yang berasingan.

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 amalan terbaik untuk sistem sedemikian. Untuk strategi pada frekuensi yang lebih rendah, amalan sedemikian dinasihatkan. Untuk perdagangan frekuensi yang sangat tinggi, buku peraturan mungkin perlu diabaikan dengan mengorbankan sistem untuk meningkatkan prestasi. Sistem yang lebih rapat mungkin diinginkan.

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 number crunching, sementara pengurus portfolio dan sistem pelaksanaan ditulis dalam Python menggunakan SciPy dan IBPy.

Pertimbangan Prestasi

Prestasi adalah pertimbangan penting untuk kebanyakan strategi perdagangan. Untuk strategi frekuensi yang lebih tinggi, ia adalah faktor yang paling penting. Prestasi merangkumi pelbagai isu, seperti kelajuan pelaksanaan algoritma, latensi rangkaian, lebar jalur, I / O data, serentak / paralel dan penskalaan. Setiap bidang ini dilindungi secara individu oleh buku teks yang besar, jadi artikel ini hanya akan menggaruk permukaan setiap topik. Arkitektur dan pilihan bahasa sekarang akan dibincangkan dari segi kesannya terhadap prestasi.

Kebijaksanaan yang berlaku seperti yang dinyatakan oleh Donald Knuth, salah seorang bapa Sains Komputer, adalah bahawa optimasi awal adalah akar semua kejahatan. Ini hampir selalu berlaku - kecuali ketika membina algoritma perdagangan frekuensi tinggi! Bagi mereka yang berminat dengan strategi frekuensi rendah, pendekatan biasa adalah untuk membina sistem dengan cara yang paling mudah dan hanya mengoptimumkan apabila kemacetan mula muncul.

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 penemuan semula roda membuang masa yang lebih baik dibelanjakan untuk membangun dan mengoptimumkan bahagian lain infrastruktur perdagangan. Masa pembangunan sangat berharga terutamanya dalam konteks pemaju tunggal.

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 paralel. Algoritma yang dipanggil susah paralel termasuk langkah yang boleh dikira sepenuhnya bebas dari langkah lain. Operasi statistik tertentu, seperti simulasi Monte Carlo, adalah contoh yang baik dari algoritma paralel yang memalukan kerana setiap cabutan rawak dan operasi laluan berikutnya boleh dikira tanpa pengetahuan tentang laluan lain.

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 unscalable. Ini biasanya merupakan hasil dari maklumat yang salah, bukan fakta keras. Ia adalah timbunan teknologi keseluruhan yang harus diperiksa untuk skalabiliti, bukan bahasa. Jelas bahawa bahasa tertentu mempunyai prestasi yang lebih besar daripada yang lain dalam kes penggunaan tertentu, tetapi satu bahasa tidak pernah lebih baik daripada yang lain dalam setiap pengertian.

Salah satu cara untuk menguruskan skala adalah untuk memisahkan kebimbangan, seperti yang dinyatakan di atas. Untuk memperkenalkan lagi keupayaan untuk mengendalikan spikes dalam sistem (iaitu turun naik mendadak yang mencetuskan banyak perdagangan), adalah berguna untuk membuat arsitektur antrian mesej. Ini hanya bermaksud meletakkan sistem antrian mesej antara komponen supaya pesanan ditumpuk jika komponen tertentu tidak dapat memproses banyak permintaan.

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 cloud atau pelayan pertukaran yang terletak bersama.

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 garis pertama serangan ketika memburu tingkah laku masa pelaksanaan program yang tidak dijangka. Malangnya kekurangan sistem logging cenderung hanya ditemui selepas fakta! Seperti dengan sandaran yang dibincangkan di bawah, sistem logging harus diberikan pertimbangan yang sewajarnya SEBELUM sistem direka.

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 baked dalam dari awal. infrastruktur yang berlebihan (walaupun dengan perbelanjaan tambahan) mesti sentiasa dipertimbangkan, kerana kos waktu henti mungkin jauh melebihi kos penyelenggaraan berterusan sistem tersebut.

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. Dinamik bahasa (iaitu yang dinamik-ditaktipkan) sering boleh membawa kepada kesilapan masa berjalan yang sebaliknya akan ditangkap dengan pemeriksaan jenis masa penyusunan.

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 MatLab adalah dua daripada pilihan hak cipta yang lebih besar untuk membangunkan perisian dagangan algoritma tersuai. Kedua-dua alat telah mempunyai ujian pertempuran yang signifikan di ruang kewangan, dengan yang pertama membentuk tumpukan perisian yang dominan untuk infrastruktur perdagangan perbankan pelaburan dan yang terakhir digunakan secara meluas untuk penyelidikan perdagangan kuantitatif dalam dana pelaburan.

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 menggali mendalam jika masalah berlaku dan menurunkan jumlah kos pemilikan (TCO) jauh melebihi kesederhanaan GUI proprietari dan pemasangan yang lebih mudah.

Bateri Termasuk?

Header bahagian ini merujuk kepada out of the box keupayaan bahasa - perpustakaan apa yang terkandung dan seberapa baik mereka? Ini adalah di mana bahasa matang mempunyai kelebihan berbanding varian yang lebih baru. C ++, Java dan Python semua kini memiliki perpustakaan yang luas untuk pengaturcaraan rangkaian, HTTP, interaksi sistem operasi, GUI, ungkapan tetap (regex), pengulangan dan algoritma asas.

C ++ terkenal dengan Perpustakaan Templat Standard (STL) yang mengandungi banyak struktur data dan algoritma prestasi tinggi secara percuma . Python terkenal kerana dapat berkomunikasi dengan hampir semua jenis sistem / protokol lain (terutamanya web), kebanyakannya melalui perpustakaan standardnya sendiri. R mempunyai banyak alat statistik dan ekonometrik yang terbina dalam, sementara MatLab sangat dioptimumkan untuk mana-mana kod aljabar linear numerik (yang boleh didapati dalam pengoptimuman portfolio dan harga derivatif, sebagai contoh).

Di luar perpustakaan standard, C ++ menggunakan perpustakaan Boost, yang mengisi bahagian yang hilang dari perpustakaan standard.

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.


Lebih lanjut