Tuesday 8 August 2017

Adaptive moving average kalman filter


Tanya Jawab di JMA Apa Teori Dibalik JMA. Mengapa JMA memiliki parameter PHASE. Apakah JMA memperkirakan deret waktu. Akankah nilai JMA sebelumnya, sudah diplot, berubah saat data baru masuk. Dapatkah saya memperbaiki indikator lain menggunakan JMA Apakah JMA memiliki jaminan khusus Bagaimana JMA dibandingkan dengan filter lainnya. TOPIK UMUM PADA ALAT JURIK Bisakah alat memplot banyak lekukan pada masing-masing bagan. Bisakah alat memproses semua jenis data. Bisakah alat bekerja secara real-time. Apakah algoritma diungkapkan atau hitam-kotak. Apakah alat Jurik perlu melihat masa depan deret waktu. Apakah alat menghasilkan nilai yang serupa di semua platform (TradeStation, Multicharts.). Apakah alat Juriks hadir dengan jaminan. Berapa banyak password instalasi yang saya dapatkan. Apa Teori Dibalik JMA. BAGIAN 1. HARGA GAPS Data time series Smoothing, seperti harga saham harian, untuk menghilangkan noise yang tidak diinginkan pasti akan menghasilkan grafik (indikator) yang bergerak lebih lambat dari pada deret waktu aslinya. Quotslownessquot ini akan menyebabkan plot tersebut tertinggal jauh dari seri aslinya. Misalnya, rata-rata bergerak sederhana 31 hari akan tertinggal dalam rangkaian waktu harga 15 hari. Lag sangat tidak diinginkan karena sistem perdagangan yang menggunakan informasi tersebut akan mengalami penundaan perdagangan. Akhir perdagangan bisa berkali-kali menjadi lebih buruk daripada tidak ada perdagangan sama sekali, karena Anda mungkin membeli atau menjual di sisi yang salah dari siklus pasar. Akibatnya, banyak usaha dilakukan untuk meminimalkan lag, masing-masing dengan kegagalan mereka sendiri. Penaklukan lag sementara tidak membuat asumsi yang menyederhanakan (misal, data terdiri dari siklus yang dilapiskan, perubahan harga harian yang memiliki distribusi Gaussian, semua harga sama pentingnya, dsb.) Bukanlah tugas sepele. Pada akhirnya, JMA harus menggunakan teknologi yang sama dengan yang digunakan militer untuk melacak benda-benda yang bergerak di udara dengan menggunakan radar yang bising. JMA melihat deret waktu harga sebagai gambar berisik dari target bergerak (underlying price yang halus) dan mencoba untuk memperkirakan lokasi target sebenarnya (smooth price). Matematika berpemilik dimodifikasi untuk mempertimbangkan sifat khusus dari deret waktu keuangan. Hasilnya adalah kurva halus halus yang tidak membuat asumsi tentang data yang memiliki komponen siklik apapun. Akibatnya JMA bisa mengubah kuota dimequot jika pasar (moving target) memutuskan untuk mengubah arah atau gap updown dengan jumlah apapun. Tidak ada gap harga yang terlalu besar. BAGIAN 2. SEGALA SESUATU Setelah beberapa tahun melakukan penelitian, kami Riset Jurik menetapkan bahwa filter pengurangan kebisingan yang sempurna untuk data keuangan memiliki persyaratan sebagai berikut: Keterlambatan minimum antara sinyal dan harga, jika pemicu perdagangan terlambat datang. Minimal overshoot, jika tidak, sinyal menghasilkan tingkat harga palsu. Minimum undershoot, jika tidak, waktu hilang menunggu konvergensi setelah selisih harga. Kelancaran maksimal, kecuali pada saat harga gap ke level yang baru. Bila diukur sampai keempat persyaratan ini, semua filter populer (kecuali JMA) berkinerja buruk. Berikut adalah ringkasan filter yang lebih populer. Weighted Moving Average - tidak responsif terhadap gap Exponential Moving Average - undian berisik yang berlebihan Adaptive Moving Averages - (bukan milik kita) biasanya didasarkan pada asumsi yang terlalu menyederhanakan aktivitas pasar dengan mudah tertipu Garis Regresi - tidak responsif terhadap kesenjangan yang berlebihan overshoot Filter FFT - Mudah terdistorsi oleh non-Gaussian kebisingan di jendela data biasanya terlalu kecil untuk secara akurat menentukan siklus yang benar. Filter FIR - memiliki lag yang dikenal sebagai quotgroup delayquot. Tidak ada jalan lain kecuali Anda ingin memotong beberapa sudut. Lihat filter quotBand-Passquot. Filter Band-Pass - tidak ada lag hanya di tengah band frekuensi yang cenderung terombang-ambing dan melampaui harga sebenarnya. Filter Entropy maksimum - mudah terdistorsi oleh noise non-Gaussian di jendela data biasanya terlalu kecil untuk secara akurat menentukan siklus sebenarnya. Filter Polinomial - tidak responsif terhadap kesenjangan overshoot berlebihan Sebaliknya, JMA mengintegrasikan teori informasi dan penyaringan non-linear adaptif dengan cara yang unik. Dengan menggabungkan penilaian konten informasi dalam rangkaian waktu dengan kekuatan transformasi nonlinier adaptif, hasilnya mendorong kuotasi teoritis kuotomatis pada penyaringan waktu keuangan yang menyaring hampir sejauh mungkin. Lagi dan lagi, hadapi Prinsip Ketidakpastian Heisenburg (sesuatu yang tidak pernah diatasi, atau pernah). Sejauh yang kita tahu, JMA adalah yang terbaik. Kami mengundang seseorang untuk menunjukkan sebaliknya. Untuk analisis komparatif lebih banyak tentang kegagalan filter populer, unduh laporan kami. Evolusi Moving Averagesquot dari departemen Laporan Khusus kami. Lihat perbandingan kami terhadap filter populer lainnya. Mengapa JMA memiliki parameter PHASE. Ada dua cara untuk menurunkan noise dalam deret waktu menggunakan JMA. Menambah parameter LENGTH akan membuat JMA bergerak lebih lambat dan dengan demikian mengurangi kebisingan dengan mengorbankan lag tambahan. Sebagai alternatif, Anda dapat mengubah jumlah quotinertiaquot yang terdapat dalam JMA. Inersia seperti massa fisik, semakin banyak yang Anda miliki, semakin sulit untuk mengubah arah. Jadi filter dengan banyak inersia akan memerlukan lebih banyak waktu untuk membalikkan arah dan dengan demikian mengurangi kebisingan dengan mengorbankan overshooting selama pembalikan dalam deret waktu. Semua filter noise kuat memiliki lag dan overshoot, dan JMA tidak terkecuali. Namun, parameter disesuaikan JMAs PHASE and LENGTH menawarkan cara untuk memilih tradeoff optimal antara lag dan overshoot. Ini memberi Anda kesempatan untuk menyempurnakan berbagai indikator teknis. Misalnya, bagan (di sebelah kanan) menunjukkan garis JMA cepat yang melintasi garis JMA yang lebih lambat. Untuk membuat garis JMA yang cepat mengubah kuota sebuah dimequot setiap kali pasar berbalik, hal itu tidak memiliki inersia. Sebaliknya, JMA yang lambat diatur untuk memiliki inersia besar, sehingga memperlambat kemampuannya untuk berbalik selama pembalikan pasar. Pengaturan ini menyebabkan garis yang lebih cepat melintasi garis yang lebih lambat secepat mungkin, sehingga menghasilkan sinyal crossover lag rendah. Jelas, kontrol pengguna terhadap inersia filter memberikan kekuatan yang cukup besar pada filter yang kekurangan kemampuan ini. Apakah JMA memperkirakan deret waktu. Itu tidak meramalkan ke masa depan. JMA mengurangi kebisingan dengan cara yang sama seperti rata-rata bergerak eksponensial, namun berkali-kali lebih baik. Akankah nilai JMA sebelumnya, sudah diplot, berubah saat data baru masuk. Tidak. Untuk setiap titik pada plot JMA, hanya data historis dan data terkini yang digunakan dalam formula. Akibatnya, karena data harga baru tiba di slot waktu berikutnya, nilai JMA yang sudah diplot tidak terpengaruh dan TIDAK PERNAH berubah. Pertimbangkan juga kasus saat bar terakhir di bagan diperbarui secara real time karena setiap tanda centang baru tiba. Karena harga penutupan bar terakhir cenderung berubah, JMA secara otomatis dievaluasi ulang untuk mencerminkan harga penutupan yang baru. Namun, nilai historis JMA (pada semua bar sebelumnya) tetap tidak terpengaruh dan tidak berubah. Seseorang dapat menciptakan indikator yang mengesankan mengenai data historis saat menganalisis nilai masa lalu dan masa depan yang mengelilingi setiap titik data yang sedang diproses. Namun, formula apa pun yang perlu melihat nilai masa depan dalam rangkaian waktu tidak bisa diterapkan dalam perdagangan dunia nyata. Hal ini karena ketika menghitung nilai todays indikator, nilai masa depan tidak ada. Semua indikator Jurik hanya menggunakan data deret saat ini dan sebelumnya dalam perhitungannya. Hal ini memungkinkan semua indikator Jurik bekerja dalam semua kondisi real time. Dapatkah saya memperbaiki indikator lain menggunakan JMA Ya. Kami biasanya mengganti perhitungan rata-rata yang paling banyak bergerak dalam indikator teknis klasik dengan JMA. Ini menghasilkan hasil yang lebih halus dan lebih tepat waktu. Sebagai contoh, dengan hanya memasukkan JMA ke dalam indikator teknis DMI standar, kami menghasilkan indikator DMX, yang disertakan dengan pesanan JMA Anda. Apakah JMA memiliki jaminan khusus Jika Anda menunjukkan kepada kami algoritma non-proprietary untuk rata-rata bergerak yang, bila dikodekan untuk dijalankan di TradeStation, Matlab atau Excel VBA, ia melakukan quotbetterquot daripada rata-rata pergerakan kami dalam jangka pendek, menengah dan panjang dari Berjalan acak, mengembalikan dengan baik lisensi pengguna yang dibeli untuk JMA. Yang kami maksud dengan quotbetterquot adalah rata-rata, rata-rata, lebih mulus dengan jeda rata-rata yang lebih besar daripada perkiraan kami, tidak ada overshoot rata-rata yang lebih besar dan tidak ada garis bawah rata-rata yang lebih besar daripada nilai kami. Yang kami maksud dengan quotshort, framequot medium dan length adalah bahwa perbandingan harus mencakup tiga panjang JMA yang terpisah: 7 (pendek), 35 (medium), 175 (panjang). Apa yang kita maksud dengan jalan acak adalah deret waktu yang dihasilkan oleh jumlah kumulatif 5000 nol-mean, Cauchy membagikan nomor acak. Jaminan terbatas ini bagus hanya untuk bulan pertama Anda telah membeli lisensi pengguna untuk JMA dari kami atau salah satu distributor kami di seluruh dunia. Bagaimana JMA dibandingkan dengan filter lainnya. Filter Kalman mirip dengan JMA karena keduanya merupakan algoritma ampuh yang digunakan untuk memperkirakan perilaku sistem dinamis yang bising saat semua yang harus Anda kerjakan adalah pengukuran data yang bising. Filter Kalman menciptakan ramalan yang mulus dari deret waktu, dan metode ini tidak sesuai untuk seri waktu keuangan karena pasar cenderung menghasilkan putaran goncangan dan kesenjangan harga, perilaku yang tidak khas dari sistem dinamis operasi yang lancar. Akibatnya, smoothing penyaringan Kalman sering tertinggal atau melampaui harga pasar. Sebaliknya, JMA melacak harga pasar dengan ketat dan lancar, beradaptasi dengan kesenjangan sambil menghindari overshoot yang tidak diinginkan. Lihat bagan di bawah untuk contoh. Filter yang dijelaskan di majalah populer adalah rata-rata Kaufmann. Ini adalah rata-rata bergerak eksponensial yang kecepatannya bervariasi sesuai dengan efisiensi tindakan harga. Dengan kata lain, ketika aksi harga berada dalam tren yang jelas dengan sedikit retracement, filter Kaufmann akan meningkat dan saat aksi tersebut mengalami congesting, filter akan melambat. (Lihat grafik di atas) Meskipun sifat adaptifnya membantu mengatasi beberapa lag khas rata-rata pergerakan eksponensial, namun tetap tertinggal jauh di belakang JMA. Lag adalah masalah mendasar bagi semua pedagang. Ingat, setiap bar lag dapat menunda perdagangan Anda dan menolak keuntungan Anda. Rata-rata pergerakan lain yang dijelaskan di majalah populer adalah Chandes VIDYA (Variable Index Dynamic Average). Indeks yang paling sering digunakan di dalam VIDYA untuk mengatur kecepatannya adalah volatilitas harga. Karena volatilitas jangka pendek meningkat, rata-rata pergerakan eksponensial VIDYA dirancang untuk bergerak lebih cepat, dan karena volatilitas menurun, VIDYA melambat. Di permukaan ini masuk akal. Sayangnya, desain ini memiliki cacat yang jelas. Meskipun kemacetan samping harus benar-benar merapikan terlepas dari volatilitasnya, periode kemacetan yang sangat mudah berubah akan dilacak dengan ketat (tidak merapikan) oleh VIDYA. Akibatnya, VIDYA mungkin gagal menghilangkan suara yang tidak diinginkan. Sebagai contoh, bagan membandingkan JMA dengan VIDYA, keduanya mengatur untuk melacak tren penurunan sama baiknya. Namun, selama kemacetan berikutnya, VIDYA gagal menghaluskan lonjakan harga sementara JMA berhasil meluncur melalui obrolan. Dalam perbandingan lain di mana kedua VIDYA dan Juriks JMA ditetapkan memiliki kehalusan yang sama, kita melihat dalam grafik bahwa VIDYA tertinggal. Seperti disebutkan sebelumnya, waktu yang terlambat dapat dengan mudah mencuri keuntungan Anda dalam perdagangan apapun. Dua indikator populer lainnya adalah T3 dan TEMA. Mereka halus dan memiliki sedikit lag. T3 lebih baik dari keduanya. Meskipun demikian, T3 dapat menunjukkan masalah overshoot yang serius, seperti yang terlihat pada grafik di bawah ini. Bergantung pada aplikasi Anda, Anda mungkin tidak menginginkan indikator yang menunjukkan tingkat harga yang tidak dicapai pasar sebenarnya, karena hal ini mungkin secara tidak sengaja memulai perdagangan yang tidak diinginkan. Berikut adalah dua komentar yang ditemukan diposting di forum internet yang relevan: indikator TheT3 sangat baik (dan saya telah menyanyikan puji-pujiannya sebelumnya, dalam daftar ini). Namun, saya memiliki kesempatan untuk mendapatkan beberapa pengukuran pasar alternatif dan saya memperlancarnya. Mereka sangat berperilaku buruk di kali. Saat merapikannya, T3 menjadi tidak stabil dan terlalu buruk, sedangkan JMA melayar dengan benar melalui mereka. quot - Allan Kaminsky allank xmission quotMy view sendiri JMA konsisten dengan apa yang orang lain telah tulis (Ive menghabiskan banyak waktu untuk membandingkan JMA secara visual dengan TEMA Saya tidak akan berpikir sekarang menggunakan TEMA dan bukan JMA).quot Steven Buss sbuss pacbell Sebuah artikel di edisi Januari 2000 tentang TASC menggambarkan rata-rata bergerak yang dirancang pada tahun 1950an memiliki lag yang rendah. Penemunya, Robert Brown, merancang Moving Averagequot quotModified Moving Averagequot (MMA) untuk mengurangi lag dalam memperkirakan persediaan. Dalam rumusnya, regresi linier memperkirakan momentum arus saat ini, yang pada gilirannya digunakan untuk memperkirakan jeda vertikal. Rumus tersebut kemudian mengurangi lag yang diperkirakan dari moving average untuk mendapatkan hasil lag yang rendah. Teknik ini bekerja dengan baik pada grafik harga berperilaku baik (lancar transisi), tapi sekali lagi, jadi lakukan filter lanjutan lainnya. Masalahnya adalah bahwa pasar sebenarnya tidak berperilaku baik. Ukuran kebugaran yang benar adalah seberapa baik filter bekerja pada data keuangan dunia nyata, properti yang dapat diukur dengan tes benchmark benchmark kami yang mapan. Tes ini menunjukkan bahwa MMA melampaui grafik harga, seperti yang digambarkan di bawah ini. Sebagai perbandingan, pengguna dapat mengatur parameter di JMA untuk menyesuaikan jumlah overshoot, bahkan menghilangkannya sepenuhnya. Pilihan ada padamu. Ingat, hal terakhir yang Anda inginkan adalah indikator yang menunjukkan tingkat harga yang tidak dicapai pasar sesungguhnya, karena hal ini mungkin secara tidak sengaja memulai perdagangan yang tidak diinginkan. Dengan MMA, Anda tidak punya pilihan dan harus tahan dengan overshoot apakah Anda suka atau tidak. (Lihat bagan di bawah) Isu TASC edisi Juli 2000 memuat sebuah artikel oleh John Ehlers yang mendeskripsikan sebuah Optimal Elliptical Filterquot quotModified Optimal Elliptical (disingkat di sini sebagai quotMEFquot). Ini adalah contoh analisis sinyal klasik yang luar biasa. Bagan di bawah ini membandingkan MEF dengan JMA yang parameternya (JMA length7, phase50) ditetapkan agar JMA sama dengan MEF. Perbandingannya mengungkapkan kelebihan ini saat menggunakan JMA: JMA merespons ayunan harga yang ekstrim dengan lebih cepat. Akibatnya, setiap nilai ambang yang digunakan untuk memicu sinyal akan dieksekusi lebih cepat oleh JMA. JMA hampir tidak memiliki overshoot, memungkinkan garis sinyal untuk lebih akurat melacak aksi harga tepat setelah pergerakan harga yang besar. JMA meluncur melalui pergerakan pasar kecil. Hal ini memungkinkan Anda untuk fokus pada tindakan harga riil dan bukan aktivitas pasar kecil yang tidak memiliki konsekuensi nyata. Metode favorit di antara para insinyur untuk data time series smoothing adalah menyesuaikan titik data dengan polinomial (eq, spline parabolik atau kubik). Desain yang efisien dari jenis ini adalah kelas yang dikenal sebagai filter Savitzy-Golay. Bagan di bawah ini membandingkan JMA dengan filter Savitzy-Golay cubic-spline (urutan ke-3), yang pengaturan parameternya dipilih paling atas membuatnya melakukan sedekat mungkin dengan JMA. Perhatikan bagaimana lancar JMA meluncur melalui daerah kemacetan perdagangan. Sebaliknya, filter S-G cukup bergerigi. JMA jelas sekali lagi, pemenangnya. Teknik lain yang digunakan untuk mengurangi lag pada moving average filter adalah dengan menambahkan beberapa momentum (slope) dari sinyal ke filter. Hal ini mengurangi lag, namun dengan dua penalti: lebih banyak noise dan overshoot lebih banyak pada pivot pivot points. Untuk mengimbangi kebisingan, seseorang dapat menggunakan filter FIR yang tertimbang secara simetris, yang lebih halus daripada rata-rata bergerak sederhana, yang bobotnya mungkin: 1-2-3-4-3-2-1 dan kemudian menyesuaikan bobot ini untuk menambahkan beberapa lag Mengurangi momentum Keefektifan pendekatan ini ditunjukkan pada gambar di bawah ini (garis merah). Meskipun FIR filter melacak harga secara ketat, masih tertinggal JMA dan juga menunjukkan overshoot yang lebih besar. Selain itu, filter FIR memiliki kelancaran tetap dan perlu didesain ulang untuk setiap kehalusan yang diinginkan. Sebagai perbandingan, pengguna hanya perlu mengubah satu quotsmoothnessquot parameter JMA untuk mendapatkan efek yang diinginkan. JMA tidak hanya menghasilkan plot grafik harga yang lebih baik, namun juga dapat memperbaiki indikator klasik lainnya. Misalnya, perhatikan indikator MACD klasik, yang merupakan perbandingan dua moving averages. Konvergensi mereka (bergerak mendekat) dan divergensi (bergerak terpisah) memberi sinyal bahwa tren pasar berubah arah. Sangat penting bahwa Anda memiliki sedikit penundaan semaksimal mungkin dengan sinyal ini atau perdagangan Anda akan terlambat. Sebagai perbandingan, MACD yang dibuat dengan JMA memiliki kelambatan yang jauh lebih sedikit daripada MACD yang menggunakan rata-rata bergerak eksponensial. Untuk menggambarkan klaim ini, gambar di bawah ini adalah grafik harga hipotetis yang disederhanakan untuk meningkatkan isu-isu penting. Kami melihat bar berukuran sama dalam tren naik, terputus oleh selisih turun yang tiba-tiba. Dua garis berwarna adalah moving average eksponensial yang membentuk MACD. Perhatikan bahwa crossover terjadi dalam waktu lama setelah celah, menyebabkan strategi trading menunggu dan berdagang terlambat, jika sama sekali. Jika Anda mencoba mempercepat waktu indikator ini dengan membuat rata-rata bergerak lebih cepat, garis akan menjadi ribut dan lebih bergerigi. Hal ini cenderung menciptakan pemicu palsu dan perdagangan yang buruk. Di sisi lain, bagan di bawah ini menunjukkan JMA biru yang disesuaikan dengan cepat ke tingkat harga baru, yang memungkinkan crossover sebelumnya dan penunjukan sebelumnya dari sebuah uptrend yang sedang berjalan. Sekarang Anda bisa masuk pasar lebih awal dan naik sebagian besar tren. Berbeda dengan rata-rata pergerakan eksponensial, JMA memiliki parameter tambahan (FASE) yang memungkinkan pengguna menyesuaikan tingkat overshoot. Pada grafik di atas, garis kuning JMA diijinkan melampaui overselling lebih banyak dari yang biru. Ini memberikan crossover yang ideal. Salah satu fitur yang paling sulit untuk disain menjadi filter pemulusan adalah respons adaptif terhadap kesenjangan harga tanpa melampaui tingkat harga yang baru. Hal ini terutama berlaku untuk desain filter yang menggunakan filter sebagai momentum untuk mengurangi lag. Bagan berikut membandingkan overshoot oleh JMA dan Hull moving average (HMA). Pengaturan parameter untuk kedua filter ditetapkan sehingga kinerja steady state mereka hampir sama. Masalah desain lainnya adalah apakah filter tersebut dapat mempertahankan kehalusan yang sama selama pembalikan saat tren berlangsung. Bagan di bawah ini menunjukkan bagaimana JMA bertahan mendekati kelancaran konstan sepanjang keseluruhan siklus, sementara HMA berosilasi pada saat pembalikan. Ini akan menimbulkan masalah bagi strategi yang memicu perdagangan berdasarkan apakah filter bergerak naik atau turun. Terakhir, ada kasus ketika harga naik dan kemudian mundur dalam tren menurun. Hal ini sangat sulit dilacak pada saat mundur. Untungnya, filter adaptif memiliki waktu yang jauh lebih mudah untuk menunjukkan kapan pembalikan terjadi daripada filter tetap, seperti yang ditunjukkan pada tabel di bawah ini. Tentu ada filter yang lebih baik dari JMA, kebanyakan digunakan oleh militer. Tapi jika Anda berada dalam bisnis melacak perdagangan bagus dan bukan pesawat musuh, JMA adalah filter pengurangan kebisingan terjangkau terbaik yang tersedia untuk data pasar keuangan. Kami menjaminnya. Analisis Gangguan dan Pelacakan Objek calcOpticalFlowPyrLK Menghitung aliran optik untuk rangkaian fitur yang jarang menggunakan metode Lucas-Kanade yang berulang dengan piramida. C: void calcOpticalFlowPyrLK (InputArray prevImg InputArray nextImg InputArray prevPts InputOutputArray nextPts OutputArray status OutputArray err Ukuran winSize Size (21,21), int maxLevel 3, kriteria TermCriteria TermCriteria (TermCriteria :: COUNTTermCriteria :: EPS, 30, 0.01), flag int 0, double minEigThreshold 1e-4) Python: cv2. CalcOpticalFlowPyrLK (prevImg, nextImg, prevPts, nextPts, status, err, winSize, maxLevel, kriteria, flags, minEigThreshold) rarr nextPts, status, err C: void cvCalcOpticalFlowPyrLK (const CvArr prev const CvArr curr CvArr prevpyr CvArr currpyr. Const CvPoint2D32f prevfeatures CvPoint2D32f currfeatures int count CvSize winsize tingkat int char status float trackerror Kriteria CvTermCriteria int flag Python: cv. CalcOpticalFlowPyrLK (prev, curr, prevPyr, currPyr, prevFeatures, winSize, level, criteria, flags, guessesNone) - gt (currFeatures, status, trackerror) prevImg 8211 gambar masukan 8 bit pertama atau piramida yang dibangun dengan buildOpticalFlowPyramid (). NextImg 8211 gambar masukan kedua atau piramida dengan ukuran yang sama dan jenis yang sama seperti prevImg. PrevPts 8211 vector dari titik 2D dimana arus harus ditemukan koordinat titik harus berupa bilangan floating-point presisi tunggal. Vektor keluaran NextPts 8211 dari titik 2D (dengan koordinat floating-point presisi tunggal) yang berisi posisi baru masukan fitur input pada gambar kedua saat flag OPTFLOWUSEINITIALFLOW dilewati, vektor harus memiliki ukuran yang sama seperti pada input. Status 8211 vektor status keluaran (karakter unsigned) setiap elemen vektor diatur ke 1 jika aliran untuk fitur yang sesuai telah ditemukan, jika tidak, maka akan diset ke 0. err 8211 vektor output dari kesalahan setiap elemen vektor adalah Diatur ke kesalahan untuk fitur yang sesuai, jenis ukuran kesalahan dapat diatur dalam parameter bendera jika alirannya tidak ditemukan maka kesalahan tidak ditentukan (gunakan parameter status untuk menemukan kasus semacam itu). WinSize 8211 ukuran jendela pencarian di setiap tingkat piramida. MaxLevel 8211 0 berbasis jumlah piramida maksimal jika set ke 0, piramida tidak digunakan (level tunggal), jika diset ke 1, dua level digunakan, dan seterusnya jika piramida dilewatkan ke input maka algoritma akan menggunakan sebanyak level seperti Piramida memiliki tapi tidak lebih dari maxLevel. Kriteria 8211, menentukan kriteria penghentian algoritma pencarian berulang (setelah jumlah maksimum kriteria iterasi yang ditentukan. maxCount atau ketika jendela pencarian bergerak kurang dari kriteria. epsilon flag 8211 OPTFLOWUSEINITIALFLOW menggunakan estimasi awal, disimpan di nextPts jika bendera OPTFLOWLKGETMINEIGENVALS menggunakan nilai eigen minimum sebagai ukuran kesalahan (lihat deskripsi minEigThreshold) jika bendera tidak disetel, maka jarak L1 antara tambalan di sekitar titik awal dan titik yang dipindah-pindahkan. MinEigThreshold 8211 algoritma menghitung nilai eigen minimum dari matriks normal 2x2 dari persamaan aliran optik (matriks ini disebut matriks gradien spasial dalam Bouguet00), dibagi dengan jumlah piksel dalam sebuah jendela, digunakan sebagai ukuran kesalahan. Jumlah piksel di jendela jika nilai ini kurang dari minEigThreshold, maka fitur yang sesuai akan disaring dan alirannya adalah Tidak diproses, sehingga memungkinkan untuk menghapus poin buruk dan mendapatkan dorongan kinerja. Fungsi ini menerapkan versi iteratif yang jarang dari aliran optik Lucas-Kanade di piramida. Lihat Bouguet00. Fungsi ini diparalelkan dengan perpustakaan TBB. Contoh menggunakan algoritma aliran optik Lucas-Kanade dapat ditemukan di opencvsourcecodesamplescpplkdemo. cpp (Python) Contoh menggunakan algoritma aliran optik Lucas-Kanade dapat ditemukan di opencvsourcecodesamplespython2lktrack. py (Python) Contoh menggunakan pelacak Lucas-Kanade untuk homografi Pencocokan dapat ditemukan di opencvsourcecodesamplespython2lkhomography. py buildOpticalFlowPyramid Membangun piramida gambar yang dapat dilewatkan ke calcOpticalFlowPyrLK (). C: int buildOpticalFlowPyramid (InputArray img OutputArrayOfArrays piramida Ukuran winSize int maxLevel bool withDerivatives true, int pyrBorder BORDERREFLECT101, int derivBorder BORDERCONSTANT, bool tryReuseInputImage true) Python: cv2. BuildOpticalFlowPyramid (img, winSize, maxLevel, piramida, withDerivatives, pyrBorder, derivRorder, tryReuseInputImage) rarr retval, piramida img 8211 input gambar 8 bit. Piramida piramida 8211. WinSize 8211 ukuran jendela algoritma aliran optik. Harus tidak kurang dari winSize argumen calcOpticalFlowPyrLK (). Hal ini diperlukan untuk menghitung padding yang dibutuhkan untuk tingkat piramida. MaxLevel 8211 0 berbasis jumlah piramida maksimal. DenganDerivatives 8211 mengatur precompute gradien untuk setiap level piramida. Jika piramida dibangun tanpa gradien maka calcOpticalFlowPyrLK () akan menghitungnya secara internal. PyrBorder 8211 modus perbatasan untuk lapisan piramida. DerivBorder 8211 mode border untuk gradien. TryReuseInputImage 8211 meletakkan ROI masukan gambar ke dalam piramida jika memungkinkan. Anda bisa melewati false untuk memaksa penyalinan data. Jumlah level pada piramida yang dibangun. Bisa kurang dari maxLevel. CalcOpticalFlowFarneback Menghitung aliran optik padat menggunakan algoritma Gunnar Farneback8217s. C: void calcOpticalFlowFarneback (InputArray prev InputArray selanjutnya InputOutputArray flow, double pyrscale, int level, int winsize, int iterations, int polyn, double polysigma, flag int) C: void cvCalcOpticalFlowFarneback (const CvArr prev const CvArr next CvArr flow - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Python: cv2. CalcOpticalFlowFarneback (prev, next, pyrscale, level, winsize, iterations, polyn, polysigma, flags flow) aliran rarr prev 8211 gambar input single-channel 8-bit pertama. Gambar masukan kedua 8211 kedua dengan ukuran yang sama dan tipe yang sama seperti prev. Flow 8211 computed flow image yang memiliki ukuran sama dengan prev dan tipe CV32FC2. Parameter pyrscale 8211, menentukan skala gambar (lt1) untuk membangun piramida untuk setiap gambar pyrscale0.5 berarti piramida klasik, di mana setiap lapisan berikutnya dua kali lebih kecil dari yang sebelumnya. Tingkat 8211 jumlah lapisan piramida termasuk tingkat awal gambar1 berarti tidak ada lapisan tambahan yang dibuat dan hanya gambar asli yang digunakan. Winsize 8211 rata-rata ukuran jendela yang lebih besar meningkatkan ketahanan algoritma terhadap noise gambar dan memberi lebih banyak kesempatan untuk deteksi gerakan cepat, namun menghasilkan medan gerak yang lebih kabur. Iterasi 8211 jumlah iterasi yang dilakukan algoritma pada masing-masing level piramida. Polyn 8211 ukuran lingkungan piksel yang digunakan untuk menemukan ekspansi polinomial pada setiap piksel nilai yang lebih besar berarti bahwa gambar akan didekati dengan permukaan yang lebih halus, menghasilkan algoritma yang lebih kuat dan medan gerak yang lebih kabur, biasanya polyn 5 atau 7. polysigma 8211 standar deviasi dari Gaussian yang digunakan untuk menghaluskan derivatif digunakan sebagai dasar untuk ekspansi polinomial untuk polyn5. Anda bisa mengatur polysigma1.1. Untuk polyn7 Nilai yang bagus adalah polysigma1.5. Bendera flag operasi 8211 yang bisa menjadi kombinasi dari berikut ini: OPTFLOWUSEINITIALFLOW menggunakan aliran input sebagai perkiraan arus awal. OPTFLOWFARNEBACKGAUSSIAN menggunakan filter Gaussian dan bukan filter kotak dengan ukuran yang sama untuk estimasi aliran optik biasanya, opsi ini memberi arus yang lebih akurat daripada filter kotak, dengan biaya kecepatan rendah biasanya, winsize untuk jendela Gaussian harus diatur ke Nilai yang lebih besar untuk mencapai tingkat ketahanan yang sama. Fungsi ini menemukan aliran optik untuk setiap pixel prev menggunakan algoritma Farneback2003 sehingga Contoh menggunakan algoritma aliran optik yang dijelaskan oleh Gunnar Farneback dapat ditemukan pada opencvsourcecodesamplescppfback. cpp (Python) Contoh menggunakan algoritma aliran optik yang dijelaskan oleh Gunnar Farneback dapat dilakukan. Ditemukan pada perkiraan opencvsourcecodesamplespython2optflow. pyRigidTransform Menghitung transformasi affine yang optimal antara dua titik 2D. C: Mat perkiraanRigidTransform (InputArray src. InputArray dst. Bool fullAffine) Python: cv2. TentukanRigidTransform (src, dst, fullAffine) rarr retval src 8211 Masukan pertama titik 2D yang tersimpan di std :: vector atau Mat. Atau gambar yang tersimpan di Mat. Dst 8211 Input kedua titik 2D set dengan ukuran yang sama dan tipe yang sama dengan A. atau gambar lainnya. FullAffine 8211 Jika benar, fungsinya menemukan transformasi affine yang optimal tanpa batasan tambahan (6 derajat kebebasan). Jika tidak, kelas transformasi yang dipilih terbatas pada kombinasi terjemahan, rotasi, dan skala seragam (5 derajat kebebasan). Fungsi ini menemukan transformasi affine optimal Ab (matriks floating-point 2 x 3) yang mendekati transformasi affine terbaik antara: Two point set Dua gambar raster. Dalam kasus ini, fungsi pertama menemukan beberapa fitur pada gambar src dan menemukan fitur yang sesuai pada gambar dst. Setelah itu, masalahnya dikurangi menjadi kasus pertama. Dalam kasus set titik, masalahnya dirumuskan sebagai berikut: Anda perlu menemukan matriks 2x2 A dan 2x1 vektor b sehingga: di mana srci dan dsti adalah titik ke-i di src dan dst. Masing-masing Bahkan, fastAtan2 () dan fase () digunakan sehingga sudut dihitung diukur dalam derajat dan mencakup rentang penuh 0..360. Juga, topeng diisi untuk menunjukkan piksel dimana sudut yang dihitung valid. (Python) Contoh bagaimana melakukan teknik motion template dapat ditemukan di opencvsourcecodesamplespython2motempl. py calcGlobalOrientation Menghitung orientasi gerak global di wilayah yang dipilih. C: double calcGlobalOrientation (InputArray orientation InputArray mask InputArray mhi double timestamp durasi ganda) Python: cv2. CalcGlobalOrientation (orientasi, topeng, mhi, timestamp, durasi) rarr retval C: double cvCalcGlobalOrientation (const Orientasi CvArr const CvArr mask const cvArr mhi double timestamp durasi ganda) Python: cv. CalcGlobalOrientation (orientasi, topeng, mhi, timestamp, duration) rarr float orientation 8211 Motion gradient orientation image dihitung dengan fungsi calcMotionGradient (). Topeng topeng 8211. Ini mungkin merupakan gabungan dari topeng gradien yang valid, juga dihitung dengan calcMotionGradient (). Dan topeng dari suatu daerah yang arahnya perlu dihitung. Mhi 8211 Gambar riwayat gerak dihitung dengan updateMotionHistory (). Timestamp 8211 Timestamp dilewatkan ke updateMotionHistory (). Durasi 8211 Durasi maksimum dari sebuah lagu dalam milidetik, diteruskan ke updateMotionHistory (). Fungsi ini menghitung arah gerak rata-rata di wilayah yang dipilih dan mengembalikan sudut antara 0 derajat dan 360 derajat. Arah rata-rata dihitung dari histogram orientasi tertimbang, di mana gerakan baru-baru ini memiliki bobot lebih besar dan gerakan yang terjadi di masa lalu memiliki bobot yang lebih kecil, seperti yang tercatat dalam mhi. SegmentMotion Memisahkan gambar riwayat gerak ke beberapa bagian yang sesuai dengan gerakan independen yang terpisah (misalnya tangan kiri, tangan kanan). C: void segmentMotion (InputArray mhi. OutputArray segmask. VectorltRectgtamp boundingRects. Double timestamp. Double segThresh) boundingRects, double timestamp, double segThresh) titlePermalink to this definition Python: cv2. SegmentMotion (mhi, timestamp, segThresh. Segmask) rarr segmask, boundingRects C: CvSeq cvSegmentMotion (const CvArr mhi. CvArr segmask CvMemStorage storage double timestamp double segthresh) Python: cv. SegmentMotion (mhi, segmask, storage, timestamp, segthresh) rarr boundingRects mhi 8211 Motion history image. Segmask 8211 Image dimana topeng yang ditemukan harus disimpan, single-channel, 32-bit floating-point. BoundingRects 8211 Vector yang berisi ROI komponen gerak terhubung. Timestamp 8211 Waktu sekarang dalam milidetik atau unit lainnya. SegThresh 8211 Ambang batas segmentasi yang direkomendasikan sama dengan interval antara motion history 8220steps8221 atau lebih. Fungsi ini menemukan semua segmen gerakan dan menandai mereka di segmask dengan nilai individual (1,2). Ini juga menghitung vektor dengan ROI komponen gerak yang terhubung. Setelah itu arah gerak untuk setiap komponen dapat dihitung dengan calcGlobalOrientation () menggunakan topeng yang diekstrak dari komponen tertentu. Finds an object center, size, and orientation. C: RotatedRect CamShift ( InputArray probImage . Rectamp window . TermCriteria criteria ) Python: cv2. CamShift ( probImage, window, criteria ) rarr retval, window C: int cvCamShift ( const CvArr probimage . CvRect window . CvTermCriteria criteria . CvConnectedComp comp . CvBox2D box NULL ) Python: cv. CamShift ( probimage, window, criteria) - gt (int, comp, box ) Sometimes the background image can be very blurry, as it contain the average background statistics. BackgroundSubtractorMOG class BackgroundSubtractorMOG. public BackgroundSubtractor Gaussian Mixture-based BackgroundForeground Segmentation Algorithm. The class implements the algorithm described in P. KadewTraKuPong and R. Bowden, An improved adaptive background mixture model for real-time tracking with shadow detection . Proc. 2nd European Workshop on Advanced Video-Based Surveillance Systems, 2001: personal. ee. surrey. ac. ukPersonalR. Bowdenpublicationsavbs01avbs01.pdf BackgroundSubtractorMOG::BackgroundSubtractorMOG C: BackgroundSubtractorMOG. BackgroundSubtractorMOG ( ) C: BackgroundSubtractorMOG. BackgroundSubtractorMOG ( int history . int nmixtures . double backgroundRatio . double noiseSigma 0 ) Python: cv2. BackgroundSubtractorMOG ( history, nmixtures, backgroundRatio . noiseSigma ) rarr ltBackgroundSubtractorMOG objectgt history 8211 Length of the history. nmixtures 8211 Number of Gaussian mixtures. backgroundRatio 8211 Background ratio. noiseSigma 8211 Noise strength. Default constructor sets all parameters to default values. BackgroundSubtractorMOG::operator() Updates the background model and returns the foreground mask C: void BackgroundSubtractorMOG. operator() ( InputArray image . OutputArray fgmask . double learningRate 0 ) BackgroundSubtractorMOG2 Gaussian Mixture-based BackgroundForeground Segmentation Algorithm. class BackgroundSubtractorMOG2. public BackgroundSubtractor Here are important members of the class that control the algorithm, which you can set after constructing the class instance: Maximum allowed number of mixture components. Actual number is determined dynamically per pixel. Threshold defining whether the component is significant enough to be included into the background model ( corresponds to TB1-cf from the paperwhich paper). cf0.1 gt TB0.9 is default. For alpha0.001. it means that the mode should exist for approximately 105 frames before it is considered foreground. Threshold for the squared Mahalanobis distance that helps decide when a sample is close to the existing components (corresponds to Tg ). If it is not close to any component, a new component is generated. 3 sigma gt Tg339 is default. A smaller Tg value generates more components. A higher Tg value may result in a small number of components but they can grow too large. Initial variance for the newly generated components. It affects the speed of adaptation. The parameter value is based on your estimate of the typical standard deviation from the images. OpenCV uses 15 as a reasonable value. Parameter used to further control the variance. Parameter used to further control the variance. Complexity reduction parameter. This parameter defines the number of samples needed to accept to prove the component exists. CT0.05 is a default value for all the samples. By setting CT0 you get an algorithm very similar to the standard StaufferampGrimson algorithm. The value for marking shadow pixels in the output foreground mask. Default value is 127. Shadow threshold. The shadow is detected if the pixel is a darker version of the background. Tau is a threshold defining how much darker the shadow can be. Tau 0.5 means that if a pixel is more than twice darker then it is not shadow. See Prati, Mikic, Trivedi, Cucchiarra, Detecting Moving Shadows. . IEEE PAMI,2003. The class implements the Gaussian mixture model background subtraction described in: Z. Zivkovic, Improved adaptive Gausian mixture model for background subtraction . International Conference Pattern Recognition, UK, August, 2004, zoranzPublicationszivkovic2004ICPR. pdf. The code is very fast and performs also shadow detection. Number of Gausssian components is adapted per pixel. Z. Zivkovic, F. van der Heijden, Efficient Adaptive Density Estimapion per Image Pixel for the Task of Background Subtraction . Pattern Recognition Letters, vol. 27, no. 7, pages 773-780, 2006. The algorithm similar to the standard StaufferampGrimson algorithm with additional selection of the number of the Gaussian components based on: Z. Zivkovic, F. van der Heijden, Recursive unsupervised learning of finite mixture models, IEEE Trans. on Pattern Analysis and Machine Intelligence, vol.26, no.5, pages 651-656, 2004. BackgroundSubtractorMOG2::BackgroundSubtractorMOG2 C: BackgroundSubtractorMOG2. BackgroundSubtractorMOG2 ( ) C: BackgroundSubtractorMOG2. BackgroundSubtractorMOG2 ( int history . float varThreshold . bool bShadowDetection true ) history 8211 Length of the history. varThreshold 8211 Threshold on the squared Mahalanobis distance to decide whether it is well described by the background model (see Cthr). This parameter does not affect the background update. A typical value could be 4 sigma, that is, varThreshold4416 (see Tb). bShadowDetection 8211 Parameter defining whether shadow detection should be enabled ( true or false ). BackgroundSubtractorMOG2::operator() Updates the background model and computes the foreground mask C: void BackgroundSubtractorMOG2. operator() ( InputArray image . OutputArray fgmask . double learningRate -1 ) BackgroundSubtractorMOG2::getBackgroundImage Returns background image C: void BackgroundSubtractorMOG2. getBackgroundImage ( OutputArray backgroundImage ) Implementing Pairs Trading Using Kalman Filter This article is the final project submitted by the author as a part of his coursework in Executive Programme in Algorithmic Trading (EPAT) at QuantInsti. Do check our Projects page and have a look at what our students are building. Introduction Some stocks move in tandem because the same market events affect their prices. However, idiosyncratic noise might make them temporarily deviate from the usual pattern and a trader could take advantage of this apparent deviation with the expectation that the stocks will eventually return to their long term relationship. Two stocks with such a relationship form a pair. We have talked about the statistics behind pairs trading in a previous article. This article describes a trading strategy based on such stock pairs. The rest of the article is organized as follows. We will be talking about the basics of trading an individual pair, the overall strategy that chooses which pairs to trade and present some preliminary results. In the end, we will describe possible strategies for improving the results. Let us consider two stocks, x and y, such that alpha and beta are constants and e is white noise. The parameters alpha, beta could be obtained from a linear regression of prices of the two stocks with the resulting spread Let the standard deviation of this spread be sigma . The z-score of this spread is Trading Strategy The trading strategy is that when the z-score is above a threshold . say 2, the spread can be shorted . i. e. sell 1 unit of y and buy beta units of x. we expect that the relationship between x and y will hold in the future and eventually the z-score will come down to zero and even go negative and then the position could be closed. By selling the spread when it is high and closing out the position when it is low, the strategy hopes to be statistically profitable. Conversely, if the z-score is below a lower threshold say -2, the strategy will go long the spread, i. e. buy 1 unit of y and sell beta units of x and when the z score rises to zero or above the position can be closed realizing a profit. There are a couple of issues which make this simple strategy difficult to implement in practice: The constants alpha and beta are not constants in practice and vary over time. They are not market observables and hence have to be estimated with some estimates being more profitable than others. The long term relationship can break down, the spread can move from one equilibrium to another such that the changing gives an open short signal and the spread keeps rising to a new equilibrium such that when the close long signal come the spread is above the entry value resulting in a loss. Both of these facts are unavoidable and the strategy has to account for them. Determining Parameters The parameters can be estimated from the intercept and slope of a linear regression of the prices of y against the prices of x. Note that linear regression is not reversible, i. e. the parameters are not the inverse of regressing x against y. So the pairs (x, y) is not the same as (y, x). While most authors use ordinary least squares regression, some use total least squares since they assume that the prices have some intraday noise as well. However, the main issue with this approach is that we have to pick an arbitrary lookback window. In this paper, we have used Kalman filter which is related to an exponential moving average. This is an adaptive filter which updates itself iteratively and produces alpha, beta, e and sigma simultaneously. We use the python package pykalman which has the EM method that calibrates the covariance matrices over the training period. Another question that comes up is whether to regress prices or returns. The latter strategy requires holding equal dollar amount in both long and short positions, i. e. the portfolio would have to be rebalanced every day increasing transaction cost, slippage, and bidask spread. Hence we have chosen to use prices which is justified in the next subsection. Stability of the Long Term Relationship The stability of the long term relationship is determined by determining if the pairs are co-integrated. Note that even if the pairs are not co-integrated outright, they might be for the proper choice of the leverage ratio. Once the parameters have been estimated as above, the spread time series e is tested for stationarity by the augmented Dickey Fuller (ADF) test. In python, we obtain this from the adfuller function in the statsmodels module. The result gives the t-statistics for different confidence levels. We found that not many pairs were being chosen at the 1 confidence level, so we chose 10 as our threshold. One drawback is that to perform the ADF test we have to choose a lookback period which reintroduces the parameter we avoided using the Kalman filter. Choosing Sectors and Stocks The trading strategy deploys an initial amount of capital. To diversify the investment five sectors will be chosen: financials, biotechnology, automotive etc. A training period will be chosen and the capital allocated to each sector is decided based on a minimum variance portfolio approach. Apart from the initial investment, each sector is traded independently and hence the discussion below is limited to a single sector, namely financials. Within the financial sector, we choose about n 47 names based on large market capitalization. We are looking for stocks with high liquidity, small bidask spread, ability to short the stocks etc. Once the stock universe is defined we can form n (n-1) pairs, since as mentioned above (x, y) is not the same as (y, x). In our financial portfolio, we would like to maintain up to five pairs at any given time. On any day that we want to enter into a position (for example the starting date) we run a screen on all the n (n-1) pairs and select the top pair(s) according to some criteria some of which are discussed next. Choosing Pairs For each pair, the signal is obtained from the Kalman filter and we check if e gt nz sigma, where nz is the z-score threshold to be optimized. This ensures that this pair has an entry point. We perform this test first since this is inexpensive. If the pair has an entry point, then we choose a lookback period and perform the ADF test. The main goal of this procedure is not only to determine the list of pairs which meets the standards but rank them according to some metrics which relates to the expected profitability of the pairs. Once the ranking is done we enter into the positions corresponding to the top pairs until we have a total of five pairs in our portfolio. In the following, we calibrated the Kalman filter over Cal11 and then used the calibrated parameters to trade in Cal12. In the following, we kept only one stock-pair in the portfolio. In the tests shown we kept the maximum allowed drawdown per trade to 9, but allowed a maximum loss of 6 in one strategy and only 1 in the other. As we see from above the performance improves with the tightening of the maximum allowed loss per trade. The Sharpe ratio (assuming zero index) was 0.64 and 0.81 respectively while the total PampL was 9.14 and 14. The thresholds were chosen based on the simulation in the training period. Future Work Develop better screening criterion to identify the pairs with the best potentials. I already have several ideas and this will be ongoing research. Optimize the lookback window and the buysell Z-score thresholds. Gather more detailed statistics in the training period. At present, I am gathering statistics of only the top 5 (based on my selection criteria). However, in future, I should record statistics of all pairs that pass. This will indicate which trades are most profitable. In the training period, I am measuring profitability by the total PampL of the trade, from entry till the exit signal is reached. However, I should also record max profit so that I could determine an earlier exit threshold. Run the simulation for several years, i. e. calibrate one year and then test the next year. This will generate several years worths of out-of-sample tests. Another window to optimize is the length of the training period and how frequently the Kalman filter has to be recalibrated. Expand the methodology to other sectors beyond financials. Explore other filters instead of just Kalman filter. Next Steps If you are a coder or a tech professional looking to start your own automated trading desk. Learn automated trading from live Interactive lectures by daily-practitioners. Executive Programme in Algorithmic Trading (EPAT) covers training modules like Statistics amp Econometrics, Financial Computing amp Technology, and Algorithmic amp Quantitative Trading. Enroll now The work presented in the article has been developed by the author, Mr. Dyutiman Das. The underlying codes which form the basis for this article are not being shared with the readers. For readers who are interested in further readings on implementing pairs trading using Kalman Filter, please find the article below. Pos terkait:

No comments:

Post a Comment