Pregunta

Soy muy nuevo en Python y quiero construir un programa de comercio de acciones de caja negra que encuentre varias correlaciones entre las tasas de rendimiento de las acciones y me da una respuesta como comprar, vender, retener, etc.. Encontré un módulo Python poco fácil de usar Para recuperar datos de stock llamados Ystockquote que extrae información de Yahoo! Finanzas. El módulo se puede encontrar en http://www.goldb.org/ystockquote.html.

Una de sus habilidades es generar precios históricos para una acción en la forma. ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']. Puedo darle un rango de fechas para hacer esto y me da una lista anidada que contiene una lista única con la información anterior para cada día.

Mi pregunta es cómo organizar cada uno de estos puntos de datos separados (fecha, abierto, alto, bajo, etc.) en una estructura a la que puedo recurrir más adelante en mi script y ordenar. Necesito que este proceso sea fácil de automatizar. ¿Qué tipo de algoritmos o estructuras de datos podría encontrar útiles?

¿Fue útil?

Solución

Es posible que estés buscando un diccionario estructura en lugar de una lista:

>>> prices = dict()
>>> prices['2011-01-02'] = {'Open':20.00, 'High':30.00, 'Low':10.00, 'Close':21.00, 'Volume':14.00, 'Adj Clos':120}
>>> prices['2010-11-09'] = {'Open':22.00, 'High':50.00, 'Low':20.00, 'Close':42.00, 'Volume':10.00, 'Adj Clos':666}
>>> prices
{'2011-01-02': {'Volume': 14.0, 'Adj Clos': 120, 'High': 30.0, 'Low': 10.0, 'Close': 21.0, 'Open': 20.0}, '2010-11-09': {'Volume': 10.0, 'Adj Clos': 666, 'High': 50.0, 'Low': 20.0, 'Close': 42.0, 'Open': 22.0}}

Aquí anido un diccionario dentro de cada entrada del diccionario principal de "precios". El primer nivel del diccionario lleva la fecha como clave, y se mapea en un diccionario que contiene la información de precios para esa fecha.

>>> prices['2011-01-02']
{'Volume': 14.0, 'Adj Clos': 120, 'High': 30.0, 'Low': 10.0, 'Close': 21.0, 'Open': 20.0}

El segundo nivel del diccionario utiliza los nombres de atributos como claves y se asigna a los valores de atributos mismos.

>>> prices['2010-11-09']['Open']
22.0
>>> prices['2010-11-09']['Close']
42.0

Parece que, para el get_historical_prices función a la que se refiere, cada día se emite como una entrada del formulario [Date, Open, High, Low, Close, Volume, Adj_Clos]. Si desea construir un diccionario para una lista de estas entradas, necesitará hacer tres cosas:

Primero, deberá indexar cada entrada para separar el Date De los otros elementos, ya que eso es lo que usará para indexar la primera dimensión de su dict. Puedes obtener el primer elemento con entry[0] y los elementos restantes con entry[1:].

>>> entry = ['2011-01-02', 20.00, 30.00, 10.00, 21.00, 14.00, 120]
>>> date = entry[0]
>>> date
'2011-01-02'
>>> values = entry[1:]
>>> values
[20.0, 30.0, 10.0, 21.0, 14.0, 120]

En segundo lugar, dado que desea asociar cada uno de los otros elementos con una clave específica, debe hacer una lista de esas claves en el mismo orden que los elementos de datos se le dan. Utilizando el zip() función puede combinar dos listas p y q, tomando el elemento ésimo de cada uno y hacer zip(p,q)[i] == (p[i], q[i]). De tal manera que cree una lista de pares (clave, valor) que puede pasar a un constructor de diccionario:

>>> keys = ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']
>>> pairs = zip(keys, entry[1:])
>>> pairs
[('Open', 20.0), ('High', 30.0), ('Low', 10.0), ('Close', 21.0), ('Volume', 14.0), ('Adj Clos', 120)]

Finalmente, desea construir su diccionario e indexarlo en su fecha adecuada en el historial general:

>>> stockdict = dict(pairs)
>>> stockdict
{'Volume': 14.0, 'Adj Clos': 120, 'High': 30.0, 'Low': 10.0, 'Close': 21.0, 'Open': 20.0}
>>> histodict = dict()
>>> histodict[date] = stockdict

Puedes iterar a través de tu anidado history Lista para construir su diccionario de dos maneras, el primero es usar un for círculo:

keys = ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']
histodict = dict()
for item in history:
    date = item[0]
    values = item[1:]
    histodict[date] = dict(zip(keys, values))

O si quieres jugar con una técnica de pitón un poco más avanzada, prueba un dict anidado declaración del generador:

keys = ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']
histodict = dict((item[0], dict(zip(keys, item[1:]))) for item in history)

Ese último es un desastre si eres nuevo en la programación, pero te animo a que leas en ese enlace; Recuerde, al programar en Python, Google es su amigo. Espero haberte dado suficientes palabras clave e ideas aquí para comenzar a aprender, y te dejaré el resto.

Otros consejos

Dada una lista de listas de igual longitud, es muy fácil de ordenar por cualquier "columna":

>>> l = [[1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [0, 0, 0, 0, 0], [6, 6, 6, 6, 6]]
>>> l.sort(key=lambda l: l[1])
>>> l
[[0, 0, 0, 0, 0], [1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [6, 6, 6, 6, 6]]
>>> l.sort(key=lambda l: l[4])
>>> l
[[0, 0, 0, 0, 0], [5, 4, 3, 2, 1], [1, 2, 3, 4, 5], [6, 6, 6, 6, 6]]

los key El argumento de palabras clave toma una función que, dado un elemento en la lista, devuelve un valor que se usa como clave de clasificación.

Pero si desea hacer cosas más interesantes, probablemente sea mejor que use una base de datos. Convenientemente (para mí), el sqlite3 Los documentos usan una tabla de existencias como ejemplo, que he asignado y modificado suavemente:

import sqlite3
conn = sqlite3.connect('/tmp/example')   # use ':memory:' for an in-memory db
c = conn.cursor()

# Create table
c.execute('''create table stocks
(date text, trans text, symbol text,
 qty real, price real)''')

# Insert a row of data
c.execute("""insert into stocks
          values ('2006-01-05','BUY','RHAT',100,35.14)""")

# Save (commit) the changes
conn.commit()

# Insert another row of data
c.execute("""insert into stocks
          values ('2006-01-07','SELL','RHAT',100,2.11)""")

# Select rows of data from table in an order
rows_by_date = c.execute("""select * from stocks order by date""")
for row in rows_by_date:
    print row

# In a different order
rows_by_price = c.execute("""select * from stocks order by price""")
for row in rows_by_price:
    print row
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top