Added the ability for the backtester to use unrealised PnL from the Position objects to calculate a tick-by-tick equity curve. Added a performance directory that calculates drawdown statistics. Modified the output.py script to use Seaborn and output the equity curve, returns and drawdown curve.
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
|
||||
def create_drawdowns(pnl):
|
||||
"""
|
||||
Calculate the largest peak-to-trough drawdown of the PnL curve
|
||||
as well as the duration of the drawdown. Requires that the
|
||||
pnl_returns is a pandas Series.
|
||||
|
||||
Parameters:
|
||||
pnl - A pandas Series representing period percentage returns.
|
||||
|
||||
Returns:
|
||||
drawdown, duration - Highest peak-to-trough drawdown and duration.
|
||||
"""
|
||||
|
||||
# Calculate the cumulative returns curve
|
||||
# and set up the High Water Mark
|
||||
hwm = [0]
|
||||
|
||||
# Create the drawdown and duration series
|
||||
idx = pnl.index
|
||||
drawdown = pd.Series(index = idx)
|
||||
duration = pd.Series(index = idx)
|
||||
|
||||
# Loop over the index range
|
||||
for t in range(1, len(idx)):
|
||||
hwm.append(max(hwm[t-1], pnl[t]))
|
||||
drawdown[t]= (hwm[t]-pnl[t])
|
||||
duration[t]= (0 if drawdown[t] == 0 else duration[t-1]+1)
|
||||
return drawdown, drawdown.max(), duration.max()
|
||||
Reference in New Issue
Block a user