2

私はPythonを初めて使用し、株式の収益率間のさまざまな相関関係を見つけて、購入、販売、保留などの応答を返すブラックボックス株取引プログラムを構築したいと考えています。使いやすいPythonモジュールを見つけました。 Yahoo!から情報を取得するystockquoteと呼ばれる株式データを取得するため ファイナンス。モジュールはhttp://www.goldb.org/ystockquote.htmlにあります。

その機能の1つは、株式の過去の価格をの形式で出力すること['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']です。これを行うための日付範囲を指定できます。これにより、毎日の上記の情報を含む単一のリストを含むネストされたリストが表示されます。

私の質問は、これらの個別のデータポイント(日付、オープン、高、低など)のそれぞれを、後でスクリプトで呼び出して並べ替えることができる構造に編成する方法です。このプロセスを簡単に自動化する必要があります。どのような種類のアルゴリズムまたはデータ構造が役立つと思いますか?

4

2 に答える 2

5

リストではなく辞書の構造を探している可能性があります。

>>> 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}}

ここでは、メインの「価格」辞書の各エントリ内に辞書をネストしました。辞書の最初のレベルは日付をキーとして取り、その日付の価格情報を含む辞書にマップします。

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

ディクショナリの第2レベルでは、属性名をキーとして使用し、属性値自体にマップします。

>>> 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]です。これらのエントリのリストの辞書を作成する場合は、次の3つのことを行う必要があります。

まず、各エントリにインデックスを付けて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()関数を使用すると、2つのリスト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リストを反復処理して、2つの方法で辞書を作成できます。最初の方法は、従来の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テクニックを試してみたい場合は、ネストされたdictジェネレーターステートメントを試してください。

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

あなたがプログラミングに不慣れであるならば、それの最後のものはやっかいです、しかし私はあなたがそのリンクで読むことを勧めます。Pythonでプログラミングするときは、Googleがあなたの友達であることを忘れないでください。ここで学習を開始するのに十分なキーワードとアイデアを提供したことを願っています。残りはあなたに任せます。

于 2011-06-16T21:57:17.187 に答える
1

同じ長さのリストのリストを考えると、任意の「列」で並べ替えるのは非常に簡単です。

>>> 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
于 2011-06-16T21:59:38.087 に答える