Rankia - Comunidad Financiera
Usuarios  |  Regístrate  |  Ayuda
 

12 de mayo de 2008

Psicología 1 - Introducción

En esta serie vamos a intentar explicar como la mente se distancia mucho de la realidad y como el mercado es maniaco-depresivo, dado que la gente tiene tendencia a serlo. El mercado por si refleja toda la información existente tanto a nivel técnico como a nivel fundamental, solamente cuando la euforia y el miedo entran en juego es cuando el mercado se aleja de la realidad y los stocks empiezan a estar infravalorados o sobrevalorados.
Esa es la psicología del mercado, pero también tenemos que mirar nuestra propia psicología, cada uno es un mundo y es diferente aunque tenemos muchas cosas en común y la naturaleza humana tiene mucho que ver en nuestra forma de reaccionar, tenemos que tener en cuenta que nuestras emociones son el producto de millones de años de evolución, y ha sido una evolución relacionada con la vida salvaje y animal y todo eso ha cambiado en solo unos pocos años, conseguir alimentarnos o que no se alimenten de nosotros no es nuestra meta en la mayoria de los casos y nuestras emociones estan optimizadas para ello.

Nuestras emociones sirven para defendernos de los peligros de la naturaleza y para poder sobrevivir en un entorno hostil, pero ahora el entorno es muy diferente y nuestras emociones no funcionan tan bien como deberían en nuestro entorno actual que nada tiene que ver con el entorno en el que se desarrollaron estas capacidades.
Por tanto las personas que son capaces de analizar sus propias emociones y no darles rienda suelta, sino controlarlas y comprenderlas y saber porque se producen y si las seguimos a que punto nos llevan. Si ese punto es el correcto o no y si las ignoramos y racionalizamos y actuamos de una forma mas concordante a nuestro entorno en vez de seguir a nuestros instintos llegaremos a nuestras metas en vez de sabotearlas.

También es importante saber cuales son nuestras metas, si realmente son lo que queremos o nuestras metas están basadas en carencias que tenemos y desconocemos y tratamos de llenar con otra cosa que nos satisface momentáneamente, pero nos sigue dejando vacíos al no llenar esa carencia, por ejemplo la gente que necesita adrenalina porque tiene adicción a ella y busca perder en los mercados para obtener esa adrenalina ya que perder produce mas adrenalina que ganar. O la gente que va de compras para suplir una necesidad que tiene, en el momento que esta de compras se siente bien, pero momentos después sigue sintiéndose vacía.
La inteligencia no es ni una décima parte de importante que la inteligencia emocional para triunfar en el trabajo, en los mercados financieros, en las relaciones sentimentales y cualquier otro tipo de relación interpersonal, la gente con mucha inteligencia pero sin inteligencia emocional fracasan constantemente y son infelices, sus sentimientos y emociones están desalineadas con su realidad y tratan de razonar lógicamente lo abstracto y les lleva a actuar de una forma que es resto de la gente ve como carencia de sentido común.

Voy a poner un ejemplo de inteligencia emocional, tenemos que racionalizar por ejemplo el hecho de que un avión llegue tarde es algo que ocurre un X% de veces digamos 10% de las veces, por tanto una de cada diez veces va a ocurrir de media, por tanto es algo del sistema, que no depende de nosotros y no podemos hacer nada para cambiarlo, solo podemos aceptarlo y asumirlo, por tanto si de cada diez veces una tenemos retraso en un avión, que sentido tiene montar en cólera, hacer enfadar a los de alrededor y sentirnos mal?

Simplemente es así, la ley de los grandes números se cumple y te pueden pasar dos seguidos, pero a la larga te pasaran uno de cada diez, por tanto nuestro instinto puede que nos quiera llevar a un estado de agresividad, furia etc..

Que lo único que hace es no dejarnos pensar con claridad, stressarnos, producir una adrenalina innecesaria, para finalmente llegar al mismo estado que hubiésemos llegado si lo hubiésemos racionalizado, entendido y sabido que no podemos hacer nada y es algo que ocurre, e incluso siendo un poco positivos aprovechar ese tiempo para algo útil, en vez de para estar enfadados y si tenemos a alguien cerca, además empeorar la relación con esa persona, ya que alguien de mal genio al lado no es agradable.

Debemos de entender que la gente opina según sus propias experiencias y en función de la intensidad que hayan tenido esas experiencias le calaran mas o menos a la hora de tomarlas en cuenta, por ejemplo, la gente de menos de 40 es muy probable que no tenga la experiencia de la vivienda bajando, y la gente de mas es probable que la haya olvidado, por tanto eso llevo a una convicción general de que la vivienda nunca baja, aun cuando mirando estadísticas históricos etc.. Sea claro que con una exactitud bastante impresionante se producen los ciclos de la vivienda de subidas y bajadas.
También es muy difícil que alguien recuerde el crack del 29, se ha oído hablar pero pocos lo han vivido, cuanto mas lejos quede en el pasado, será mas probable que ocurra algo similar.

Para empezar a explicar estos conceptos y las necesidades de cada uno en cada momento es interesante ver la pirámide de Maslow de las necesidades humanas:


En el siguiente post explicare como a la gente que tiene unas necesidades cubiertas le surgen las siguientes, aunque en todo momento tengas necesidades de todo tipo, si estas hambriento no pensaras en autorealizarte escribiendo un libro y si has nacido en una familia rica es mucho mas difícil que estés motivado para conseguir dinero que te de una seguridad de la que dispones es mas probable que busques reconocimiento y autorrealizacion.
Todo esto también depende mucho de las convicciones que te han dado al educarte y de la sociedad en la que vives y las reglas que impone, pero esto ira en el siguiente!

Nota: Me he propuesto hacer esta serie de psicología para indagar mas en un campo que realmente me parece apasionante, este fin de semana ha venido mi amigo Andoni que es psicólogo y hemos hablado bastante de nuestras relaciones sentimentales y de nuestros trabajos ya que acabamos de comenzar nuevos trabajos ambos, y de como nos sentimos ambos con ambas cosas, ya que estamos en sitiaciones stressantes similares an ambas situaciones, han salido unas reflexiones muy buenas y unas conclusiones interesantes y además me ha dejado un libro muy bueno que va a servir de base para esta serie de psicología.

Etiquetas:

8 de mayo de 2008

Laboratorio de Inversión y Especulación 7 - Colaborar No Programadores

Ya tenemos una carpeta en los servidores de Rankia donde colocar los históricos que descarguemos, tenemos tres descargadores funcionando, solo tenemos que crear los batch para descargar todo lo que queremos, podemos empezar con:

- Un batch para el IBEX 35
- Un batch para el Eurostoxx50
- Un batch para todo el mercado continuo
- Un batch de índices
- Un batch de ETFs
- Un batch de los valores del S&P500
- Un batch de los valores del NASDAQ
- Otros que se propongan

Estas son tareas para los no programadores, el que se anime que me lo diga y coja uno. Tenemos que coordinar quien descargara y subirá por FTP todos los días las actualizaciones, yo no puedo ahora mismo porque me estoy mudando de piso y tendré que pedir internet y esos líos, así que no me quiero comprometer hoy mismo, quizás dentro de 2 semanas si. Esta tarea debería de ser automática prácticamente y cuestión de unos clicks, esperar 10 min a que descargue y listo!

Como crear un batch?

Tenemos dos tipos de batch, uno para descargar la información por primera vez, entre dos fechas y otro para actualizar el archivo desde la fecha mas reciente.
Para seguir un formato común pondremos el nombre del tipo IBEX_RETRIEVE.batch para obtener los datos por primera vez y otro IBEX_UPDATE.batch para actualizarlos diariamente.
Tenemos ejemplos de batch para actualizar y para importar en el post lab 4.
Para crear un batch solo se necesita Notepad, ved los ejemplos:
Crear un batch desde BolsaMadrid





Seguid las flechas hasta llegar a los historicos, ver el codigo fuente y usar el isdn como dato necesario para los batch, el ticker sera el nombre.
En este caso seria:
name="nombre" value="ABENGOA"
name="isin" value="ES0105200416"
RETRIEVE VALUE ES0105200416 FROM BOLSAMADRID INITDATE 01/01/2006 ENDDATE 04/04/2006 TICKER ABENGOA
UPDATE VALUE ES0105200416 FROM BOLSAMADRID TICKER ABENGOA
Crear un batch desde Yahoo







Seguid las flechas hasta llegar a los historicos, presionar update, y obtener el dato para el batch de la URL.
RETRIEVE VALUE %5EIBEX FROM YAHOO INITDATE 01/01/2006 ENDDATE 04/04/2006 TICKER IBEX
UPDATE VALUE %5EIBEX FROM YAHOO TICKER IBEX

Crear un batch desde Google



Seguir las flechas hasta llegar a los historicos, presionar update, y obtener el dato para el batch de la URL.
RETRIEVE VALUE 99624 FROM GOOGLE INITDATE 01/01/2006 ENDDATE 04/03/2006 TICKER CISCO
UPDATE VALUE 99624 FROM GOOGLE TICKER CISCO
En todos los RETRIEVE tendremos que intentar buscar las fechas con mayores valores posibles.
Queda claro que este proyecto colaborativo tiene la finalidad de buscar pautas de inversión y especulación mediante estadísticas y todos los métodos que se nos ocurran, necesitando históricos para empezar a trabajar en ello, dado que ninguno de nosotros recibimos un sueldo por hacer este trabajo, sino que es un hobby, no hay obligación de hacer tareas ni de cumplir plazos de tiempo, cada cual tiene su propio trabajo, familia y quehaceres varios...
Si se cree que se va a tener tiempo se toma una tarea mas larga, sino una mas corta si se ha tomado una tarea y no se tiene mas tiempo se deja un mensaje diciéndolo y otra persona puede continuar con la tarea.

Yo personalmente he dedicado varias decenas de horas en las ultimas semanas al proyecto y probablemente pueda dedicar muchas menos en los próximos meses debido a las condiciones de mi trabajo, voy a gestionar usuarios de sourceforge y responder dudas, y si tengo tiempo escribiré código y si no, lo dejare para mas adelante.

Creo que colaborar en el proyecto es beneficioso para todos aparte de mostrar una iniciativa por parte de la persona que es muy valorada, colaborar en un proyecto Open Source es algo que yo pondría en mi CV, aparte del beneficio que pueda obtener de los resultados del propio proyecto en si.

Comentario para los programadores:

Yo creo que se podría considerar hacer las pautas mediante scripting:http://www.beanshell.org/manual/bshmanual.html
Da mucho juego con las funcionalidades remotas, consola etc... Y las pautas de cada uno serian importables como fichero de texto.
Mirad el manual y me decís que os parece!

Juanmi apuesta por poner varios lenguajes de scripting... A gusto del programador, al menos uno!

NOTA: Como entiendo que para la gente que no sabe programar y que tiene conocimientos muy básicos de informática, es complicado colaborar, estoy trabajando en un interfaz gráfico, que sea ejecutable con un .exe normal desde windows y no necesite instalar java sino que ya lo lleve incluido (por supuesto la aplicación a descargar será mas pesada.)

NOTA 2: Tengo pensado hacer un coloquio con Francisco Llinares dentro de unas semanas, cuando tengamos mas funcionalidad y lo haya probado mas gente, para poder hablar de que el lo que quiere cada uno, y de las tareas que quiere hacer cada uno, con estos últimos posts hay material mas que de sobra para colaborar y en dos o tres semanas anunciamos el coloquio, ya que tendremos mas gente colaborando activamente y el sistema estará probado y conocido por otros muchos, eso espero...

Etiquetas: ,

Laboratorio de Inversión y Especulación 6 - Colaborar Programadores

La gente con mas conocimientos de programación, puede colaborar en todo tipo de tareas, proponer ideas para la arquitectura etc...

Unos comentarios de Juanmi que ya ha estado colaborando activamente en el proyecto:

Me gustaría fijar el camino a donde vamos para que tengamos que hacer la mínima rearquitectura al cambiar las dimensiones del problema y poder ir paralelizando el desarrollo. Por supuesto no vamos a hacer esto de golpe, sino que iremos aproximándonos pero sin cerrarnos puertas.

Creo que deberíamos hacer dos sistemas:

El primero no visual interno:

1º Sistema de cubo de información
a- El cubo se va rellenando con quotes
b- El Sistema actualiza las quotes automáticamente
c- Otros Cálculos derivados de las quotes
d- Se guardan en el cubo tb estos cálculos
e- Se automatizan tb estos cálculos

2º Dimensionamiento:
a- Clusterizamos el cubo de información
b- Paralelizamos para reparto en hilos y máquinas la actualización y el calculo

3º Optimización:
Creación de cubos diarios. Basicamente entorno de persistencia y ejecución distribuido (que solo necesitemos poner mas nodos para ampliarlo).

Arquitectura+servicio global de persistencia
Gestor de tareas y distribución de carga.

En resumen: un poco de arquitectura, un par de gestores.

Lo demás es crear los feeders de screenscraping, algoritmos de calculo y sistemas para importar y exportar datos.

Parte visual:
Entorno independiente de gestión que administre y use la información.
a- Ver datos, sacar gráficos con los datos.
b- Crear, eliminar y gestionar tareas automatizadas del sistema.(pudiendo configurar elementos de calculo, crear líneas de comando o crear cálculos con scripting).
c- Poder pintar directamente en los gráficos, poder aplicar cálculos directos locales sobre los datos en pantalla o aplicar los resultados de cálculos automatizados. Poder guardar vistas del gráfico con sus cálculos asociados.

Deberíamos tb crear un sitio donde estén los datos descargados para todo el mundo y que sea el prioritario de descarga, así se bombardea lo menos posible a las webs de datos. Si empiezan a tener demasiada carga automatizada de peticiones van a cambiar las cosas para cortar de raíz (ya he estado en casos similares en el otro bando).

Digase, colgar los históricos y las actualizaciones diarias (por ejemplo últimos 30 días y el resto a históricos).

La gente sincroniza contra ahí y luego si quiere algo mas se lo baja.

Poco a poco iremos haciendo el sistema maestro lo mas rico posible, lo normal seria que todo el mundo terminase sincronizando contra este principal y no fuese a buscar datos a ningún otro sitio. Siempre que sea posible deberíamos indicar en la aplicación la fuente de los datos, ya que en realidad son datos que hacen públicos y nos los prestan. A la hora de implementar algoritmos hay que identificar al autor y asegurarse que el algoritmo es libre.

Muy importante se necesitan ficheros de configuración en plan, para hacer el sistema mas fácil de usar, mas inteligente y para ir haciendo la copia de datos

principal:ticker-value-proveedor de datos

Creo que habría que crear un modelo de información para acciones, otro para futuros, otro para opciones y si acaso otro para bonos. Con todos los campos posibles, de tal manera que si están los datos se meten y sino pues nada...Normalmente es mejor que sobren campos a que falten. Los campos que no se llenen ahora quizás en un futuro cuando se encuentre la información si se llenen (Por ejemplo el de acciones prestadas). Los campos que sea información que se pueda sacar a través de un calculo de otros datos que tengamos no los metería (por lo menos por ahora).

Creo que Llinares nos podría dar esa información, a nosotros seguro que se nos pasarían campos.

Los temas de cluster y paralelizacion no son tan complicados. Metemos Sequoia para clusterizar y JPPF para GRID (si conocéis implementaciones que os parezcan mejores decírmelo). El tema es pensar que lo vamos a meter.

Para la persistencia usamos un motor de JDO (hibernate u otro) donde guardemos datos+metadada+nombre de forma independiente. Uno que automatice lo mas posible. A la hora de hacer persistencia simplemente tenemos que evitar al máximo la interdependencia de tablas (aquí hay que jugar un poco porque no es como le gusta a JDO).

En el tema de la bolsa y en sistemas grandes es mejor bajar la dependencia de datos. Por un lado tendremos los datos y por otro lado los cálculos basados en esos datos.

Cada uno guarda sus soluciones de forma independiente y solo hay que guardar la metadata de interdependencia.

Por ejemplo:
Se bajan las quotes de ibex y vía jdo se crea una tabla llamada ibex donde se guardan las quotes.

Se automatiza el calculo de media móvil para ibex a 30 días:

El algoritmo recupera su info anterior si quiere o tiene (datos de medias a 30 días de ibex realizados), recupera las quotes de ibex que le interesan, calcula el nuevo punto para el día y se guarda en jdo el nuevo valor. Por debajo lo que ocurriría es que se crease o reusase una "tabla" para ese estudio, algo así como MOV30_IBEX y los resultados de la media para ese día se guardarían en esa "tabla" (junto a los demás históricos).


Aparte cuando se crea esta tabla se añade la meta información de dependencia: que MOV30_IBEX tenia relación con ibex (La meta-info nos sirve para que los humanos asociemos la información).

De esta forma desde el entorno gráfico, si estamos en ibex podemos listar los estudios que se basan en el (Gracias a su meta-información) y decir que se pinten si queremos.

TB seria fácil hacer un motor de lo mismo hacia fichero. Pero finalmente creo que detrás habrá una base de datos y encima tendremos importadores y exportadores de info a formatos que nos interesen.

Es simplemente aprovechar un entorno de mucha lectura y calculo pero pocos cambio (casi todo inserciones), con casi nulas transacciones.

Mas adelante podemos meter sistemas de eventos para avisos o cálculos en cascada (por ejemplo que estén atentos a que 2 medias móviles se crucen o cosas así para que nos avisen).

Resumiendo:
1- Modelo de información abierto, dinámico pero independiente. Meta-Información para asociación humana.
2- Entorno de calculo y automatización por "tareas" escalable
3- Tareas de importación y exportación de datos (los feeders actuales y sus persistores).
4- Entorno visual que gestione y visualice esta información. Que permita crear nuevos cálculos, automatizarlos, graficarlos etc...

Si pasásemos de datos diarios a mensuales, minuto, ticker ...etc. Podríamos reutilizar todo esto, simplemente añadiríamos nuevas vistas al cubo, con info de quotes timeframe de minutos podríamos crear las vistas de timeframe de horas...etc.

En realidad lo que mas tiempo lleva es crear todos los feeders (importadores sobre todo), algoritmos de calculo y un entorno visual cómodo. Lo demás es un tema mas técnico que de muchas líneas de datos. Esto cumpliría con todo lo comentado en el mail anterior.

Además muchos usuarios podrían estar usando el grid en paralelo de forma bastante óptima (para esto ya abría que empezar a meter algo mas de arquitectura de gestión de usuarios).

Creo que si a esto luego le sumamos scripting y motor de reglas vamos muy bien.

NOTA: A partir de ahora este tipo de comentarios de tipo técnico irán en el foro de Sourceforge, en el próximo post explicare con detalle como puede colaborar la gente que no sabe programar.

Etiquetas: ,

7 de mayo de 2008

Laboratorio de Inversión y Especulación 5 - Sourceforge y Colaborar

El código fuente esta disponible en Sourceforge, ya tenemos un proyecto:

CVS Server: laboratoriodein.cvs.sourceforge.net
Shell Server: shell.sourceforge.net
Web Server: laboratoriodein.sourceforge.net

Todos los que vayan a colaborar que se registren en sourceforge y me den su usuario para que los agregue al proyecto. Los comentarios respecto a la parte técnica del proyecto, irán en el foro de sourceforge, los comentarios de la parte funcional irán en un foro de rankia.

Tareas para los que saben algo de programación:
-Importadores, de momento vamos a por estos, después cuando estén listos iremos a por otros.

He pedido unas URL a Francisco Llinares y las he mirado un poco por encima, principalmente las ha mirado Juanmi., aquí tenemos sus comentarios:

1-nymex posible: http://www.nymex.com/lsco_fut_condet.aspxproduct=CL&month=Feb&cmonth=G&year=9&currPrev=Ccmonth es una sequencia que llevan.

En esta tienes toda la energía del mercado de Londres

2-tb posible. Diarion tb los quitan https://www.theice.com/marketdata/settlementPrices/getDailySettlementsResults.do**los datos salen en esta dirección vía post con contractChoice=num

3-Sirven 10 días de datos, cvs muy comodo
En esta tienes todo lo del LIFFE - EURONEXT Euribor y todos los tipos de interés de la libra y el franco suizo http://www.liffe.com/reports/eoditem=Historieshttp://www.liffe.com/data/p_ds080430so.csv.csv
http://www.liffe.com/data/prefijo+año+mes+dia+sufijo+.csv para cada uno hay que tener la lista de prefijos y sufijosdigase mapear: Ticker=prefijo,sufijo

4-PDF hay que hacer pruebas para destriparlo

5-http://www.cbot.com/cbot/pub/page/0,3181,759,00.html

Se puede hacer, hay que mapear sus códigos de números a los ticker.

Si algo parece un poco confuso se aclara en los comentarios y lo que indague cada uno también debe de aparecer en los comentarios.

El que quiera colaborar en algo mas, que me lo diga, tareas hay muchas pendientes, puedo hacer una lista muy larga y la voy a hacer y ponerla en sourceforge para que la gente pueda pedirme tareas.

No hay prisa en hacer las tareas, pero hay que hacerlas y es mejor coger cosas pequeñas e ir haciéndolas poco a poco, no hay mucha gente con tiempo para colaborar, pero entre todos podemos hacer que avance a buen ritmo, para después del verano podríamos tener una plataforma muy interesante.

También podéis proponer ideas de donde descargar mas información útil.

Necesito que todo el que quiera colaborar se registre en sourceforge y me pase su usuario para que lo agregue al proyecto.

Como funciona un importador?

Los importadores están localizados en el paquete jds.com.locations.sites

Un importador tiene un constructor, una función download y otra getUrl, el constructor siempre es igual, solo hay que ver el formato de los que ya tenemos, la función getUrl construye la URL para descargar los valores de un mes en concreto, lo único que nos interesa es que debemos de pasarle el día de inicio, el día de fin, el mes y el año:

A continuación vemos el getUrl de Google:

public String getUrl(int dayMin, int dayMax, int month, int year) {
return ("http://finance.google.com/finance/historical?cid=" + name
+ "&startdate=" + months[month] + "+" + dayMin + "%2C+" + year
+ "&enddate=" + months[month] + "+" + dayMax + "%2C+" + year);
}


A continuación vemos el getUrl de Yahoo:

public String getUrl(int dayMin, int dayMax, int month, int year) {
return ("http://finance.yahoo.com/q/hp?s=" + name + "&a="
+ df.format(month) + "&b=" + df2.format(dayMin) + "&c=" + year
+ "&d=" + df2.format(month) + "&e=" + df2.format(dayMax)
+ "&f=" + year + "&g=d");
}


A continuación vemos el getUrl de BolsaMadrid:

public String getUrl(int dayMin, int dayMax, int month, int year) {
return ("http://www.bolsamadrid.es/comun/empresas/infhist.asp?id=esp&isin="
+ name
+ "&bolsa=0&scontrata=02&tipo=htm&dia1="
+ df2.format(dayMin)
+ "&mes1="
+ df2.format(month + 1)
+ "&anyo1="
+ (year)
+ "&dia2="
+ df2.format(dayMax)
+ "&mes2="
+ df2.format(month + 1) + "&anyo2=" + year + "&Buscar=Aceptar");
}


Lo siguiente será la función download que descarga la información usando HttpUnit para la url que le pasamos al método, voy a poner como ejemplo el download de BolsaMadrid:

public int download(String url) throws Exception {

int results = 0;

// Separa los miles con puntos
DecimalFormat dfLocal = new DecimalFormat();
DecimalFormatSymbols dfsLocal = new DecimalFormatSymbols();
dfsLocal.setDecimalSeparator(',');
dfsLocal.setGroupingSeparator('.');
dfLocal.setDecimalFormatSymbols(dfsLocal);

WebConversation webConversation = new WebConversation();
this.configProxy(webConversation);

WebRequest webRequest = new GetMethodWebRequest(url);
WebResponse webResponse = webConversation.getResponse(webRequest);

WebTable webTable = webResponse.getTableStartingWith("Fecha");
if (webTable == null)
return 0;
int rows = webTable.getRowCount();

for (int row = 1; row < date =" webTable.getCellAsText(row," cierre =" webTable.getCellAsText(row," anterior =" webTable.getCellAsText(row," volumen =" webTable.getCellAsText(row," max =" webTable.getCellAsText(row," min =" webTable.getCellAsText(row," quote =" new">

Voy a poner el código del importador de Google y me comentáis lo que no entendáis en los comentarios y lo voy explicando, si es necesario, explicare en otro post como funcionan los otros dos importadores y como crear mas.

package jds.com.locations.sites;

import jds.com.locations.AbstractFeeder;
import jds.com.model.Quote;
import jds.com.service.QuotesPersistanceService;


import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.HttpUnitOptions;
import com.meterware.httpunit.WebConversation;
import com.meterware.httpunit.WebRequest;
import com.meterware.httpunit.WebResponse;
import com.meterware.httpunit.WebTable;


public class Google extends AbstractFeeder {
//private static Logger logger = Logger.getLogger(Google.class);

private String[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };

public Google(String name, String tickerName,
QuotesPersistanceService persistance) {
super(name, tickerName, persistance);
}

public int download(String url) throws Exception {

int results = 0;

HttpUnitOptions.setScriptingEnabled(false);

WebConversation webConversation = new WebConversation();
this.configProxy(webConversation);
WebRequest webRequest = new GetMethodWebRequest(url);

WebResponse webResponse = webConversation.getResponse(webRequest);

WebTable webTable = webResponse.getTableStartingWith("Date");
if (webTable == null)
return 0;
int rows = webTable.getRowCount();


for (int row = 1; row < date =" webTable.getCellAsText(row," cierre =" webTable.getCellAsText(row," anterior =" webTable.getCellAsText(row," volumen =" webTable.getCellAsText(row," max =" webTable.getCellAsText(row," min =" webTable.getCellAsText(row," quote =" new">(getUrl(int dayMin, int dayMax, int month, int year) {
return ("http://finance.google.com/finance/historical?cid=" + name
+ "&startdate=" + months[month] + "+" + dayMin + "%2C+" + year
+ "&enddate=" + months[month] + "+" + dayMax + "%2C+" + year);
}

}


Estoy seguro que pueden salir muchas dudas, las resolveremos en los comentarios entre todos y si hay algo que realmente hay que explicar mas en profundidad, haré otro post para explicarlo.

Etiquetas: , ,

Reflexión: Es el mejor momento!

Estamos en un momento delicado de los mercados financieros y probablemente del mercado laboral, creo que es el mejor momento para comenzar a operar en los mercados y para buscar tu primer trabajo.

Yo hice esto mismo en la caída de las .com, estaba en la universidad y veía carteles de anuncios para trabajar en USA en Sillicon Valley, en multitud de posiciones muy buenas, cuando realmente empecé a buscar trabajo, me encontré con algo totalmente opuesto, un cambio del mercado de 180 grados, mande cientos y cientos de CVs y nada de nada... Me rompí la cabeza buscando formas de llegar a las empresas, por email, por correo, por contactos, por teléfono..

Decidí probar suerte en UK y con un ingles patético en un mes estaba trabajando como programador de java en un puesto mal pagado (12K brutos), pero que seria en el futuro un buen lanzamiento para mi carrera profesional.

Al mismo tiempo llevaba bastante tiempo siguiendo los mercados financieros, pero no tenia ni idea de lo que veía, solo sabia que todo subía y había que esperar a que estuviera mas barato para comprar, hice una buena operación en el canje Lycos/Terra y me creí el "amo de la barraca"...

Paso lo que tenia que pasar, lo que siempre pasa, los amigos que me vieron ganar dinero dijeron "toma este dinero he enviártelo con el tuyo...", empecé a perder dinero rápidamente y ellos también, lo perdieron prácticamente todo... Yo tuve un poco mas de suerte ya que tuve una urgencia para sacar mi parte (Irme de vacaciones a Cuba) y no perdí tanto... Afortunadamente no tenia tanto dinero y no podía perder tanto, solo era un estudiante en el fondo y tenia unos pocos ahorrillos... Si esto me hubiese pasado ahora hubiese sido algo muchísimo mas grave!

He visto ún caso realmente alarmante, como empezar a trabajar en Suiza como informático en pleno auge de las .com, ganando tanto dinero como recién graduado que decía "no tengo tiempo para gastar todo lo que gano"...

Dejar el trabajo para irse de vacaciones porque no le quedaban mas y al volver encontrar otro mejor en un gran banco de inversiones por mas dinero todavía y hacer el mismo proceso cuando se le terminaron las vacaciones, claro con un absoluto convencimiento de que ser informático es algo así como ser una divinidad y que los demás por mucho que digan que hay crisis! A los informáticos no les afecta...

Después de esto, la historia es: mas de un año sin trabajo (Claro los primeros meses las exigencias son muy altas y cuando las bajas, la cosa ha empeorado mucho y te sigue siendo difícil...), hasta quedarse sin nada de dinero tener que pedir prestado para vivir y terminar de camarero en una zona turista de la costa de España y un agujero en el CV irreparable al menos en pocos años!

Si esta persona en ese momento hubiese sido consciente de los vaivenes del mercado y en vez de derrochar ese dinero lo hubiese invertido o ahorrado o comprado una casa... La situacion seria muy muy diferente e incluso hubiese aguantado en un puesto impresionantemente bueno para un recien graduado y ahora ya seria financieramente independiente.

Actualmente veo gente que termino de estudiar hace 3 o 4 años y que les ha ido muy bien y ganan mucho dinero el comentario es "por el reloj que llevas se sabe lo bien que lo haces en la citi!", solo con eso me lo dicen todo... Se gastan miles de libras en un reloj para presumir de lo bien que les va.. En esta crisis caerán muchos de esos! (Yo no uso reloj!)

No saben lo que es una crisis y no están preparados y ya se ha despedido a 47.000 personas en la citi y se calcula que caerán 100.000 mas en los próximos dos años!

Todos estos conocimientos y experiencias me han llevado a estudiar la historia para ver como las burbujas se han formado, esto me ha llevado a la conclusión de que aun no habiendo vivido un bajón de la inmobiliaria en mi vida, todo el mundo estaba equivocado porque nunca lo habían vivido y tenia que pasar, me he ahorrado grandes problemas al no haber comprado una vivienda en los últimos años.

Cosa que he visto hacer a muchos convencidisimos de que no existen las burbujas ni las tendencias ni los cambios de tendencia ni nada parecido, cuando con un estudio de unos pocos días te lleva inevitablemente a ver que es algo que se ha reproducido constantemente en la historia, y que aplicando la lógica y el sentido común, te dice que es una situación absurda! Como todas las burbujas!

Con un poco de experiencia identificar una burbuja avanzada es algo muy fácil, y no arruinarse con ella, es difícil identificar el momento en que va a explotar, pero identificar que es una situación ilógica y sin sentido es fácil, lo ideal es identificar la frase temprana de la burbuja para entrar con ella y sacar provecho, y cuando ya es claro que es una burbuja y tiene que reventar en algún momento, cubrir las posiciones para evitar caer con todos! Quizás no sabemos cuando explotará, pero sabemos que lo hará, cosa que ya es muy valiosa!

Mi conclusión es que si empiezas en condiciones muy favorables, te vas a confiar y vas a atribuirte todos los méritos cuando los méritos son del mercado a todo el mundo le va bien, cuantos mas méritos te atribuyes mas confiado estas y menos reconocerás tus errores cuando los tengas, tomaras riesgos mas altos y cuando el mercado se de la vuelta el batacazo será impresionante!

Y para cuando te des cuenta de que no eras tu el genio sino que los mercados tanto financieros como laborales tienen tendencias alcistas y bajistas, puede que sea demasiado tarde y ya te hayas pegado un batacazo que te cueste muy caro.

Sin embargo si empiezas en condiciones adversas, lo vas a pasar mal, pero como empiezas con cautela vas a perder poco, te vas a esforzar mas, y por muy buenas condiciones que vengan luego ya estas prevenido y sabes que lo bueno no es eterno, sabes que las vacas flacas llegaran y estarás preparado, tendrás en mente los duros inicios y los batacazos iniciales, que afortunadamente como estabas cerca del suelo por recién iniciado no fueron muy duros, pero para la próxima vez ya sabes que debes de poner un colchón en el suelo para el batacazo!

El iniciar las andanzas en un mercado bajista te dará unas lecciones y unos conocimientos que realmente valen muchísimo mas que el dinero, para aprovechar futuros mercados alcistas y amortiguar los bajistas!

Mi consejo para los que empiezan a invertir como en el mercado laboral, es tomárselo con calma, asumir los batacazos y aprender, aprender y aprender que es lo que vale! En vacas gordas ahorrar para vacas flacas, por ejemplo el deposito de un piso etc...

Y tener modestia (al menos ante ti mismo) saber que el mercado puede cambiar, observarlo y estar preparado para ello, principlamente sin meterse en deudas que no podras pagar!

Una norma para mi es no tener deudas que no pueda pagar si pierdo mi trabajo, que queda claro que se puede perder...

Es mejor aprender a nadar en aguas revueltas para disfrutar de las aguas tranquilas que aprender a nadar en aguas tranquilas y ahogarse en aguas revueltas!
NOTA: Necesito colaboradores para el laboratorio de momento solo estamos 2!!

Etiquetas:

5 de mayo de 2008

CBI 4 - Derivados 1 - Introducción (Primera parte)

Nivel de conocimiento: Basico - Requisitos: Conocimientos Basicos de los mercados financieros

Que son?

Son instrumentos cuyo valor esta basado o deriva de otro instrumento (Al que llamaremos subyacente, en ingles underlaying)

Por ejemplo: En un swap de tipos de interés su valor deriva de uno o mas tipos de intereses.

Mediante derivados el participe puede jugar con las fluctuaciones del subyacente sin necesidad de tener este ultimo.
Hoy dos tipos básicos de derivados:
- Forward : Es un acuerdo realizado hoy para comprar o vender un activo en una fecha "forward" acordada.
- Options : Le dan al poseedor de la opcion, el derecho pero no la obligación de entrar en una transacción financiera en una fecha acordada. El que posee la opcion "holder" debe de pagar una prima "premium" al que la compra "writer" por este derecho "right".

Tenemos dos tipos de opciones Call y Put, Call representa el derecho a comprar y Put el derecho a vender.
Una opcion Call será beneficiosa para el holder si el precio del subyacente a subido por encima de Strike price acordado. (Pnemotecnico - Call es Llamar en ingles)

Una opcion Put será beneficiosa si el precio del subyacente baja por debajo del precio de Strike. (Pnemotecnico - Put es Poner en ingles)

Exchanged - Traded & OTC Derivatives
Tenemos dos tipos de derivados los cotizados y los OTC (Over the Counter)

Los derivados cotizados están organizados en un mercado regulado que actúa como intermediario para las transacciones, los contratos son standard en lo que respecta a cantidades de subyacente, liquidaciones o fechas de expiración y demás procedimientos.

Los derivados OTC (Sobre el mostrador)

Los derivados OTC se hacen a medida, se negocian de forma privada y se contratan directamente entre las contrapartidas sin ningún intermediario, debido a esto hay un riesgo de quiebra (default) de la contrapartida, cosa que no ocurre de la misma forma en los mercados cotizados ya que ahí tenemos el riesgo de quiebra de la "clearing house" que es mucho menor.

En la practica ambos mercados trabajan conjuntamente, por ejemplo, un trader de derivados puede usar un mercado cotizado para cubrirse de una posición OTC que contrata de forma privada.

Tipos de activos que se comercian en los mercados de derivados:

- Interest Rates Derivatives
- Foreign Exchange Derivatives
- Equity Derivatives
- Commodity derivatives

Todos estos activos se comercian de ambas formas en mercados cotizados y OTC.
Explicare todos estos tipos y sus subtipos en el siguiente post CBI 5

Resumen: Un Writer le da una opcion a un Holder a cambio de una Premium.

NOTA: Voy a trabajar con los conceptos en ingles, ya que aunque trabajes en un banco español, todos los conceptos apareceran en ingles en el software e incluso en la mayoria de la literatura, tambien es util para el que investigue en internet.

Etiquetas: ,

Laboratorio de Inversión y Especulación 4 - Históricos arreglados y mas funciones

He actualizado el downloader para que sea configurable y podamos usar el formato descrito en el coloquio de voz.

También investigué el problema de las fechas que se corregía simplemente con especificar un Locale en ingles, pero ya no es necesario especificarlo dado que lo hago internamente en el código.

El código fuente lo dejo aquí de momento estará disponible en SourceForge dentro de poco. (Dos semanas a un mes...)



El código fuente son solamente 14 clases!

Tal como comentamos se pueden descargar históricos entre dos fechas:

RETRIEVE VALUE 694653 FROM GOOGLE INITDATE 01/01/2006 ENDDATE 04/03/2006 TICKER GOOGLE
RETRIEVE VALUE %5EIBEX FROM YAHOO INITDATE 01/01/2006 ENDDATE 04/04/2006 TICKER IBEX
RETRIEVE VALUE
ES0173516115 FROM BOLSAMADRID INITDATE 01/01/2006 ENDDATE 04/04/2006 TICKER REPSOL

Y también podemos actualizar un archivo que ya tenemos con históricos:

UPDATE VALUE 694653 FROM GOOGLE TICKER GOOGLE
UPDATE VALUE %5EIBEX FROM YAHOO TICKER IBEX
UPDATE VALUE ES0173516115 FROM BOLSAMADRID TICKER REPSOL


Si estamos bajo un proxy lo podemos configurar con un archivo llamado proxy.prop que será algo así:

# Proxy
proxyurl = proxy
proxyport = 8080
proxyuser = usuario
proxypassword = password


También podemos configurar los formatos de comas, puntos etc... Creando un config.prop pero de momento lo dejaremos con los valores por defecto.
Como necesitaremos actualizar muchos archivos simultáneamente podemos juntarlos todos en un archivo batch y hacerlo de una sola vez.

java -jar lab-v0.2.jar BATCH batch1.batch
java -jar lab-v0.2.jar BATCH batch2.batch


Tareas a realizar por programadores y que podemos repartirnos:
- Que funcione desde Windows y no sea necesario descargar java.
- Que el nombre usado para el ticker no dependa de la url.
- Que la gente no tenga que descargar la aplicación cada vez que se actualice sino que sea automático.
- Mostrar gráficas con los datos.
- Hacer Unit Tests.
- Comentar el código.
- Eliminar el uso de funciones "deprecated".
- Mejorar los errores presentados si los parámetros de entrada no son correctos.
- Gestionar una base de datos HSQL en memoria.
- Que las nuevas fuentes de datos se metan mediante configuraciones de Spring.
- Funcionalidad de Log con Log4j.

Principal tarea a repartir y que voy a explicar mas en detalle: (Me parece la mas prioritaria e importante)
- Descargar históricos de diferentes fuentes y en diferentes formatos.

Como podéis observar "un descargador" solo son unas pocas líneas de código, debería ser muy, muy fácil agregar mas, espero que me mandéis muchos!

Ahora mismo tenemos tres fuentes de las que descargar: (En el paquete jds.com.locations.sites)
- Google
- Yahoo
- BolsaMadrid

Podemos pedirle a Francisco Llinares que nos diga cuales serian las siguientes fuentes mas interesantes para continuar.

Voy a empezar con las dos primeras tareas, espero a los colaboradores que me digan en que parte quieren colaborar o si tienen otras tareas en mente que podamos hacer, se me ocurren muchísimas mas...

Quien quiera usar los datos de salida en un modulo aparte independiente en java u otro lenguaje lo puede hacer fácilmente. (Ya lo conectaremos luego.. con Webservices o lo que sea)

Tareas a realizar para los no programadores:
- Crear un batch con que descargue por primera vez todos los valores del mercado continuo, todos los índices, los valores del eurostoxx, del SP500 etc... (Cada uno se podría encargar de uno diferente, enviarme el batch terminado y yo o rankia lo ejecutaríamos a diario y actualizaríamos los históricos en los servidores de rankia)

Creo que es una tarea que lleva bastante trabajo, preguntadme cualquier duda al respecto.

Para los programadores, tened en cuenta que tenemos tiempo y recursos limitados, nos interesa ir al grano, obtener resultados con el menor esfuerzo posible, por tanto en lo que se refiere a gráficos etc, debemos de utilizar un paquete Open Source que sea mantenido por otro y sea de fácil integración.

En cuanto alguien se ponga manos a la obra con las gráficas podemos hablar con Francisco Llinares para ver que capacidades deben de tener estos gráficos, como mostrar los 40 gráficos de los vencimientos de los futuros... etc...

Creo que ya tenemos un inicio! En el próximo post explicare como funciona el código, como extenderlo y como ejecutarlo desde Eclipse.

Archivos:
Downloader.zip
batch1.batch - Batch de ejemplo para descargar estos 3
batch2.batch - Batch de ejemplo para actualizar estos 3
GOOGLE.data - Ejemplo de datos descargados de Google
IBEX.data - Ejemplo de datos descargados de Yahoo
REPSOL.data - Ejemplo de datos descargados de BolsaMadrid
lab-v0.2.jar - Segunda version del laboratorio

Nota: Yo calculo que en 3 o 4 semanas tendre la proxima version con mas cosas, si me mandais codigo, podre tener mucho mas y quizas antes! Comentad que es lo que quereis hacer cada uno!

Ultima version del codigo actualizada por Juan Albisu: srcRankia0.3.0.3.rar (La actualizare aqui hasta tener la cuenta de sourceforge o hasta que escriba otro post)

Etiquetas: ,