介绍
加权移动平均(Weighted Moving Average,简称WMA)是一种用于时间序列数据平滑和分析的技术。它与简单移动平均(Simple Moving Average, SMA)类似,但不同之处在于加权移动平均对不同的历史数据点赋予不同的权重,从而使得对最近的数据点赋予更大的影响力。这使得WMA在捕捉数据的趋势和波动性方面比SMA更加灵敏
加权移动平均的定义
加权移动平均是指对一段时间内的历史数据按照预设的权重进行加权求和,然后除以权重的总和,得到的就是该时间段的加权平均值。
对于一个长度为 𝑛的时间窗口,WMA 的计算公式为:
权重的选择
在WMA中,权重的选择是至关重要的。常见的权重选择方法包括:
线性权重:权重按线性递增或递减的方式分配。通常,最近的数据点赋予最大的权重,权重随着时间的推移而逐渐减小。例如,如果使用线性权重,最近的三个数据点的权重可以为 3,2,1
指数权重:权重按指数递减的方式分配,这种方法使得权重更偏重于最近的数据点,远期数据点的权重快速减小。这种权重选择与指数移动平均(Exponential Moving Average, EMA)密切相关。
自定义权重:可以根据实际需求定义自适应权重。这种方法灵活性最高,可以通过实验或基于某种理论对数据点进行加权。
加权移动平均的优点
对最近数据更加敏感:WMA赋予最近数据点更大的权重,因此它比SMA更加敏感,可以更快地反映时间序列的最新变化。
灵活性:可以根据实际应用需求灵活调整权重,从而适应不同的时间序列数据特征。
减少滞后效应:WMA减少了SMA中普遍存在的滞后效应,更快地响应趋势变化
加权移动平均的应用
WMA在多个领域中都有广泛应用,特别是在金融市场分析、经济数据处理和工程信号处理等领域。以下是一些典型的应用场景:
金融市场分析:
股票价格分析:WMA常用于平滑股票价格时间序列,以识别潜在的价格趋势和波动。与SMA相比,WMA能够更快地响应价格的急剧变化,因此在短期交易策略中非常受欢迎。
技术指标计算:WMA是计算一些技术指标(如加权移动平均交叉策略)的基础,用于生成买卖信号。
经济数据分析:
经济指标预测:WMA可以用来平滑经济时间序列(如GDP、通货膨胀率等),从而帮助预测未来的经济趋势。
需求预测:WMA被用于消费品需求的平滑和预测,特别是在具有季节性波动的行业中。
工程与信号处理:
噪声滤除:WMA可用于处理信号数据,通过赋予最近的数据点更高的权重来减少噪声对信号的影响。
系统响应分析:在控制系统中,WMA可用于分析系统的实时响应,帮助设计更加稳健的控制策略。
与其他移动平均方法的比较
与简单移动平均(SMA)比较:
权重分配:SMA对窗口内的所有数据点赋予相同的权重,而WMA对不同数据点赋予不同的权重。
敏感性:WMA由于对最近的数据点赋予更高的权重,因此在趋势检测上比SMA更加敏感。
与指数移动平均(EMA)比较:
计算复杂度:WMA需要预先定义并计算每个数据点的权重,而EMA使用一个递归公式,计算更为简单。
权重分布:EMA的权重按指数递减,WMA的权重可以更加灵活,不一定是指数递减
本文代码
我们将使用加权移动平均(WMA)来捕捉价格趋势,并根据此趋势生成交易信号
核心代码
% 从CSV文件中导入数据
data = readtable('AAPL.csv');
% 提取时间和价格数据
dates = datetime(data.Date);
prices = data.AdjClose;
% 绘制股票价格数据
figure;
plot(dates, prices);
title([ticker ' Stock Prices']);
xlabel('Date');
ylabel('Price');
grid on;
% 定义WMA的周期和权重
shortTermPeriod = 5;
longTermPeriod = 20;
% 线性递增权重计算
shortTermWeights = 1:shortTermPeriod;
longTermWeights = 1:longTermPeriod;
% 计算短期WMA
shortTermWMA = zeros(size(prices));
for i = shortTermPeriod:length(prices)
segment = prices(i-shortTermPeriod+1:i); % 提取价格的时间窗口段
shortTermWMA(i) = sum(shortTermWeights(:) .* segment) /
end
% 计算长期WMA
longTermWMA = zeros(size(prices));
for i = longTermPeriod:length(prices)
segment = prices(i-longTermPeriod+1:i); % 提取价格的时间窗口段
longTermWMA(i) = sum(longTermWeights(:) .* segment) /
end
% 绘制价格和WMA曲线
figure;
plot(dates, prices, 'k-', 'DisplayName', 'Price');
hold on;
plot(dates, shortTermWMA, 'r-', 'DisplayName', ['Short-Term WMA (' num2str(shortTermPeriod) '-Day)']);
plot(dates, longTermWMA, 'b-', 'DisplayName', ['Long-Term WMA (' num2str(longTermPeriod) '-Day)']);
title([ticker ' Stock Prices with WMA']);
xlabel('Date');
ylabel('Price');
legend('show');
grid on;
% 初始化交易信号
signals = zeros(size(prices)); % 1 = 买入, -1 = 卖出
% 绘制信号
figure;
plot(dates, prices, 'k-', 'DisplayName', 'Price');
hold on;
plot(dates, shortTermWMA, 'r-', 'DisplayName', ['Short-Term WMA (' num2str(shortTermPeriod) '-Day)']);
plot(dates, longTermWMA, 'b-', 'DisplayName', ['Long-Term WMA (' num2str(longTermPeriod) '-Day)']);
plot(dates(signals == 1), prices(signals == 1), 'g^', 'MarkerFaceColor', 'g', 'DisplayName', 'Buy Signal');
plot(dates(signals == -1), prices(signals == -1), 'rv', 'MarkerFaceColor', 'r', 'DisplayName', 'Sell Signal');
title([ticker ' Trading Signals with WMA']);
xlabel('Date');
ylabel('Price');
legend('show');
grid on;
% 初始化资金和仓位
initialCash = 100000; % 初始资金
cash = initialCash;
position = 0; % 持仓
tradeLog = table();
% 计算投资组合价值
portfolioValue(i) = cash + position * prices(i);
end
% 显示交易日志
disp(tradeLog);
% 计算最终收益率
% 计算最大回撤
% 绘制投资组合价值
figure;
plot(dates, portfolioValue);
title([ticker ' Portfolio Value']);
xlabel('Date');
ylabel('Portfolio Value');
grid on;
% 输出绩效指标
disp(['Final Portfolio Value: $' num2str(finalValue)]);
disp(['Total Return: ' num2str(returns) '%']);
disp(['Max Drawdown: $' num2str(maxDrawdown)]);
% 输出交易日志
disp('Trade Log:');
disp(array2table(tradeLog, 'VariableNames', {'Date', 'Price', 'Position', 'Cash', 'Action'}));
说明
数据导入:从金融数据源(如Yahoo Finance或本地CSV文件)导入股票价格数据。
WMA计算:计算不同周期的加权移动平均线,用于趋势分析。
交易策略:基于WMA交叉策略生成交易信号。
交易执行与绩效分析:模拟交易执行,并计算交易策略的绩效指标,如收益率、最大回撤等
效果图示
优化建议
调优WMA参数:通过历史数据测试不同的WMA周期,优化短期和长期WMA的选择。
多资产组合:扩展到多资产组合交易,并评估整个组合的绩效。
风险管理:引入止损和止盈机制,进一步控制风险。
模型扩展:结合其他技术指标(如相对强弱指数RSI、布林带等)进行多指标交易策略。
完整代码
关注下方公众号,回复“WMA”获取完整代码