Detección de cambios direccionales en Python

El algoritmo

Esta semana mi mujer compartió de forma humorística un tweet en el que decía que de buena mañana su marido le hablaba de cambios direccionales, series temporales y fractales. Nos pudimos reír con el tema y fue la comidilla entre algunos amigos unos días. El caso es que estuve esta semana pasada programando algunos algoritmos sobre el tema. Para entender la envergadura del problema, valga una breve lista de algunos estudios sobre esta materia pues no es un asunto trivial.

  • Detección y análisis de CD (cambio direccional) de saltos en datos intra-día. Hvozdyk, Lyudmyla (PhD).
  • Identificación de CD basado en eventos. Alkhamees, Nora. IADS.
  • Negociación de Hombro-Cabeza-Hombro basado en CD. Li, Shengnan. CCFEA.
  • Hechos estilizados (regularidades empíricas) en CD, negociación algorítmica. Golub, Anton.
  • Negociación algorítmica. Kampouridis, Michael (PhD). Univ. de Kent.
  • Análisis de rebasamiento. Sun, Jianyong (PhD). Universidad de Essex.
  • Caracterización de CD, datos de alta frecuenca. Serguieva, Antoaneta (PhD). Computación financiera y Analítica, UCL.
  • Caracterización del CD. Gao, Jing. Universidad de Beihang.
  • Carecterización de CD: glosario y comparación. Tao, Ran (PhD). CCFEA.
  • Negociación algorítmica (proyecto de doctorado). Ye, Alan. Universidad de Greenwhich.

Y claro, uno se pregunta qué hace tanto doctor y doctorando escribiendo sobre el asunto. Y al final se tira una semana estudiando el problema y buscando la solución más sencilla. Es lo que tiene dedicarse a la ingeniería del software: cuando más fácil y más rápido, mejor.

Así que he escrito una pequeña variación del algoritmo de Bill Williams para calcular fractales. Sus aplicaciones en trading son innumerables. Desde cálculo de canales, soportes y resistencias, trading armónico, categorización de sesiones del mercado bursátil, determinación de momento y tendencia del valor de instrumentos financieros, análisis de patrones técnicos y todo lo que a quien lo explote se le ocurra.

import numpy as np
import pandas as pd
 
class Fractals(object):
    __data = None
    __peaks = None
    __valleys = None
    __column_mode = None
 
    def __init__(self):
        pass
 
    def getFractals(self, data, column_mode="high", depth=3):
        Bars = data.shape[0]
        peaksBuffer = np.empty(Bars)
        valleysBuffer = np.empty(Bars)
        peaksBuffer [ : ] = np.NaN
        valleysBuffer [ : ] = np.NaN
 
        i = depth
 
        while (i < Bars - depth - 1):
 
            is_upper_fractal = False
            is_lower_fractal = False
 
            lower_range_pos = i - depth
            upper_range_pos = i + depth + 1
            N = lower_range_pos + depth
 
            lower_range_values = data.iloc[lower_range_pos:N][column_mode].values
            upper_range_values = data.iloc[N + 1:upper_range_pos][column_mode].values
            N_value = data.iloc[N][column_mode]
 
            # Basic Fractal:
            # Peaks
            if np.append([N_value], lower_range_values).argmax() == 0 and\
                    np.append([N_value],upper_range_values).argmax() == 0:
 
                if N_value not in lower_range_values:
                    is_upper_fractal = True
                    peaksBuffer[N] = N_value
 
            # Valleys
            if not is_upper_fractal:
                if np.append([N_value], lower_range_values).argmin() == 0 and \
                        np.append([N_value], upper_range_values).argmin() == 0:
 
                    if N_value not in lower_range_values:
                        is_lower_fractal = True
                        valleysBuffer[N] = N_value
            i += 1
 
            peaksBufferSeries = pd.Series(peaksBuffer, name="peaks", index=data.index).dropna()
            valleysBufferSeries = pd.Series(valleysBuffer, name="valleys", index=data.index).dropna()
 
            self.__data = data
            self.__peaks = peaksBufferSeries
            self.__valleys = valleysBufferSeries
            self.__column_mode = column_mode
 
        return pd.merge(
            peaksBufferSeries, valleysBufferSeries, left_index=True, right_index=True, how="outer", sort=False
        )

¿Cómo se utiliza esto? Hace falta pasarle un DataFrame de pandas cuyo índice sea de tipo datetime y que esté ordenado ascendente.

Los datos

Supongamos que tenemos el siguiente DataTrame:

date open high low close
2003-05-28 08:40:00 1.1782 1.17968 1.17619 1.1795
2003-05-28 08:45:00 1.17967 1.18012 1.17967 1.18004
2003-05-28 08:50:00 1.17996 1.18007 1.17939 1.17939
2003-05-28 08:55:00 1.17932 1.17944 1.17691 1.17695
2003-05-28 09:00:00 1.17702 1.17796 1.17702 1.1779
2003-05-28 09:05:00 1.17795 1.17823 1.17759 1.17759
2003-05-28 09:10:00 1.17768 1.17805 1.17756 1.17802
2003-05-28 09:15:00 1.17791 1.17802 1.1778 1.17787
2003-05-28 09:20:00 1.17796 1.17923 1.17773 1.17923
2003-05-28 09:25:00 1.17933 1.17935 1.17786 1.17789
2003-05-28 09:30:00 1.17793 1.17832 1.17762 1.17793
2003-05-28 09:35:00 1.17794 1.17839 1.17789 1.17802
2003-05-28 09:40:00 1.17808 1.17837 1.177 1.17703
2003-05-28 09:45:00 1.17673 1.17827 1.17666 1.17827
2003-05-28 09:50:00 1.17819 1.1783 1.17779 1.17788
2003-05-28 09:55:00 1.17784 1.17872 1.17784 1.17872
2003-05-28 10:00:00 1.17847 1.17867 1.17833 1.17844
2003-05-28 10:05:00 1.17863 1.17886 1.17852 1.17862
2003-05-28 10:10:00 1.17865 1.17872 1.17771 1.17772
2003-05-28 10:15:00 1.1775 1.1787 1.17744 1.17839
2003-05-28 10:20:00 1.1784 1.17883 1.17837 1.17859
2003-05-28 10:25:00 1.17859 1.17869 1.17842 1.17855
2003-05-28 10:30:00 1.17859 1.1787 1.17839 1.17851
2003-05-28 10:35:00 1.17845 1.17874 1.17831 1.17867
2003-05-28 10:40:00 1.17866 1.17977 1.17818 1.17861
2003-05-28 10:45:00 1.17852 1.17866 1.17822 1.17856
2003-05-28 10:50:00 1.1787 1.17893 1.1786 1.1786
2003-05-28 10:55:00 1.17855 1.17855 1.17786 1.17786
2003-05-28 11:00:00 1.17769 1.17783 1.17426 1.17429
2003-05-28 11:05:00 1.17429 1.17474 1.17411 1.17456
2003-05-28 11:10:00 1.17467 1.17516 1.17462 1.17484
2003-05-28 11:15:00 1.17472 1.17517 1.17217 1.17517
2003-05-28 11:20:00 1.17518 1.17537 1.17493 1.17493
2003-05-28 11:25:00 1.17493 1.17532 1.17469 1.17511
2003-05-28 11:30:00 1.17504 1.17504 1.17436 1.17469
2003-05-28 11:35:00 1.17471 1.17563 1.17471 1.17558
2003-05-28 11:40:00 1.17559 1.17793 1.17528 1.17529
2003-05-28 11:45:00 1.17519 1.17559 1.17506 1.17547
2003-05-28 11:50:00 1.17558 1.17572 1.17533 1.17533
2003-05-28 11:55:00 1.17536 1.17536 1.17307 1.17307
2003-05-28 12:00:00 1.17268 1.17268 1.17166 1.17167
2003-05-28 12:05:00 1.17168 1.17237 1.17147 1.17224
2003-05-28 12:10:00 1.17214 1.17228 1.17194 1.17217
2003-05-28 12:15:00 1.17224 1.17237 1.17187 1.17209
2003-05-28 12:20:00 1.17205 1.17229 1.17153 1.17153
2003-05-28 12:25:00 1.17121 1.17226 1.17047 1.17204
2003-05-28 12:30:00 1.17208 1.1726 1.17181 1.17259
2003-05-28 12:35:00 1.17261 1.17264 1.17182 1.17192
2003-05-28 12:40:00 1.17203 1.17337 1.17189 1.17337
2003-05-28 12:45:00 1.17351 1.1736 1.1714 1.17153

Si el campo «date» es una columna y el dataframe se llama «data», por ejemplo, tendríamos que escribir lo siguiente para poder usarlo como argumento, pues el  índice ha de ser datetime:

data = data.set_index("date")

Por supuesto el código de la clase anterior se puede modificar para funcionar con numpy o cualquier otra biblioteca.

La aplicación

Si queremos obtener los máximos y mínimos locales de los valores «high» de nuestra serie de datos utilizando 6 valores para calcular los picos y valles, es tan simple como hacer esto:

#"data" es un DataFrame que contiene los datos de la tabla de arriba.
fr = fractals()
high_fractals = fr.getFractals(data=data,column_mode="high", depth=3)

El resultado se cargaría en la variable high_fractals y sería el siguiente:

Y para extraer los máximos, por ejemplo, solo bastaría ejecutar el siguiente código:

Con una profundidad de 2, éste sería el resultado para los datos:

import matplotlib.pyplot as plt
 
fr = fractals() 
#"data" es un DataFrame que contiene los datos de la tabla de arriba. fr = fractals() 
high_fractals = fr.getFractals(data=data,column_mode="high", depth=2)
 
fig, ax = plt.subplots()
fig.set_size_inches(10, 5)
plt.plot(high_fractals["valleys"].dropna(), marker='^', linestyle="none", markersize=7,  color="red")
plt.plot(high_fractals["peaks"].dropna(), marker='v', linestyle="none", markersize=7,  color="green")
plt.plot(data.high, color="black")
plt.show()

El resultado es más que satisfactorio para la mayoría de escenarios.  En mi caso, lo voy a mejorar añadiendo también identificación de movimientos a partir de cierto nivel (porcentaje, pips, etc). Pero, en general, este sencillo algoritmo cumple con todas las expectativas que personalmente necesito para marcar cambios direccionales en series temporales. Menos es más.

Si en vez de mostrar la serie sobre la que hemos obtenido los picos y valles, empleamos toda la serie de precios, el resultado será mucho más obvio. Para el siguiente ejemplo, vamos a utilizar un total de 200 puntos, en vez de los 50 de antes.

#cargamos un dataframe con 200 datos.
data = all_historical_data.dropna()[5000:5200]
 
fr = fractals()
 
high_fractals = fr.getFractals(data=data,column_mode="high", depth=3)
high_fractals["fractal_type"]="highs"
high_fractals=high_fractals.reset_index().set_index(["fractal_type","date"])
 
low_fractals = fr.getFractals(data=data,column_mode="low", depth=3)
low_fractals["fractal_type"]="lows"
low_fractals=low_fractals.reset_index().set_index(["fractal_type","date"])
 
# Vamos a incluir una serie de librerías que nos interesan.
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import matplotlib.dates as mdates
from mpl_finance import candlestick_ohlc
from datetime import date
import datetime
 
fig, ax1 = plt.subplots(figsize=(20,5))
ax1.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M:%S"))
 
#Creamos un conjunto de velas japonesas.
number_of_ticks = data.shape[0]
dates = data.index
x=0
ohlc=[]
while x < len(dates):
    d = mdates.date2num(dates[x])
    append_me = d, data["open"].values[x], data["high"].values[x], data["low"].values[x], data["close"].values[x]
    ohlc.append(append_me)
    x += 1
 
# Añadimos bordes a las velas.
lines, patches = candlestick_ohlc(ax1, ohlc, width=0.2*2.5/number_of_ticks, colorup="green", colordown="red")
for line, patch in zip(lines, patches):
    patch.set_edgecolor("black")
    patch.set_linewidth(0.9)
    patch.set_antialiased(False)
    line.set_color("black")
    line.set_zorder(0)
 
#Seleccionamos los máximos de los Highs (Higher Highs) y los mínimos de los lows (Lower Lows)
hfs = high_fractals.loc["highs"].drop("valleys",axis=1).dropna()
lfs = low_fractals.loc["lows"].drop("peaks",axis=1).dropna()
 
plt.plot(hfs, marker="o", linestyle="None")
plt.plot(lfs, marker="o", linestyle="None")
plt.savefig("fractals.png")
plt.show()

Y el resultado es la gráfica siguiente:

¿Y qué se puede hacer con estos puntos? Con dos puntos podemos pintar una línea, por ejemplo.

data = high_fractals["peaks"].dropna()
TF_seconds = 300 #timeframe de 5 minutos.
peaks = []
 
for i in range(1, data.shape[0]):
    peaks.append( { "type": "H", 
    "x1": data[i - 1:i].index, "y1": data[i - 1], 
    "x2": data[i:i + 1].index, "y2": data[i], 
    )
 
for point in peaks:
    diference = (point["x2"] - point['x1']).seconds[0]
    units = diference / TF_seconds
    slope = (point["y2"] - point["y1"]) / units
    slope = slope / 0.0001
    peaks[i]["slope"] = slope
    peaks[i]["units"] = units
    i += 1

Y he ahí todos los vectores directores de todas las líneas de todos los picos consecutivos. Con meta-información relativa a su pendiente e incremento de X en formato escalar (aparte de datetime). La imagen de abajo ilustra la estructura de la implementación completa, donde la pendiente está calculada en pips:

La imaginación es el límite. Podríamos utilizar estos datos para analizar varias características de nuestros vectores directores. Veamos un ejemplo con la implementación completa. Para ello vamos a unir en un solo dataframe todos los fractales y todos los vectores directores en segundo lugar:

all_analyzed_data=pd.concat([high_fractals,low_fractals])

Lo que nos generaría una estructura similar a ésta:

Con los datos de los fractales, vamos a generar los vectores directores entre cada punto y todos los puntos posteriores al mismo.

Digits=4
# Low peaks -> the lower high points
# Low valleys -> the lower low points
# High peaks -> the Higher high points
# High valleys -> THe Higher high points
 
tl_higher_highs = Trendlines(dataframe=all_analyzed_data.loc["highs"],column_mode="peaks",seconds=300, digits=Digits)
tl_higher_lows = Trendlines(dataframe=all_analyzed_data.loc["highs"],column_mode="valleys",seconds=300, digits=Digits)
 
tl_lower_lows = Trendlines(dataframe=all_analyzed_data.loc["lows"],column_mode="peaks",seconds=300, digits=Digits)
tl_lower_highs = Trendlines(dataframe=all_analyzed_data.loc["lows"],column_mode="valleys",seconds=300, digits=Digits)

Cada una de las cuatro variables, tendría una estructura similar a ésta:

Cada fila de la tabla anterior representa un vector director que une dos puntos de los identificados con el algoritmo de fractales del principio. Como estoy analizando los Higher Highs, me voy a centrar en los picos. Los datos del dataframe incluyen:

  • Tipo de vector: valle o pico.
  • x1: fecha del primer punto.
  • y1: precio del primer punto.
  • x2, y2: fecha y precio del segundo punto.
  • height: Altura entre y1 e y2.
  • pips: Altura entre y1 e y2 en pips.
  • slope: pendiente del vector en pips por unidades temporales (pips/5m en este caso).
  • width: Distancia horizontal en número de unidades temporales entre el punto 1 y el punto 2 (cada unidad temporal son 5 minutos en este caso).

Quitamos información innecesaria y preparamos el dataset para su análisis.

data_hhs = tl_higher_highs.getFractalsVectors()
data_hhs_peaks=data_hhs.reset_index().drop(["x1","x2","index_type"],axis=1)

Con lo que ahora tenemos el siguiente DataFrame:

Veamos algunas características. Como la distribución de número de pips de cada vector director.

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
from scipy import stats
 
sns.distplot(data_hhs_peaks["pips"].values)
plt.show()

Comparar la altura en pips de los puntos con la pendiente de la recta que los une.

df = data_hhs_peaks[["pips","slope"]]
#df = df[df.slope.apply(abs)<=1.5]
df.columns = ["x","y"]
 
g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="brown")
g.plot_joint(plt.scatter, c="b", s=30, linewidth=1, marker="+")
g.ax_joint.collections[0].set_alpha(0)
g.set_axis_labels("$Pendiente$", "$Altura$");

Y comprender mejor el entorno sobre el que estamos trabajando. Porque no es sino con la comprensión profunda del problema, con lo que más oportunidades tenemos para encontrar soluciones óptimas.

Entornos de Inteligencia Artificial para Trading y Simulando Ticks

A estas alturas, si has estado intentando diseñar modelos de machine learning  o inteligencia artificial para hacer trading, ya te habrás dado cuenta de que la cosa no es tan fácil como normalizar unos cuantos datos históricos de Forex o Bolsa, meterlos en una red neuronal y esperar que tu output tipo {mantener, comprar, vender} te salga lo suficiente bien balanceado como para que la red negocie por ti.

De hecho, en el pasado, mi experiencia es que arquitecturas como XGBOOST daban mejores predicciones con datos suavizados con medias móviles de 2 o 3 muestras que perceptrones o LSTMs.

Todo depende del tiempo que uno tiene disponible. Si es poco, como en mi caso, lo mejor es ir primero a los más seguro y luego ir refinando el trabajo para poder, con la mayor brevedad posible, aprobar o descartar una metodología. Lo de «la mayor brevedad» es un concepto bastante relativo.

En mi caso, la mayor brevedad han sido unos cinco años de trabajo intenso más un esfuerzo financiero relevante. En mi caso, como ya he comentado en otras entradas, he estudiado casi todas las técnicas de trading, las he probado, validado; una tras otra, durante años. Tanto el trading manual como el trading algorítmico. Es decir, que no solo he estudiado trading o pagado por aprender, sino que además he tenido que investigar mucho sobre algoritmos, estructuras, lenguajes, estadística (incluyendo un master en Ciencia de Datos), probabilidad, machine learning, inteligencia artificial y otras materias relevantes.

En ese sentido, se puede decir que me he hecho una idea genérica relativamente amplia del asunto. Escribo este rollo, no para ponerme medallas, sino para que quien lea este texto entienda que el trading no es llegar y triunfar. En el mejor de los casos hacen falta entre 3 o 5 años para empezar a entenderlo y puede que la tasa de fracaso sea del 95%. Esto es, que de cada 100 personas que intentan hacer trading, solo 5 conseguiran cubrir costes y un porcentaje menor ganar algo. Y no solo depende de lo buena que sea la técnica utilizada, el 80% de los factores van a ser ajenos al dominio de una técnica de trading determinada. De hecho, no me pongo medallas porque no enseño mis técnicas gratuitamente nunca. Tengo por ahí una mención a un seminario de 5 días de trading por 12000 euros por si alguien tiene curiosidad por saber qué principios y técnicas utilizo.

Lo que voy a mostrar ahora es una implementación personalizada de un proveedor de datos virtual; que es más sencillo de programar que un canal de comunicación con mi broker, de forma que puedo hacer simulaciones y estudios exactamente igual que si estuviera conectado, pero con mucho menos esfuerzo. Con bastante esfuerzo, pero con mucho menos.

A estas alturas ya funciona razonablemente bien, es un borrador del final, pero ya tiene suficiente complejidad para que valga la pena como ejemplo. Me he programado un broker virtual también, porque me gusta la modularidad. Este broker puede recibir datos de distintas fuentes. Para ello, uso una interfazclase abstracta (depende del lenguaje) que define unos métodos y propiedades iguales, sea cual sea la fuente de datos.

Una de las fuentes de datos que utilizo son ficheros csv en formato tick (date, ask, bid). Estos los he convertido en OHLC para Ask y OHLC para bid en marcos temporales de 1-minuto y 5-minutos. Para mí es suficiente, pero si alguien quiere más granularidad y exactitud, puede usar directamente los datos ask-bid, o hacer un muestreo a 30-segundos, 10-segundos, etc. para los datos tick. Para que se entienda mejor, tengo:

  1. Un único csv con todos los datos OHLC en el marco temporal de 5-minutos entre 2003 y 2019. Este fichero se utiliza para dibujar la gráfica OHLC, entrenar un modelo estadístico o lo que sea.
  2. Un fichero por año de datos OHLC en el marco temporal de 1-minuto. Este fichero se utiliza para extraer los ticks que tendrán lugar hasta que la siguiente barra OHLC se tenga que dibujar. Son como los datos que nos van llegando del broker en tiempo real y muestran cómo va cambiando el precio del instrumento.

Como observación, estuve decidiendo si utilizar datos tick ASK/BID, pero me pareció que tanta precisión no era necesaria y que iba a utilizar un generador de ruído para calcular el spread mediante un generador de números aleatorios con una distribución T de student o bien promediando High-Low de mi muestra histórica. Pero eso es otra historia. Recordemos que compramos a precio Ask, pero vendemos a precio Bid. La comisión por operación también tiene que tenerse en cuenta, por ejemplo.

Vamos a plantear el sistema:

Datos históricos en 5 minutos
(última fila, núm. filas=n)
(AMD = año-mes-día)

Datos en «tiempo real» en 1 minuto
(todos los ticks desde que cierra la vela histórica hasta que abre la siguiente).
Date Open High Low Close
AMD 08:00:00 On Hn Ln Cn

Tengamos en cuenta que la vela de 8:00 en el TF de 5m contiene todos los precios entre las 8:00 y las 8H 4' 59''.

Por lo que las señales en tiempo real tienen que empezar a las 8H 5' 00''.

Date Open High Low Close
AMD 08:05:00  O1 H1  L1  C
AMD 08:06:00 O2 H2  L2  C
AMD 08:07:00 O3 H3  L3  C
AMD 08:08:00 O4 H4  L4  C
08:09:00 O5 H5  L5  C

Empecemos con el código:

# Como está orientado a csv, entonces no voy a incluir información sobre conexiones mediante sockets, puertos, ejecutables, etc...
# Definimos una clase abstracta que sirva de interfaz para el resto que vengan.
 
class Provider_abstract():
 
    def __init__(self):
        raise NotImplementedError
 
    def getRTPricesNext(self):
        raise NotImplementedError
 
    def getHistPricesNext(self):
        raise NotImplementedError
 
    def setTickDataPath(self):
        raise NotImplementedError
 
    def setHistoricalFile(self):
        raise NotImplementedError

Los métodos tendrán las siguientes funciones:

  • getRTPricesNext: Devuelve el dataframe con los ticks.
  • getHistPricesNext: Devuelve un histórico de precios.
  • setTickDataPath: El directorio donde están los datos tick.
  • setHistoricalFile: La ruta al fichero con los datos históricos.

Y ahora procedemos a la implementación, veamos el código completo primero.

from gym_gspfx.gspProviders.provider import Provider_abstract
import pandas as pd
 
# Reads TF data and generates tick data from the same or other data source.
# For instance, reads 5m data nd generates ticks from 1m data.
 
class Provider(Provider_abstract):
 
    def __init__(self, historical_file, tick_data_path, start_row=0, number_of_samples=300, \
                 tick_file_prefix="EURUSD_1M_"):
 
        self.min_year=None
        self.max_year=None
        self.__historical_file = ""
        self.__tick_data_path = ""
        self.setHistoricalFile(historical_file)
        self.setTickDataPath(tick_data_path)
        self.current_start_row_index = None
        self.number_of_samples = number_of_samples
        self.next_future_start_row = start_row
        self.last_closed_row = None
        self.next_future_row_to_deliver_index = 0
        self.next_two_future_rows_to_deliver = None
        self.__tick_data_files = {"EMPTY": None}
        self.tick_file_prefix=tick_file_prefix
 
 
    def setHistoricalFile(self,fileName):
        self.__historical_file = pd.read_csv(fileName, parse_dates=["date"]).set_index("date")
 
    def setTickDataPath(self, tick_data_path):
        self.__tick_data_path=tick_data_path
 
 
    def getHistPricesNext(self):
        self.current_start_row_index = self.next_future_row_to_deliver_index
        self.next_future_row_to_deliver_index += 1
 
        __df = self.__historical_file.iloc[self.current_start_row_index:self.current_start_row_index + self.number_of_samples]
 
        self.last_closed_row = __df.tail(1)
 
        self.next_two_future_rows_to_deliver = pd.DataFrame( \
            self.__historical_file.iloc[self.current_start_row_index + self.number_of_samples:\
                                        self.next_future_row_to_deliver_index + self.number_of_samples + 1])
        return __df.copy()
 
 
    def getRTPricesNext(self):
 
        if self.last_closed_row is None:
            return None
 
        if "EMPTY" in self.__tick_data_files.keys() and self.__historical_file.shape[0]>0:
            del self.__tick_data_files["EMPTY"]
 
        self.min_year = self.last_closed_row.index.year.values[0]
        self.max_year = self.next_two_future_rows_to_deliver.head(1).index.year.values[0]
 
        if self.max_year not in self.__tick_data_files.keys():
            self.__tick_data_files[self.max_year] = \
                pd.read_csv(self.__tick_data_path + "EURUSD_1M_" + str(self.max_year) + ".csv", parse_dates=["date"])
 
            if self.min_year in self.__tick_data_files.keys() and self.min_year != self.max_year:
                del self.__tick_data_files[self.min_year]
 
        initial_date = self.next_two_future_rows_to_deliver.head(1).index.values[0]
        end_date = self.next_two_future_rows_to_deliver.tail(1).index.values[0]
 
        __df = self.__tick_data_files[self.max_year]
        __df = __df[(__df["date"] >= initial_date) & (__df["date"] < end_date)]
 
        return __df.copy()

El método __init__ se encarga de parametrizar los valores iniciales de la clase, como la fila del histórico desde el que se comenzará a extraer datos, el número de filas del histórico que se extraerán. También se han de definir al instanciar la clase la ruta completa al fichero de históricos y la carpeta donde están los ficheros de ticks.

Los ficheros de ticks los guardo en un diccionario conforme los necesito por motivos prácticos. He optado por usar ficheros de 1m, pero podría tener otra estructura y he preferido prever la posibilidad de tener que utilizar ficheros de tick múltiples. Todo ello se define en el constructor, junto con atributos que serán utilizados por la clase.

 def __init__(self, historical_file, tick_data_path, start_row=0, number_of_samples=300, \
                 tick_file_prefix="EURUSD_1M_"):
 
        self.min_year=None
        self.max_year=None
        self.__historical_file = ""
        self.__tick_data_path = ""
        self.setHistoricalFile(historical_file)
        self.setTickDataPath(tick_data_path)
        self.current_start_row_index = None
        self.number_of_samples = number_of_samples
        self.next_future_start_row = start_row
        self.last_closed_row = None
        self.next_future_row_to_deliver_index = 0
        self.next_two_future_rows_to_deliver = None
        self.__tick_data_files = {"EMPTY": None}
        self.tick_file_prefix=tick_file_prefix

Tras ello, los métodos que cargan el fichero de históricos y configuran la ruta de los ficheros de ticks.
Nótese que utilizo la librería de pandas y que asumo que los datos vienen ya ordenados por fecha, ascendente.

    def setHistoricalFile(self,fileName):
        self.__historical_file = pd.read_csv(fileName, parse_dates=["date"]).set_index("date")
 
   def setTickDataPath(self, tick_data_path):
       self.__tick_data_path=tick_data_path

Cada vez que queremos avanzar 1 vela, tenemos que llamara a este procedimiento.
El procedimiento devuelve un DataFrame con el número de filas indicado en el constructor o modificado en el atributo number_of_samples.
Cada vez que se le llama, avanza 1 fila.

    def getHistPricesNext(self):
        self.current_start_row_index = self.next_future_row_to_deliver_index
        self.next_future_row_to_deliver_index += 1
 
        __df = self.__historical_file.iloc[self.current_start_row_index:self.current_start_row_index + self.number_of_samples]
 
        self.last_closed_row = __df.tail(1)
 
        self.next_two_future_rows_to_deliver = pd.DataFrame( \
            self.__historical_file.iloc[self.current_start_row_index + self.number_of_samples:\
                                        self.next_future_row_to_deliver_index + self.number_of_samples + 1])
        return __df.copy()

Por útlimo, tenemos el método que nos devuelve todos los ticks que se producirán desde el cierre de la última vela de los históricos hasta justo antes de la apertura del siguiente.

   def getRTPricesNext(self):
 
        if self.last_closed_row is None:
            return None
 
        if "EMPTY" in self.__tick_data_files.keys() and self.__historical_file.shape[0]>0:
            del self.__tick_data_files["EMPTY"]
 
        self.min_year = self.last_closed_row.index.year.values[0]
        self.max_year = self.next_two_future_rows_to_deliver.head(1).index.year.values[0]
 
        if self.max_year not in self.__tick_data_files.keys():
            self.__tick_data_files[self.max_year] = \
                pd.read_csv(self.__tick_data_path + "EURUSD_1M_" + str(self.max_year) + ".csv", parse_dates=["date"])
 
            if self.min_year in self.__tick_data_files.keys() and self.min_year != self.max_year:
                del self.__tick_data_files[self.min_year]
 
        initial_date = self.next_two_future_rows_to_deliver.head(1).index.values[0]
        end_date = self.next_two_future_rows_to_deliver.tail(1).index.values[0]
 
        __df = self.__tick_data_files[self.max_year]
        __df = __df[(__df["date"] >= initial_date) & (__df["date"] < end_date)]
 
        return __df.copy()

Estudiando el código anterior se puede hacer una idea de cómo realizar un proveedor de ticks y datos financieros personalizado, así como adaptarlo a las necesidades propias. Una aplicación puede ser un simulador de trading por ejemplo. Yo lo uso para mis proyectos de inteligencia artificial, de manera que no necesito estar conectado a ningún proveedor de precios online para simular series temporales y mercados financieros.

En la siguiente imagen se muestra cómo usar la clase creada con un ejemplo real.

Generador de datos históricos y tick en Python

Y si volvemos a ejecutar los métodos, obtenemos la vela siguiente con sus históricos y los ticks correspondientes.

Si alguien no conoce la librería Pandas y no entiende alguna de las expresiones del código, se pueden consultar en la documentación oficial, en el siguiente enlace: http://pandas.pydata.org/pandas-docs/stable/

Y preguntados:

  • ¿Cómo puede obtenerse algo negociando si no es desarrollando una técnica para acertar las suficientes veces como para cubrir los costes de los fallos?
  • ¿Cómo puede mantenerse un negocio sin conocer el riesgo asociado y una buena gestión financiera y de riesgos conforme?
  • ¿cómo podría un cerebro humano ser mejor calculando aspectos técnicos y numéricos que una compleja computadora?

Principios de negociación armónica. Desde Leonardo hasta Scott.

Efecto Marea en sesiones de trading

En la entrada titulada «Extensiones de Fibonacci, incertidumbre y refuerzo«, se describe la serie descubierta por Leonardo de Pisa, más conocido por Fibonacci. Pero, ¿por qué estudiar una mera serie exponencial puramente matemática para negociar las variaciones de precios que sufren los activos?

Si vives en Europa y trabajas, tu horario de trabajo coincide con el horario de apertura de los principales mercados financieros. O mejor dicho con el solapamiento de Reino Unido, Europa y Estados Unidos. Si ignoramos los picos de la sesión Asiática, es entre las 10:00AM y las 17:00PM CET cuando vale la pena operar las principales divisas (euro, dólar, yen…). En estos casos, la actividad de trading, si operas intradía, la realizas justo en los horarios de finalización y cierre de los principales mercados financieros; por lo que la mayor parte de la actividad financiera ya ha sido realizada y los operadores se retiran.

A priori se podría pensar que esto supone un estancamiento de las negociaciones y una consolidación de los precios hasta la siguiente sesión, un cese de los movimientos de precios. Pero lo que se observa es que se produce un retroceso de los precios paulatino, continúa la actividad. En términos prácticos, si la tendencia intra-día era ascendente, de repente ésta se invierte muchas veces de forma drástica; por lo que si se opera pensando en términos de tendencia, en estas horas suelen observar movimientos contrarios.

En cuanto a mí, mis estrategias funcionaban como un reloj durante la sesión, pero no eran tan fiables al final de las sesiones, dado que en una hora determinada  el momento se invertía y tenía que replantear toda la estructura de precios e invalidar la preliminar, necesitando cerrar operaciones y abrir nuevas en sentido contrario.

Anteriormente había estudiado y puesto en práctica las obras de L.A. Little sobre la determinación de tendencias y de Bob Volman sobre estructuras de precios; intercambiando incluso algún e-mail con éste último. Por ese motivo, recordando algunas de las referencias de mi amigo y trader Carlos Valverde a Richard Demille Wyckoff, en referencia al perfeccionamiento de la teoría de ondas de Ralph Nelson Elliott; empecé un estudio del sistema de Wickoff. Fuera por su caracterización más categórica, fuera por otro motivo; al igual que me sucedió con la teoría de Elliott cuando estaba en la facultad de Empresariales, no encontré de mi gusto la forma de analizar los mercados. El libro «Trades About to Happen», de David H. Weis sobre el método Wickoff fue el último que leí sobre el tema, el cual por otro lado describía un sistema de trading bastante parecido al que yo ya seguía en ese momento.

Al tener una forma de pensar muy numérica, mis sistemas deben de ser reproducibles mediante codificación algorítmica para que les dé validez. El sistema actual que utilizo tiene menos de un pip de margen de error; esto es, lo cierro si el precio excede en un solo pip mi nivel de entrada. Esto significa que la entrada es extremadamente precisa o se invalida. Veamos un ejemplo:

Compra con stop loss y take profit.

Si quisiera comprar en el nivel de la línea horizontal verde, el stop loss lo pondría donde está la línea roja (justo abajo) y el take profit en un punto superior. En el ejemplo la línea azul. Si no consigo realizar mis operaciones sin que el stop loss no se active, entonces no utilizaría esa técnica hasta perfeccionarla más y poder operar con niveles muy bajos de stop loss.

Análisis armónico de precios

Como comencé a explicar en el artículo mencionado, «Extensiones de Fibonacci, incertidumbre y refuerzo«, las ratios primaras de fibonacci son las siguientes:

  • 1  (\(\frac{N}{N}\) )
  • 0 (\(N-N\) o \(\frac{0}{N}\))
  • 1.618 (\(\phi\) o «ratio de oro»), división de dos números consecutivos de la serie de Fibonacci (\(\frac{N_i}{N_{i-1}}\))
  • 0.618, inversa de \(\phi\), resultado de dividir dos números consecutivos a la inversa (\(\frac{N_{i-1}}{N_i}\)).
  • 0.382 (\(0.618^2\))
  • 0.786 (\(\sqrt{0.618}\))
  • 1.27 (\(\sqrt{1.618}\))
  • 2.24 (\(1.618 + \frac{1}{1.618}\)) o \(\phi +\frac{1}{\phi}\)
  • 2.618 (\(\frac{N_i}{N_{i-2}}\))

Otros números complementarios y auxiliares se utilizan en cáculo armónico, incluyendo:

  • 3.14 o número Pi.
  • 0.5 (\(\frac{N}{2}\)). Nótese que \(\phi +\frac{1}{\phi}\) es equivalente a \(\sqrt{0.5*10}\).

Para aplicar las ratios de Fibonacci y los complementarios necesitamos al menos cuatro puntos al los que llamamos A, B, C y D.

Puntos AB=CD, retroceso y expansión de Fibonacci.

Las ratios se miden en función de la diferencia de precios o alturas de los cuatro puntos entre ellos. Lo importante no es la longitud de las líneas que los unen, sino la diferencia de altura.

En el caso de la imagen anterior, los puntos serían los siguientes:

  • AB = 1 o 100% del intervalo de precios de referencia.
  • AC = 0.618 o un retroceso del 61.8% respecto a la longitud recorrida entre AB.
  • CD = 1 de expansión o una distancia igual a AB que ha sido recorrida desde el punto C hasta el punto D.

Así pues, los números inferiores a 1 son retrocesos y los superiores a 1 son extensiones. Y todas estas ratios hacen referencia a un segmento llamado AB, que representa la altura o diferencia de precios entre un nivel de precios A y otro B.

Este patrón AB = CD, en el que tras un retroceso C, luego se produce una expansión de la misma longitud que el segmento AB es muy frecuente. Existen diferentes formas de determinar cuándo un patrón AB=CD va a comenzar o terminar, no obstante lo importante es entender el concepto subyacente más que cómo asignar correctamente un punto A en una gráfica, cosa que se aprende de forma natural al estudiar gráficas.

Aplicación de la teoría de negociación armónica

De los números de armónicos presentados anteriormente, los más importantes son 0.618, 0.786, 1.27 y 1.618. El resto de números se suelen usar para complementar las extensiones y retrocesos del segmento AB calculados en base a los cuatro números anteriores. Por ejemplo, si la extensión 1.27 de AB coincide con la extensión 2.24 de BC en el punto D, tenemos una confluencia de ratios que otorga mayor significación a ese nivel de precios.

Donde concurren estos niveles se espera que haya reacciones importantes en los precios, en concreto, se estudian los patrones que definen qué niveles de precios van a ser puntos probables de retorno del precio. Dicho de otra manera, se sabe que esos niveles producen que el precio deje de avanzar y retorne hacia su origen cuando llega a los mismos. Este hecho se estudia, determinando qué relación hay entre los segmentos ABCD, y a veces otro principal llamado X; así como otros segmentos secundarios que pueden incluso ser A,B,C,D,a,b,c,d,X, etc…

El punto de partida es comprender que ABCD para AC=0.618 suele corresponder con AD = 1.618 y que AC=0.786 suele corresponder con AD=1.27, por lo que en función de los retrocesos iniciales, las expansiones suelen tener unas magnitudes proporcionales. Retrocesos de tan solo 0.382 suelen corresponderse con expansiones extremas que pueden fácilmente llegar a 2.618 o 3.14.

A efectos prácticos, si entramos en una operación por el motivo que sea y vemos que ese nivel corresponde con un retroceso en el nivel 0.786, es prudente tomar beneficios en el nivel 1.27 como mucho y esperar a ver qué sucede para decidir seguir en el mercado, entrar o salir.

Scott M. Cartney, el negociador armónico

De la decena aproximada de libros que he leído de trading con Fibonacci, sin duda el libro «The Harmonic Trader», escrito por Scott M. Cartney es el punto de partida; incluso el texto suficiente para entender los pormenores de la negociación armónica. Sus otros tres libros de la serie «Harmonic Trading» son más avanzados y no suplen la información de este primero, imprescindible.

El resto de libros que he leído sobre trading de alta probabilidad, trading con Fibonacci no me han valido para nada y por ese motivo desaconsejo la lectura de otros textos sobre este tema, de no ser que se haya antes completado la lectura de la obra de Scott M. Cartney en cuanto a negociación armónica.

Por si queda la duda, la siguiente gráfica de 5 minutos de GBPUSD del viernes pasado ilustra perfectamente los principios mencionados en el artículo.

En primer lugar, los dos retrocesos que sufre el precio mientras desciende, se detienen al llegar al área del 0.618.

Si calculamos las expansiones que sufren los precios tras romper el primer nivel de soportes, calculando el segmento principal XA = 1 y las proyecciones desde C hacia abajo, en relación a la longitud de XA, podemos observar cómo también se respetan los niveles de Fibonacci y cómo se crea un fuerte soporte en el nivel 1.618; tal como era de esperar tras una secuencia de retrocesos hasta 0.618. Además, el nivel D, en el que el precio sufre un brusco retroceso corresponde con la conclusión del patrón XA=CD (equivalente al principio de AB=CD, cuando solo hay 4 puntos).

Como conclusión, la negociación armónica de precios no es sencilla. En este artículo presento principios de la misma, no una estrategia de negociación basada en armónicos. Si ya cuentas con una estrategia propia, el análisis de armónicos puede ayudarte en gran medida para entender cuándo te encuentras en soporte y cuándo te encuentras en resistencia, así como para entender si la oferta o demanda tienen probabilidades de estar exhaustas, en contra de lo que intuitivamente la gráfica de precios o tus indicadores te están mostrando.

La forma de comprender el trading basado en series de Fibonacci es mediante el análisis de patrones armónicos, un tema más avanzado a la vez que imprescindible para poder empezar a aplicar el análisis armónico de precios a una estrategia de trading determinada. En la siguiente imagen se observa la estructura de un patrón tipo Gartley 222, en el cual, si se dan las condiciones favorables y se forma la estructura descrita, se vende en el punto D.

Patrón Gartley 222

Son los patrones los que nos ayudan a interpretar el estado general de la estructura de los precios. En mi caso, la estructura de la sesión diaria, en la de un inversor, la estructura de precios de los últimos años; pues si tienen una cosa es que los patrones técnicos son válidos para cualquier marco temporal. De hecho cuando empecé a practicarlo, lo hice con gráficas de 1 minuto, pues los patrones técnicos son totalmente fractales.

En la imagen siguiente comparto un análisis de armónicos realizados sobre un simulador de trading, que utilizo a menudo, con datos reales de EURUSD.

Análisis de armónicos de precios en EURUSD H1.

Trading sin Stop-Loss a pérdida

No hablamos de stop-loss de emergencia

Siempre es necesario establecer un stop-loss de emergencia; un nivel crítico en el que las operaciones se cierren solas en caso de un evento catastrófico. En el momento que perdemos el control de las operaciones y el mercado sufre un shock que nos pueda arruinar, debemos de tener un mecanismo que cierre todo en un nivel aceptable de pérdida.

Las variaciones de precios en mercados financieros no siguen una distribución normal, por lo que los valores atípicos superan con creces las dos desviaciones estándar típicas de VAR. Esto, sumado con que las variaciones extremas suelen agruparse en sucesos consecutivos, requieren sin duda un nivel global de stop-loss con independencia del estado del mercado. Parte fundamental del trading es establecer siempre dicho nivel máximo de pérdida y ajustar el marco temporal y el tamaño de cada posición para que dicho nivel solo se alcance cuando sucedan eventos inesperados que pongan en riesgo la cuenta de trading y las ganancias hasta la fecha.

Así pues, no voy a hablar del necesario estudio y definición de los niveles de riesgo financiero que deben incorporarse a cualquier sistema de trading o negocio, al punto en el que un negocio ruinoso debe clausurarse para evitar que arrastre a toda la empresa consigo.

No hablamos estrictamente de stop-loss a ganancia

Hay otro tipo de stop-loss que resulta muy conveniente y permite asegurar ganancias. Se trata de una técnica complementaria al aumento y descenso incremental del tamaño de la posición.

Existen varias formas de implementar esta estrategia. Una técnica consiste en abrir más de una posición por operación. Se establecen varios niveles de beneficio. Cuando se alcanza el primer nivel, se cierra una de las posiciones y se asigna inmediatamente un stop-loss a las siguientes a nivel del umbral de rentabilidad de cada posición, de manera que si el precio se vuelve en contra, se cierren todas a la vez y la operación tenga un beneficio positivo.

Este tipo de estrategia también es interesante si, por ejemplo, queremos asegurar un ingreso mínimo al inicio de la sesión para que compense pérdidas en operaciones con mayor riesgo conforme avance el día.

Hablamos principalmente del stop-loss a pérdida

Stop-loss a pérdida es un término que se me acaba de ocurrir para nombrar el tipo de stop-loss al que me refiero. Básicamente es aceptar un nivel inicial de stop-loss que acarree una pérdida inferior al nivel de emergencia como resultado posible de una operación.

Es decir, que permitamos que una operación sea cerrada por un único stop-loss en pérdida sin que el motivo sea que ha habido un evento anormal e inesperado que ha superado el nivel máximo de pérdida global que estamos dispuestos a asumir en nuestra cuenta.

Observemos la siguiente gráfica diaria del para euro-dólar.

La operativa tradicional en los libros de trading sería abrir una operación, establecer un nivel de toma de beneficio (take profit) y uno de pérdidas (stop loss). Supongamos que decidimos comprar en el punto 1 y establecer los niveles de TP y SL según el siguiente diagrama:

Al introducir una orden de compra en el momento 1, sucede que el precio empieza a bajar, en vez de a subir como esperábamos. Al llegar al nivel SL antes de que haya alcanzado el nivel predefinido de toma de beneficios (SL), la operación se cierra con una pérdida en el punto 2.

El principio no es malo, como normalmente acertamos más que fallamos, con unos niveles más o menos equivalentes de SL/TP tenemos una ganancia promedio. Si perdemos más que ganamos, tenemos que cambiar las ratios, de manera que el saldo final sea positivo igualmente.

Incorporamos operaciones de cobertura

Las operaciones de cobertura, hedging en inglés, consisten en posiciones únicamente destinadas a reducir el riesgo. Es muy importante entender este concepto: su función es mitigar el riesgo, no producir beneficios.

En contra de la literatura tradicional, yo opino que la diversificación en trading ha de limitarse a lo mínimo. Dos o tres instrumentos no correlacionados deberían de ser más que suficientes para tener una cartera equilibrada para un trader. Incluso, para un especulador, scalper en inglés, no profesional a muy corto plazo opino que un instrumento, dos a lo  sumo, tendrían que ser más que suficientes.

Uno de los motivos es que para poder operar con éxito hay que estar completamente conectado con el mercado y el activo. Tiene que existir una conexión intelectual total con el mercado, de manera que seamos conscientes de todo lo que está ocurriendo. Esto requiere un nivel de concentración, atención y estructuras mentales muy profundos. Algo que no podemos conseguir si vamos cambiando continuamente de instrumento o mercado, si tenemos distracciones ambientales o un mal estado emocional o cansancio mental. Algo imposible si no se tiene, además, la práctica suficiente producto de años de exposición a los mercados. Algo que no se puede obtener en unas pocas semanas, meses o en un entorno no favorable a la concentración total en el trading.

Como peces en el agua

Me gusta plantearme las sesiones de trading como un día en la piscina. Lo primero que hago es ponerme cómodo en todos los sentidos. Si me apetece un té me lo preparo y me lo llevo a la mesa. Si me apetece tener música o una película, me pongo un segundo equipo específicamente para eso. Buena iluminación, habitación bien ventilada. A veces me puede apetecer tener Facebook o la guitarra a mano. Quiero poder hacer todo lo que desee hacer mientras opero y poder decidir no hacerlo por voluntad propia, no porque no me sea posible hacerlo.

Cuando el espacio de trading está preparado, preparo la plataforma de trading, reviso el mercado y me quedo con uno o dos instrumentos para operar con ellos. Normalmente uno solo.

Tras ello empiezo a analizar ese instrumento hasta que consigo vislumbrar perfectamente qué acciones voy a tomar en función de cómo varíe su precio en cada momento. Y cuando el precio alcanza lo niveles adecuados puedo entrar en el mercado sin stop-loss o con stop-loss. Veamos qué sucede cuando no uso stop-loss.

Lo primero es revisar los acontecimientos esperados relevantes dentro del marco temporal en el que voy a operar. Como normalmente opero gráficas de 1, 5 o 15 minutos; cualquier noticia de alto impacto es relevante para mi operativa. Así que para operar precios no puedo tener ninguna noticia pendiente en menos de una o dos horas. Podría operar noticias, pero aquí estamos hablando de operar un instrumento, no una noticia.

Supongamos que entro en largo y el precio va en mi contra. En vez de usar un stop-loss y cerrar con pérdida, planteo la operación como una operación en la que tengo que ganar sin importar adónde vaya el precio. Esto suena bastante bien y no sin motivo. Existe un 100% de posibilidades de que el precio vaya en la dirección en la que me he planteado ganar.

La filosofía del stop-loss es que mi operación es ganadora si el precio va en una dirección y pierde si va en la otra. En un evento aleatorio esto es que tengo un 50% de posibilidades de acertar. Pero si uso mi nueva estrategia, mis aspiraciones son tener un 100% de probabilidad de ganar; que por mucho que me aleje de dicha probabilidad, siempre es mejor que partir del 50% y alejarme lo mismo.

En trading existe el concepto de ventaja, edge en inglés. Es similar a la ventaja en una carrera. Gana el que aventaja al resto aunque sea por una décima de segundo. Cuando elaboramos sistemas intentamos encontrar una ventaja para explotarla. En un nivel superior de ejecución, la técnica y el método tienen que dejar paso al concepto, a la realización en la que el cuerpo y la mente se adaptan automáticamente al entorno sin una técnica exacta predefinida e inmutable derivada de un proceso activamente analítico.

En las artes marciales chinas esta filosofía es muy evidente. Nombres como «El Rey del Cielo Sostiene la Pagoda» definen técnicas de lucha concretas. Mucho más directo, en el estilo Wing Chun se aprende desde la primera forma Siu Nim Tao (pequeña ideaque los fundamentos del kung-fu según ese estilo son, entre otros movimientos defensivos taan-sao, fuk-sao, bong-sao  u ofensivos como Jung Kuen.

Lo relevante es que más importante que esos movimientos está la idea de línea central, de manera que el luchador puede iniciar un movimiento de brazo ofensivo tipo Jung Kuen (un puñetazo directo), el cual se transforma de forma natural en un movimiento defensivo como bong-sao si el oponente de defiende.

El Gran Maestro Yip Man ejecutando puñetazo y bloqueo.

El practicante lanza puñetazo directo (foto izquierda)  y lo transorma en técnica defensiva (foto derecha) para contrarrestar acción ofensiva de su oponente. Todo ocurre en décimas de segundo en las cuales, de forma intuitiva, el luchador se adapta automáticamente a la situación.

Análogamente, el trading requiere ese tipo de evolución y preparación, donde estamos alineados con el mercado. En la cultura china el Ying y el Yang no existen por contraposición, sino que coexisten en un equilibrio. Igualmente la idea de cobertura implica la coexistencia de fuerzas ascendentes y descendentes en el mercado, no excluyentes unas de otras; de manera que si el trader está inmerso en el mercado puede aprovechar todas para avanzar al igual que un barco de vela aprovecha el viento ajustando las velas según cambia el mismo.

Cobertura de riesgo

Si operamos con cobertura, cuando una operación sale mal nuestra aspiración ya no será cerrarla con un stop-loss aunque no estemos en una situación de emergencia, sino de reducir el riesgo y la pérdida asociados a la misma, a ser posible a cero. Asimismo nos mantendremos centrados en el mercado para aprovechar al máximo las oportunidades que ofrece.

Revisemos la operación anterior con cobertura de riesgo.

Abrimos orden de compra en punto 1.oc, tras lo que vemos que el precio no va hacia donde pensábamos. En el punto 2.ov detectamos que el precio no va a seguir hacia nuestro nivel de TP (la línea verde), entonces vendemos 1.5 veces la cantidad con la que entramos la orden de compra. Para poder hacer esto no entramos con una posición total en 1.0c, sino con 1/4 de la posición que usábamos cuando hacíamos stop-loss.

En el nivel 2.c, la venta tiene un beneficio del doble de la pérdida que soportamos por la compra en 1.oc. Además es un nivel de toma de beneficios para la venta que realizamos, así que cerramos la operación de cobertura. Aunque cerráramos la operación con la compra en negativo, al haber ingresado ya el doble de lo que llevamos de pérdida, el saldo sería positivo en este nivel tan bajo. Lo haríamos si no viéramos posibilidades de que el precio suba, pero supongamos que sí las vemos en este caso.

Decidimos no incrementar la posición aunque pensamos que el precio va a subir. Podríamos incrementar la posición ya que nuestro tamaño es 1/4 de lo que estamos dispuestos a operar en una sola operación. Para simplificar no lo hacemos.

Tras el cierre de 2.c, el precio va subiendo hasta nuestro nivel de beneficio y cerramos con el beneficio esperado más el importe de la cobertura en el mejor escenario posible.

A nivel psicológico y emocional, una vez adquiridas las destrezas para operar con cobertura, en mi opinión es positivo considerar la opción siempre que sea posible, pues no tiene solo un efecto positivo financieramente, sino que nos mantiene más inmersos en el mercado y requiere que comprendamos mejor su funcionamiento.

El uso de stop-loss también tiene la ventaja de ser más simple y obligarnos a buscar los mejores niveles de precio posibles, mientras que la estrategia de cobertura asume que no hay entrada óptima, sino gestión de la operación óptima. En función de la volatilidad y estabilidad del mercado un stop-loss puede ser más peligroso que una cobertura también en tanto que sea más o menos fácil asegurarnos cuáles van a ser los niveles de oscilación de los precios.

Pero, como hemos visto, hay siempre que darle la vuelta a todos los conceptos y buscar la ventaja yendo un poco más allá de los límites establecidos y conocidos.

Una Lección de Trading con Fibonacci

Al menos que yo sepa, no existe en todas las publicaciones que hay en lengua española algo similar a lo que voy a explicar en esta entrada. He empezado enfocando el artículo hacia Fibonacci, pero podría tener cualquier otro enfoque para explicar lo mismo.

Cuando ofreces algo de forma gratuita siempre se desprecia. A las pocas personas a las que les he explicado gratis este asunto no les ha calado, pero supongo que eso también es porque el receptor de esa información no estaba listo para recibirla en ese momento. Luego miramos atrás y nos damos cuenta lo cerca que estuvimos y cómo no lo vimos.

El trading con fibonacci es parte del trading armónico o trading fractal. Yo suelo llamarle trading fractal porque engloba no solo la parte de la armónicos, sino también su propagación en múltiples escalas.

La mayoría de traders que yo conozco no saben hacer trading puramente técnico porque son incapaces de hacerlo en frecuencias temporales de pocos minutos. Existe un límite temporal, pero no está definido en sí por la escala de tiempo, sino por la liquidez instantánea de un mercado. No puedes comprar o vender más de lo que la oferta y la demanda en un momento dado te permiten, nada más.

Hablo, claro, sin tener en cuenta el precio de las operaciones que en mercados donde se negocia la volatilidad, como la bolsa o el mercado de divisas, es necesario operar una volatilidad que dé un rendimiento superior al coste de la operación más el diferencial que haya entre precio de venta y de compra.

El mercado que yo opero, Forex, empieza a ser rentable desde las gráficas de 1 minuto, aunque es mejor operar a partir de 5 minutos como mínimo para reducir la proporción coste-beneficio a un nivel más razonable. Cuando opero opciones binarias no me importa el margen temporal, pues la volatilidad ya no es un factor a tener en cuenta. No obstante, actualmente el mercado de binarias es demasiado complejo como para que sea atractivo, por lo que me voy a centrar exclusivamente en Forex.

Lo primero que vamos a hacer es localizar una vela que tenga un tamaño superior al de las velas próximas. Usaré cualquier par de Forex en cualquier marco temporal en tanto que la acción del precio sea favorable para operar. En general, cuando hay velas consecutivas del mismo tipo (bajistas o alcistas) se han de considerar como un solo movimiento, por lo que no se operarán de forma individual, sino en conjunto. Esto influye en el tiempo esperado para que la operación concluya. Por ejemplo, si operamos un grupo de 4 velas bajistas consecutivas de 5 minutos, estamos operando realmente en el marco temporal de 20 minutos. Si fueran 5 velas diarias, en el marco temporal de 1 semana. Si operamos la gráfica de 70 ticks pues lo mismo, ya que estas técnicas son universales en cuanto a tipo de gráficas y marcos temporales. Es pues crucial determinar bien el setup o estructura de precios que vamos a negociar para estimar el tiempo aproximado de finalización y la volatilidad que vamos a soportar.

Operar Fibonacci por niveles es una lotería. Así que vamos a buscar algo más. Nos vamos a centrar en los niveles 62,8 y 50. Y vamos a mirar al pasado reciente para comprobar si en alguno de esos niveles, el precio reaccionó de forma notable.

Si el precio, en general, iba como Pepe por su casa en un nivel determinado, entonces lo vamos a ignorar, pero si vemos que el precio era rechazado y obligado a volver en dirección contraria habitualmente, entonces lo consideraremos un punto de entrada de alta probabilidad. Ésa es la diferencia entre operar como si jugáramos a la ruleta rusa o como si fuéramos traders de verdad.

Es importante no operar durante la emisión de noticias macroeconómicas porque esta técnica no funciona entre los minutos previos y posteriores a las mismas. También es recomendable usar niveles de stop loss para salir de las operaciones si hemos calculado mal la entrada, pues no hacerlo puede producir un nivel de pérdida importante o incluso la bancarrota en una sola operación.

A continuación voy a lanzar mi plataforma de trading y a capturar una o dos operaciones como ejemplo. Invito a quien lea este artículo a que realice este ejercicio con datos históricos y revise muchas gráficas hasta que dé con las mejores condiciones para aplicarlo. El uso de niveles de Fibonacci, así como del de Ichimuko son realmente muletas temporales hasta que uno empieza a entender el mercado, momento en el cual ya no son necesarios nunca más.

En la imagen siguiente, he marcado algunos niveles donde existe una notable resistencia a que el precio traspase dichas líneas.

Estos niveles son buenos candidatos para operar Fibonacci al haber sido puntos de inflexión en el pasado.

Vamos a centrar ahora mismo la operación a una vela solo. Para ello tenemos que trazar el nivel de Fibonacci adecuado. Si miramos la gráfica, la última vela cerrada es verde, pero tiene una mecha bastante larga arriba, por lo que el precio podemos decir que ha sido rechazado desde ese nivel.

Pues bien, voy a trazar los niveles tomando como referencia la vela que considere que es la que está proporcionando el momento al precio actual. En este caso, considero que el precio está reaccionando a una resistencia, por lo que el momento es bajista, así que voy a buscar el rango bajista en el que debería de operar.

Al estar reaccionando el precio de arria hacia abajo, la acción es sobre una resistencia, por lo que tenemos que reflejar el momento bajista y sus niveles.

Ante la típica pregunta de cómo definir los niveles de Fibonacci, cualquier rango es válido, así que marco uno que considero que puede resolverse en una magnitud de tiempo del orden de la unidad de vela, es decir por debajo de 10 veces ese orden por decir algo.

Veamos desde más cerca la situación:

La acción del precio muestra cómo la vela ha rebotado en el nivel 38.2 hasta por debajo del 23.6. La resistencia más cercana es el nivel 23.6 y el soporte más cercano el 0%.

Dado que el precio ya ha testeado el nivel 38.2 de Fibonacci, es de esperar a que, si estamos operando a la baja, el siguiente máximo sea más bajo que el anterior y el siguiente mínimo también lo sea. Así que vamos a entrar cerca del nivel 23.6 y salir cerca del siguiente nivel inferior de Fibonacci, el 0%.

Aunque es probable que se vuelva a testear el nivel 23.6, ya que este tutorial es estático, voy a introducir una orden de venta en el sistema y ver qué sucede. Ahora mismo ignoro qué sucederá, por lo que es posible que tenga que ampliar el artículo si el precio rompe el SL.

Como el precio sigue en resistencia, vendemos a pesar de que puede subir un poco aún antes de bajar hasta el siguiente soporte.

La venta está ya abierta, el SL está situado por encima del nivel máximo que debería de servir de resistencia actual. Si el precio sobrepasa dicho nivel es que la estructura sobre la que operamos no se estaba desarrollando en este momento y debemos salir inmediatamente.

La reacción del precio parece favorable, al estar formándose una resistencia en el nivel de Fibonacci.

Observamos cómo el precio, en efecto sube hasta el nivel 23.6 y empieza a completar el momento bajista. No hay que esperar hasta justo el nivel exacto de salida, es mejor salir unos pips por arriba para asegurarse la operación. Esperaremos a que baje un poco más para salir. En este caso, dado que estoy escribiendo un tutorial, salgo cuando el precio ha recorrido más del 80%-90% del rango. Es muy posible que complete en una o dos velas máximo el nivel, pero no quiero arriesgarme y tener que alargar innecesariamente el artículo; pues es mucho más claro explicar cómo operar en una vela que interpretar subsiguientes reacciones del precio.

Ya casi en el nivel 0 de Fibonacci, cerramos la venta tras haber el precio recorrido un nivel casi por completo.

Siempre es bueno asegurar beneficios conforme se opera, pues el tiempo necesario que puede suponer no cerrar un poco antes puede ser mucho mayor que el porcentaje de beneficio a recibir a cambio de dicha espera. En este caso, la vela finalmente cerró en contra de la operación, por lo que al haber cerrado un poco antes nos salvó de una situación bastante comprometida.

La vela cerró con un patrón alcista, por lo que el momento ha cambiado de repente y ahora es incierto cuándo el momento bajista se retomará.

Como conclusión, decir que el trading no es tan obvio como a veces se explica, pero que siempre es lógico y sus principios son claros y sencillos de entender.

En este ejercicio se detalla con bastante precisión la motivación detrás de cada paso dado para definir una estructura de negociación, el retroceso de Fibonacci, y cómo se opera para asegurar siempre la negociación dentro de los máximos niveles de probabilidad posibles mediante la búsqueda de una serie de convergencias técnicas.

El autor de este artículo ofrece a quien lo desee tutoriales de trading privados en primera persona bajo presupuesto o por horas sueltas. El coste aproximado para cubrir la materia y entender los puntos básicos rondaría los 12,000€ (doce mil) dadas dos semanas de sesiones de unas 5 horas cada día para una persona ya iniciada en el análisis técnico.

Si tienes interés por aprender más sobre el mismo, puedes enviar un mensaje mediante el formulario de contacto o dejar un comentario. Como el trading no es adecuado para la mayoría de personas, solo se atiende a solicitantes que tengan un nivel de conocimientos o experiencia equivalentes a un grado en Administración de Empresas, Medicina, Filosofía o Magisterio y excelente gramática. No se requiere titulación, solo es un nivel cultural y capacidades de aprendizaje y comprensión de referencia. Si tienes un nivel equivalente pero con muy buen expediente en Psicología, Ingeniería Superior, Matemáticas, Física, Estadística o similar tienes más bastantes posibilidades que el resto.

En cualquier caso, las probabilidades de aprender con éxito trading son inferiores al 10%-20% en promedio, conllevan del orden de un año de preparación casi en solitario y suponen una inversión de tiempo y dinero notables. Los resultados dependen en gran medida del individuo y de su buena gestión monetaria y psicológica.

Moving Averages, Time Frames and Complexity in Trading

One of the first algorithmic trading programs I learnt was just a moving average crossover strategy. When I saw how it was failing all the times I asked myself: why is the person who wrote this book making me wasting my time with this since it does not work? Should I return this book?

Time after I read just the opposite, a book related to mutual funds trading strategies. This time you had to buy when the fast trend crossed the slow one downwards and sell when that fast moving average crossed the slow one from below. Everything a nonsense that, after backtesting, was a failure. Then I read the contrarians books. I must confess that the contrarians seemed to me unnatural. Because one thing is taking profits from price bounces, that is right, but another thing is going against the trend and thinking you are smarter than the rest of the seven billion souls that live in this world. The trend is your friend, the trend is your friend, be like water and follow the slopping trend my friend.

One should not think that the moving average and the trend are the same stuff. The moving average is a rolling average that takes a particular fixed number of past periods and averages. The trend can be defined in different ways but it is more related to how price evolves in time, more related to price action. Different authors use different definitions for trends to build their strategies accordingly.

I have my own interpretation of what means the moving average and how it should be used for trading. I use short moving averages, between 20-30 periods and have a few techniques that require confirmation through EMA. When I say confirmation is just that the EMA do not constitute the trade signal, but the confirmation of the signal. A signal given by the current price action. I do not use indicators by the way.

Then, for me, the moving average is the level in which price finds equillibrium after price momentum is temporarily stopped. Generally speaking, once price reaches the EMA level, under certain price action, the EMA will react and push the price away from it creating a new anchor point. I really appreciate Bob Volman’s price action methodology, he calls it a magnet effect.

Most trading strategies rely on a certain number of pips or levels. I have found easier to trade with a particular number of bars instead. That is maybe why I have a particular preference for binary options, because they focus in time instead of volatility, if I trade bars I want to think in terms of bars, not in terms of price. Indeed, traditional charts are based in time but most people try to trade with these in terms of volatility which is not strictly precise in my opinion. This is another issue however.

What do you think it would be easier? Reading 500 candles and analysing the price action within those or reading just 5 candles for the same purpose?

Trying to answer this question what I did is reducing the number of periods of my EMA at the same time I increased the timeframe I was analysing. Now I have fewer things to take into account to find patterns. At least fewer bars. When you learn Price Action trading, one of the aspects is being able to mentally combine multiple bars into one and also the opposite, mentally being able to dissect one single bar, especially if you are tracking it in real time into smaller multiple bars.

At the end, the number of periods of your moving average define the volatility you want to be exposed to as well as the chosen time frame for a specific instrument.

Another aspect is trade frequency. As a financial manager you want to be able to get your profit asap to be able to reinvest and increase your next absolute profit risking the same relative proportion of your capital, taking advantage of the compounding profit effect. Fast frequency time frames are my favourites for this reason and for other reasons too. In fact one of my current projects is generating data charts according to predefined patterns generation to find the right frequency any asset should be traded at a certain moment in time.

Now it is noticeable that the topic around the moving average and timeframes is defined for can lead to many different and valid approaches. In technical analysis absolute price levels are important. Moving averages are also price levels, but relative this time, that I understand as takeoff or balance areas that follow prices. And when both price and averages meet things occur. I have not found nor really researched reliable mean crossover techniques and all of those I have read in multiple books were losers to such a degree that I do not trust who writes strategies based purely on what the moving averages are doing.

Reducing the complexity of your model increases intelligibility. Therefore I only use one EMA, not multiple moving averages. If I can also define a strategy based on one sole candle instead of waiting for a buch of uncertain bars to be formed I definetively would choose it. Here, again, binary options offer many opportunities; but I do it for Forex as well, since for me there is no technical difference between binary option trading and stock or Forex trading.

Why I do not use Fibonacci for trading

What is Fibonacci?

To explain it succinctly, Fibonacci is a set of predetermined price levels of an instrument regarding a particular price range.

DE30 Fibonacci Levels

The previous figure shows an example of the Fibonacci levels. We take any lower low and any other highger high and draw a line connecting both points. The fibonacci levels between those two points are usually a set of percentages of the total heigth between the two points. Other levels may be printed, but the most common ones are 0, 50, 61.8. It is not unusual finding this default setup:

  • 0%
  • 23.6%
  • 38.2%
  • 50%
  • 61.8%
  • 78.6%
  • 100%

Now, if you pay attention to the prior image, it happens that price usually bounces and ranges between those levels, therefore if we identify the level in which price is going to change its direction from, we can place an order exiting at the next Fibonacci level. In the last example, if we would have placed a buy order when the price crossed the 38.2 level the first time, we would have successfully sold with profit at the nearest Fibonacci level, 23.6.

I know traders who successfully use Fibonacci in their trades, if I am not using Fibonacci it is not to demerit the strategies that are profitable using it.

Why I do not use Fibos.

If I do not use Fibonacci is because to me, trading is:

  • A matter of statistical price analysis.
  • A matter of complete uncertainty about how price action will develop in the future.
  • A matter of support and resistance game.

and because:

  • Fibonacci establishes fixed levels not related to the actual price action.
  • Fibonacci levels are not related to the actual price buildup.
  • Fibonacci levels are a fixed structural deterministic approach and trading is dynamic and probabilistic.
  • Fibonacci fails most of the time.

Now, look at the next image. The red circles mark the times in which Fibonacci trading failed. The problem is that you cannot predict when Fibonacci will work or how price will react at each level, just because Fibonacci levels are fixed no matter how price was moving before or how price is changing accross the different levels.

Fibonacci levels are not a safe bet.

If  you place buy in the red circles number 1, 2 or 5, the trade is lost. The same happens when placing sell when price is in circles 3 and 4. Therefore, Fibonacci levels cannot be traded in a direct way.

The first red circle failed because the 38.2 level had been already retested, the second red circle failed because buying after a bearish breakout is a very poor setup. The third red circle failed because the 61.8 level represents antoher poor setup: selling next to a strong support from a resistance that was just broken by a breakout candle and therefore it became a new support (and no one should sell on a support if we want to stay safe). To understand the third cicle, look at the initial green huge breakout candle on the left side of tha chart. That candle has just transformed every resistance in a potential support. Selling in potential supports is not a safe wager.

Using Price Action.

So, what is your solution for this?, you may ask.

As I mentioned, we can train our eyes and research how to identify the correct anchor points just by identifying them by analyzing the price history, chart patterns and price momentum. The exact same chart may be analyzed in a more realiable way by just understanding what each price move means.

Price action is realiable because it analizes just the same object we want to trade.

So two immediate high probability trades can be depicted almost without too much effort within the same time range and without any indicator of course. I have drawn the dashed lines just by observing how the candles behave at the current scenario, without any predefined proportion nor shape.

One main rule here is: do not sell approaching near above a support and do not buy near below a resistance.

Conclusion.

The conclusion about all this, for me, is that the Fibonacci levels are good to spot potential price anchor points, but they also put the trader in a worse danger: having the conviction that something that is not there exists and losing the edge on the market.

Why should I use predetermined not trustworthy levels when I can train my eyes to identify support and resistance levels looking at the naked price?

If I draw my lines by observing the actual price I do know that each of my lines is actually an anchor point. And I can also draw diagonal (not necessarily horizontal) and vertical lines to mark high probability trade areas. I can identifiy where the price structures lay on and represent indeed high support and resistance areas.

And I do not need Fibonacci to understand that I have to sell only when price is high and buy only when price is low. The fibonacci levels may convince me that the price is near to a strong level and cloud my mind with that conviction so that I do not see what is actually happening by looking at the main picture and the signs that contradict that conviction. One of the worst enemies of traders is conviction because our brains are designed to fight for our own convictions and deny what denies those.

Do you think a boxer can win a round if he always protects himself against the same fixed punch type just because he thinks it is the most probable among the rest?

For these reasons, I think that Fibonacci and any other indicators are usually very dangerous tools, especially for those who have not developed yet a working trading strategy without need of using them.

The key for making money trading Forex and other financial markets

At the beginning, I was overwhelmed like many others by the indecent numerous trading techniques that are published, because of those multiple websites repeating exactly the same slogans on how to be a trader that lead me to nowhere. During the last years I have tried one by one dozens of different trading strategies only to see these one after another. This path has been hard and full of failures to the point that many times I have doubted if there is really  a way for earning money by trading (Forex in my case). I have spent an important amount of  time and hundred, maybe thousands of euros acquiring paid software, books and spent money on trading tuition and rehearsal. Also whole years without holidays pursuing strategies to become a successful trader until I finally achieved my purpose.

Trading has several aspects I will try to expose next.

Psycological Trading

This is the most important part of trading. You can read Trading in the Zone by Mark Douglas to better understand the topic. But unless you do not deeply learn the psycological details of trading you will fail for sure.

What’s special about trading?

Trading is probabilistic, so you repeat the same strategy again and again. You accept losses as a part on the wager. You accept that everything that may happen will happen when trading, everything you do not want to occur, it will occur eventually and repeteadely.

Trading is not a game, there are no rules. It is not safe and nothing you may predict.

Trading causes very strong emotional burden. You have to learn how to control it to avoid cutting your earnings and letting your losses grow. Your next trade will not be recover any previous loss, but to follow your system and earn money with it repeating the same steps of the same strategy.

Price Trading

Price is something hard to define when we speak about financial markets. I tend to think that price is more about expectations than value. People make money in any market by buying at low prices and selling at higher prices. Or by doing something equivalent.

Trading financial markets is about doing exactly it, finding when prices are either high or low and entering at the right moment. On the next figure there is an example of the strategy that beats the market which is very simple.

Buy low and sell high.

For doing it I use OCHL bars or japanese candlesticks. The next figure shows the same chart but using the candlesticks for displaying the price change.

Japanese candlesticks show open, close, high and low prices at the same time.

The advantage is that with candlestick I can know which is the open, close high and low levels. I can now spot which will be the turning points of price analysing the current price momentum, trend and in particular the difference between high-low and open-close.

I know by observation that at the turning levels, called support and resistance levels, the candle’s wicks begin to be long compared to the candle bodies, so I can follow and predict the most probable price evolution by correct interpretation of the price changes. This is called price action trading.

Basically, with long compact candles there is no too much to do except they represent the current price momentum. If momentum and trend keep up with their direction, then we can take profit from it. Otherwise we must stay out. Look for instance the next figure, the colored part of the candle represents the open and close price levels while the wicks the maximum and minimum prices.

Bullish clandle versus pin bar.

The first bar is a strong bar in which the range of prices has been respected during all the trading session. The second bar instead shows that the price of the asset even if it reached the same level as the first candle, it finally closed very low, almost at the same level of the opening price; meaning that traders perceive that the value of the instrumet is much lower than the highs of the session. In the first case we might expect some kind of price continuation or at least price slowdown. In the second case there is a chance that price will reverse within a bearish trend.

Therefore we are looking all the time longer wicks to enter and examining the price history to determine good entry points. How? Simply by confirming we are on a support or at a resistance depending if we want to either buy or sell. And that is all the story here. There is a number of patterns we can identify and use it to enter the markets. See an example below.

We sell when trend and momentum are bearish and a resistance level is touched after a bearish breakout.

So, the key technique is identifying which are the turning points by observing the past and trading on the strongest levels found. On the figure above a resistance area is confirmed by notice it often acted as a strong resistance. Then we wait for both, momentum and trend to follow the same direction and we enter when a well-known pattern is produced. In this case a price reversal after a bearish breakout.

The goodness of this system is that we do not have only vague indications as almost all the trading resources, we do know the exact entry area according to what we can read from price itself, without using any indicator nor fixed pattern.

Fundamental Trading

Fundamental analysis is not part of my trading, but I trade fundamentals however. A lot of profit can be obtained through trading fundamental announcements, with a higher risk, it is not difficult to get a 30% increase of your account in a single fundamental event.

Risks of trading

Trading is a very risky activity and it is not suited to most of the people they say. Well, it may not be suited for most of the untrained people, but if one person is correctly prepared trading is not an issue riskier than any other economic activity.

But trading is not for novices alone, for unprepared people or for any person who would not be able to run a regular business successfuly.

Trading requires a lot of concepts to be assimilated and mastered before risking money and it takes months, otherwise and especially with leveraged financial instruments, it can blow up your account in a few days and even incur in debts due to the leverage levels.

I would say that trading is very difficult yet not riskier than other business. If we consider that 80% of people loss money when trading, we should take precautions as we would do with any other business.

Trading involves costs, requires investment, skill and hard work as any business needs. The rate of failure in any market will probably be similar to this 80%-90% reported by brokers regarding individuals lossing everything and more of their initial investments.

Money management is very important and it is key to make your account grow fast and limit your losses. I use compounding position sizing for instance.

If you are interested in straightforward learning experience, I offer a one-day seminar in trading to teach the basic principles that will allow you to become a trade once you master the practical strategies I can teach. It is not cheap but it will cost to you much less that it has costed to me. If you want a proof of it contact me to schedule a free demo session to show you how I beat the market you decide me to trade in Forex and other instruments at any past date you choose.

Trading Forex Like a Pro

 

Behold, the secret to trade like a pro: become a pro.

The past

It was during my college years at the Business School that I my interest in stock exchange trading emerged for the first time. A numer of subjects related to business and asset evaluation were taught within the financial, operationalorganizational and accounting areas of the official curriculum. One of the most remarkable topics covered was traditional charting theory; a bit of Elliott’s theories and some foundations in chartist patterns. At that time, Internet was still in the early stages and affordable access to financial data of acceptable quality was merely present only on daily press, so that in order to check stock charts and market analysis the time frame was indeed the daily reports that those publications delivered each morning. For those with a modern television set, the teletext service provided a listing of the companies trading at the Madrid Stock Exchange with their current share price updated every 15 minutes. The charts however were not included within the teletext information.

Operating in the markets was also not exent of pain. I used to have kind of a personal VIP bank card with a phone number contact printed on it for the bank’s brokerage department to call trades. Definitively decent for those interested in investing but completely insufficient for retail trading purposes.

The Present Day

It could be written several hundred thousands of words only to describe the modern resources for teaching and allowing any individual to achieve a profound understanding and hands-on experience in trading. But beware of thinking that trading is easy and suitable for most people including yourself. Please, read before continuing the following notice and disclaimer:

Trading is an activity that involves high risk. Any person trying to trade has almost 100% chance of losing all the money on his/her trading accounts and additional high probability of incurring in additional debts when trading with leverage because margin calls may not be executed in time due to frequent particular market situations. The information herein is not a trading advice and must be solely used for educational purposes and never with live accounts with real money.

It is important that you notice that before trading you have to go through and overcome a significant number of critical steps during a reasonable period of time that is not likely going to be shorter than one year or more. Never prior to being able to obtain consistent account growth with your own thoughtful strategies and having perfect control over the timing and price volatility you could consider starting trading with other’s real money (not yours). After doing the same with a live account by using a welcome bonus, you could start considering opening your own small account. How much is small? Something that allows you to trade risking about one thousand part of your monthly salary (provided that yours is an average salary) per trade, so if your monthly net income is $1,0000 (one thousand euros) you do not want to risk more than $1 per trade and adjust that amount proportionally according to the performance of your trades, either positive or negative, increasing or decreasing such $1 amount.

One of the places I enjoy buying most is El Corte Inglés, the biggest spanish retailer store chain. The key difference between El Corte Inglés and others is the customer satisfaction policy. If one client is not completely satisfied, El Corte Inglés completely refunds the purchase price without questions. They have followed this praxis since long ago when only a few used to. When a broker boasts about their cutting-edge technology and that with it you, a retailer, will be given an interesting if not realtively easy prospect of becoming a wealthy individual; when it happens I say: «Yeah, let’s prove it together!, let me buy your services and if I am not satisfied, please approve my reimbursement».

It’s obvious at this stage that getting rich in one week or year is not the purpose of this post. If the purpose is becoming rich starting from scratch just look around you and realize that average people unfortunately stay on the average no matter how hard they try it, and that the easy routes usually lead to a bad end. Let’s keep our feet on the ground and stay focused towards something reasonable and absolutely work to give away any greed every time it speaks to you into the ear to weaken your good judgement. Sound preparation pays its cost and is not obtained without great effort, humility and discipline.

Have a plan and take the first step

A plan with a preset deadline. If you do not succeed on it before the deadline, finish it immediately, never elongate the predefined time period. If the circumstances change notoriously midway through your plan execution, just cancel it. After cancelling a plan, it must be examined in detail and a new plan should come out after finishing assessing the current state of things. The plan that I present is a walk along a representative set of books and tools.

The books that will be mentioned next are used for guidance purposes and you should not be limited to them or even use any of them. There will be other good alternatives free and paid; on paper, digital support or even personal lessons. Make your own research and you will surely get many unexpected benefits from it. I encourage you to consult every related treatise to boarden your specific culture and to call into question whatever idea formerly developed. Babypips, Elite Trader, Forex Factory and other sites have a lot to offer to you.

The first part of the plan will consist on pure learning. The first book I would recommend is just Technical Analysis of the Financial Markets, by John M. Murphy.

It is a classic and you do not want to use it as a trading guide, you will lose everything if you would do it. Instead this book will teach you the basics on chart reading. I recommend however to skip all the chapters about indicators. Indicators never should be used for trading. All the strategies based on indicators, you should consider these just innefective. The only indicator that is woth using it is the moving average and purely to have a visual guide to help you determine if prices are above or below the mean and far away from equilibrium. But not even the rolling means should never be used to trigger any trading action.

While Murphy’s Technical Analysis of the Financial Markets has introduced the principles of charting theory, the next book could be Japanese Chandlestick Charting Techniques by Steve Nison.

This book will teach you tons of different price bar figures with exotic names. This information will prove to be essential to fine-tune your trading. Have this in mind in advance: japanese candlesticks should not be traded, instead, they will serve as a way to better gauge the tension within the market and how buyers and sellers toss around. You will encounter during your learning trip myriads of strategies that use japanese bars. Just ignore them all because they will empty your pocket.

Remember that indicators, signal providers and trading robots must be avoided without exception. Sooner or later you will run into the interesting area of algorithmic trading. Forget about strategies with indicators if you find them on the algorithmic trading books and you will see that there is no anything remaining to test. In a more elevated level you may come across researching about artificial intelligence. I have developed a bunch of IA systems under the umbrella of my master in Data Science and years of programming experience. Systems that learn by themselves, others that are trained upfront. Again, my adivce: first learn how to manually increase the size of your account, then find a hobby programming expert advisors if you are bored. The rule of thumb: never use a robot without knowing and understanding the underlying source code.

At this point you are at two thirds of your way of your trading preparation stage. Since you have already increased your prowess for financial markets, it is time to start testing that knowledge with real market data. You are still very far from being able to trade with real money and pressure; believe me, the pressure under real trading conditions is so huge it would crush you like a train in less time that it takes to say «hello world». Financial markets are like a pool full of sharks where you are their aperitif. I am serious, stay away from risking one cent and from beginning being used to carry the loser’s backpack with you.

Set the right mindset up

Trading without a proper psychological preparedness is like driving a car blindfolded.  The trader’s activity is characterised by unlimited risk and freedom to act, devoid of social considerations about what is good or fair. Markets change randomly. There are no rules about how many times traders have to be in the market, working hours, minimum or maximum position sizes and anyone can stay just looking at the charts searching odds. Anything that may happen can happen without prior notice, because the main principle of markets is free randomness.

There is a book praised by the community and describes in plain language the different psychological aspects of trading that the author has identified during his first 18 years trading and working as trading coach.

Trading In The Zone, by Mark Douglas is completely devoted to train you to become a trader. The way to success requires patience and time. Do not fear a break from charts to smother one’s natural tendency to act under emotions and hopes. Learn how to proceed with a consistent methodology consisting in putting the probabilities at your favour and waiting idle around  rough sea when the likelyhood of gain is against you.

Trading In The Zone takes off from the basics and climbs slowly to navigate across those main principles, which is good for people never been exposed in the past to those concepts, but it may result a bit tedious for the majority of persons who already have an average knowledge in psychology and self-help books. Anyway, in my opinion is worth reading it since it is quite unique to the trading area; maybe a bit expensive only because its popularity and because it could have been written in 30 pages instead of 100 (200 on A5 sheets). So not a big deal, but better having this in your toolbox and make the effort of paying what it costs.

Overcome frustration

Through being hit you will learn to not being paralysed in combat or what is even worse, driven by fear or greed when realizing that no matter how well you follow what you have learnt you fail to achieve success trading repeteadely. You will learn how to avoid the punches of your adversaries; and finally if you have what takes, do not hold out a lot of hope on it, you will start winning on the ring. Your bedside books this time will be (1) Reading Price Charts Bar by Bar, by Al Brooks and (2) Naked Forex: High-Probability Techniques for Trading Without Indicators, by Alex Nekritin and Walter Peters.

 This time practical trainig is also recommended. While you learn the concepts and tactics on these books including chart reading, entries and exits and risk management you may find yourself starting to win some wagers in the Forex arena. Remember, you are still just winning, nothing really similar to earning money by trading. You are not even an amateur at this stage. Please, consider keeping training in the manner I will tell you next for one or two months, reviewing the books and concepts one time after another until you really fully comprenhend everything.

How to practise trading

Open a free demo Metatrader account on a Forex broker with a simulated maximum leverage of 50. In any case stay between 20 and 50 leverage level. Try https://tickmill.com, they won’t bother you with stupid phone calls trying to steal your money by suggesting you to open a real account as many or most of the brokers do. Remember: never ever accept opening a trading account from a phone call. Brokers will insist you are ready to trade with real money with their support. That is false, that is a thief trying to steal your hard earned money. Treat him/her accordingly and ask yourself why someone having the ability to earn money in that way would have such a horrible work instead of being on a beach in Bahamas trading with the laptop while having margaritas and other good experiences.

So once you install Metatrader find out the market opening hours and try to trade within the previous and the later hours. Avoid always trading news. Look for one or two major pairs, let’s say EURUSD, USDJPY or so. Find spreads lower than 3-5 pips and avoid the rest. Never trade bars that are higher than average and too far from equilibrium (10-30 EMA level). You can create a demo account with Metatrader itself. Do it and set it with the parameters above ($500 of capital and 50 leverage). Test your knowledge and the new books risking no more than 50-60 pips on the 5M or 15M charts until your account peters out several times. Learn from it. Do it again and again for a few weeks or months. Avoid improvisation, stick to your strategy. See how it fails. Get over it and avoid acting by fear or greed and stay calm and cold.

Join the amateur’s wagon

It is unlikely but not impossible that trading correctly support/resistance and round number levels you have started to see that finally your trades seem to anticipate market moves. Less probable that you even have been making profit from it for months. This is the next milestone in the plan you have been devoted to during the last months, maybe the last year until you got here.

First, stay out while news are released. This page contains a calendar that you shall use: https://www.forexfactory.com/calendar.php. Those long bars, horrible spreads and slippage levels are not seldom cause of news.

I would have one main concern at this point of the post: what about fundamental analysis?

«HA-HA», yes, millions of operators accross the world with different purposes and reasons to act, each one of these operators ignoring the reasons of the others. Millions of plans which their trades respond to, private internal information that will never be shared with the public, outside the organizations. It is impossible to now how every agent is going to act today. With technical analysis, at least, you are whatching at what all of them are doing at this very moment and since ever and how securities are reacting to that. In Forex, wait for price to react to fundamentals and keep safe from news releases.

Now, check the next figure and see how the platform installed in the previous step with your demo account looked like, being indistinguishable from a live account platform. The platform simulates any trading operation in real-time on the Forex market, it is free and it does not use real money for demo accounts.

Metatrader image
Metatrader 4 terminal

From here on, there is no one strict way to proceed. The last books I will add to your toolbox is will leverage your odds when choosing the right side to shoot from, Understanding Price Action by  Bob Volman.

Do not venture to such readings until you have mastered the prior lessons, meaning that even if you are still not being profitable in average, at least you have reviewed everything several times, enough to have already a nitid understanding of price action and psychological aspect of trading subtetlies. We have not been aiming to earn money yet, just to understanding price action and to get calm and stick to the plan when facing frustration within the session.

The other book, Forex Price Action Scalping, is also written by Bob Volman. In my opinion Bob Volman is one of those writers that excels over the rest in their field. If the first book is about understanding price action, this second book is more about grabbing the best of every situation in the market. I recommend reading first Undertanding Price Action. I think that the ideas presented on both are universal for any time frame. Be advised that this book is based upon the 70-bars chart, but I have seen the same patterns working, adjusting the settings to the volatility within that timeframe, in the higher timeframes due to the fractal nature of price which patters are repeated over and over again at any scale.

Fractals are structures that repeat themselves across any possible scale (size). The most known example is the one named «the Mandelbrot set». But, please, do not rush into your book store to buy stuff about fractals and trading, there is no need for it. Just catch this idea of price patters being always present at any time scale and enjoy how a fractal set looks like whatching the image below.

The Mandelbrot Set
The Mandelbrot Set

Beyond the books, search also Youtube for real trading videos that are broadcasted live for free. Do not fall under anxiety and pay for something you may find equally at no cost. Ask all the brokers you want to for tuition-free education on price action and trading. Read the last book by Bob Volman, you will be really surprised as I was. Look for live trading sessions offered by real traders (usually paid by the brokers or anyone else) and learn from real people trading with real money.  Do not trust a trading session in which the trader is not putting real money on the trades and risking the own wealth.

By combining all the teachings since now and the lessons learnt within those live trading rooms, now continue with the demo trading and see if you are able to get consistent earnings for months.

If you are able, then you are one step out from catching the amateur’s wagon and start putting some real money. But not your money, find a broker offering a free welcome bonus account. Here you may be forced to raise the leverage level since those accounts are very small. However, with $30 you have a lot to do with 0.01 lot position size risking no more than 50 cents per trade if you pick very well your trades. If the bonus account runs out of money, find another broker and start again with a bonus account. There are tens.

Once you are doing well with your bonus account and making it grow for weeks or months, start considering risking your first $100 at a 30-50 leverage live account. But before doing it, carefully review all the consequences, legal and financial, of real trading and how it can affect you. Have in mind that the risk is very high and that you will probably have an average probability of losing all the money you put in higher than 90% or 99%. This is a very difficult and financially dangerous endeavour, be advised.

Finally, look for multiple resources, the net is full of them and you will find priceless articles, forum threads and videos. Do not let yourself being convinced by apparently logic and obvious winning techniques. Test everything always for months before deciding if it works or not.

Again, remember that this post is not a recommendation for trading. This post is meant to give support to those that, being interested on learning trading, have not found yet a clear guide of valid steps to follow and work on to improve or adquire in some way their trading skills. The followed results are not guaranteed and this post represents solely the subjective view of the author. The methods described may not be suitable for other persons and the author is not an expert trader nor holds any certification on the matter. This text is also subject to errors, misconceptions and interpretation; it could be completely wrong in every aspect.

Final words

One of the most useful tools I have been using for backtesting is a paid tool called Forex Tester. It is not very cheap but it is not costly for what it has to offer to you. It has the same aspect as Metatrader and similar user interface. It also comes with real market data and can also import data from other tools and brokers.

The purpose of this tool is training and you can trade any past period simulating that is the present time. The tool shows you the market status and generates new bars for you so that the feeling is very similar to demo and real trading. You can also freeze the time and decide when the next bar will be added by just clicking one key.

Of course the typical trading operations are implemented such as market long/short orders, sell and buy stop/limit, trailing stops, etc. Look at this screenshot:

Forex Tester 3
Forext Tester 3 Screenshot. Short trade simulation.

The developers offer a free trial of the tool on https://www.forextester.com/ so you can evaluate it.

I would like the reader appreciates the fact that I am not affiliated to any of the resources and companies mentioned on this post, including the ones I shared links to, like Tickmill or Forex Tester. I could have used affiliate Amazon links for the books and same thing for the other stuff, but I want the reader to be sure my opinion is not constrained nor directed by economical interests, recommending books and resources I am paid for.

Please, be careful, stay calm, act wisely and be patient. Best luck.

Predicting Stock Exchange Prices with Machine Learning

This article will describe how to get an average 75% prediction accuracy in next day’s average price change. The target magnitude is the 2-day simple moving average. The reason is that if we do not apply smoothing to daily prices, the forecasts are much harder to get. The minimum possible smoothing is two days, and that will be the target: altering actual prices as little as possible.

I have selected randomly a company from the New York Stock Exchange, it was «CNH Industrial NV». No reason for that, it has been a completely random choice among a couple thousand files I have generated extracted from either Yahoo! or Google finance, I do not remember the source. The files are uploaded here: https://drive.google.com/open?id=18DkJeCqpibKdR8ezwk9hGjdHYSGwovWH.

The method is valid for any financial data as long as it has the same structure. I have also tested it with Forex data getting similar accuracy levels with currencies such as EURUSD, GBPUSD or USDJPY. The interesting point of forecasting those quotes is that by examining where it fails, I think you will improve your price action trading skills and your understanding of the market and what matters.

Data Collection and Variable Configuration

There are millions of possible variable candidates that may seem valid to be analyzed. And which will be the target value we will try to aim? I like thinking that price is like any other object subject to physical laws. It reacts to market forces, it has an inertia, velocity, acceleration, etc.

The forces may be volume, it may have a potential energy depending if it is very high or very low, the rate of change may be important and so on. There are other many factors we could analyze such as gaps, breakouts, technical patterns, candlestick analysis or price distribution within space just to mention a few. For this example we will only be focused on price action and volume.

I have the files saved in csv format to be used with Excel, so let’s start loading the csv file into a DataFrame object using Python.

# Importing all the libraries that we will use.
 
import pandas as pd
import matplotlib.pyplot as plt
import xgboost as xgb
from sklearn.metrics import accuracy_score
 
#Load the data from a csv file.
CNHI = {"stock_name":"CNH Industrial NV", "data": pd.read_csv("./data/CNHI_excel.csv",sep="\t",header=0,decimal=',')}
 
CNHI["data"]=CNHI["data"].drop("Adj Close",1).set_index("Date")

The previous code will, after extracting, remove a column that won’t be used («Adj Close») and creating an index using the «Date» column. The date is not a variable we may use for forecasting, so there is no need to keep it as a column of the dataset.

The data now has the typical structure of the financial data: Date, Open, High, Low and Close. The first three rows are shown in the next table:

Date Open High Low Close Volume
2013-09-30 2.75 13.08 12.5 12.5 352800
2013-10-01 12.76 13.16 12.75 12.92 1477900
2013-10-02 13.02 13.08 12.87 12.9 1631900

Predictors

We are going to omit High, Low and Open, using only Open and Volume for the study. Let’s start preparing the data for the analysis. The predictors (X variables) to be used to predict the target magnitued (y variable) will be the following ones:

  • Two day simple moving average (SMA2). The formula is (Ct – Ct-1)/2, being Ct equal to current day’s open price and Ct-1 to previous day’s open price. This formula is applied to each row of the data set.
Predictors = pd.DataFrame({"sma2":CNHI["data"].Open.rolling(window=2).mean()})
  • 1 day window SMA2. The previous day’s SMA2 value.
Predictors["sma2_1"] = Predictors.sma2.shift(1)

And the other predictors will be:

  • Current day SMA2 increment. (SMA2t – SMA2t-1).
  • 1 day window SMA2 increment. (SMA2t-1 – SMA2t-2).
  • Current day volume increment. (Volt – Volt-1).
  • Current day volume rate of change. (Volt – Volt-1)/Volt
  • 1 day window open price. (Ct-1)
  • Current day open price increment. Ct – Ct-1
  • Current day open price. Ct.
Predictors["sma2_increment"] = Predictors.sma2.diff()  
 
Predictors["sma2_1_increment"] = Predictors.sma2_1.diff()  
 
Predictors["vol_increment"] = CNHI["data"].Volume.diff()
 
Predictors["vol_rel_increment"] = CNHI["data"].Volume.diff() / CNHI["data"].Volume
 
Predictors["open_1"] = CNHI["data"].Open.shift(1)
 
Predictors["open_incr"] = CNHI["data"].Open - CNHI["data"].Open.shift(1)
 
Predictors["open"] = CNHI["data"].Open
 
# The rows with nulls generated by rolling values will be removed.
Predictors = Predictors.dropna()

A sample of the first 5 rows:

Date sma2 sma2_1 sma2_increment sma2_1_increment vol_increment vol_rel_increment open_1 open_incr open
2013-10-03 12.895 12.89 0.005 0.135 -495500 -0.436026047 13.02 -0.25 12.77
2013-10-04 12.765 12.895 -0.13 0.005 -21800 -0.019558586 12.77 -0.01 12.76
2013-10-07 12.59 12.765 -0.175 -0.13 -400 -0.000359002 12.76 -0.34 12.42
2013-10-08 12.42 12.59 -0.17 -0.175 104600 0.08582212 12.42 0 12.42
2013-10-09 12.5 12.42 0.08 -0.17 -232400 -0.235604217 12.42 0.16 12.58

 

Target Variable

This will be a classification variable, if the average price will go either up or down the next day.  The target will be forecasting the difference between today’s price and tomorrow’s price (which is unkonwn).

target = pd.DataFrame({"value":Predictors.sma2.shift(-1) - Predictors.sma2}).dropna()

After calculating the data to predict, the three first rows look like this:

Date value
2013-10-03 -0.13
2013-10-04 -0.175
2013-10-07 -0.17

Finally we will match predictors and target values by date and remove those rows without counterpart in the other table.

X = pd.merge(Predictors, target,left_index=True,right_index=True)[Predictors.columns]
y = pd.merge(Predictors, target,left_index=True,right_index=True)[target.columns]

X now contains the predictors and y the target values. The table contains 1,059 records at this moment.

Extreme Gradient Boosting prediction

The extreme gradient boosting is an exceptional machine learning technique for many reasons. It is based on decision trees and it has nice features such as residuals analysis, non-linear regression, feature selection tools, overfitting avoidance and many other more. Other machine learning alternative techniques commonly used for this type of analysis are Support Vector Machines, Neural Networks and Random Forest. I have used all of those for predicting market prices and the Extreme Gradient Boosting is always my first choice.

We will setup the regression model using the 65% of the data and with that model, the next 35% of the data will be used to predict future values. This simulates the actual scenario in which we have past data to train our model and we want to predict how a future datum will be with the data we currently have on hand. The data will be split in two sets: the training set to preconfigure the model and the testing set that won’t be used to build the model, but only to test if it works as expected with new data.

train_samples = int(X.shape[0] * 0.65)
 
X_train = X.iloc[:train_samples]
X_test = X.iloc[train_samples:]
 
y_train = y.iloc[:train_samples]
y_test = y.iloc[train_samples:]

After applying the data splitting, the test data set contains:

  • Train records: 688.
  • Test records: 371.

The target variables will be transformed for binary classification. A positive change in the value of prices will be classified as 1 and a non-positive change as 0.

def getBinary(val):
    if val>0:
        return 1
    else:
        return 0
 
# and the transformation is applied on the test data for later use.
# The train data will be transformed while it is being fit.
y_test_binary = pd.DataFrame(y_test["value"].apply(getBinary)

And next, the model is trained and the test data predicted to verify the accuracy of the system:

regressor = xgb.XGBRegressor(gamma=0.0,n_estimators=150,base_score=0.7,colsample_bytree=1,learning_rate=0.01)
 
xgbModel = regressor.fit(X_train,y_train.value.apply(getBinary))
 
y_predicted = xgbModel.predict(X_test)
y_predicted_binary = [1 if yp >=0.5 else 0 for yp in y_predicted]
 
print (accuracy_score(y_test_binary,y_predicted_binary))
 
 
Out: 0.76010781671159033

So, the initial accuracy without optimizing the model is 76% predicting the daily average price change for each of the the next 371 trading days.

The model can be optimized, I have just used a few parameters to avoid overfitting with the training data and adjusting the learning rate.

The features used should also be analyzed to avoid using redundant variables and to discard those with no correlation. New features should be added to try improved approaches and, to sum up, there is a lot of work that could be done around this basic model.

XGBOOST has also ways to study features. Let’s take a look at their importance:

fig = plt.figure(figsize=(8,8))
plt.xticks(rotation='vertical')
plt.bar([i for i in range(len(xgbModel.feature_importances_))], xgbModel.feature_importances_.tolist(), tick_label=X_test.columns, color="chocolate")
plt.show()

It is obvious that the field extension is huge and especially interesting.