Análisis Técnico De Mercados Financieros Basado En Técnicas De Inteligencia Artificial Angel Pina Canelles Capıtulo 4: Resultados y Conclusiones4.1. Resultados del Prototipo Inicial Tras finalizar el desarrollo del prototipo de nuestro software sin las medidas de control de errores y fiabilidad descritas en la sección 3.5, se puso en marcha con un conjunto de 23 robots durante un mes, desde el 02/06/2014 hasta el 30/06/2014. Aunque nuestro sistema está pensado para proporcionar información a un agente externo que sea el que controle los robots, para poder obtener resultados sobre su eficacia implementamos una estrategia sencilla para poder elegir los robots que dejaremos operar en el mercado y poder evaluar sus resultados. Puesto que el sistema de fiabilidad aun no estaba desarrollado, ´únicamente contábamos con la predicción de la red asociada a cada robot. Así, nuestra estrategia consistió en elegir para operar en mercado a todos aquellos robots cuya predicción de su red fuera positiva. Es decir, pondremos a operar todos los robots que estimemos que van a obtener ganancias en sus operaciones, y los retiraremos cuando predicamos que van a sufrir pérdidas. En la tabla 4.1 se detallan nuestros balances totales de cada semana comparándolos con los que habrán obtenido los robots sin ninguna supervisión, es decir, permitiendo a todos los robots operar durante todo el tiempo. Por otra parte, en la tabla 4.2 aparecen el número de operaciones positivas y negativas que realizan los robots, y el balance total dividido en balance positivo y negativo. Además, encontramos calculadas las proporciones entre todos estos factores comparando los resultados obtenidos por nuestro sistema con los obtenidos sin ninguna supervisión. Para interpretar estas proporciones, tenemos que las relativas a balance y operaciones positivas dan una medida de la precisión de nuestro sistema para detectar cuando los robots van a funcionar bien, y por tanto les permite operar. Por otra parte, las proporciones de balance y operaciones negativas indican la precisión de nuestro sistema para detectar cuando los robots van a tener pérdidas, y evitar que se produzcan. Por tanto, idealmente nuestro sistema tendrá proporciones de balance y operaciones positivas muy altas, y proporciones de balance y operaciones negativas muy bajos. As´ı, podemos ver que el balance total que habr´ıan obtenido los robots hubiera sido de -235.51$, mientras que los robots con nuestro sistema pierden 72.20$ menos, es decir, -163.31$. Lo que es más, ´únicamente en una de las semanas los robots fuera de nuestro sistema funcionaron mejor. Como debemos tener en cuenta que el hecho de que los robots en sí funcionen mal en general, y pierdan dinero, está fuera de nuestro control y no es nuestra responsabilidad, podríamos pensar que los resultados obtenidos son satisfactorios.
| Balance Final Original | Balance Final Redes | Diferencia | Semana 1 | -24.12 | 9.01 | 33.13 | Semana 2 | -70.44 | -19.3 | 51.14 | Semana 3 | -3.04 | -22.07 | -19.03 | Semana 4 | -137.91 | -130.95 | 6.96 | TOTAL | -235.51 | -163.31 | 72.20 |
Cuadro 4.1: Balance total de las 4 semanas y total. Software sin fiabilidad.
| Balance Positivo | Proporción | Balance Negativo | Proporción | Semana 1 | 49.34 / 69.65 | 0.71 | -40.33 / -93.77 | 0.43 | Semana 2 | 38.49 / 46.98 | 0.82 | -57.79 / -117.42 | 0.49 | Semana 3 | 78.06 / 150.07 | 0.52 | -100.13 / -153.11 | 0.65 | Semana 4 | 39.31 / 81.13 | 0.48 | -170.26 / -219.04 | 0.78 | TOTAL | 205.2 / 347.83 | 0.59 | -368.51 / -583.34 | 0.63 |
| Ops. Positivas | Proporción | Ops. Negativas | Proporción | Semana 1 | 13 / 18 | 0.72 | 7 / 18 | 0.39 | Semana 2 | 13 / 18 | 0.72 | 9 / 22 | 0.41 | Semana 3 | 15 / 25 | 0.6 | 11 / 27 | 0.41 | Semana 4 | 9 / 12 | 0.75 | 17 / 27 | 0.63 | TOTAL | 50 / 73 | 0.68 | 44 / 83 | 0.53 |
Cuadro 4.2: Balance positivo y negativo y número de operaciones positivas y negativas de cada semana y final. Software sin fiabilidad. Comparaci´on entre Robots con Red / Robots sin Red
No obstante, un estudio algo más detallado muestra que no es así. Es importante resaltar que, como puede verse en la tabla 4.2, todas las semanas la proporción de operaciones positivas que nuestro sistema deja pasar es superior a la proporción de operaciones negativas, lo cual śı es sin duda un dato muy positivo. Sin embargo, si observamos las columnas de proporción vemos que los resultados no son buenos. Este será el dato que nos indicará en realidad si nuestro sistema está funcionando correctamente, ya que no depende de que los propios robots lo hagan bien o mal. Así, podemos ver que nuestro sistema permite pasar el 59 % del balance positivo y el 63 % del balance negativo. Es decir, el porcentaje de pérdidas producidas por los robots que se realizan en nuestro sistema es superior al porcentaje de ganancias que se producen. Esto significa que si construyeramos un sistema que dejara operar a mercado aleatoriamente el 60 % de las operaciones que los robots solicitaron, estad´ısticamente deber´ıa mantener el 60 % de las ganancias (más que nuestro sistema) y como consecuencia tener ´únicamente el 60 % de las pérdidas (menos que nuestro sistema). As´ı, en realidad, el hecho de que los robots supervisados den mejores resultados que sin supervisar se debe a que en general ha habido muchas más pérdidas que ganancias, por lo que cualquier sistema que evite que una cierta cantidad de operaciones se realicen (incluso si las elige al azar) mejorar´ıa los resultados. Sin embargo, sí´ı podemos ver que hay semanas que nuestro sistema ha funcionado muy bien (semanas 1 y 2) aunque haya otras que haya funcionado muy mal (3 y 4). Además, tenemos que los resultados de las proporciones de operaciones positivas y negativas que realiza nuestro sistema son buenos todas las semanas. Por tanto, nos planteamos que si pudiéramos detectar a tiempo en qué momentos (o semanas) nuestro sistema y nuestras redes están fallando en sus predicciones deberíamos mejorar sustancialmente nuestros resultados. Esto es precisamente lo que perseguimos con la implementación del sistema de fiabilidad y control de errores que desarrollamos e implementamos como parte del prototipo final. Adicionalmente, añadimos también en las tablas 4.3 y 4.4 los balances totales de cada robot las semanas 2 y 4, encontrando en esta primera resultados muy buenos, y en la segunda resultados muy malos. Hay que tener en cuenta en estos datos que hay ocasiones en las que nuestro sistema permite operar a un robot algo de tiempo después ́es de lo que lo har ́ıa sin nuestra intervención, por lo que los resultados de una “misma operación” con y sin la supervisión de nuestro software pueden ser distintas. Es por eso, por ejemplo, que un robot que haya realizado una única operación con y sin nuestro sistema puede tener balances ligeramente diferentes.
| Balance Original | Balance Redes | Ops. Positivas | Ops. Negativas | 10062 | 1.11 | 2.12 | 1 / 1 | 0 / 0 | 10075 | 0 | 0 | 0 / 0 | 0 / 0 | 10208 | 0 | 0 | 0 / 0 | 0 / 0 | 10290 | 0 | 0 | 0 / 0 | 0 / 0 | 10309 | 0 | 0 | 0 / 0 | 0 / 0 | 10416 | 0 | 0 | 0 / 0 | 0 / 0 | 15009 | 0 | 0 | 0 / 0 | 0 / 0 | 20020 | -3.2 | -3.1 | 2 / 2 | 1 / 1 | 20023 | -4.49 | 0 | 0 / 0 | 0 / 2 | 20030 | -29.5 | -33.6 | 1 / 1 | 3 / 3 | 25001 | -13.7 | 1.6 | 1 / 4 | 0 / 5 | 25013 | -24.1 | -7.7 | 1 / 2 | 3 / 4 | 40003 | -18.24 | -3.3 | 0 / 0 | 1 / 4 | 50003 | 0 | 0 | 0 / 0 | 0 / 0 | 50011 | 0 | 0 | 0 / 0 | 0 / 0 | 50016 | 2.7 | 2.7 | 2 / 2 | 0 / 0 | 50030 | 0 | 0 | 0 / 0 | 0 / 0 | 50114 | 0 | 0 | 0 / 0 | 0 / 0 | 50177 | 4.4 | 0.3 | 1 / 2 | 0 / 0 | 50212 | 0 | 0 | 0 / 0 | 0 / 0 | 50242 | 6.95 | 6.95 | 3 / 3 | 1 / 1 | 61228 | -7.1 | 0 | 0 / 0 | 0 / 2 | 10169 | 14.73 | 14.73 | 1 / 1 | 0 / 0 |
Cuadro 4.3: Balance total desglosado de la semana 2. Proporción de operaciones con Red / sin Red.
| Balance Original | Balance Redes | Ops. Positivas | Ops. Negativas | 10062 | -15.54 | 0 | 0 / 0 | 0 / 1 | 10075 | 0 | 0 | 0 / 0 | 0 / 0 | 10208 | 0 | 0 | 0 / 0 | 0 / 0 | 10290 | 0 | 0 | 0 / 0 | 0 / 0 | 10309 | 26.5 | 0 | 0 / 1 | 0 / 0 | 10416 | -4.71 | -4.71 | 2 / 2 | 3 / 3 | 15009 | -1.8 | -1.8 | 0 / 0 | 1 / 1 | 20020 | 10.3 | 10.2 | 2 / 2 | 1 / 1 | 20023 | -26.38 | -24.79 | 0 / 0 | 1 / 2 | 20030 | -0.1 | -0.1 | 0 / 0 | 1 / 1 | 25001 | 1.4 | -5.5 | 0 / 2 | 1 / 3 | 25013 | -6.1 | -6.1 | 1 / 1 | 3 / 3 | 40003 | -71.91 | -63.17 | 1 / 1 | 3 / 3 | 50003 | 0 | 0 | 0 / 0 | 0 / 0 | 50011 | 0 | 0 | 0 / 0 | 0 / 0 | 50016 | 8.2 | 8.2 | 1 / 1 | 0 / 0 | 50030 | 0 | 0 | 0 / 0 | 0 / 0 | 50114 | 0 | 0 | 0 / 0 | 0 / 0 | 50177 | -5.8 | -6.1 | 0 / 0 | 1 / 1 | 50212 | 0 | 0 | 0 / 0 | 0 / 0 | 50242 | -37.08 | -37.08 | 2 / 2 | 3 / 3 | 61228 | -21.4 | 0 | 0 / 0 | 0 / 3 | 10169 | 6.51 | 0 | 0 / 1 | 0 / 0 |
Cuadro 4.4: Balance total desglosado de la semana 4. Proporción de operaciones con Red / sin Red. En esta sección se presentan los resultados finales de nuestro software, siendo la diferencia más importante respecto a los resultados de la sección anterior la incorporación al sistema del método de control de errores y fiabilidad descrito en la sección 3.5. Para obtener estos resultados, se añadieron 40 nuevos robots al sistema, se entrenaron redes para ellos, y se pusieron a funcionar teniendo en cuenta la nueva información ́ con que nos proporcionaba la fiabilidad de cada red. Como método de control de errores, hemos elegido el m ́etodo basado en la t ́ecnica de ajuste de m ́ınimos cuadrados ponderado, que recordemos que consiste ́ıa en utilizar las predicciones de las ́últimas operaciones y sus resultados finales reales para ajustar una recta que permita corregir la predicción nueva. Además, pese a que de nuevo los datos de predicción y fiabilidad que obtenemos en nuestro sistema están planteados para ser utilizados por un agente externo, implementamos una nueva estrategia básica que nos permita probar el sistema. En este caso elegiremos para operar todos aquellos robots que, pese a tener en cuenta el error que esperamos cometer en nuestra predicción, supere un cierto umbral U. Además de este umbral, debemos elegir un valor del parámetro α utilizado en el método elegido de fiabilidad para definir los pesos que asignamos a cada una de las operaciones anteriores. Tanto este valor α como el valor del umbral U se ajustaron utilizando las operaciones cuyos resultados se detallan en la sección anterior. Así, se eligieron aquellos parámetros que hubieran dado mejores resultados en ese periodo de tiempo. Concretamente, estos fueron los par ́ ametros α = 0,3 y U = 2. Los resultados del sistema tras 3 semanas de ejecución (del lunes 10/08/2014 al domingo 31/08/2014) son los que se detallan en esta sección. Al igual que en la sección anterior, realizaremos la comparativa entre los resultados obtenidos con nuestro sistema y aquellos que los robots habrán obtenido sin él. Nos centraremos principalmente en las mismas métricas: El balance total de cada semana y desglosado por robot, los balances positivo y negativo y número de operaciones positivas y negativas. Además, volveremos a reflejar la proporción entre los balances y número de operaciones que se realizan con nuestro sistema frente a los totales que se produzcan sin nuestra intervención. Esperamos que, si nuestro sistema funciona bien, la proporción de balance y operaciones positivas que se realizan con nuestro sistema sea siempre mayor que la proporción de balance y operaciones negativas. En la tabla 4.5 podemos encontrar los balances totales comparados de las 3 semanas, y el balance final total. Además, en la tabla 4.6 podemos encontrar el balance positivo y negativo que realizan los robots que nuestro sistema elige para operar en cada momento frente al que realizar ́ ıa la totalidad de los robots si operan de forma independiente. También encontramos en esta tabla, al igual que en la sección anterior, la proporción entre los resultados de ambos tipos. Por último, en la tabla 4.7 podemos encontrar los balances finales y número de operaciones positivas y negativas que realiza cada uno de los robots utilizados. Como podemos ver, todos los resultados en este caso son mucho más favorables que en la secci´on anterior, en concreto, podemos citar los siguientes:
4.2. RESULTADOS FINALES
| Balance Final Original | Balance Final Redes | Diferencia | Semana 1 | -144.9 | -6.22 | 138.68 | Semana 2 | -229.22 | -102.65 | 126.57 | Semana 3 | -22.75 | 39.76 | 62.51 | TOTAL | -396.87 | -69.11 | 327.76 |
Cuadro 4.5: Balance total de las 3 semanas y total. Software sin fiabilidad.
| Balance Positivo | Proporción | Balance Negativo | Proporción | Semana 1 | 138.63 / 154 | 0.90 | -144.85 / -298.9 | 0.48 | Semana 2 | 128.6 / 210.18 | 0.61 | -231.25 / -439.4 | 0.53 | Semana 3 | 155.66 / 265.12 | 0.59 | -115.9 / -287.87 | 0.40 | TOTAL | 422.89 / 629.30 | 0.67 | -492 / -1026.17 | 0.48 |
| Ops. Positivas | Proporción | Ops. Negativas | Proporción | Semana 1 | 16 / 23 | 0.70 | 11 / 22 | 0.5 | Semana 2 | 19 / 29 | 0.66 | 15 / 26 | 0.57 | Semana 3 | 23 / 38 | 0.61 | 6 / 30 | 0.2 | TOTAL | 58 / 90 | 0.64 | 32 / 78 | 0.41 |
Cuadro 4.6: Balance positivo y negativo y número de operaciones positivas y negativas de cada semana y final. Software con fiabilidad. Comparaci´on entre Robots con Red / Robots sin Red Todas las semanas los resultados de balance total de nuestro sistema son mejores que los obtenidos sin su utilización. Todas las semanas la proporción de operaciones positivas respecto del total ha sido superior a la proporción ́ on de operaciones negativas. Todas las semanas la proporción de balance positivo respecto del total ha sido superior a la proporción de balance negativo. De los 21 robots que han operado y muestran diferencias entre nuestros resultados y los obtenidos operando independientemente, en 13 se ha producido una mejora de los mismos, y sólo en 8 los resultados han empeorado. Lo que es m ́ as, la media de mejora para estos 13 son 34$, mientras que la media de empeoramiento para los otros 8 es de solo 15$. Adem ́as, como resultados finales obtenemos que a pesar de que los robots en general han funcionado mal durante este periodo, y el balance total de ́estos operando independien temente ha sido de -396.87$, el balance final total de nuestro sistema ha sido de 69.11$. Lo que es más importante, nuestro sistema ha realizado 58 de 90 operaciones positivas (el 64 %) y tan solo 32 de 78 operaciones negativas (el 41 %). Adem´as, la suma del balance de las operaciones positivas que ha dejado pasar ha sido 422.89$ de 629.30$ totales (67 %), y la suma del balance de las operaciones negativas realizadas ha sido tan solo de -492$, frente a los -1026.17$ de balance negativo total (48 %).
| Balance Original | Balance Redes | Ops. Positivas | Ops. Negativas | 10062 | 6.63 | 13.77 | 3 / 3 | 0 / 1 | 10078 | -32.5 | -32.6 | 2 / 2 | 1 / 1 | 10208 | 6.82 | 6.82 | 1 / 1 | 0 / 0 | 10224 | 0 | 0 | 0 / 0 | 0 / 0 | 10387 | 0 | 0 | 0 / 0 | 0 / 0 | 15009 | -31.5 | -19.1 | 3 / 4 | 2 / 5 | 16052 | -126.27 | 37.33 | 2 / 3 | 0 / 2 | 20042 | 0 | 0 | 0 / 0 | 0 / 0 | 20059 | 4.35 | 3.02 | 1 / 2 | 0 / 0 | 50016 | -38.9 | -39.7 | 0 / 0 | 1 / 1 | 50030 | 5.89 | 12.64 | 2 / 1 | 0 / 0 | 50082 | 0 | 0 | 0 / 0 | 0 / 0 | 50407 | -110.91 | -92.41 | 1 / 1 | 4 / 5 | 10169 | 1.86 | 1.86 | 2 / 2 | 1 / 1 | 10185 | 29.33 | -1 | 0 / 3 | 1 / 3 | 10194 | 5.06 | 0 | 0 / 2 | 0 / 0 | 10225 | 0 | 0 | 0 / 0 | 0 / 0 | 10226 | 0 | 0 | 0 / 0 | 0 / 0 | 10290 | 8.4 | 8.4 | 1 / 1 | 0 / 0 | 50003 | -3 | 0 | 0 / 0 | 0 / 1 | 50011 | -19 | -19 | 1 / 1 | 1 / 1 | 50114 | 0 | 0 | 0 / 0 | 0 / 0 | 10309 | 16.8 | 0 | 0 / 1 | 0 / 0 | 15036 | -24.97 | -17.99 | 6 / 8 | 4 / 6 | 16024 | 0 | 0 | 0 / 0 | 0 / 0 | 16080 | -90 | 0 | 0 / 0 | 0 / 2 | 16104 | 9.1 | 9.1 | 2 / 2 | 0 / 0 | 20020 | 10 | 8.2 | 4 / 6 | 2 / 2 | 20030 | -1.6 | -6.1 | 1 / 7 | 1 / 2 | 20035 | 0 | 0 | 0 / 0 | 0 / 0 | 25013 | -72.7 | -6.8 | 1 / 2 | 3 / 8 | 30207 | 0 | 0 | 0 / 0 | 0 / 0 | 40003 | 21.82 | -16.04 | 2 / 6 | 4 / 7 | 40005 | -11.4 | 30.9 | 1 / 3 | 0 / 12 | 50006 | 0 | 0 | 0 / 0 | 0 / 0 | 50138 | 32.52 | 9.18 | 1 / 5 | 0 / 4 | 50177 | -1 | 18.2 | 5 / 6 | 1 / 2 | 50212 | -37.4 | -22.69 | 1 / 1 | 1 / 3 | 50242 | 44.9 | 44.9 | 15 / 15 | 5 / 5 | 50450 | 0 | 0 | 0 / 0 | 0 / 0 |
Cuadro 4.7: Balance total desglosado de la semana 4. 4.3. CONCLUSIONESTodo esto indica que, finalmente, hemos logrado que nuestro software realice las predicciones con suficiente precisión, y hemos podido utilizar esta información ́ on para manejar los robots de forma conveniente, mejorando significativamente sus resultados. Recordemos que nuestro objetivo inicial era aplicar técnicas de inteligencia artificial para resolver el problema real al que se enfrentaba la empresa Talentum. Esta tiene miles de robots programados y configurados, y su problema consiste´ıa en elegir cuáles de ellos tener operando en cada momento. Para ello, planteamos que nuestro objetivo final sería desarrollar un sistema que diera suficientes datos para tomar esta decisión. La implementación del primer prototipo únicamente proporcionaba una predicción del balance que obtendría cada robot si lo pusiéramos a operar en el mercado. Para ello, utilizamos redes neuronales como predictores, y otras técnicas para las distintas etapas del proceso: análisis principal de componentes, tests estadísticos, etc. Una vez implementado todo ello, pusimos nuestro sistema a funcionar durante un mes, y evaluamos los resultados. Por desgracia, estos resultados fueron altamente insatisfactorios, aunque esperábamos que mejoraran tras la adición de las medidas de control de errores al sistema. As ́ ı, aplicando ideas de matemáticas y estad ́ ıstica, desarrollamos e implementamos un sistema nuevo que nos proporciona, además de las predicciones, una cierta medida de la fiabilidad de ́ estas. Ahora, utilizando estas dos informaciones, por ́ ıamos mejorar las decisiones que tomará nuestro agente externo a la hora de elegir los robots para operar. Finalmente, en el prototipo inicial sí logramos obtener resultados satisfactorios. En concreto, tras su ejecución durante 3 semanas más, logramos que el agente programado con una estrategia básica consiguiera realizar operaciones que sumaron un 67 % del balance positivo total, mientras que ́ únicamente dejó pasar operaciones que sumaron un 48 % del balance negativo total. Esto permitió pasar de unos resultados totales por parte de los robots de pérdidas de -396.78$, a perder ́ únicamente -69.11$, lo que constituye una diferencia de 327.76$, que supone una mejora sustancial de los resultados. Por otra parte, el sistema actual aún se puede mejorar. Como trabajo futuro proponemos: El reentrenamiento automático de las redes cada cierto tiempo, para utilizar los datos nuevos. El entrenamiento de las redes asignando más peso a los casos obtenidos de operaciones realizadas más recientemente. Establecer las estrategias de fiabilidad a utilizar independientemente para cada red. Actualmente se establece una estrategia de fiabilidad global, pero para cada red puede funcionar mejor una que otra. Establecer estrategias más complejas para el agente externo utilizando la información proporcionada. Ampliar la parte de visualización de estado´ısticas, y en general hacer la interfaz más usable por un usuario menos técnico. Probar otros métodos de entrenamiento de redes neuronales. Utilizar otros factores de medida del rendimiento de un robot aparte del beneficio total esperado en el caso de realizar una operación, como una estimación del beneficio en función del tiempo que esté operando. Utilizar otras técnicas de inteligencia artificial para implementar los predictores, como sistemas clasificadores o support vector machines. Mejorar el control de errores cometidos por las redes. Podrá utilizarse para ello, por ejemplo, en lugar del ajuste a un recta, otra red neuronal para intentar aproximar la función de error. Entrenar las redes penaliza menos las subestimaciones que las sobreestimaciones.
Bibliografıa Bolsa, Mercados y Técnicas de Inversión, Francisco Lopez Lubian, Pablo Garc´ıa Estevez. Talentum - Automatic Systems for your Trading, http://fxtalentum.com/ Artificial neural networks. Opening the black box. Cancer. Dayhoff JE, DeLeo JM. American Cancer Society, v. 91, p. 1615-1635, 2001. Neuro-Fuzzy and soft computing. A computational approach to learning and machine intelligence. Jang J.-S.R., Sun C. –T., Mizutani E. (1997). Coursera - Machine Learning, Andrew Ng. Stanford University. https://www. coursera.org/course/ml Apuntes de la asignatura Inferencia Estad ́ ıstica, F ́ elix Luis Belzunce Torregrosa, Jose Mar ́ ıa Ruiz Gomez. Universidad de Murcia. http://aulavirtual.um.es Principal Components Analysis. http://inst.eecs.berkeley.edu/~ee127a/book/ login/l_sym_pca.html Encog Machine Learning Framework. Heaton Research. http://www. heatonresearch.com/encog Weka 3: Data Mining Software in Java. Machine Learning Group at the University of Waikato. http://www.cs.waikato.ac.nz/~ml/weka/ Commons Math: The Apache Commons Mathematics Library. http://commons. apache.org/proper/commons-math/index.html Jmathplot: Easy Java scientific plot for math engineering. http://code.google. com/p/jmathplot/ Neural-Networks FAQ, http://www.faqs.org/faqs/ai-faq/neural-nets/part2/ AbstractTableModel (Java Platform SE 7). http://docs.oracle.com/javase/7/ docs/api/javax/swing/table/AbstractTableModel.html Java SE Technologies - Database - The Java Database Connectivity (JDBC), Oracle, http://www.oracle.com/technetwork/java/javase/jdbc/index.html
|