在金融科技快速发展的今天,量化投资已成为股票分析的重要工具,MATLAB凭借其强大的数值计算能力、丰富的金融工具箱和直观的可视化功能,成为许多金融从业者和研究人员进行股票分析的首选平台,本文将围绕“MATLAB股票分析代码”,从数据获取、技术指标计算、量化策略实现到回测评估,系统介绍如何用MATLAB构建完整的股票分析流程,并提供关键代码示例。
股票数据获取:搭建分析的基础
股票数据是所有分析的基础,MATLAB支持多种数据获取方式,包括从金融数据库接口调用、爬取网页数据以及读取本地文件(如CSV、Excel),以下是两种常用方法:
使用MATLAB内置金融数据库接口
MATLAB的Financial Toolbox
提供了对Yahoo Finance、Bloomberg、Wind等金融数据库的接口支持,以Yahoo Finance为例,通过fetch
函数可直接获取股票历史数据:
% 设置股票代码和起止时间 ticker = '000001.SZ'; % 平安银行A股 startDate = '2020-01-01'; endDate = '2023-12-31'; % 从Yahoo Finance获取数据(需联网) stockData = fetch yahoo(ticker, 'Date Open High Low Close Volume', startDate, endDate); % 提取关键数据并整理 dates = stockData(:,1); % 日期 openPrices = stockData(:,2); % 开盘价 highPrices = stockData(:,3); % 最高价 lowPrices = stockData(:,4); % 最低价 closePrices = stockData(:,5); % 收盘价 volumes = stockData(:,6); % 成交量 % 转换为MATLAB时间格式(便于后续计算) dates = datetime(dates, 'InputFormat', 'yyyy-MM-dd');
爬取网页数据(以东方财富为例)
若需获取特定数据源(如东方财富网),可通过webread
或websave
结合网页解析实现:
% 东方财富网股票历史数据URL示例(以平安银行为例) url = 'https://datacenter-web.eastmoney.com/api/data/v1/get?sortColumns=DATE&sortOrders=DESC&pageSize=100¤tPage=1&filter=(SECUCODE%3D%27000001.SZ%27)&source=WEB&client=WEB&reportName=RPT_DAILYBILLBOARD_MARKET'; % 发送HTTP请求获取JSON数据 data = webread(url); % 提取收盘价和日期(需根据实际JSON结构调整字段) closePrices = data.result.Data(:, end-4); % 假设收盘价在倒数第5列 dates = datetime(data.result.Data(:,1), 'InputFormat', 'yyyy-MM-dd');
技术指标计算:量化股价趋势的“标尺”
技术指标是股票分析的核心工具,MATLAB可快速实现常见指标(如MA、MACD、RSI、KDJ等)的计算,以下以移动平均线(MA)和MACD为例展示代码逻辑:
移动平均线(MA)
MA通过计算一段时间内股价的平均值,平滑价格波动,反映趋势方向,计算5日、20日、60日MA:
% 计算移动平均线(窗口分别为5、20、60) ma5 = movmean(closePrices, [2,2]); % 中心化移动平均(对称窗口) ma20 = movmean(closePrices, [10,10]); ma60 = movmean(closePrices, [30,30]); % 可视化MA与收盘价对比 figure; plot(dates, closePrices, 'b-', 'LineWidth', 1); hold on; plot(dates, ma5, 'r-', 'LineWidth', 1.5); plot(dates, ma20, 'g-', 'LineWidth', 1.5); plot(dates, ma60, 'm-', 'LineWidth', 1.5);'平安银行收盘价与移动平均线'); xlabel('日期'); ylabel('价格(元)'); legend('收盘价', 'MA5', 'MA20', 'MA60'); grid on;
MACD指标
MACD(指数平滑异同移动平均线)通过快慢EMA的差值(DIF)和信号线(DEA)判断买卖时机:
% 计算MACD参数 fastEMA = 12; % 快速EMA周期 slowEMA = 26; % 慢速EMA周期 signalEMA = 9; % DEA周期 % 计算快慢EMA fastEma = ema(closePrices, fastEMA); slowEma = ema(closePrices, slowEMA); % 计算DIF和DEA DIF = fastEma - slowEma; DEA = ema(DIF, signalEMA); % 计算MACD柱状图(HIST = 2*(DIF-DEA),通常简化为DIF-DEA) HIST = DIF - DEA; % 可视化MACD指标 figure; subplot(2,1,1); plot(dates, closePrices, 'b-');'平安银行股价与MACD指标'); xlabel('日期'); ylabel('价格(元)'); subplot(2,1,2); plot(dates, DIF, 'r-', 'LineWidth', 1.5); hold on; plot(dates, DEA, 'g-', 'LineWidth', 1.5); bar(dates, HIST, 'barWidth', 0.3, 'FaceColor', [0.5,0.5,1]); legend('DIF', 'DEA', 'MACD柱状图'); grid on;
量化策略实现:从信号到交易逻辑
技术指标的核心价值在于生成交易信号,以下以“金叉死叉”策略(MA5上穿MA20买入,下穿卖出)和MACD策略为例,展示MATLAB策略代码框架:
MA金叉死叉策略
% 初始化参数 initialCapital = 100000; % 初始资金 position = 0; % 持仓股数(0为空仓,1为满仓) capital = initialCapital; % 当前资金 equity = zeros(size(closePrices)); % 每日权益 % 遍历每日数据(从第21天开始,因MA20需20个数据点) for i = 21:length(closePrices) % 生成交易信号:MA5上穿MA20为买入(1),下穿为卖出(-1),否则持有(0) if ma5(i) > ma20(i) && ma5(i-1) <= ma20(i-1) signal = 1; % 金叉买入 elseif ma5(i) < ma20(i) && ma5(i-1) >= ma20(i-1) signal = -1; % 死叉卖出 else signal = 0; % 持有 end % 执行交易(假设每次全仓买卖,不考虑手续费) if signal == 1 && position == 0 % 买入信号且当前空仓 position = floor(capital / closePrices(i)); % 买入股数(全仓) capital = capital - position * closePrices(i); % 剩余现金 elseif signal == -1 && position > 0 % 卖出信号且当前持仓 capital = capital + position * closePrices(i); # 卖出后现金 position = 0; % 清仓 end % 计算当日权益(现金+持仓市值) equity(i) = capital + position * closePrices(i); end % 可视化权益曲线 figure; plot(dates, equity, 'r-', 'LineWidth', 1.5);'MA金叉死叉策略权益曲线'); xlabel('日期'); ylabel('权益(元)'); grid on;
MACD策略
% 初始化参数 initialCapital = 100000; position = 0; capital = initialCapital; equity = zeros(size(closePrices)); % 遍历每日数据(从第27天开始,因DEA需9个DIF数据点) for i = 27:length(closePrices) % 交易信号:DIF上穿DEA为买入,下穿为卖出 if DIF(i) > DEA(i) && DIF(i-1) <= DEA(i-1) signal = 1; elseif DIF(i) < DEA(i) && DIF(i-1) >= DEA(i-1) signal = -1; else signal = 0; end % 执行交易(同上) if signal == 1 && position == 0 position = floor(capital / closePrices(i)); capital = capital - position * closePrices(i); elseif signal == -1 && position > 0 capital = capital + position * closePrices(i); position = 0; end equity(i) = capital + position * close
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权,未经许可,不得转载。