matlab 简单均线策略

版权声明:本文为博主原创文章,如能帮助到各位,荣幸之至,欢迎转载。 https://blog.csdn.net/m0_37639589/article/details/83449591

matlab 简单均线策略示例1

策略描述

这是一个作业具体要求如下:2018-10-27-20-28-55

策略编写

题目中对问题的描述已经非常清晰,我们这里按题目要求一步一步解决问题。

编写移动平均函数

function ma = myma(price,n)
% 自定义的计算移动平均序列函数
% 有移动平均导致缺失的数据,全部补为nan(以便数据对齐)
% price为原价格序列,n为移动平均参数
len = length(price);
% 初始化ma序列
ma = nan(len,1);
for i = n:len
    ma(i) = sum(price(i-n+1:i))/n;
end

end

这里要提醒的是我们为了移动平均缩短序列,将由于移动平均消失的值用nan补齐。

编写策略主函数

function  ma_strategy(short,long,band)

% 测试用数据
% short = 2;
% long = 20;
% band = 0.01;
%% 加载数据
load stock_data
% 提取用到的收盘价
data_close = data(:,5);
%% 移动平均策略准备
% ma_s 短期移动平均线,ma_l长期
ma_s = myma(data_close,short);
ma_l = myma(data_close,long);
% ma_u 减去带宽向上突破的短期移动平均线,ma_d,加上带宽向下突破
ma_u = ma_s-band*ma_l;
ma_d = ma_s - band*ma_l;
% 用buy,sell记录开平仓时的位置
buy = [];
sell = [];
%% 策略逻辑

% 每次假设开一手,多仓记为1 ,空仓为0
% 这里就假设这种最简单的情况,你要研究什么情况下多开仓可以慢慢研究
% 向上突破得满足两个条件,1.前一时刻short<long,2.后一时候short>=long,向下,反之
% 所以当最长移动平均参数为200时,是从201开始的
for i = 201:length(data_close)
    if ma_u(i-1) < ma_l(i-1) && ma_u(i) >= ma_l(i)
        buy = [buy;i];
        % 因为不允许卖空,所以在买出时多了一个前置条件,就是手中有仓位
    elseif ma_d(i-1) > ma_l(i-1) &&  ma_d(i) <= ma_l(i) && ~isempty(buy)
        sell = [sell;i];
    end
end
% 最后一日如果还有持仓,清仓
if length(buy) ~= length(sell)
    sell= [sell;length(data_close)];
end
%% 计算收益率
r = (data_close(sell) - data_close(buy)) ./ data_close(buy);
r = r+1;
total_r= cumprod(r);
%% output
fprintf('Cumulative return for MA(%d,%d,%.2f) is %.2f %%\n',short,long,band,total_r(end)*100);

end



题目中限制卖空,使问题简单不少。可以思考一下如果允许卖空该怎么做。另外就是对于带宽限制的处理,我们采取了上下移短期均线的方式。

数据处理函数

主函数中调用了数据处理函数保存的数据。该函数如下:

clear;
clc;
%% 从文件中读取数据
filename = '股票日度数据.txt';
fid = fopen(filename,'r');
format1 = '%s %f %f %f %f %f %f';
data_title = fgetl(fid);
data = textscan(fid,format1,'Delimiter',',','collectoutput',1);
fclose(fid);
%% 整理数据
% 将日期数值化
data_time = datenum(data{1,1});
% 提取用到的收盘价
data_close = data{1,2}(:,1:4);
data = [data_time data_close];
% 保存以便后续使用
save('stock_data.mat','data','data_title');

运行策略

close all
clear
clc
tic;
short = [1 2 5];
long = [20 50 150 200];
band = [0 0.01];
% 调用策略函数求解
for i= 1:length(short)
    for j = 1:length(long)
        for k = 1:length(band)
            ma_strategy(short(i),long(j),band(k))
        end
    end
end
toc

程序运行结果如下:

2018-10-27-20-43-01

该程序以及相应数据已经上传,可点击下载

猜你喜欢

转载自blog.csdn.net/m0_37639589/article/details/83449591