9

こんにちは。2 つの一連のデータがあります。毎日の生の株価リターン (正または負のフロート) とトレード シグナル (買い = 1、売り = -1、トレードなし = 0) です。

生の価格のリターンは、今日の価格を昨日の価格で割った単純な対数です。

log(p_today / p_yesterday)

例:

raw_return_series = [ 0.0063 -0.0031 0.0024 ..., -0.0221 0.0097 -0.0015]

トレードシグナルシリーズは次のようになります。

signal_series = [-1. 0. -1. -1. 0. 0. -1. 0. 0. 0.]

トレードシグナルに基づいて毎日のリターンを取得するには:

daily_returns = [raw_return_series[i] * signal_series[i+1] for i in range(0, len(signal_series)-1)]

これらの毎日のリターンは次のようになります。

[0.0, 0.00316, -0.0024, 0.0, 0.0, 0.0023, 0.0, 0.0, 0.0] # results in daily_returns; notice the 0s

複合リターン シリーズを計算するには、daily_returns シリーズを使用する必要があります。ただし、daily_returns シリーズの値が 0 であることを考えると、最後のゼロ以外の複利リターンを「時間をかけて」次のゼロ以外の複利リターンに持ち越す必要があります。

たとえば、次のように複利のリターンを計算します (時間の経過とともに「逆行」していることに注意してください)。

compound_returns = [(((1 + compounded[i + 1]) * (1 + daily_returns[i])) - 1) for i in range(len(compounded) - 2, -1, -1)]

そして結果のリスト:

[0.0, 0.0, 0.0023, 0.0, 0.0, -0.0024, 0.0031, 0.0] # (notice the 0s)

私の目標は、これらの複利リターンを累積するために最後のゼロ以外のリターンを引き継ぐことです。つまり、インデックス i でのリターンはインデックス i+1 でのリターンに依存するため、インデックス i+1 でのリターンは非ゼロでなければなりません。リスト内包表記は、daily_return シリーズでゼロに遭遇するたびに、本質的に再起動します。

4

3 に答える 3

8

このような計算に優れた AQR (ヘッジファンド) の人によって書かれたpandasと呼ばれる素晴らしいモジュールがあります...必要なのは、「欠落データ」を処理する方法です...上記の誰かが述べたように、基本は、scipy または numpy の nan (数字ではない) 機能を使用しています。nanただし、それらのライブラリでさえ財務計算をそれほど簡単にするわけではありません... pandas を使用する場合、考慮したくないデータを としてマークすることができます。その他のデータ。

私は約 8 か月間、自分の取引プラットフォームでpandasを使用しています。

Wes (著者) は pyCon 2010 でモジュールの機能について講演しました... pyCon 2010 webpage のスライドとビデオを参照してください。そのビデオでは、彼は毎日の収益を取得する方法、収益のマトリックスで数千の線形回帰を実行する方法 (ほんの一瞬で)、タイムスタンプ / グラフ データなどを示しています... すべてこのモジュールで完了します。サイコと組み合わせると、これは財務分析ツールの獣です。

それが処理するもう1つの優れた点は、断面データです...そのため、毎日の終値、それらのローリング平均などを取得できます...すべて の計算にタイムスタンプを付け、これらすべてをpython辞書に似たものに保存します(pandas.DataFrameclass)... 次に、次のように単純にデータのスライスにアクセスします。

close_prices['stdev_5d']

ローリング stdev を計算する方法の詳細については、pandasローリング モーメントのドキュメントを参照してください(ワンライナーです)。

Wes は cython を使用してモジュールを高速化するために尽力しましたが、私の分析要件のためにサーバー (古い Xeon) をアップグレードすることを検討していることは認めます。

STRIMP の質問の編集: pandas データ構造を使用するようにコードを変換した後、pandas データフレームでデータをインデックス化する方法と、欠落したデータを処理するための複合関数の要件 (または、 0.0 リターン... またはNaNパンダで使用している場合..)。データのインデックス作成を使用してデモンストレーションします... 1 日がランダムに選択されましdfた... ES Futures の引用符が含まれるデータフレームです... 1 秒ごとにインデックスが作成されます... 欠落している引用符はnumpy.nan. DataFrame インデックスはオブジェクトであり、モジュールのタイムゾーン オブジェクトdatetimeによってオフセットされます。pytz

>>> df.info
<bound method DataFrame.info of <class 'pandas.core.frame.DataFrame'>
Index: 86400 entries , 2011-03-21 00:00:00-04:00 to 2011-03-21 23:59:59-04:00
etf                                         18390  non-null values
etfvol                                      18390  non-null values
fut                                         29446  non-null values
futvol                                      23446  non-null values
...
>>> # ET is a pytz object...
>>> et
<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>
>>> # To get the futures quote at 9:45, eastern time...
>>> df.xs(et.localize(dt.datetime(2011,3,21,9,45,0)))['fut']
1291.75
>>>

pandas.TimeSeries10 分前のクオートを参照する連続リターン (a 内) の列を計算する方法の簡単な例を示すと、次のようになります。

>>> df['fut'].fill(method='pad')/df['fut'].fill(method='pad').shift(600)

その場合、ラムダは必要ありません。値の列を 600 秒前にそれ自体で除算するだけです。その.shift(600)部分は、データが 1 秒ごとにインデックス化されるためです。

HTH、\マイク

于 2011-04-01T16:26:40.710 に答える
3

この質問の累積リターンの部分は、Wes McKinney の優れた「データ分析のための Python」本 (339 ページ) で扱われており、Pandas の cumprod() を使用して、計算された価格変化からリベース/インデックス付きの累積リターンを作成します。

本からの例:

import pandas.io.data as web

price = web.get_data_yahoo('AAPL', '2011-01-01')['Adj Close']

returns = price.pct_change()

ret_index = (1 + returns).cumprod()

ret_index[0] = 1 # Set first value to 1
于 2015-08-27T01:54:09.427 に答える
1

imagine I have a DataMatrix with closing prices, some indicator value, and a trade signal like this:

 >>> data_matrix
                        close          dvi            signal
 2008-01-02 00:00:00    144.9          0.6504         -1             
 2008-01-03 00:00:00    144.9          0.6603         -1             
 2008-01-04 00:00:00    141.3          0.7528         -1             
 2008-01-07 00:00:00    141.2          0.8226         -1             
 2008-01-08 00:00:00    138.9          0.8548         -1             
 2008-01-09 00:00:00    140.4          0.8552         -1             
 2008-01-10 00:00:00    141.3          0.846          -1             
 2008-01-11 00:00:00    140.2          0.7988         -1             
 2008-01-14 00:00:00    141.3          0.6151         -1             
 2008-01-15 00:00:00    138.2          0.3714         1   

I use the signal to create a DataMatrix of returns based on the trade signal:

>>> get_indicator_returns()

                   indicator_returns    
2008-01-02 00:00:00    NaN            
2008-01-03 00:00:00    0.000483       
2008-01-04 00:00:00    0.02451        
2008-01-07 00:00:00    0.0008492      
2008-01-08 00:00:00    0.01615        
2008-01-09 00:00:00    -0.01051       
2008-01-10 00:00:00    -0.006554      
2008-01-11 00:00:00    0.008069       
2008-01-14 00:00:00    -0.008063      
2008-01-15 00:00:00    0.02201 

What I ended up doing is this:

def get_compounded_indicator_cumulative(self):

    indicator_dm = self.get_indicator_returns()
    dates = indicator_dm.index

    indicator_returns = indicator_dm['indicator_returns']
    compounded = array(zeros(size(indicator_returns)))

    compounded[1] = indicator_returns[1]

    for i in range(2, len(indicator_returns)):

        compounded[i] = (1 + compounded[i-1]) * (1 + indicator_returns[i]) - 1

    data = {
        'compounded_returns': compounded
    }

    return DataMatrix(data, index=dates)

For some reason I really struggled with this one...

I'm in the process of converting all my price series to PyTables. Looks promising so far.

于 2011-04-05T01:36:44.223 に答える