GOOGLEDOCS file:

http://docs.google.com/View?id=ddb2j6dw_13dg24q4mkIn this post I show how one could utilize the VIX methodology for American

Options.VIX was designed with European Type Options. It was designed

for S&P500 Options ( which are European ). But when applied to American

Options,These have a bias due to early exercise and Dividend and disbursement

events. If the forecasted period avoids dividends, then the bias should

be minimal. Neverthelss, It can be used as a valuable forecast or a

technical indicator.

function VIX = ReplicateVixStock(Data,TM,Rf,CT)

%REPLICATEVIXSTOCK applies VIX methodology for stocks (American Options)

% VIX was designed with European Type Options. It was designed for S&P500

% Options ( which are European ). But when applied to American Options,

% These have a bias due to early exercise and Dividend and disbursement

% events. If the forecasted period avoids dividends, then the bias should

% be minimal. Neverthelss, It can be used as a valuable forecast or a

% technical indicator.

% Inputs: If NO Inputs are provided, Example will run

% Data: Should be cell array with separate data for two Maturities

% centered around 30 days. I.e One option expiry must be less than 30

% days and the other should be greater than 30 days.

% Data is a three column data with Strike, Call and Put Prices.

% Data{1} should be Near Term Option Data

% Data{2} should be far Term Option Data

% TM : Time to maturity for two options

% Rf : Risk free Rate

% CT : Current Time ( Time Stamp when The data was collected )

% Output : VIX-- A single number that Applies the VIX methodology to the

% American Options

% Example : Try running with NO inputs

if(nargin==0)

% Near-Term

% Strike Call Put

Data{1} = [75 11.75 0.05;...

80 6.90 0.08;...

85 2.40 0.60;...

90 0.18 3.40;...

95 0.05 8.30;...

];

% Next Term

% Strike Call Put

Data{2} = [75 NaN NaN;...

80 7.70 0.73;...

85 3.80 1.80;...

90 1.05 4.05;...

95 NaN NaN;...

];

%Time_To_Maturity

TM = [9;37];

%Risk_Free_Rate

Rf = 1.1625/100; %Per Annum

% Current Time

CT = '12:09:00';

end

% remove NaN Rows

Data{1}((any(isnan(Data{1}),2)),:)=[];

Data{2}((any(isnan(Data{2}),2)),:)=[];

% Difference between Calls and Puts (Absolute Value)

DF{1} = abs(Data{1}(:,2) - Data{1}(:,3));

DF{2} = abs(Data{2}(:,2) - Data{2}(:,3));

% FInd Hour, Minute, Second from the time using datevec function

[Year, Month, Day, Hour, Minute, Second] = datevec(CT);

%In Years

%1440 is the number of minutes in a day and 510 is the number

% of minutes to 8:30 AM which is the time the option expires

% on its expiration date

NumYears(1) =[1440 - (Hour * 60 + Minute + Second/60) + 510]/ ...

(1440 * 365) + [(TM(1) - 2)/365];

NumYears(2) =[1440 - (Hour * 60 + Minute + Second/60) + 510]/ ...

(1440 * 365) + [(TM(2) - 2)/365];

% In days

NumDays = NumYears .* 365;

% Find the minimum of the difference in Call and Put

% Prices and Get the corresponding Strike Price.

ATM(1,:) = Data{1}((DF{1}==min(DF{1})),:);

ATM(2,:) = Data{2}((DF{2}==min(DF{2})),:);

% Calculate Forward Price Level and Referential Strike

% Application of PUT CALL Parity

Level = ATM(:,1) + exp(Rf*NumYears(:)) .* (ATM(:,2) - ATM(:,3));

%Reference Strike

for i = 1:2

Strike = ATM(i,1);

if(ATM(i,2)>=ATM(i,3))

Ref_Strike(i)=ATM(i,1);

else

Ref_Strike(i) = Data{i}(find(Data{i}(:,1) < ATM(i,1),1,'last'),1);

end

% Differences of Strikes

Temp = diff(Data{i}(:,1));

Delta_Strike{i} = [Temp(1);Temp];

% If the strike is above the “reference strike” , use the call price

% If the strike is below the “reference strike” , use the put price

%If the strike equals the “reference strike” , use the average of the call

% and put prices

cpval= zeros(size(Data{i},1),1);

cid = find(Data{i}(:,1) > Ref_Strike(i));

cpval(cid) = Data{i}(cid,2);

pid = find(Data{i}(:,1) < Ref_Strike(i));

cpval(pid) = Data{i}(pid,3);

Aid = find(Data{i}(:,1) == Ref_Strike(i));

cpval(Aid) = (Data{i}(Aid,2) + Data{i}(Aid,3))/2;

% Now do the math as given in the paper vixwhite.pdf

vix{i} = Delta_Strike{i} * exp(Rf*NumYears(i)) .* cpval ./(Data{i}(:,1).^2);

Var(i) = (2/NumYears(i)) * sum(vix{i}) - ((Level(i)/Ref_Strike(i) ...

- 1).^2)/NumYears(i);

% Center the data to 30 days

if(i==1)

Term(i) = NumYears(i) * Var(i) * ((NumDays(i+1)-30)/(NumDays(i+1)-NumDays(i)));

elseif(i==2)

Term(i) = NumYears(i) * Var(i) * ((-NumDays(i-1)+30)/(NumDays(i)-NumDays(i-1)));

end

end %i

% Final Vix Calculation

VIX = sqrt(sum(Term) * 365/30) * 100;