Portfolio Insurance Trading Strategies

Futures trading strategies for price risk management, for commercial hedgers with long or short exposure. All models below aim to achieve a favorable unit price for the energy portfolio, while preventing it from breaching a pre defined cap (floor).

The functions

implement alternative approaches to achieve this goal. They return S4 objects of type CPPI, DPPI, OBPI, SHPI and SLPI respectively, with methods plot(), summary() and show().

We will illustrate with some examples using the synthetic powcal data set, which is included in etrm. The data set contains daily closing prices for a set of yearly baseload power futures contracts:

library(etrm)
data(powcal)

# the first five contracts
head(powcal[1:6])
#>         Date CAL-06 CAL-07 CAL-08 CAL-09 CAL-10
#> 1 2003-01-02  24.29     NA     NA     NA     NA
#> 2 2003-01-03  24.91     NA     NA     NA     NA
#> 3 2003-01-07  24.67     NA     NA     NA     NA
#> 4 2003-01-08  24.59     NA     NA     NA     NA
#> 5 2003-01-09  24.39     NA     NA     NA     NA
#> 6 2003-01-10  24.29     NA     NA     NA     NA

In our example, we will consider the CAL-06 contract, and start trading 500 days prior to the contract expiry.

day06 <- powcal$Date[!is.na(powcal$`CAL-06`)]
cal06 <- powcal$`CAL-06`[!is.na(powcal$`CAL-06`)]
dat06 <- data.frame(Date = day06, CAL06 = cal06)
dat06 <- tail(dat06, 500)

We will use the obpi() function to implement option-based portfolio insurance, e.g. we synthesize an option via a delta hedging scheme. For the OBPIstrategy, the target price is calculated as an expected cap (floor) given by the option premium-adjusted strike price selected for the delta hedging scheme within a standard Black-76 option pricing framework. The default strike price is set at-the-money. The user may express a view regarding future market development by deviating from this level.

cal06_obpi_b <- obpi(q = 30,               # volume 30 MW (buyer)
                     tdate = dat06$Date,   # vector with trading days until expiry
                     f = dat06$CAL06,      # vector with futures price
                     k = dat06$CAL06[1],   # default option strike price at-the-money
                     vol = 0.2,            # annualized volatility, for the Black-76 delta hedging
                     r = 0,                # default assumed risk free rate of interest
                     tdays = 250,          # assumed trading days per year
                     daysleft = 500,       # number of days to expiry
                     tcost = 0,            # transaction cost
                     int = TRUE            # integer restriction, smallest transacted unit = 1
                   )

plot(cal06_obpi_b, legend = "bottom", title = "OBPI strategy buyer CAL-06")

The summary() method:

summary(cal06_obpi_b)
#> $Description
#> [1] "Hedging strategy of type OBPI and length 500"
#> 
#> $Volume
#> [1] 30
#> 
#> $Target
#> [1] 29.83626
#> 
#> $ChurnRate
#> [1] 4.333333
#> 
#> $Stats
#>       Market Trade Exposed Position     Hedge   Target Portfolio
#> First  26.82    17      13       17 0.5666667 29.83626  26.82000
#> Max    39.01    17      17       30 1.0000000 29.83626  29.29433
#> Min    25.60    -3       0       13 0.4333333 29.83626  26.46833
#> Last   37.81     0       0       30 1.0000000 29.83626  29.29433

The show()method provide details regarding daily values for market price, transactions, exposed volume, futures contract position, the target price and the calculated portfolio price. Further details for a specific instance of a trading strategy can be found in the slots, see for example:

slotNames(cal06_obpi_b)
#>  [1] "StrikePrice"  "AnnVol"       "InterestRate" "TradingDays"  "Name"        
#>  [6] "Volume"       "TargetPrice"  "TransCost"    "TradeisInt"   "Results"

The strategy CAL-06 OBPI strategy from a sellers point of view:

cal06_obpi_s <- obpi(q = - 30,             # volume -30 MW (seller)
                     tdate = dat06$Date,   # vector with trading days until expiry
                     f = dat06$CAL06,      # vector with futures price
                     k = dat06$CAL06[1],   # default option strike price at-the-money
                     vol = 0.2,            # annualized volatility, for the Black-76 delta hedging
                     r = 0,                # default assumed risk free rate of interest
                     tdays = 250,          # assumed trading days per year
                     daysleft = 500,       # number of days to expiry
                     tcost = 0,            # transaction cost
                     int = TRUE            # integer restriction, smallest transacted unit = 1
                   )

plot(cal06_obpi_s, legend = "bottom", title = "OBPI strategy seller CAL-06")