这篇指南将从基础到进阶,涵盖以下内容:

- 为什么选择 MATLAB 进行技术分析?
- 核心准备工作:获取金融数据
- 技术指标的计算与实现
- 数据可视化
- 一个完整的实战案例
- 进阶方向与资源
为什么选择 MATLAB 进行技术分析?
相比于 Python 或其他语言,MATLAB 在技术分析领域有其独特的优势:
- 专业的金融工具箱:MATLAB 提供了 Financial Toolbox™ 和 Econometrics Toolbox™,其中内置了大量现成的金融函数,可以直接计算技术指标、处理日期时间序列、进行资产组合分析等,无需从头编写代码。
- 强大的矩阵运算能力:技术分析的核心是处理时间序列数据(即向量或矩阵),MATLAB 的设计初衷就是矩阵运算,这使得数据处理非常高效和简洁。
- 便捷的数据可视化:
plot函数及其丰富的参数可以轻松绘制各种类型的图表,包括线图、K线图、成交量图等,并且可以轻松地在图上叠加多条均线、布林带等技术指标。 - 集成开发环境:MATLAB 提供了一个集成的编辑器、调试器和性能分析器,方便开发和调试复杂的交易策略。
- 代码部署与仿真:可以将策略编译为独立的可执行文件或 C/C++ 代码,方便回测和部署。
核心准备工作:获取金融数据**
在进行任何分析之前,首先需要获取可靠的金融数据,MATLAB 提供了多种方式:
使用 MATLAB 内置的函数(推荐)
这是最方便、最推荐的方法,特别是对于美股数据。
使用 fetch 函数 (需要 Financial Toolbox)

% 获取苹果公司从 2025年1月1日 到 2025年12月31日 的股票数据
startDate = datetime('2025-01-01');
endDate = datetime('2025-12-31');
ticker = 'AAPL';
% 使用 fetch 函数获取数据
% 'Price' 可以是 'OHLC' (开盘、最高、最低、收盘) 或 'close' 等
[~, ~, ~, ~, ~, ~, prices, ~, ~] = fetch(ticker, startDate, endDate, 'OHLC');
% prices 是一个结构体,包含 OHLC 数据
closePrices = prices.Close; % 提取收盘价
dates = prices.Date; % 提取日期
% 显示前5行数据
disp(table(dates(1:5), closePrices(1:5), 'VariableNames', {'Date', 'ClosePrice'}));
从 CSV 文件导入
如果你有自己的数据文件(例如从雅虎财经、TradingView 等下载的 CSV 文件),可以使用 readtable 函数。
% 假设你有一个名为 'AAPL.csv' 的文件
% 文件包含列:Date, Open, High, Low, Close, Volume
data = readtable('AAPL.csv');
% MATLAB 默认将文本列读取为 categorical 或 char,需要转换为 datetime
data.Date = datetime(data.Date, 'InputFormat', 'yyyy-MM-dd');
% 提取收盘价和日期
closePrices = data.Close;
dates = data.Date;
% 显示前5行数据
head(data, 5)
技术指标的计算与实现
下面我们手动实现几个经典的技术指标,这能帮助你理解其原理,同时也会展示如何使用金融工具箱中的内置函数。
移动平均线
MA 是最基础的趋势指标。
手动实现:

% 假设我们已经有了 closePrices 和 dates % 计算20日简单移动平均线 SMA_period = 20; sma20 = movmean(closePrices, SMA_period); % movmean 是 MATLAB 内置函数,计算移动平均 % 计算50日指数移动平均线 EMA_period = 50; weights = exp(-1.5 * (0:EMA_period-1)'); % EMA 权重 weights = weights / sum(weights); % 归一化 ema50 = filter(weights, 1, closePrices); % 使用 filter 函数计算 % 使用金融工具箱内置函数(更简单) % sma20_tb = movavg(closePrices, 'simple', SMA_period); % ema50_tb = movavg(closePrices, 'exponential', EMA_period);
相对强弱指数
RSI 是一个动量指标,用于衡量超买超卖状态。
手动实现:
function rsi = calculateRSI(prices, period)
% 计算价格变化
priceChange = diff(prices);
% 分别计算上涨和下跌的幅度
gain = priceChange;
gain(gain < 0) = 0;
loss = -priceChange;
loss(loss < 0) = 0;
% 计算平均增益和平均损失
avgGain = movmean(gain, period);
avgLoss = movmean(loss, period);
% 避免 avgLoss 为 0 的情况
avgLoss(avgLoss == 0) = eps; % eps 是 MATLAB 中一个非常小的数
% 计算 RSI
rs = avgGain(2:end) ./ avgLoss(2:end);
rsi = 100 - (100 ./ (1 + rs));
end
% 计算14日 RSI
RSI_period = 14;
rsi = calculateRSI(closePrices, RSI_period);
布林带
布林带由中轨(SMA)、上轨和下轨组成,用于衡量价格的波动性。
手动实现:
% 假设我们已经计算了 sma20 % 计算20日标准差 stdDev = movstd(closePrices, SMA_period); % 计算布林带 upperBand = sma20 + 2 * stdDev; lowerBand = sma20 - 2 * stdDev;
数据可视化
绘制 K 线图,并将计算出的技术指标叠加在上面。
% 创建一个新的图表窗口
figure('Name', 'AAPL Technical Analysis', 'NumberTitle', 'off');
% --- 子图1: K线图和收盘价 ---
subplot(3, 1, 1);
% 绘制K线图 (需要 Financial Toolbox)
% candle(dates, prices.Open, prices.High, prices.Low, prices.Close);
% 如果没有工具箱,可以简化为绘制收盘价线图
plot(dates, closePrices, 'b-', 'DisplayName', 'Close Price');
hold on;
% 绘制移动平均线
plot(dates, sma20, 'r-', 'LineWidth', 1.5, 'DisplayName', 'SMA(20)');
plot(dates, ema50, 'g-', 'LineWidth', 1.5, 'DisplayName', 'EMA(50)');
% 绘制布林带
plot(dates, upperBand, 'k--', 'DisplayName', 'Upper Band (20, 2)');
plot(dates, lowerBand, 'k--', 'DisplayName', 'Lower Band (20, 2)');
'AAPL Price with Moving Averages and Bollinger Bands');
xlabel('Date');
ylabel('Price (USD)');
legend('show', 'Location', 'best');
grid on;
datetick('x', 'yyyy-mm', 'keepticks'); % 美化X轴日期显示
hold off;
% --- 子图2: RSI ---
subplot(3, 1, 2);
% RSI 数据比价格数据少一个(因为diff),所以需要调整日期
rsi_dates = dates(2:end);
plot(rsi_dates, rsi, 'm-', 'LineWidth', 1.5);['RSI(', num2str(RSI_period), ')']);
xlabel('Date');
ylabel('RSI Value');
ylimits([0 100]); % RSI 范围是 0-100
grid on;
% 添加超买超卖线
yline(70, 'r--', 'DisplayName', 'Overbought (70)');
yline(30, 'g--', 'DisplayName', 'Oversold (30)');
datetick('x', 'yyyy-mm', 'keepticks');
% --- 子图3: 成交量 ---
subplot(3, 1, 3);
% 假设我们从 fetch 或 CSV 中获得了成交量数据
% volume = prices.Volume;
bar(dates, volume);'Volume');
xlabel('Date');
ylabel('Volume');
grid on;
datetick('x', 'yyyy-mm', 'keepticks');
运行上述代码,你将得到一个包含价格、移动平均线、布林带、RSI 和成交量的综合分析图表。
一个完整的实战案例:简单的双均线交叉策略
这是一个非常经典的趋势跟踪策略。
策略逻辑:
