Sunday 6 August 2017

Algoritma eksponensial moving average


Pada dasarnya saya memiliki sejumlah nilai seperti ini: Array di atas disederhanakan, saya mengumpulkan 1 nilai per milidetik dalam kode sebenarnya dan saya perlu mengolah keluaran pada algoritma yang saya tulis untuk menemukan puncak terdekat sebelum sebuah titik waktu. Logika saya gagal karena dalam contoh saya di atas, 0,36 adalah puncak sebenarnya, tapi algoritme saya akan terlihat mundur dan melihat angka terakhir 0,25 sebagai puncaknya, karena ada penurunan menjadi 0,24 sebelum itu. Tujuannya adalah untuk mengambil nilai-nilai ini dan menerapkan algoritma kepada mereka yang akan memperlancar mereka sedikit sehingga saya memiliki nilai linier yang lebih banyak. (Yaitu: Id seperti hasil saya melengkung, tidak bergerigi) Saya telah diberitahu untuk menerapkan filter rata-rata bergerak eksponensial ke nilai-nilai saya. Bagaimana saya bisa melakukan ini Sangat sulit bagi saya untuk membaca persamaan matematis, saya jauh lebih baik dengan kode. Bagaimana cara memproses nilai dalam array saya, menerapkan perhitungan rata-rata bergerak eksponensial bahkan sampai mereka bertanya pada 8 Februari 12 di 20:27 Untuk menghitung rata-rata pergerakan eksponensial. Anda perlu menyimpan beberapa keadaan di sekitar dan Anda memerlukan parameter penyetelan. Ini memerlukan kelas kecil (dengan asumsi Anda menggunakan Java 5 atau yang lebih baru): Instantiate dengan parameter peluruhan yang Anda inginkan (mungkin mengambil tuning harus antara 0 dan 1) dan kemudian gunakan rata-rata () untuk memfilter. Saat membaca sebuah halaman tentang beberapa kekambuhan mathmatical, semua yang Anda benar-benar perlu ketahui saat mengubahnya menjadi kode adalah matematikawan suka menulis indeks menjadi array dan urutan dengan subskrip. (Beberapa notasi lain juga, yang tidak membantu). Namun, EMA cukup sederhana karena Anda hanya perlu mengingat satu nilai lama tanpa susunan negara yang rumit. Jawab Feb 8 12 jam 20:42 TKKocheran: Cukup banyak. Tidak masalah jika hal-hal sederhana (Jika dimulai dengan urutan baru, dapatkan rata-rata baru.) Perhatikan bahwa beberapa istilah pertama dalam urutan rata-rata akan melompat sedikit karena efek batas, namun Anda mendapatkan yang lain dengan rata-rata bergerak lainnya. terlalu. Namun, keuntungan yang bagus adalah Anda dapat membungkus logika rata-rata bergerak menjadi rata-rata dan bereksperimen tanpa mengganggu keseluruhan program Anda. Ndash Donal Fellows Feb 9 12 at 0:06 Saya mengalami kesulitan untuk memahami pertanyaan Anda, tapi saya akan mencoba menjawabnya juga. 1) Jika algoritma Anda menemukan 0,25 bukan 0,36, maka itu salah. Ini salah karena mengasumsikan kenaikan atau penurunan monotonik (yang selalu naik atau selalu turun). Kecuali Anda rata-rata SEMUA data Anda, poin data Anda --- seperti yang Anda sampaikan - tidak bersifat nonlinier. Jika Anda benar-benar ingin menemukan nilai maksimum antara dua titik dalam waktu, maka iris array Anda dari tmin ke tmax dan temukan maks dari subarray itu. 2) Sekarang, konsep moving averages sangat sederhana: bayangkan bahwa saya memiliki daftar berikut: 1.4, 1.5, 1.4, 1.5, 1.5. Saya bisa menghaluskannya dengan mengambil rata-rata dua angka: 1.45, 1.45, 1.45, 1.5. Perhatikan bahwa angka pertama adalah rata-rata 1,5 dan 1,4 (angka kedua dan pertama) yang kedua (daftar baru) adalah rata-rata 1,4 dan 1,5 (daftar ketiga dan kedua) yang ketiga (daftar baru) rata-rata 1,5 dan 1,4 (Keempat dan ketiga), dan seterusnya. Saya bisa membuatnya periode tiga atau empat, atau n. Perhatikan bagaimana datanya jauh lebih mulus. Cara yang baik untuk melihat moving averages di tempat kerja adalah pergi ke Google Finance, pilih saham (coba Tesla Motors cukup mudah menguap (TSLA)) dan klik pada bagian teknis di bagian bawah grafik. Pilih Moving Average dengan periode tertentu, dan moving average eksponensial untuk membandingkan perbedaannya. Rata-rata pergerakan eksponensial hanyalah penjabaran lain dari hal ini, namun bobot data yang lebih tua kurang dari data baru ini adalah cara untuk meratakan perataan ke arah belakang. Silahkan baca entri Wikipedia. Jadi, ini lebih merupakan komentar daripada sebuah jawaban, tapi kotak komentar kecil itu hanya untuk mungil. Semoga berhasil. Jika Anda mengalami masalah dengan matematika, Anda bisa pergi dengan rata-rata bergerak sederhana daripada eksponensial. Jadi output yang Anda dapatkan akan menjadi hal x terakhir yang dibagi dengan x. Pseudocode yang tidak teruji: Perhatikan bahwa Anda perlu menangani bagian awal dan akhir data karena dengan jelas Anda tidak dapat menghitung 5 persyaratan terakhir saat Anda berada di titik data kedua Anda. Juga, ada cara yang lebih efisien untuk menghitung rata-rata pergerakan ini (jumlah penjumlah - tertua terbaru), namun ini adalah untuk mendapatkan konsep tentang apa yang terjadi. Jawab 8 Feb 12 di 20: 41Im dalam proses pembuatan algoritma trading forex dan ingin mencoba tembakan saya saat menghitung EMA (Exponential Moving Averages). Hasil saya tampak benar (dibandingkan dengan perhitungan yang saya lakukan dengan tangan) jadi saya yakin metode berikut berhasil, tapi hanya ingin mendapatkan satu set ekstra untuk memastikan saya tidak kehilangan apapun. Perhatikan bahwa ini hanya mengembalikan EMA untuk harga terbaru, ia tidak mengembalikan array EMA karena itu bukan apa yang saya butuhkan untuk aplikasi saya. Rekursi adalah alat yang bagus untuk pekerjaan yang tepat, tapi di sini digunakan untuk menyelesaikan perulangan sederhana. Seperti kode tersebut. Lebih sulit dibaca dan dipikirkan. Lebih lambat karena banyak kode di ema hanya perlu dijalankan sekali. Akan gagal dengan nilai jendela yang cukup besar karena meluapnya Piton memanggil stack. Harap dokumentasikan setidaknya parameter dari setiap fungsi, mis. Jendela itu adalah panjang jendela, dan posisi itu mundur dari akhir data. (Sebenarnya semuanya akan lebih jelas jika posisi adalah indeks forward normal ke data) Naikkan pengecualian saat Anda menemukan parameter memiliki nilai yang tidak valid. Returning None malah hanya akan menimbulkan pengecualian yang lebih membingungkan nantinya. Sebenarnya, jika saya mencoba Indikator (). Ema (closeprices, 600) Saya mendapatkan rekursi tak terbatas karena sma kembali tidak ada. Yang membuat ema memanggil sma lagi dan lagi. Poin sebelumnya juga mengungkapkan bahwa jika len (data) lt window 2 bukan pemeriksaan validitas yang benar. 1 di data-window2 1: - window 1 dont sepertinya benar untuk saya. Saya kira Anda ingin data-window2: - window Pernyataan kembali previousema berada dalam tempat yang aneh karena pada saat itu Anda telah menghitung currentema baru. Ini adalah kasus dasar rekursi, dan biasanya menangani kasus dasar terlebih dahulu. Proposal saya untuk ema: dijawab 26 Nov 14 at 18:56 review yang lumayan dangkal: Anda tidak perlu menulis kelas untuk apa yang Anda lakukan (dan saya sarankan Anda melihat video ini). Kelas Anda tidak mengenkapsulasi data apapun dan Anda menggunakannya untuk memiliki fungsi Anda dalam entitas yang sama. Kurasa semuanya akan lebih mudah dipahami jika Anda mendefinisikan metode kelas agar jelas bahwa Anda sama sekali tidak bergantung pada kejadian apa pun. Namun, pilihan yang lebih bagus lagi adalah mendefinisikan fungsi dalam modul indikator. Jawab 24 Nov 14 at 18:04 Terima kasih atas saran yang saya berikan pada mereka sebagai metode kelas dan diskusikan bolak-balik antara bahkan menggunakan kelas atau hanya mendefinisikan fungsi dalam modul indikator (yang akan saya lakukan sekarang). Ndash ChrisC 25 Nov 14 jam 19:12 Hanya menonton videonya juga, bagus sekali. Ndash ChrisC 25 Nov 14 di 19:43 Jawaban Anda 2017 Stack Exchange, IncI perlu melacak jam kerja 7 hari terakhir di loop membaca file datar. Ini digunakan untuk mengukur kelelahan dari daftar pekerjaan. Saat ini saya memiliki sesuatu yang berhasil, tapi sepertinya agak verbose dan saya tidak yakin apakah ada pola yang lebih ringkas. Saat ini, saya memiliki kelas Java dengan array statis untuk menyimpan data x hari terakhir, lalu saat membaca file, saya memotong elemen pertama dan memindahkan 6 lainnya (untuk keseluruhan putaran keseluruhan) satu per satu. Pengolahan array statis ini dilakukan dengan metodenya sendiri. Pertanyaan saya: apakah ini pendekatan desain yang masuk akal, atau adakah sesuatu yang menyilaukan dan sederhana untuk melakukan tugas ini Terima kasih guys tanya 30 Agustus 11 jam 14:33 Terima kasih banyak guys: Saya punya pesannya: gunakan benda tingkat lebih tinggi dan eksploitasi Metode yang relevan atau penyangga melingkar. Jawaban yang bagus, semuanya. Ketika Anda memikirkannya, Anda selalu membutuhkan akses ke keseluruhan rangkaian sehingga Anda bisa menyingkirkan entri pertama - yang saya tidak yakin dengan kemampuan saya sendiri. Saya merasa lega bahwa saya tidak dapat melewati satu kapal pun dan pada dasarnya berada pada jalur yang masuk akal, jika tidak efisien dan singkat Inilah yang saya sukai dari situs ini: jawaban berkualitas tinggi dan relevan dari orang-orang yang mengetahui kemampuan mereka. Ndash Pete855217 30 Agu 11 11 di 15:05 Mengapa Anda menginisialisasi runningTotal ke null Apa jenisnya Dimana dideklarasikan Akan lebih baik jika Anda memasukkan beberapa contoh kode yang menyerupai kode Java yang sebenarnya. Pindah, kritik saya adalah sebagai berikut: fungsi Anda terlalu banyak. Suatu fungsi, atau metode, harus bersifat kohesif. Lebih tepat, mereka harus melakukan satu hal dan satu hal saja. Lebih buruk lagi, apa yang terjadi dalam lingkaran Anda saat x 5 Anda menyalin runningTotal6 ke runningTotal5. Tapi kemudian Anda memiliki dua salinan dengan nilai yang sama pada posisi 5 dan 6. Dalam desain Anda, fungsi Anda menggerakkan item pada array Anda menghitung total barang cetakan ke kesalahan standar mengembalikan totalnya. Saran pertama saya adalah tidak memindahkan barang-barang ke dalam array. Sebagai gantinya, terapkan buffer lingkaran dan gunakan sebagai pengganti array. Ini akan mempermudah disain anda. Saran kedua saya adalah memecah hal-hal menjadi fungsi yang kohesif: memiliki struktur data (buffer melingkar) yang memungkinkan Anda menambahkannya (dan itu memasukkan entri tertua kapan pun mencapai kapasitasnya.) Miliki struktur data yang menerapkannya. Interator memiliki fungsi yang menghitung total pada iterator (Anda tidak peduli jika Anda menghitung total dari daftar, daftar atau bufer melingkar.) Jangan menyebutnya total. Sebut itu jumlah, apa yang Anda komputasi. Thats apa Id lakukan :) Itu info bagus luis, namun ingat fungsi ini adalah bagian kecil dari fungsionalitas kelas, dan akan berlebihan untuk menambahkan terlalu banyak kode untuk membuatnya sempurna. Anda secara teknis benar, dan saya mengerti kode saya tidak banyak, tapi pada saat yang sama kadang-kadang lebih baik berbuat salah pada kode yang lebih kecil dan lebih jelas daripada memilih kesempurnaan. Mengingat kemampuan Java saya, bahkan membuat pseudocode yang Anda gambarkan kompilasi akan membuat saya meniup anggaran saya untuk ini (), namun terimakasih atas deskripsi yang jelas. Ndash Pete855217 31 Agustus 11 at 2:23 Hmmm, ini bukan tentang kesempurnaan, tapi tentang praktik industri mapan yang telah kita ketahui selama 3 dekade terakhir. Kode bersih selalu satu yang dipartisi. Kami memiliki beberapa dekade bukti yang menunjukkan bahwa ini adalah cara untuk pergi dalam kasus umum (dalam hal efisiensi biaya, pengurangan cacat, pemahaman, dll.). Kecuali itu adalah kode membuang jauh untuk hal satu kali. Tidak perlu melakukan hal ini bila seseorang memulai analisis masalah dengan cara ini. Coding 101, memecah masalah dan kode berikut, tidak berlebihan atau sulit) ndash luis. espinal 31 Agustus 11 at 15:55 Tugas Anda terlalu sederhana dan pendekatan yang Anda adopsi tentu saja bagus untuk pekerjaan itu. Namun, jika Anda ingin menggunakan desain yang lebih baik, Anda harus menyingkirkan semua gerakan angka itu dengan lebih baik menggunakan antrian FIFO dan memanfaatkan metode push and pop dengan baik sehingga kode tersebut tidak mencerminkan pergerakan data apa pun, hanya dua tindakan logika. Data baru dan hapus data lebih tua dari 7 hari. Jawab 30 Agustus pukul 14:49

No comments:

Post a Comment