楼主: 挖矿专家
3234 11

[源码分享] Matlab量化交易策略之 MTM择时 [推广有奖]

  • 0关注
  • 74粉丝

讲师

22%

还不是VIP/贵宾

-

威望
0
论坛币
2016 个
通用积分
5.2622
学术水平
21 点
热心指数
21 点
信用等级
21 点
经验
6055 点
帖子
403
精华
0
在线时间
151 小时
注册时间
2017-2-8
最后登录
2017-6-27

楼主
挖矿专家 发表于 2017-3-15 11:24:04 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
策略原理:
         选股标的:沪深300所有成分股
         买入信号:MTM上穿其均线
         资金分配:等权重买入
         卖出信号:MTM下穿其均线

回测曲线(由Auto-Trader提供回测报告)

MTM择时.png

策略代码:

function MTM1(n1,n2,n4) % MTM动量指标.%获取目标资产信息targetList = traderGetTargetList(); % 在RunBackTest中选择好的标的.%获取账户信息HandleList = traderGetHandleList();%=================================================================% RunBackTest的参数设置% n1=12; % 前n1天的收盘价 % n2=6; % MTM的n2日平均% n4=2; % 几倍ATR%=================================================================% 定义持有的账户为全局变量global holdingList;if isempty(holdingList) % 判断cc是否为空值    holdingList(1).Market=0;    holdingList(1).Code=0;    holdingList(1).OpenBar=0;    holdingList(1).OpenPrice=0;    holdingList(1).Sharebum=0;    holdingList(1).StopLoss=0;end% 定义可用金额global available;if isempty(available) % 判断cc是否为空值    available=100000000;end% 定义初始金额,每只股票的最大仓位为初始资金的1/300initial=100000000;initialeach=initial/length(targetList);k1=0;%------------------------------------------------------------------------------------------------------------------------------------------------------------------------------for i = 1:length(targetList) % 每个股票过一遍        % lags为策略需要往前获取多少天    lags=n1+n2+2;    %策略中每次取数据的长度    barnum=traderGetCurrentBar(targetList(i).Market,targetList(i).Code); % K线的序号,后面会增加,前面的值对应的日期固定.    % 数据长度限制,排除了前lags根k线    if(barnum<lags)        continue;    end        % 策略开始部分    [time,open,high,low,close,volume,turnover,openinterest] = traderGetKData(targetList(i).Market,targetList(i).Code,'day',1, 0-lags, 0,false,'FWard');    if length(close)<n1+n2+2        continue;    end    if time(end)>=datenum('1-Jan-2014')        if length(close)<n1+n2+2            continue;        end        % MTMMA        MTM=traderMTM(n1,targetList(i).Market,targetList(i).Code,'day',1, 0-lags, 0,false,'FWard');        MTMMA=tsmovavg(MTM,'s',n2,1);        % 买入信号:        a=MTM(end-1)<MTMMA(end-1) && MTM(end)>MTMMA(end);        if a            k1=k1+1;            stockList(k1).Market=targetList(i).Market;            stockList(k1).Code=targetList(i).Code;            stockList(k1).Price=close(end);            [ATR1, ~]=traderATR(14,targetList(i).Market,targetList(i).Code,'day',1,0-lags,0,false,'FWard');            stockList(k1).ATR=ATR1(end);        end    endend%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------% 判断股票池里面的股票是否要买入,买入多少手if k1~=0    for i=1:length(stockList)        % 等权重买入%         sharenum=floor(initialeach/stockList(i).Price);        % 设置每只股票的交易手数,使得最大的亏损不大于初始账户的 n2%.        sharenum=floor(stockList(i).Price*initialeach/stockList(i).ATR/10000);        % 获取当前bar序号        barnum=traderGetCurrentBar(stockList(i).Market,stockList(i).Code);        %获取当前仓位        [marketposition,~,~]=traderGetAccountPosition(HandleList(1),stockList(i).Market,stockList(i).Code);        if marketposition ==0 && (sharenum*stockList(i).Price)<=1*available && time(end)>=datenum('1-Jan-2014')            orderID1=traderBuy(HandleList(1),stockList(i).Market,stockList(i).Code,sharenum,0,'market','buy1'); % 开多单            if orderID1~=0                [~,~,price] = traderGetAccountPosition(HandleList(1),stockList(i).Market,stockList(i).Code); % 记录开仓的价格                available=available-sharenum*price;                if holdingList(1).Market==0                    holdingList(1).Market=stockList(i).Market;                    holdingList(1).Code=stockList(i).Code;                    holdingList(1).OpenBar=barnum+1;                    holdingList(1).OpenPrice=price;                    holdingList(1).Sharebum=sharenum;                    holdingList(1).StopLoss=price-n4*stockList(i).ATR;                else                    holdingList1(1).Market=stockList(i).Market;                    holdingList1(1).Code=stockList(i).Code;                    holdingList1(1).OpenBar=barnum+1;                    holdingList1(1).OpenPrice=price;                    holdingList1(1).Sharebum=sharenum;                    holdingList1(1).StopLoss=price-n4*stockList(i).ATR;                    holdingList=[holdingList,holdingList1];                end            end        end    endend%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------% 出场设置if holdingList(1).Code~=0    for i=1:length(holdingList)        [ATR2, ~]=traderATR(14,holdingList(i).Market,holdingList(i).Code,'day',1,0-lags,0,false,'FWard');        [time1,open1,high1,low1,close1,volume1,turnover1,openinterest1] = traderGetKData(holdingList(i).Market,holdingList(i).Code,'day',1, 0-lags, 0,false,'FWard');        barnum=traderGetCurrentBar(holdingList(i).Market,holdingList(i).Code);                if barnum>holdingList(i).OpenBar && high1(end-1)>high1(end-2)            holdingList(i).StopLoss=high1(end-1)-n4*ATR2(end-1);        end        exitlong1=close1(end)<holdingList(i).StopLoss;        % MTMMA        MTM=traderMTM(n1,holdingList(i).Market,holdingList(i).Code,'day',1, 0-lags, 0,false,'FWard');        MTMMA=tsmovavg(MTM,'s',n2,1);        % 买入信号:        exitlong2=MTM(end-1)>MTMMA(end-1) && MTM(end)<MTMMA(end);        exitlong=exitlong1 || exitlong2;        if barnum>=holdingList(i).OpenBar && exitlong            orderID2=traderPositionTo(HandleList(1),holdingList(i).Market,holdingList(i).Code,0,0,'market','sell1');            if orderID2~=0                exitprice=traderOrderFilledPrice(HandleList(1),orderID2);                available=available+exitprice*holdingList(i).Sharebum;                holdingList(i).Sharebum=0;            end        end            end    % 删除已经卖出的股票    holdingList2(1).Market=0;    holdingList2(1).Code=0;    holdingList2(1).OpenBar=0;    holdingList2(1).OpenPrice=0;    holdingList2(1).Sharebum=0;    holdingList2(1).StopLoss=0;    for i=1:length(holdingList)        if holdingList(i).Sharebum~=0            holdingList2=[holdingList2,holdingList(i)];        end    end    holdingList=holdingList2(2:end);end%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------end


更多免费策略源码下载请登录DigQuant社区-策略资源下载~



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 1 人评分经验 论坛币 收起 理由
fantuanxiaot + 33 + 33 精彩帖子

总评分: 经验 + 33  论坛币 + 33   查看全部评分

本帖被以下文库推荐

沙发
peppep 发表于 2017-3-15 14:25:13
楼主的每个贴我都会看~~

藤椅
peppep 发表于 2017-3-15 14:25:39
楼主的每个贴我都会看~~

板凳
65425856 发表于 2017-3-15 17:08:02
楼主好人~

报纸
挖矿专家 发表于 2017-3-16 13:22:06
感谢支持~

地板
twoods9876 在职认证  发表于 2017-3-18 16:32:15
Thanks!

7
挖矿专家 发表于 2017-3-20 14:55:07
twoods9876 发表于 2017-3-18 16:32
Thanks!
感谢支持~

8
65425856 发表于 2017-3-20 17:57:34
谢谢分享

9
ghjktdf 发表于 2017-3-21 12:22:06
感谢楼主分享~

10
ydc129 发表于 2017-3-30 00:10:26
thanks

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-1-28 13:47