Code covered by the BSD License  

Highlights from
A simple CPPI strategy in MATLAB

image thumbnail
from A simple CPPI strategy in MATLAB by Vincent Leclercq
Backtesting of a CPPI strategy

CPPI_PayOff_From_Returns_2(StartAmount, WarrantiedAmount, Multiplier,OneYearOfReturns, InterestRate, SmoothingFactor, TransactionThreshold, TransactionCost,HedgingFrequencyInDays)
function [PortFolioValue, TradedAmount, PercentageOfTradingDates, DynamicFloor, Exposure, ExpPercentage] = CPPI_PayOff_From_Returns_2(StartAmount, WarrantiedAmount, Multiplier,OneYearOfReturns, InterestRate, SmoothingFactor, TransactionThreshold, TransactionCost,HedgingFrequencyInDays)

NumberOfTimeStepPerYear = 250;
NumberOfSteps = size(OneYearOfReturns,1);
NumberOfYear = NumberOfSteps / NumberOfTimeStepPerYear;

Floor    = WarrantiedAmount;
S = StartAmount;
dt = HedgingFrequencyInDays /NumberOfTimeStepPerYear;

% Initialize everything

NumberOfTradingDates = 0;
PortFolioValue      = zeros(1,NumberOfSteps -1);
PortFolioValue(:,1) = StartAmount;
Cash  = Floor * exp(-InterestRate*NumberOfYear);
NewCash = Cash;
Cushion(1) = StartAmount - Cash;
Exposure(1) = Cushion(1) * Multiplier;
ExpPercentage(1) = Exposure ./ StartAmount;
OneYearOfReturns = OneYearOfReturns  +1;
DynamicFloor(1) = Floor * exp(-InterestRate*(NumberOfYear));


NumberOfHedgingStep = 0;

% Hedging Loop

for t = HedgingFrequencyInDays + 1  : HedgingFrequencyInDays : NumberOfSteps  
    NumberOfHedgingStep = NumberOfHedgingStep + 1;
    % what is the current value of my Floor at my hedgin date ?
    DynamicFloor(t-HedgingFrequencyInDays + 1  : t) =  Floor * exp(-InterestRate*(NumberOfYear - dt * t));
    % how much can i spend in the risky asset
    Cushion(t)  = PortFolioValue(t-HedgingFrequencyInDays ) - DynamicFloor(t);
    % What is my retunr between my hedging dates ?
    ReturnOnPeriod = prod(OneYearOfReturns(t-HedgingFrequencyInDays+1:t ));
    % Let s take a bit more risk    as we expect not loose everything
    % between 2 hedging dates ...
    Exposure(t) = Cushion(t) .* Multiplier;
    % how much should i trade to hedge ?
    TransactionPercentage(t) = (Exposure(t) - Exposure(t-HedgingFrequencyInDays))./Exposure(t-HedgingFrequencyInDays);

    if (abs(TransactionPercentage(t)) > TransactionThreshold)
        % Let's hedge
        % Apply Smoothing factor (we want to have a 'smooth strategy :
        % downside protection
        Exposure(t-HedgingFrequencyInDays+1 : t) = SmoothingFactor * Exposure(t) + (1-SmoothingFactor) * Exposure(t-HedgingFrequencyInDays);
        % How much is really in my risk free asset ?
        Cash     = PortFolioValue(t - HedgingFrequencyInDays) -  Exposure(t) ;
        % take Trading cost in actio,
        TradedAmount(t - HedgingFrequencyInDays  +1 : t) = abs(Exposure(t) - Exposure(t-HedgingFrequencyInDays)) * TransactionCost;
        % We have our new Portfolio value
        PortFolioValue(t - HedgingFrequencyInDays  +1 : t) = Exposure(t) .* ReturnOnPeriod+ Cash .* exp(InterestRate * dt) - TradedAmount(t);
        % Update hte number of trading dates
        NumberOfTradingDates = NumberOfTradingDates +1;
        % ExpPercentage
        ExpPercentage(t - HedgingFrequencyInDays  +1 : t) = Exposure(t) ./ PortFolioValue(t);
    else
        % We don't hedge
        %How much was in the riskfree asset ?
        PreviousRiskFreeCash =  PortFolioValue(t-HedgingFrequencyInDays) - Exposure(t - HedgingFrequencyInDays);
        % How much was exposed ?
        Exposure(t-HedgingFrequencyInDays+1 : t) = Exposure(t - HedgingFrequencyInDays).* ReturnOnPeriod;
        % Simply update the portfolio value according to our retruns on our
        % considered period between our hedging dates
        PortFolioValue(t - HedgingFrequencyInDays  +1 : t) = Exposure(t) +(PreviousRiskFreeCash .* exp(InterestRate * dt));
        % No trading here !
        TradedAmount(t - HedgingFrequencyInDays  +1 : t)  = 0;
        % ExpPercentage
        ExpPercentage(t - HedgingFrequencyInDays  +1 : t) = Exposure(t) ./ PortFolioValue(t);
    end;
end;

PercentageOfTradingDates= 100 * NumberOfTradingDates/NumberOfHedgingStep ;

Contact us at files@mathworks.com