DataFrame
価格データを含む行ごとに、利益/損失額のDataFrame
を計算しています。次のように売買戦略保有期間の損益計算書 - rolling_applyボトルネック解消
ロジックは次のとおりです。
- 私たちは、現在の期間に資産を売却/購入します。
- 資産は
holding_period
のままです。 - 保有期間中に価格が
take_profit
を超える場合は、その価格で利益を得て終了します。 - 保有期間中の価格が
stop_loss
を超える場合は、その価格で終了します。 - 最初の
take_profit
またはstop_loss
のレベルは、損益を終了するかどうかを決定します。 - 利益または損失のいずれにも達していない場合は、保有期間の最後の価格で終了します。
私はこれを実装している方法は、がDataFrame
における各系列のローリング・ウィンドウ上提供関数を適用する、pandas.rolling_apply
を使用することです。
rolling_apply
がDataFrame
の行と列の組み合わせごとに関数を呼び出すと、深刻なボトルネックになります。
他のpandas/numpy機能を使用してこれを達成するより良い方法があるのだろうかと思いますか?
これは、現在の実装である:
def potential_pnl(prices, side, periods, take_profit=np.nan, stop_loss=np.nan):
# set sign depending on direction of price movement required by BUY/SELL
if side == Side.SELL:
take_profit *= -1
else:
stop_loss *= -1
def period_potential_pnl(window):
# enter at the first price, rest of the window are possible exit prices
entry_price = window[0]
exit_prices = window[1:]
take_profit_price = entry_price + take_profit
stop_loss_price = entry_price + stop_loss
# calculate array of bools showing where take_profit/stop_loss is reached
if side == Side.BUY:
filtered = exit_prices[ (exit_prices >= take_profit_price) |
(exit_prices <= stop_loss_price) ]
else:
filtered = exit_prices[ (exit_prices <= take_profit_price) |
(exit_prices >= stop_loss_price) ]
# if neither take_profit/stop_loss is reached, exit at the last price
# otherwise exit at the first price which exceeds take_profit/stop_loss
if len(filtered) == 0:
exit_price = exit_prices[-1]
else:
exit_price = filtered[0]
exit_pnl = exit_price - entry_price
if side == Side.SELL:
exit_pnl *= -1
return exit_pnl
# apply `period_potential_pnl` onto the dataframe
pnl = pd.rolling_apply(prices, periods + 1, period_potential_pnl)
# shift back by periods so the exit pnl is lined up with the entry price
pnl = pnl.shift(-periods)[:-periods]
return pnl
物事私が試してみました:
は、私が最初にtake_profit
またはstop_loss
に到達したかどうかを判断するためにpandas.rolling_max
とpandas.rolling_min
を使用。
私はこのアプローチとしていた問題は2倍であった:
take_profit
は非常によく、低価格で達している可能性があるためあなたは、take_profit
のための出口価格として最大を使用することはできません。保持期間の最大値をリアルタイムで知ることは不可能です。take_profit
またはstop_loss
に最初に到達したものを特定することはできません。
質問:
は、各期間でP & Lを計算するためのより効率的な方法はありますか?