6

私は Pandas と Zipline が初めてで、それらの使用方法を学ぼうとしています (そして、私が持っているこのデータでそれらを使用します)。完全な解決策でなくても、あらゆる種類のヒントをいただければ幸いです。私は多くのことを試し、かなり近づいてきましたがException: Reindexing only valid with uniquely valued Index objects、特にインデックス作成の問題に遭遇しました。[パンダ 0.10.0、Python 2.7]

Postgres の何千もの株式の月次収益データを次の形式に変換しようとしています。

ticker_symbol :: String, monthly_return :: Float, date :: Timestamp

例えば

AAPL, 0.112, 28/2/1992
GS, 0.13, 30/11/1981
GS, -0.23, 22/12/1981

注: レポートの頻度は毎月ですが、ここにある 6000 を超える企業のすべてが同時に存在するわけではないため、かなりの NaN データがここにあるでしょう。

…以下に説明するフォームに変換します。これは、Zipline がバックテスターを実行するために必要なものです。(私は思います。Zipline のバックテスターは、このような月次データを簡単に処理できますか?できることはわかっていますが、これを行うためのヒントはありますか?)


以下は、私が必要とする形式の DataFrame (時系列の? これはなんと言いますか?) です。

> data:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2268 entries, 1993-01-04 00:00:00+00:00 to 2001-12-31 00:00:00+00:00
Data columns:
AA      2268  non-null values
AAPL    2268  non-null values
GE      2268  non-null values
IBM     2268  non-null values
JNJ     2268  non-null values
KO      2268  non-null values
MSFT    2268  non-null values
PEP     2268  non-null values
SPX     2268  non-null values
XOM     2268  non-null values
dtypes: float64(10)

以下は時系列であり、必要な形式になっています。

> data.AAPL:

Date
1993-01-04 00:00:00+00:00    73.00
1993-01-05 00:00:00+00:00    73.12
...

2001-12-28 00:00:00+00:00    36.15
2001-12-31 00:00:00+00:00    35.55
Name: AAPL, Length: 2268

ここには返品データはありませんが、代わりに価格があることに注意してください。それらは (Zipline によってload_from_yahoo— しかし、実際には pandas の関数によって、ソースを読むことから) 配当、分割などのために調整されているので、それと私の戻りデータの間に同型 (初期価格を差し引いたもの) があります (したがって、ここでは問題ありません)。 )。

(編集: 私が持っているものを書いてほしいか、iPython ノートブックまたは要旨を添付してほしいかどうか教えてください。それが役立つとは思えませんが、要求があれば絶対にできます。)

4

1 に答える 1

3

インデックスとして日付を設定しようとしているのが早すぎると思われます。私の提案は、最初set_indexに日付会社名として、次にunstack会社名とresample.

このようなもの:

In [11]: df1
Out[11]: 
  ticker_symbol  monthly_return                date
0          AAPL           0.112 1992-02-28 00:00:00
1            GS           0.130 1981-11-30 00:00:00
2            GS          -0.230 1981-12-22 00:00:00

df2 = df2.set_index(['date','ticker_symbol'])
df3 = df2.unstack(level=1)
df4 = df.resample('M')

In [14]: df2
Out[14]: 
                          monthly_return
date       ticker_symbol                
1992-02-28 AAPL                    0.112
1981-11-30 GS                      0.130
1981-12-22 GS                     -0.230

In [15]: df3
Out[15]: 
               monthly_return      
ticker_symbol            AAPL    GS
date                               
1981-11-30                NaN  0.13
1981-12-22                NaN -0.23
1992-02-28              0.112   NaN

In [16]: df4
Out[16]: 
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 124 entries, 1981-11-30 00:00:00 to 1992-02-29 00:00:00
Freq: M
Data columns:
(monthly_return, AAPL)    1  non-null values
(monthly_return, GS)      2  non-null values
dtypes: float64(2)
于 2013-01-25T22:36:43.830 に答える