How to compare ARMA model with simple average moving in matlab

11 Ansichten (letzte 30 Tage)
Martin Njagi
Martin Njagi am 20 Apr. 2023
Beantwortet: Nithin am 20 Aug. 2025 um 7:08
% 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);

Antworten (1)

Nithin
Nithin am 20 Aug. 2025 um 7:08
In the code provided, the trading signal was not properly lagged, so the signal at time "t" was being applied to the return at time "t", effectively using future information. This can result in artificially inflated strategy performance, resulting in unreallisticaly high "Sharpe ratios". Modify the code such that the signal generated at time "t" is used to trade the return from "t+1".
signal_arma = [0; signal_arma(1:end-1)];
signal_ma = [0; signal_ma(1:end-1)];
strategy_ret_arma = signal_arma .* test_ret;
strategy_ret_ma = signal_ma .* test_ret;
Additionally, the calculation of maximum drawdown was performed on the cumulative log returns rather than on a realistic equity curve based on simple returns. Since log returns can accumulate to negative values, this method allowed the drawdown to exceed "100%", which is not meaningful in a trading context, no strategy can lose more than all of the invested capital.
ret = [0; diff(log(Y))]; % log returns
cumret_arma = cumsum(strategy_ret_arma); % cumulative log return
Refer to the results attached below after applying the updated approach on a sample dataset along with an unpdated Max Drawdown Calculation:
Kindly refer to the attached MATLAB code for better understanding.
Here's the corresponding MathWorks documentations for more information:

Kategorien

Mehr zu Transaction Cost Analysis finden Sie in Help Center und File Exchange

Produkte


Version

R2016a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by