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.