2 votos

Cálculo del índice de fuerza EMA para el indicador de acciones

Estoy tratando de suavizar un índice de fuerza de 13 períodos EMA Elder en c +, y nadie realmente describe esto como algo más que :

Force Index(1) = {Close (current period)  -  Close (prior period)} x Volume.
Force Index(13) = 13-period EMA of Force Index(1).

Debo estar un poco espeso, pero cuando usas una media móvil con un periodo, obtienes un promedio de ese periodo, y luego lo usas como referencia para MA's de días posteriores. He calculado SMA y Exp MA para conjuntos de datos exstentes antes, pero ¿cómo se supone que se calcula el Índice de Fuerza suavizado para un período de tiempo exstente?

void indicators::EMA(input* Close1, size_t Start, size_t Period) {

vector<double> CloseRe (Close1->Close.rbegin(), Close1->Close.rend());
    vector<double> Xtemp;
    for(size_t i = Start; i < Period; i++) {
        Xtemp.push_back(CloseRe[i]); 
        }
    // cout << Xtemp.size() << endl;
    double InitXavg = (std::accumulate(Xtemp.begin(), Xtemp.end(), 0.0) / Xtemp.size());
    ExpMA.push_back(InitXavg);

    for(size_t j = Period; j < CloseRe.size(); j++) { 
        tmpEMA = ((CloseRe[j] - ExpMA[j-Period]) * (2.0 / (Period + 1.0))) + ExpMA[j-Period];
        // cout << j << " is " << CloseRe[j] << endl;
        ExpMA.push_back(tmpEMA);
        tmpEMA = 0.0;
    }

return;
}

Lo anterior calcula la media móvil exponencial, y lo que sigue se supone que calcula el índice de fuerza suavizado para un conjunto de datos extenso, con un período de 13 días. Pero no puedo decir que entienda realmente cómo se supone que funciona esto, ya que la EMA estándar sólo utiliza el precio de cierre y la media del día anterior y el multiplicador. ¿Cómo se supone que incorpora el volumen más allá del período original de 13 días?

void indicators::ForceIndexEMA(input* Close1, input* Volume1, size_t Start, size_t Period) {

vector<double> CloseRe (Close1->Close.rbegin(), Close1->Close.rend());
vector<double> VolumeRe(Volume1->Volume.rbegin(), Volume1->Volume.rend());
vector<double> FXtemp;
for(size_t i = Start; i < Period; i++) {
        FXtemp.push_back((CloseRe[i+1] - CloseRe[i]) * VolumeRe[i]); 
        }

        ForceXMA.push_back(std::accumulate(FXtemp.begin(), FXtemp.end(), 0.0) / FXtemp.size());
for(size_t j = Period; j < CloseRe.size(); j++) {
        ForceXMA.push_back(((CloseRe[j] - ForceXMA[j-Period]) * (2.0 / (Period + 1.0))) + ForceXMA[j-Period]);
        }
return;
}

Podría simplemente calcular el índice de fuerza día a día con un bucle, pero sigo viendo en todas partes cómo se supone que la media EMA suavizada da señales más fiables en ciertos escenarios. Así que mi pregunta sería lo que estoy haciendo mal aquí.... ? Entiendo que este no es un foro de programación, pero no dependo de que me lo expliquen como tal. Es que no he visto a nadie explicarlo bien del todo ? ¿Qué pasa con el volumen actual? Una EMA no funciona en general con el volumen, por lo que utilizando la forma estándar de calcular la EMA sería simplemente acercarse a los precios de cierre del día a medida que se hace un bucle a través del conjunto de datos ...

EDITAR : He conseguido hacer lo que veo como una "EMA" de los valores del índice de fuerza de 1 período aquí, pero ¿alguien podría corregirme si está mal?

void indicators::ForceIndex(input* Close1, input* Volume1, size_t Start, size_t Period) {

vector<double> CloseRe (Close1->Close.rbegin(), Close1->Close.rend());
vector<double> VolumeRe(Volume1->Volume.rbegin(), Volume1->Volume.rend());
vector<double> FXtemp;
for(size_t i = Start; i < Period; i++) {
        FXtemp.push_back((CloseRe[i+1] - CloseRe[i]) * VolumeRe[i+1]); 
        }

        ForceXMA.push_back(std::accumulate(FXtemp.begin(), FXtemp.end(), 0.0) / FXtemp.size());
for(size_t j = Period; j < CloseRe.size(); j++) {
        double daily = ((CloseRe[j+1] - CloseRe[j]) * VolumeRe[j+1]);
        ForceXMA.push_back(((daily - ForceXMA[j-Period]) * (2.0 / (Period + 1.0))) + ForceXMA[j-Period]);
        daily = 0.0;
        }
return;
}

Por lo que veo esto debería ponderar el volumen también, pero en cuanto a la lógica de la "media" del cálculo todavía estoy un poco inseguro...

0voto

Dave Skender Puntos 101

En pocas palabras, el Índice de Fuerza de Alexander Elder es un EMA de un Índice de Fuerza "crudo", que es:

# raw force index

RFI = Volume * (Close - Prev Close)

Para inicializar la EMA de RFI, habría que hacer una Media Móvil Simple (SMA) básica de la primera Period barras del daily RFI. Sin esta inicialización, usted está utilizando esencialmente 0 como la inicialización, lo cual no es terrible, pero podría tomar 100-200 barras adicionales antes de que converja a una precisión aceptable debido a la forma en que funciona la EMA.

# EMA of RFI
# For the first instance, substitute SMA of RFI for Previous Force Index (not shown)

k = 2 / (Period + 1)
ForceIndex = Prev Force Index + k * (RFI - Previous Force Index)

Por lo que veo, tu fórmula final parece ser correcta. Mi biblioteca C# .NET de código abierto incluye el fórmula del índice de fuerza y una hoja de cálculo Excel calculada manualmente. Podría valer la pena una comparación.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X