Semplice Mobile Media Java


A Simple Moving Average Implementazione in Java In diverse occasioni Ive ha voluto calcolare le metriche semplici nelle mie applicazioni Java, per esempio il numero di colpi per ora, o errori per un periodo di tempo. Mentre il calcolo delle metriche semplici non è molto difficile, il suo lavoro solo in più e Id piuttosto che trascorrere del tempo sul dominio del problema. Sono rimasto sorpreso di non trovare alcuna soluzione ampiamente accettato per metriche in Java. Ho trovato metrica ma sembrava un po 'troppo complicato e non ben documentato - Tutto quello che volevo era di calcolare una media mobile. Ho pensato al problema un po 'di più e ha deciso il suo non è un problema difficile. Ecco la mia soluzione Questo funziona con la creazione di una serie di aggiornamento della finestra dimensione di frequenza, poi un filo imposta il numero al successivo indice nella matrice sulla frequenza di aggiornamento. Il conteggio dell'intervallo è semplicemente arrayi - arrayi1, che è il valore più recente meno il valore più vecchio. Per un intervallo di 10 minuti, il conteggio più antica (i1) è esattamente 10 minuti di vita. Per aggiungere una media mobile al nostro codice prima e hanno bisogno di un contatore, utilizzando AtomicLong. Questo contatore dovrebbe essere incrementato in base agli eventi youre interessati nel calcolo (ad esempio richieste POST di un servizio REST). Abbiamo bisogno di fornire l'implementazione con accesso al contatore e che si compie attraverso l'interfaccia GetCount. Qui Ill creare una media mobile con una finestra cinque minuti che aggiorna ogni secondo. E per ottenere la media corrente chiamiamo semplicemente il metodo getAverage: un dettaglio di implementazione chiave è come la dimensione della matrice è determinata: dividendo la finestra per la frequenza di aggiornamento. Quindi una grande finestra con una frequenza di aggiornamento frequente può consumare una quantità significativa di memoria. In questo esempio, la dimensione della matrice è ragionevole 300. Tuttavia, se abbiamo creato una media mobile 24 ore con un intervallo di 1 secondo la dimensione sarebbe 86400 Una frequenza di aggiornamento più ragionevole per un periodo di 24 ore potrebbe essere ogni 5 minuti (dimensione dell'array di 288 ). Un'altra considerazione di scegliere la frequenza di finestra e aggiornamento è la finestra deve essere divisibile per frequenza. Ad esempio una finestra 2 minuti con una frequenza Update 6 secondo è ok, ma una seconda frequenza di aggiornamento 7 non è, in quanto la sua non divisibile per 120. Un IllegalArgumentException viene emessa se la frequenza di aggiornamento della finestra modulo non è zero. Questa implementazione richiede un thread per ogni media mobile, che non è molto efficiente. Una soluzione migliore sarebbe quella di condividere un filo in molte medie. Aggiornare . Ive ha aggiornato il codice di condividere un thread qui. Infine, theres un problema di stato iniziale: noi non hanno ancora i dati per l'intera finestra. Per esempio, se si dispone di una finestra di cinque minuti e solo 15 secondi di dati. Questa implementazione restituisce null fino a quando abbiamo 5 minuti di dati. Un altro approccio è quello di stimare la media. Supponiamo di avere un conteggio di 10 in 30 secondi, quindi possiamo stimare la media del 40 in 2 minuti. Tuttavia, vi è il rischio di errore significativo estrapolando i dati incompleti. Per esempio, se avessimo una raffica di 20 colpi in 2 secondi, mer essere la stima 1200 per 2 minuti, che con ogni probabilità è il modo off. Your interno per l'iterazione è tutta la matrice di modo che è il motivo per cui si ottiene sempre la stessa media (il uno per l'intero array), si deve scorrere da 0 al numero attuale di quella esterna per posto. La vostra media mobile viene aggiornato in base a j del vostro interiore per questo significa che si sostituisce i valori precedenti ogni nuovo ciclo, questo dovrebbe essere all'interno del esterna per invece di quello interno utilizzando i come indice. Si state dividendo sumj per calcolare le medie, ogni nuovo ciclo j interno si dividere per 0 la prima somma. Credo che si intende utilizzare J1, invece, l'indice non è lo stesso di punte di lunghezza corrente per la risoluzione: Evitare l'uso di variabili per le matrici di loop, è necessario utilizzare Array. length invece. Per una questione di riprodurre il problema ci potrebbe dare il problema isolato anziché il codice corrente. vale a dire: immaginate se l'errore è nei vostri input, come potremmo credere davvero usato li risposto 4 ottobre 13 alle 20:54 Si loop su tutti i dati ogni volta. Si dovrebbe avere for (int j (igtaverageLengthi-averageLength2: 0) JLT iaverageLength2 jltnumDataPoints ampamp j) (o qualcosa di simile) per la media più interno. Inoltre, movingAverageisumj deve essere modificato per gestire il caso in cui j è 0. In particolare, dovrebbe probabilmente movingAverageisumaverageLength e dovrebbe essere applicato alla fessura movingAveragei all'esterno del ciclo di media. ha risposto 4 ottobre 13 al 20:42 La prossima volta, prendere le osservazioni circa l'assegnazione fuori questione prima di postare esso. Ma dal momento che ti sembra abbastanza nuovo a questo, pensare a come si dovrebbe passare attraverso i dati, e fargli fare quello. Si dovrebbe cercare di assicurarsi che ogni ciclo si ferma al punto giusto, e ricordare che se si sarebbe fermato quando non ci sono più numeri, (come quando si sta facendo il ciclo interno e si può ottenere solo altri 3 numeri invece di 4) il programma ha bisogno di fermarsi troppo. Assicurarsi che il codice sta controllando per questo. risponde 4 13 Ottobre alle 20:56 senza alcun ulteriore dettaglio, probabilmente avete bisogno di una media mobile ponderata. In qualsiasi punto Ai nell'input array A di lunghezza N (con 0ltiltN), questo è semplicemente la media delle voci K precedenti della matrice, fino al Ai. Se vi arent K tali valori, quindi la media dei valori (I1) da A0 attraverso Ai. inclusiva. Un po 'di pensiero vi mostrerà che non avete bisogno di sommare tutti i valori K ogni volta. Basta tenere la somma e, quando ci si sposta al punto successivo (si tratta di una media mobile), sottrarre il thats valore sostituiti e aggiungere il nuovo valore che lo sostituirà. (Durante le prime K-1 punti, youll sufficiente aggiungere il nuovo valore alla somma e aumentare il contatore di 1.) In qualsiasi punto in questo processo, la media mobile è la somma divisa per il valore corrente. risponde 4 13 Ottobre alle 21:05 In una media mobile, è necessario avere un qualche tipo di dimensione della finestra. La dimensione della finestra è averageLength, così sarà simile a questa: Il ciclo for dalle ore i dati attuali e risale punti dati averageLength e li aggiunge in su. Si avrà solo una media mobile quando si ha si ha quando si dispone di punti di dati sufficienti e la media sarà la somma divisa per la lunghezza media. Nota: Non testato codice appena sudo, ma questa è l'idea. ha risposto 4 ottobre 13 alle 21:05 La vostra risposta 2017 Stack Exchange, IncMoving media - MA Abbattere Media mobile - MA Come esempio SMA, prendere in considerazione un titolo con i seguenti prezzi di chiusura oltre 15 giorni: Settimana 1 (5 giorni) 20, 22 , 24, 25, 23 settimana 2 (5 giorni) 26, 28, 26, 29, 27 settimana 3 (5 giorni) 28, 30, 27, 29, 28 a MA 10 giorni sarebbe in media i prezzi di chiusura per la prima 10 giorni come il primo punto di dati. Il punto di dati successivo sarebbe cadere il primo prezzo, aggiungere il prezzo del giorno 11 e prendere la media, e così via, come illustrato di seguito. Come osservato in precedenza, il Mas lag attuale azione di prezzo perché si basano sui prezzi passati il ​​più a lungo il periodo di tempo per il MA, maggiore è il ritardo. Così un 200 giorni MA avrà un grado molto maggiore di ritardo di 20 giorni MA perché contiene prezzi degli ultimi 200 giorni. La lunghezza del MA da utilizzare dipende dagli obiettivi di trading, con AIC più brevi utilizzati per il trading a breve termine ea lungo termine AIC più adatto per investitori a lungo termine. Il MA 200 giorni è ampiamente seguita dagli investitori e commercianti, con interruzioni sopra e sotto questa media mobile considerati importanti segnali di trading. AdG anche impartire importanti segnali di trading per conto proprio, o quando due medie cross over. Un MA crescente indica che la sicurezza è in una tendenza rialzista. mentre un MA declino indica che è in una tendenza al ribasso. Allo stesso modo, slancio verso l'alto è confermata con un crossover rialzista. che si verifica quando un MA breve termine attraversa sopra un MA-lungo termine. spinta al ribasso è confermata con un crossover ribassista, che si verifica quando un MA breve termine incrocia al di sotto di un MA-lungo termine.

Comments

Popular Posts