% Load data
data = readtable('sample data.xlsx');
Y = data.AdjClose;
% Split data into training and testing sets
train_Y = Y(1:2519);
test_Y = Y(2520:end);
%check if test_Y is empty
if isempty(test_Y);
test_Y= 0.001*ones(size(train_Y));
end
% Fit ARMA model to training set
p = 1;
q = 1;
Mdl = arma(p, 0, q, 'Constant', 'off');
EstMdl = estimate(Mdl, train_Y);
% Make predictions on testing set
forecast_horizon = ceil(length(test_Y) + 30); % Adjust forecast horizon according to test set length
y0=train_Y(end-p-q+1:end);%Set the initial condition
num_periods=30;%Number of periods to forecast
y_pred = predict(Mdl,test_Y,num_periods,'Y0',y0,'InitialCondition','z');
% Calculate trading signals based on ARMA model predictions
signal_arma = zeros(size(test_Y));
for i = 2:length(signal_arma)
if y_pred(i-length(test_Y)) > y_pred(i-1)
signal_arma(i) = 1; % Buy signal
elseif y_pred(i-length(train_Y)) < y_pred(i-1)
signal_arma(i) = -1; % Sell signal
end
end
% Calculate trading signals based on moving average
window = 20;
signal_ma = zeros(size(test_Y));
for i = window+1:length(signal_ma)
if mean(test_Y(i-window+1:i)) > mean(test_Y(i-window:i-1))
signal_ma(i) = 1; % Buy signal
elseif mean(test_Y(i-window+1:i)) < mean(test_Y(i-window:i-1))
signal_ma(i) = -1; % Sell signal
end
end
% Evaluate trading rule performances
returns_arma = signal_arma .* (test_Y - y_pred(end-length(test_Y)+1:end)); % Adjust the index to match the length of test_Y
returns_ma = signal_ma .* (test_Y - mean(test_Y));
cumulative_returns_arma = cumsum(returns_arma);
cumulative_returns_ma = cumsum(returns_ma);
% Plot cumulative returns
plot(cumulative_returns_arma);
hold on;
plot(cumulative_returns_ma);
legend('ARMA', 'Moving average');
% Calculate performance metrics
sharpe_arma = sqrt(252) * mean(returns_arma) / std(returns_arma);
sharpe_ma = sqrt(252) * mean(returns_ma) / std(returns_ma);
max_drawdown_arma = maxdrawdown(cumulative_returns_arma);
max_drawdown_ma = maxdrawdown(cumulative_returns_ma);
% Display performance metrics
fprintf('ARMA model:\n');
fprintf('Sharpe ratio: %.2f\n', sharpe_arma);
fprintf('Max drawdown: %.2f%%\n', max_drawdown_arma*100);
fprintf('\n');
fprintf('Moving average:\n');
fprintf('Sharpe ratio: %.2f\n', sharpe_ma);
fprintf('Max drawdown: %.2f%%\n', max_drawdown_ma*100);