我是Python的新手,我想构建一个黑匣子股票交易程序,找到股票回报率之间的各种相关性,并给我一个响应,如买入、卖出、持有等!资金该模块位于http://www.goldb.org/ystockquote.html.
它的能力之一是以['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']
的形式输出股票的历史价格。我可以给它一个日期范围来做这件事,它会给我一个嵌套列表,其中包含一个单独的列表,每天都有上面的信息。
我的问题是如何将这些单独的数据点(Date、Open、High、Low等)组织成一个结构,以便稍后在脚本中调用并排序。我需要这个过程易于自动化。我觉得什么样的算法或数据结构有用?
您可能正在寻找字典结构而不是列表:
>>> 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}}
在这里,我在主"price"字典的每个条目中嵌套了一个字典。字典的第一级以日期为关键字,并映射到包含该日期的价格信息的字典。
>>> prices['2011-01-02']
{'Volume': 14.0, 'Adj Clos': 120, 'High': 30.0, 'Low': 10.0, 'Close': 21.0, 'Open': 20.0}
字典的第二级使用属性名称作为关键字,并映射到属性值本身。
>>> prices['2010-11-09']['Open']
22.0
>>> prices['2010-11-09']['Close']
42.0
对于您所引用的get_historical_prices
函数,似乎每天都作为形式[Date, Open, High, Low, Close, Volume, Adj_Clos]
的一个条目输出。如果你想为这些条目的列表构建一个字典,你需要做三件事:
首先,您需要对每个条目进行索引,以将Date
与其他元素分开,因为这是您将用于索引dict的第一个维度的内容。您可以使用entry[0]
获得第一个元素,使用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]
其次,由于您希望将其他元素中的每一个与特定键相关联,因此应该按照数据元素的顺序列出这些键。使用zip()
函数,您可以组合两个列表p
和q
,从每个列表中提取第i个元素并生成zip(p,q)[i] == (p[i], q[i])
。通过这种方式,您可以创建一个(键、值)对列表,并将其传递给字典构造函数:
>>> 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)]
最后,您需要构建您的字典,并将其索引到整个历史中的适当日期:
>>> 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
您可以通过两种方式迭代嵌套的history
列表来构建字典,第一种方式是使用传统的for
循环:
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))
或者,如果你想使用稍微高级一点的Python技术,可以尝试嵌套的dictgenerator语句:
keys = ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']
histodict = dict((item[0], dict(zip(keys, item[1:]))) for item in history)
如果你是编程新手,最后一个是很糟糕的,但我鼓励你阅读这个链接;记住,当用Python编程时,谷歌是你的朋友。我希望我在这里给了你足够的关键词和想法来开始学习,剩下的就交给你了。
给定一个长度相等的列表列表,很容易按任何"列"进行排序:
>>> 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]]
key
关键字参数采用一个函数,该函数在给定列表中的某个项时,返回一个用作排序键的值。
但如果你想做更多有趣的事情,你最好使用数据库。方便地(对我来说),sqlite3
文档使用了一个库存表作为示例,我对其进行了适当的调整和修改:
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