Llevo mucho tiempo sin escribir nada porque no tenía nada interesante que comentar, pero hoy si.
Si te gustaría tener una plataforma con la que investigar algoritmos de trading intradía, o simplemente te gustaría poder cotillear la cotización al instante, hay una forma de hacerlo sin que te gastes dinero. Esto es lo que yo hago. Además es útil aunque solo hagas un par de compras al año, a veces te metes en la web de tu broker y hay que hacer un acto de fé para creerse la cotización que te da.
La web de Nasdaq (http://www.nasdaq.com) ofrece la posibilidad de leer el precio de una acción en tiempo real, por ejemplo en http://www.nasdaq.com/symbol/spy/real-time vemos la cotización en tiempo real del SPY. Pero estar todo el día dándole a Crtl+R para actualizarlo no es que sea muy productivo.
Y Matlab (www.mathworks.com) tiene una función muy útil de lectura de urls. Lee el código fuente de una url para poder utilizaro. Matlab, para aquel que no lo conozca es un software de cálculo numérico y programación sobre todo orientado a ingeniería y al ámbito científico.
Gratis entre comillas, porque Matlab no es gratis. Pero en todas las universidades hay licencias de Matlab, por ejemplo. No es difícil de encontrar. Y aún así tampoco es caro como para que no podamos comprarlo si realmente nos interesa.
Esas dos piezas son las únicas que necesitamos. Un proveedor de datos (Nasdaq) y un entorno de programación que pueda leer los datos (Matlab). Además Matlab te permite desarrollar tus propios algoritmos con los que hacer trading automático. Para ello lo único que necesitarías es una forma de enlazar Matlab con el software que uses para comprar y vender, tan fácil como comunicarse a través de ficheros con un mini script que te permita progrmar tu broker en python o en lo que sea.
Y, ¿cómo se programa? Pues aquí tienes una función que he programado para graficar en tiempo real la cotización de una acción:
function plot_real_time(ticker)
close all
if ~exist('ticker','var')
ticker = 'spy' ;
end
max_N = 5000 ;
sale = [] ;
time = [] ;
h = plot(time,sale) ;
set(h,'YDataSource','time')
set(h,'XDataSource','scale')
while true
[s,t] = get_real_time(ticker) ;
if isempty(time)
sale = s ;
time = t ;
elseif length(time)==max_N && time(end)~=t
sale = [sale(2:end),s] ;
time = [time(2:end),t] ;
elseif length(time)<max_N && time(end)~=t
sale(end+1) = s ; %#ok<AGROW>
time(end+1) = t ; %#ok<AGROW>
end
if length(time)>2
h = plot(time,sale,'LineWidth',1) ;
title([upper(ticker),' - Last sale: ',num2str(sale(end),'%1.2f'),' at ',datestr(time(end),'HH:MM:SS'),' '],'FontSize',15)
grid on
datetick('x')
refreshdata(h) ;
drawnow
pause(1)
save DATA.mat time sale
end
end
function [last_sale,time] = get_real_time(ticker)
if ~exist('ticker','var')
ticker = 'spy' ;
end
url = ['http://www.nasdaq.com/symbol/',ticker,'/real-time'] ;
while true
try
str = urlread(url) ;
str_last_sale = '<div id="qwidget_lastsale" class="qwidget-dollar">' ;
str_time = '<span id="qwidget_markettime">' ;
index = strfind(str,str_last_sale) + length(str_last_sale) ;
i = index ;
while str(index)~='<'
index = index+1 ;
end
last_sale = str2double(str(i+1:index-1)) ;
index = strfind(str,str_time) + length(str_time) ;
i = index ;
while str(index)~='<'
index = index+1 ;
end
try
time = datenum(str(i:index-1),'mm/dd/yyyy HH:MM:SS AM') ;
catch
error('The market is closed.')
end
break
catch err
disp(sprintf('Error catched at %s # %s',datestr(now,'HH:MM:SS'),err.message)) %#ok<DSPS>
pause(1)
end
end
