Wednesday 12 July 2017

Php Code Eksponensial Moving Average


Traderema the tradersema () fungsi doesnt bekerja dengan benar. Itu hanya menghitung rata-rata entri periode lalu. Ikuti kode berikut untuk traderema: function EMACalculator (limit, array) EMApreviousday array0 printr (array) multiplier1 (2limit1) EMAarray () EMA array0 Tutup array1 saat (batas) echoEMA adalah EMAn EMA (Close - EMApreviousday) multiplier1 EMApreviousday EMApreviousday EMA limit - - return EMA dimana limit menerima periode ema dan array. Terima array data untuk perhitungan ema. Saya ingin menghitung nilai EMA (Exponential Moving Average) di PHP. Saya telah mencoba dengan kode berikut namun memberi saya 500 kesalahan. PHP: Fungsi perhitungan EMA trader-ema Mencoba dengan Googling lama tapi tidak mendapatkan bantuan apapun dalam hal ini di PHP. Jadi, saya tidak tahu apa yang perlu dilakukan untuk menghitung nilai EMA. Edit-1: Ekstensi terinstal Saya telah menginstal semua ekstensi yang diperlukan, Sekarang saya mendapatkan hasilnya. Tapi sepertinya tidak memberikan hasil yang tepat. Saya pikir fungsi PHP untuk menghitung EMA tidak bekerja dengan baik. Setiap bantuan dalam hal ini akan sangat dihargai. Saya mencoba untuk mengambil EMA terakhir dari kumpulan data besar (nilai 15000). Ini adalah algoritma yang sangat haus sumber daya karena setiap nilai bergantung pada yang sebelumnya. Berikut adalah kode saya: Apa yang sudah saya lakukan: Isolasi k jadi tidak dihitung 10000 kali Jaga hanya EMA yang dihitung terakhir, dan jangan menyimpan semuanya dalam penggunaan array untuk () daripada foreach () array data tidak memiliki kunci Ini adalah array dasar Ini memungkinkan saya mengurangi waktu eksekusi dari 2000ms menjadi sekitar 500ms untuk nilai 15000 Apa yang tidak berhasil: Gunakan SplFixedArray (), ini hanya mencukur 10ms yang mengeksekusi 1.000.000 nilai Gunakan ekstensi PHPTrader. Ini mengembalikan sebuah array yang berisi semua EMA bukan hanya yang terbaru, dan yang lebih lambat Menulis dan menjalankan algoritma yang sama di C dan menjalankannya lebih dari 2.000.000 nilai hanya membutuhkan 13ms Jadi jelas, dengan menggunakan bahasa tingkat rendah yang dikompilasi tampaknya membantu P Dimana Haruskah saya pergi dari sini Kode pada akhirnya akan berjalan di Ubuntu, jadi bahasa apa yang harus saya pilih Akankah PHP dapat memanggil dan menyampaikan argumen yang begitu besar ke naskah yang diminta 11 Juli 14 di 19:21 Jelas menerapkan dengan ekstensi memberi Anda Dorongan signifikan Selain itu kalkulus dapat ditingkatkan seperti dirinya sendiri dan keuntungan itu dapat ditambahkan ke bahasa mana pun yang Anda pilih. Mudah untuk melihat bahwa lastEMA dapat dihitung sebagai berikut: Ini dapat ditulis ulang sebagai berikut untuk menghilangkan lingkaran sebanyak mungkin: Untuk menjelaskan ekstraksi k berpikir bahwa pada formulasi sebelumnya adalah seolah-olah semua Data mentah asli dikalikan dengan k sehingga praktis Anda malah bisa mengalikan hasil akhir. Perhatikan bahwa, ditulis ulang dengan cara ini, Anda memiliki 2 operasi di dalam lingkaran alih-alih 3 (tepatnya di dalam lingkaran ada juga kenaikan saya, saya membandingkan dengan penetapan nilai nominal dan nilai akhir) jadi dengan cara ini Anda dapat mengharapkan untuk mencapai tambahan Kecepatan di kisaran antara 16 dan 33. Selanjutnya ada perbaikan lain yang dapat dipertimbangkan setidaknya dalam beberapa situasi: Pertimbangkan hanya nilai terakhir Nilai pertama dikalikan beberapa kali oleh k1m 1 k sehingga kontribusi mereka mungkin sedikit atau bahkan pergi. Di bawah presisi floating point (atau kesalahan yang dapat diterima). Ide ini sangat membantu jika Anda dapat melakukan asumsi bahwa data yang lebih tua memiliki urutan yang sama seperti yang lebih baru karena jika Anda hanya mempertimbangkan nilai n terakhir, kesalahan yang Anda buat adalah kesalahan EMAofdiscardeddata (1 k) n. Jadi jika urutan besarnya secara umum sama, kita dapat mengetahui bahwa kesalahan relatif yang dilakukan adalah reler err lastEMA EMAofdiscardeddata (1-k) n lastEMA yang hampir sama dengan hanya (1 k) n. Dengan asumsi bahwa lastEMA hampir sama dengan EMAofdiscardeddata: Katakanlah bahwa Anda dapat menerima kesalahan reler relatif Anda dapat dengan aman mempertimbangkan hanya n nilai terakhir dimana (1 - k) n lt relerr. Berarti Anda bisa melakukan pra-perhitungan (sebelum loop) log n (relerr) log (1-k) dan menghitung semua hanya dengan mempertimbangkan nilai n terakhir. Jika dataset yang sangat besar ini bisa memberikan speedup yang masuk akal. Perhatikan bahwa untuk bilangan floating point 64 bit Anda memiliki presisi relatif (terkait dengan mantissa) yaitu 2-53 (sekitar 1.1e-16 dan hanya 2-24 5.96e-8 untuk bilangan floating point 32 bit) sehingga Anda tidak dapat memperolehnya. Lebih baik dari kesalahan relatif ini sehingga pada dasarnya Anda tidak boleh memiliki keuntungan dalam menghitung lebih dari n log (1.1e-16) log (1 k) nilai. Untuk memberi contoh jika rentang 2000 maka n log (1.1e-16) log (1-22001) 36746. Saya rasa menarik untuk mengetahui bahwa perhitungan ekstra akan hilang di dalam ronde tidak ada gunanya lebih baik tidak dilakukan. Sekarang satu contoh untuk kasus di mana Anda dapat menerima kesalahan relatif lebih besar dari pada floating point precision relerr 1ppm 1e-6 0,00001 6 digit desimal yang signifikan yang Anda punya n log (1.1e-16) log (1-22001) 13815 Saya pikir cukup Jumlah kecil dibandingkan dengan nomor sampel terakhir Anda sehingga dalam kasus itu kecepatan bisa menjadi jelas (Im menduga bahwa rentang 2000 itu bermakna atau tinggi untuk aplikasi Anda tapi saya tidak tahu). Hanya beberapa nomor lainnya karena saya tidak tahu apa ciri khas Anda: rentang 1e-3 kisaran 2000 n 6907 relerr 1e-3 range 200 n 691 relerr 1e-3 range 20 n 69 relerr 1e-6 range 2000 n 13815 relerr 1e - 6 range 200 n 1381 relerr 1e-6 range 20 n 138 Jika asumsi lastEMA hampir sama dengan EMAofdiscardeddata tidak dapat diambil hal-hal yang kurang mudah namun karena keunggulan cam menjadi signifikan maka bisa bermakna untuk terus berlanjut: kita perlu mempertimbangkan kembali Rumus lengkap: reler EMAofdiscardeddata (1-k) n lastEMA jadi log n reler lastEMA EMAofdiscardeddata) log (1-k) (log (relerr) log (lastraA EMAofdiscardeddata)) log (1 k) titik pusat adalah untuk menghitung lastEMA EMAofdiscardeddata (tanpa benar-benar menghitung lastEMA atau EMAofdiscardeddata tentu saja) satu kasus adalah ketika kita mengetahui a-priori yang misalnya EMAofdiscardeddata lastEMA lm M (misalnya M 1000 atau M 1e6) dalam hal ini log (log (relerrm)) (1 - k) jika Anda tidak dapat memberikan nomor M Anda harus menemukan id yang bagus Untuk memperkirakan perkiraan EMAofdiscardeddata lastEMA satu cara cepat adalah dengan mengambil data M max (data) min (data) Paralelisasi Perhitungannya dapat ditulis ulang dalam bentuk di mana ia merupakan penambahan sederhana dari persyaratan independen: Jadi jika bahasa pelaksana mendukung Paralelisasi dataset dapat dibagi dalam 4 (atau 8 atau n. Pada dasarnya jumlah inti CPU tersedia) potongan dan dapat dihitung jumlah istilah pada masing-masing potongan secara paralel menjumlahkan hasil individual di akhir. Saya tidak membahas secara detail dengan ini karena jawaban ini sudah sangat panjang dan menurut saya konsep itu sudah diungkapkan. Terima kasih untuk ini menggunakan data pasar saham ini, jadi kenyataan bahwa data yang lebih tua berada pada urutan yang sama besarnya karena data yang lebih baru bergantung pada kerangka waktu yang digunakan. Misalkan kisaran 200, akan ada variasi harga yang jauh lebih besar pada kerangka waktu harian (200 hari) daripada jangka waktu 5 menit (16 jam). Saya akan bereksperimen dengan skenario yang berbeda pada data real dan simulasi. Pada data baru, dengan range lt 200, saya menggunakan 1000 elemen dataset. Tapi saya juga melakukan beberapa pengujian ulang selama beberapa tahun terakhir, jadi saya masih perlu memuat keseluruhan dataset. Anda membantu kedua situasi tersebut, terima kasih ndash Lykegenes 16 Juli 14 di 15:11 Membangun ekstensi Anda sendiri pasti akan meningkatkan kinerja. Heres tutorial yang bagus dari situs Zend. Beberapa angka kinerja: Perangkat Keras: Ubuntu 14.04, PHP 5.5.9, Intel Core3.3Ghz 1-inti, RAM 128MB (yang VPS-nya). Sebelum (hanya PHP, 16.000 nilai). Ekstensi 500ms C, 16.000 nilai. Ekstensi C sebesar 0.3ms (100.000 nilai). 3.7ms C Extension (500.000 nilai). 28.0ms Tapi memori Im terbatas pada saat ini, menggunakan 70MB. Saya akan memperbaikinya dan memperbarui nomor-nomor yang sesuai.

No comments:

Post a Comment