Construye un algoritmo de Day-Trading y ejecútalo en la nube usando sólo servicios gratuitos

En primer lugar, sigue adelante y obtén el script de GitHub con este comando:

git clone https://github.com/alpacahq/Momentum-Trading-Example.git

Ahora, puedes abrirlo en tu editor de texto favorito y seguir adelante. Observa que cerca de la parte superior del archivo, hay marcadores de posición para la información de tu API: tu ID de clave, tu clave secreta y la URL a la que quieres conectarte. Puedes obtener toda esa información desde el panel de control de Alpaca.

Tu clave secreta desaparece después de que te la muestren, así que guárdala en algún lugar seguro. Sin embargo, si la pierdes, siempre puedes regenerar tu clave API para obtener una nueva clave secreta.

Reemplaza las cadenas del marcador de posición con tu propia información, y el script está listo para ejecutarse. Pero antes de dejar que toque incluso el dinero de tu cuenta simulada (totalmente ficticia), vamos a repasar lo que hace. (Si está más interesado en cómo hacerlo funcionar en GCP que en lo que hace, pase a la siguiente sección.)

En términos generales, este es un algoritmo basado en el impulso. No vamos a operar durante los primeros quince minutos después de la apertura del mercado, porque esos son siempre bastante agitados. Sin embargo, entre el minuto 15 y la primera hora, buscaremos acciones que hayan subido al menos un 4% desde el cierre del día anterior. Si lo han hecho y cumplen algunos otros criterios, los compraremos, y los mantendremos hasta que suban lo suficiente (cumpliendo nuestro objetivo de precio) o caigan demasiado (cumpliendo nuestro nivel de ‘stop’.)

Verás que debajo de la información de conexión en el código, hay algunas variables adicionales que se pueden configurar. Estos pueden ser ajustados fácilmente para adaptarse mejor a sus necesidades para el algoritmo. Hay miles de acciones disponibles para operar, pero no todas son adecuadas para una estrategia como esta.

Filtramos la lista buscando algunas cosas – queremos un precio de la acción relativamente bajo, pero no uno que sea tan bajo que se comporte más como una acción de un centavo. También queremos asegurarnos de que la acción es lo suficientemente líquida como para que se cumplan nuestras órdenes. Nos aseguramos de que el volumen en dólares de la acción fue al menos min_last_dv en el día de negociación anterior.

Los parámetros default_stop y risk son importantes para asegurarnos de que nuestro algoritmo se mantiene dentro de unos límites aceptables. El riesgo es el porcentaje de nuestra cartera que asignaremos a una posición determinada. Dado que vendemos cuando alcanzamos el stop loss, la cantidad de efectivo de nuestra cartera en riesgo en una operación es default_stop * risk * account_balance .

No voy a repasar cómo obtenemos nuestros datos de inicialización aquí – si quieres, puedes echar un vistazo al código y consultar la documentación de Polygon sobre sus datos de ‘ticker’. Lo que es un poco más interesante es el hecho de que también podemos transmitir datos en tiempo real desde Polygon. (Esto también se hace en un ejemplo «HFT-ish» recientemente publicado, otro algoritmo de day trading de Alpaca que negocia con mucha más frecuencia que éste y trata de beneficiarse de los pequeños desequilibrios de la cartera de pedidos.)

El logo de Polygon.io.

Usando el SDK Python de Alpaca, nos conectamos a tres tipos de canales de streaming. El primero es trade_updates, que es simplemente una conexión con Alpaca en la que podemos escuchar las actualizaciones de nuestros pedidos a medida que se producen. Lo usaremos para asegurarnos de que no estamos enviando varias órdenes abiertas a la vez para una acción y para ver si nuestras órdenes se completan o no.

Los otros dos canales son A.<symbol> y AM.<symbol> . Para cada acción que vayamos a vigilar, nos suscribimos a esos canales para recibir actualizaciones de Polygon sobre el precio y el volumen de la acción. El canal A se actualiza cada segundo, mientras que el canal AM lo hace cada minuto. Nosotros mismos agregamos la información del canal A para poder hacer cálculos al segundo, pero consideramos que AM es la fuente de la verdad, sustituyendo lo que hemos agregado por lo que llega a través de ese canal. Aunque podríamos salirnos con la nuestra viendo sólo A y confiando en nuestra propia agregación, confiar en AM nos da un poco de resistencia extra a los contratiempos en la conexión y demás.

Una vez que hemos añadido los datos entrantes a nuestro agregado, si aún no hemos pedido acciones de un valor, comprobamos si parece una buena compra. Definimos una «buena compra» como algo con un MACD positivo y creciente que ha estado cotizando con un volumen decente y ha subido más de un 4% desde el cierre de ayer hasta hoy. También queremos asegurarnos de que ha mantenido su impulso después de la apertura, por lo que buscamos que el precio sea superior a su punto más alto durante los primeros quince minutos después de la apertura del mercado. Esperamos que estos valores sigan subiendo de valor a medida que avanza el día.

Si tenemos una posición en un valor, también comprobamos con cada barra que entra para ese valor si es el momento de vender. Vendemos cuando la acción ha alcanzado nuestro precio objetivo o nuestro stop loss, o si el MACD sugiere que el valor está perdiendo su impulso y ha retrocedido hasta nuestra base de coste. En el mejor de los casos, un número suficiente de valores alcanzan el precio objetivo que hemos fijado para que podamos recuperar las pérdidas de los que alcanzan el stop loss, con algunos beneficios adicionales.

Al final del día de negociación, liquidamos cualquier posición restante que hayamos abierto a precio de mercado. El uso de órdenes de mercado no suele ser lo ideal, pero se utilizan en este caso porque el coste potencial de mantener durante la noche es mayor de lo que estábamos dispuestos a arriesgar en la posición. Lo ideal es que ya hayamos liquidado nuestras acciones en base a nuestros stop losses y precios objetivo definidos, pero esto nos permite atrapar cualquier cosa que se cuele por aquellos operando en plano.

Si te desplazas hacia abajo más allá de la parte inferior del método largo run(), verás cómo comprobamos cuándo abrirá y cerrará el mercado utilizando el endpoint de la API Alpaca Calendar. Usar esto significa que, si lo desea, puede configurar un trabajo Cron para ejecutar el script a la misma hora todos los días sin tener que preocuparse de que los días festivos del mercado o las aperturas tardías causen problemas. Mucha gente prefiere ejecutar sus scripts manualmente, pero es bueno tener la opción de dejar que se ejecute por sí mismo.