5

No soy un programador experto, pero estoy intentando cambiar la forma en que se muestran algunos indicadores técnicos en un paquete de gráficos financieros llamado TradeStation (no el proveedor de gráficos específico es relevante).La ayuda sobre la manipulación de una serie de precios (indicador) oscila alrededor de un valor de centro

Aquí está el problema: la mayoría de los indicadores se trazan alrededor de un punto Cero, a veces oscilan cerca de este punto y, a veces muy lejos. Me gustaría cambiar la forma en que se trazan los indicadores para que oscilen mucho más de cero. Pero aquí está la parte difícil, no deseo distorsionar demasiado su forma; algunos cambios son buenos e inevitables, pero aún me gustaría que los indicadores sean reconocibles por lo que originalmente eran.

En el pasado lo he intentado de muchas maneras, una forma era usar una escala de tipo logarítmico, pero esto no fue exitoso ya que hizo que cualquier oscilación de un valor muy alto fuera casi inconsecuente, que no es el objetivo. El objetivo es tratar de mantener casi cualquier oscilación del indicador, pero cambie la ubicación de la misma de modo que esté más cerca de Cero (centro). O dicho de otra manera; el objetivo es hacer que los indicadores realicen oscilaciones de forma similar, pero el centro de estas oscilaciones debe estar más cerca de Cero (el centro de la escala de indicadores).

¿Alguien sabe o puede pensar en una forma de hacerlo? ¿Hay algún algoritmo que pueda ayudar a mantener oscilando más series de precios alrededor de un punto central sin demasiada distorsión con respecto al original?

Cualquier ayuda sobre esto sería muy apreciada, gracias.

ACTUALIZACIÓN == == enter image description here La línea rosa es el oscilador original, la línea de negro me he basado en. Crudamente representa lo que mi objetivo sería para esto. Las áreas en un círculo muestran dónde la línea dibujada cruza el cero, de modo que su valor cero está aproximadamente en el centro de la oscilación ... Pero la forma general de la oscilación sigue siendo reconocible en comparación con la original, también hay menos discrepancias en los máximos y bajos de cada oscilación; es decir, son más similares en valor. He intentado agregar varias funciones diferentes de Detrend a varios indicadores, pero he descubierto que esto distorsiona la forma demasiado.

ACTUALIZACIÓN 2

He intentado dividir reduciendo linealmente el eje y en un 50% y un 80%, por desgracia esto parece simplemente actuar de la misma era como un factor de escala lo haría? ¿Es esto correcto? No parece cambiar la relación entre diferentes oscilaciones. Si ve mi diagrama de ejemplo, la línea negra dibujada tiene oscilaciones altas y bajas más estables, es decir, son más similares en valor/tamaño y este es el objetivo clave.

A continuación, voy a tratar de agregar un filtro de paso alto a la trama para ver qué resultado da y si está más cerca de mi objetivo.

Como de costumbre, siéntase libre de publicar cualquier comentario, ya que se reciben con gratitud.

Chris

ACTUALIZACIÓN 3

Hola chicos, también han aplicado un filtro de paso alto para un indicador. Esto tampoco funcionó. Esto también parece actuar como un factor de escala. Lo que busco esencialmente es hacer que las oscilaciones grandes sean más pequeñas y las oscilaciones pequeñas más grandes.Llevar cualquier indicador usado a un rango más sincronizado, y hacer esto mientras se mantienen las propiedades básicas del indicador en cuestión ... ¿Una mejor forma de describirlo es que estoy buscando una fórmula de amortiguación?

¿Alguien tiene alguna otra idea o cosas que debería intentar? ¡¡¡Aclamaciones!!!

+0

Una imagen vale más que mil palabras - ¿Se puede publicar un gráfico de la muestra, y una muestra de la carta 'modificado' que representaría lo que quiere? –

+2

@Christopher Permítanme darle la bienvenida a StackOverflow y recordarles tres cosas que solemos hacer aquí: 1) A medida que reciba ayuda, trate de darle también ** respondiendo preguntas ** en su área de experiencia 2) ['Lea las preguntas frecuentes' ] (http://tinyurl.com/2vycnvr) 3) Cuando vea buenas preguntas y respuestas, vote por ellas ['usando los triángulos grises'] (http://i.imgur.com/kygEP.png), ya que la credibilidad del sistema se basa en la reputación que obtienen los usuarios al compartir sus conocimientos. Recuerde también aceptar la respuesta que resuelva mejor su problema, en caso de haberlo, ['presionando el signo de la marca de verificación '] (http://i.imgur.com/uqJeW.png) –

+0

@Christopher: use el mismo correo electrónico para iniciar sesión. Por lo tanto, podrá editar sus preguntas, etc. Ahora ha creado 2 cuentas: [this] (http://stackoverflow.com/users/679441/christopher) y [this] (http://stackoverflow.com/users/680084/christopher) – abatishchev

Respuesta

4

Si desea hacer algo a medida, podría, por ejemplo, filtrar los componentes de baja frecuencia de la transformada de Fourier.

Supongamos que tenemos la siguiente señal:

enter image description here

A continuación, calcular la FFT, y mantener los componentes de frecuencia sólo el más altas. Digamos que ignoramos el primer 1.5% de los componentes. El gráfico resultante de la señal original y la oscilación resultante es:

enter image description here

HTH!

Editar 2

Esto es lo que puede esperar de un filtro pasa altos como se describió anteriormente, la adición de una amortiguación exponencial, en lugar de disponer los componentes de baja frecuencia.

programa en Mathematica (por si acaso):

centerOsc[x_] := 
    Module[{list, n, fp, coef, s}, 
    list = ([email protected][#, "Jan. 1, 2005"])[[2]] &@x; 
    n = [email protected]; 
    fp = Transpose[{N[Range[n]]/n, list}]; 
    coef = FourierDST[list, 1]/Sqrt[n/2]; 
    coef = Table[N[coef[[i]] (1 - E^(-i/6))], {i, 1, [email protected]}]; 
    s = IntegerPart[[email protected]/100]; s = 1; 
    {fp, {#, 
     Sum[coef[[r]]*Sin[Pi r #], {r, s, n - 1}]} & /@ (N[Range[n]]/ 
     n)}]; 
l = {"GE", "GOOG", "IBM", "MSFT"} ;(*Real prices from*) 
[email protected] 
Partition[ListLinePlot[centerOsc[#], 
    Axes -> False, Frame -> True, PlotLabel -> #, 
    PlotRange -> {{0.1, .9}, Full}, 
    Epilog -> Line[{{0, 0}, {1, 0}}]] & /@ l, 2] 

enter image description here

Editar 2

Sobre la base de su última actualización, parece que lo que quiere se puede conseguir más fácil. Sólo hay que ver lo que se obtiene dividiendo la reducción lineal del eje y en un 50% y un 80% (usando sus datos, extraídos de su diagrama):

enter image description here

y comparar con su trama:

enter image description here

1

La primera cosa que sugiero que se hace es demasiado estandarizar todos los indicadores a una media de 0 y una desviación estándar de 1. Esto, al menos, se centrará todos sus indicadores alrededor de 0.

http://en.wikipedia.org/wiki/Standard_score

Ralph Winters

+0

Muchas gracias personas hasta ahora. Realmente aprecio que todos ustedes pasen el tiempo para responder. Tengo mucho que hacer, ya que probablemente experimente con algunas formas diferentes que se describen aquí. ¡Estoy seguro de que tendré más preguntas y los mantendré informados a todos! – Christopher

+0

La actualización 2 ahora se ha agregado ... – Christopher

0

He marcado componente de baja frecuencia de las señales de entrada/salida en su ejemplo: enter image description here Parece realmente como @belisarius dice lo que quiere es - simplemente hacer FFT sobre la señal y eliminar partes de baja frecuencia. Es decir, necesita el algoritmo high pass filter. Por cierto, el filtro de paso alto también se puede implementar con 1D convolution y kernel de paso alto. Por ejemplo, para un kernel de 3 componentes, el kernel de paso alto podría ser [-1; 3; -1]. En mi opinión, la implementación de filtro de paso alto con convolución es la más fácil. Pero generalmente la implementación a través de FFT es la más rápida en relación con el uso de la CPU.

hth

Cuestiones relacionadas