3 votos

Datos binarios de NYSE, convertir a ASCII

El producto de datos "TAQ NYSE Order Imbalances" de la Bolsa de Nueva York tiene un formato que se describe bastante bien en las secciones 4.8, 4.9, 4.10 y 5 de el documento "NYSE Order Imbalances Client Specification", versión 1.12 En resumen, es una mezcla de ASCII y binario: los símbolos de las acciones, por ejemplo, están en texto plano, pero rellenados con bytes nulos, mientras que los campos numéricos están en dígitos binarios representados por un byte con ese valor binario. Todos los campos son de ancho fijo, por lo que las filas de datos simplemente se suceden.

¿Alguien sabe cómo convertir esto en, por ejemplo, un archivo separado por comas?

1voto

Markus Olsson Puntos 12651

Creo que no es necesario ser un "programador de sistemas", y menos uno experimentado, para resolver este problema:

1) Concéntrese en la cabecera, es su leyenda a la estructura del archivo. Describe el formato y esencialmente ya le dice cómo decodificar los siguientes mensajes.

2) En función del idioma elegido, se procesa cada mensaje en formato binario y se convierte cada elemento al formato numérico. En C#, algunos utilizan "BitConverter" pero obviamente C# no es el lenguaje elegido aquí. Si puedes decirme qué lenguaje específico utilizas para hacer la conversión, sería de gran ayuda. Mucha gente utiliza Python para convertir este tipo de cosas a un formato de nivel superior basado en texto, como csv o cualquier estructura delimitada.

3) Antes de realizar la conversión, piense detenidamente si desea realizar operaciones en las representaciones de matriz de bytes de sus valores numéricos (no estoy familiarizado con su alimentación específica mencionada, aunque algunas alimentaciones sólo emiten el "alfa" en lugar de la extensión completa, por ejemplo, por lo que necesita realizar operaciones de suma/resta que, en ciertos casos, pueden ser más óptimas de realizar en la propia matriz de bytes). He aquí un ejemplo: https://stackoverflow.com/questions/3641274/c-sharp-int-byte-conversion

Aquí hay un par de ejemplos en Python para mostrar cómo se puede hacer una simple conversión byte[]-> int:

https://stackoverflow.com/questions/386753/how-do-i-convert-part-of-a-python-tuple-byte-array-into-an-integer

https://stackoverflow.com/questions/444591/convert-a-string-of-bytes-into-an-int-python

P.D.: No te servirá de nada, pero los formatos de mensajes mixtos me parecen muy ineficientes, pero eso no es culpa tuya. Los flujos más eficientes sólo envían matrices de bytes, nada más. De todos modos, un símbolo nunca debería estar en formato de cadena internamente, sino que se le debería asignar un código int32 o int64. Mapear internamente es mucho más rápido que convertir cada símbolo de cada mensaje de matriz de bytes a cadena. Además, aunque el símbolo se decodifique en ASCII eso es muy ineficiente y dispara el tamaño del mensaje.

1voto

doekman Puntos 5187

Yo escribí el paquete R (basado en la función pack de Perl), para hacer esto para los datos de opentick (ya desaparecido). Puede consultar el archivo paquete opentick (en los archivos de CRAN) para ver cómo lo he utilizado.

Acabo de darme cuenta de que has dicho que te sientes cómodo con Perl en tu post de SO. En ese caso, te recomendaría que usaras el programa de Perl unpack función.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X