こんにちは。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 シリーズでゼロに遭遇するたびに、本質的に再起動します。