移动平均策略matlab,matlab 简单均线策略

策略描述

这是一个作业具体要求如下:

147727734_1_20181121010042606.png

策略编写

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

编写移动平均函数

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

end1

2

3

4

5

6

7

8

9

10

11

12

这里要提醒的是我们为了移动平均缩短序列,将由于移动平均消失的值用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,向下,反之

% 所以当最长移动平均参数为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);

end1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

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

数据处理函数

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

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');1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

运行策略

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

toc1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

程序运行结果如下:

147727734_2_20181121010042778.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值