先上图再上代码:












主文件代码:
clc;
clear all;
% [data_all,time_all]=gethqdata(‘tick_if.csv’); %载入数据
dd = readtable(‘F:\遗传策略 -模式11\遗传策略 -模式\data\1min沪铜指数.csv’);
alldata = table2array(dd(:,5));%全部行情
alltime = table2cell(dd(:,1));%全部时间
%%%%%%检查筛选数据
dd_s =readtable(‘F:\遗传策略 -模式11\遗传策略 -模式\data\10second沪铜指数0.csv’);
alldata_s = table2array(dd_s(:,5));%全部行情
alltime_s = table2cell(dd_s(:,1));%全部时间
clear(‘dd_s’);
clear(‘dd’);
%%%%%%%%%%随机产生新的数据
% data_all=New_data(data_all);%随机产生新的数据(翻倍)
% time_all=num2cell(New_time(cell2mat(time_all)));%产生相应维度的时间
%% 策略生成
%1.初始化50个策略
breed_num =50;
input_num=100;%输入数目 数目越大 计算圆满,效果越好,但过长易造成计算缓慢和交易手数过低
output_num=10;%行情分类数目,数字大可能会过度拟合
select_num=8;%选择的策略数目
num1 =36;%繁殖的代数
num2 =20;%需要的策略数目
cost =5;%%交易成本
cost_s=5;%筛选数据的交易成本
len =20;%均线周期
rate_i=0.416;%样本初始数据大小比例
rate1=0.418;%适应产生数据的样本比例,(暂时不用)
goalnum=0.000002;%存储的策略平均分选择
i_num3=1;%选择的评价体系 初始化值
buy_ratio=15;%多头占盈利的比例的倒数
sell_ratio=15;%空头占盈利的比例的倒数
gpnum=2;%迭代次数 注意gpnum<length(Fsg)
%%%%%%%%%%%%%%%%%%%%%%%%
sgin=6;%进场指令数
sgin1=6;
sgin2=6;
sgout=6;%出场指令数
sgout1=6;
sgsum=(sgin+sgout+sgout1+sgin1+sgin2)*2;%需要的指令集数
sgkong=6;%空仓期指令数
sum_sg=ceil(log2(sgsum+sgkong));%交易目标群2^sum_sg
sg=zeros(1,sgsum);
sgg=randperm(2^(sum_sg))-1;%随机产生指令集
for i_sg=1:sgsum
sg(i_sg)=sgg(i_sg); %交易的指令集
end
% sg=sort(sg);
sg(1,end+1)=sgin;
sg(1,end+1)=sgout;
sgin=sg(end-1);
sgin1=sgin;
sgin2=sgin;
sgout=sg(end);
sgout1=sgout;
sg1=num2cell(sg(1,1:sgin));%开多
sg2=num2cell(sg(1,sgin+1:sgin+sgin1));%再次开多
sg3=num2cell(sg(1,sgin+sgin1+1:sgin+sgin1+sgin2));%再再开多
sg4=num2cell(sg(1,sgin+sgin1+sgin2+1:sgin+sgin1+sgin2+sgout));%出
sg5=num2cell(sg(1,sgin+sgin1+sgin2+sgout+1:sgin+sgin1+sgin2+sgout+sgout1));%出出
sg6=num2cell(sg(1,sgin+sgin1+sgin2+sgout+sgout1+1:sgin+sgin1+sgin2+sgout+sgout1+sgin2));%进
sg7=num2cell(sg(1,sgin+sgin1+sgin2+sgout+sgout1+sgin2+1:sgin+sgin1+sgin2+sgout+sgout1+sgin2+sgin1));%进进
sg8=num2cell(sg(1,sgin+sgin1+sgin2+sgout+sgout1+sgin2+sgin+1:sgin+sgin1+sgin2+sgout+sgout1+sgin2+sgin1+sgin));%进进
save(‘sg’,’sg’);
% sg=[0,5,2,7];%设置固定指令
% i_num3=d_i;%选择的评价体系
% Fsg=[1,2,3,10,16,18,22,23]; %gpnum<length(Fsg)
Fsg=[1,1,1,1,1,5,6];
if gpnum>length(Fsg)
gpnum=length(Fsg);
end
% % if length(s_randm)<i_chi_num
s_randm = repmat(new_strategy(‘s’,input_num,output_num,sum_sg),breed_num,1);%随机生成策略
% parfor GA_i=1:GA_num
for i =1:breed_num
s_randm(i) = init_strategy(new_strategy(‘s’,input_num,output_num,sum_sg),0);
% new_strategy 随机生成新策略
% ‘s’ 策略名字 随便赋值
% init_strategy 初始化策略,将策略中的模拟交易数据归零并且分配内存(除了策略本身),加快运算速度
%s_randm 初始策略
%num1 繁殖代数 (占用时间)
%num2 需要的策略数目 (占用内存)
%num3 选择的策略评价体系个数
%time_all data_all 需要的数据 data_all 收盘价格
%cost 每笔交易成本 冲击成本+手续费
end
for d_i=1:gpnum
findrate = fix(length(alldata)*rate_i);%测试的比例长度
data_all=alldata(1:findrate,:);%学习的范围
time_all=alltime(1:findrate,:);%学习的范围,时间
i_num3=Fsg(d_i);
%遗传算法繁殖策略,耗时间
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%第一模式
%%%%%%遗传生成策略
% parfor
% [s_generate6{(i_num3)},myseed] = generate_the_strategy1(s_randm,num1,num2,time_all,data_all,cost,len,i_num3,input_num,output_num,goalnum); %i评价选择,testtime,testdata
% sell_strategy{(i_num3)} =
sell_generate_the_strategy1(s_randm,num1,num2,time_all,data_all,cost,len,i_num3,input_num,output_num,goalnum); %i评价选择,testtime,testdata
% buy_strategy{(i_num3)} =
buy_generate_the_strategy1(s_randm,num1,num2,time_all,data_all,cost,len,i_num3,input_num,output_num,goalnum); %i评价选择,testtime,testdata
% end
num_strategy=num2;
num_generate=num1;
%%%%%%%%
% idata_all=New_data(data_all);%随机产生新的数据(翻倍)
% itime_all=num2cell(New_time(cell2mat(time_all)));%产生相应维度的时间
% findrate1 = fix(length(idata_all)*rate1);%测试的比例长度
% data_all1=itime_all(1:findrate1,:);%学习的范围
% time_all1=itime_all(1:findrate1,:);%学习的范围,时间
% s_data=zeros(length(data_all1),1);%进行交易的
% s_time=time_all1;%进行交易的
%%%%%%
s=s_randm;
i_i_num3=i_num3;
parent_rate = 0.75;%默认50%的淘汰率
num_all_strategy = floor(num_strategy*parent_rate^-1);%默认50%的淘汰率
num_origin = length(s); %初始策略数目
born_num = num_all_strategy – num_origin;
if born_num<=0
origin_strategy = s(1:num_all_strategy);
else
s1 = s(:); %确定是列向量
s2 = repmat(s(1),born_num,1);
for i_born =1:born_num
s2(i_born) = new_strategy(‘s’,input_num,output_num,sum_sg);
end
origin_strategy = [s1;s2];
end
num_init = length(alltime);
origin_strategy = init_strategy(origin_strategy,num_init);
%初始化名字
strategy_name = 1;
parent_log = cell(num_strategy,1);
for i_name =1:num_all_strategy
origin_strategy(i_name).name = num2str(strategy_name);
strategy_name=strategy_name+1;
end
s_temp=origin_strategy;%初始化策略空间
%% 开始繁殖
% myi=1;
myi_i=1;
for fanzhi_num = 1:num_generate %
%% 策略会测 评分 作为繁殖的依据
goal = zeros(num_all_strategy,1);%记录每个策略得分
% s_temp=zeros(num_all_strategy,1);
% % % % % % % % % % % % % % % % % % % % % % % %
%%%%%%%%%%随机产生新的数据
% idata_all=New_data(data_all);%随机产生新的数据(翻倍)
% % itime_all=num2cell(New_time(cell2mat(time_all)));%产生相应维度的时间
% findrate1 = fix(length(idata_all)*rate1);%测试的比例长度
% data_all1=idata_all(1:findrate1,:);%学习的范围
% time_all1=itime_all(1:findrate1,:);%学习的范围,时间
% % % % % % % % % % % % %
rate_s=0.0001*fanzhi_num;
findrate = fix(length(alldata)*(rate_i+rate_s));%测试的比例长度
data_all=alldata(1:findrate,:);%学习的范围
time_all=alltime(1:findrate,:);%学习的范围,时间
% % % % % % % % % % % % % % % % % % %
% s_data=data_all1;%进行交易的
% s_time=time_all1;%进行交易的
s_data=data_all;%进行交易的
s_time=time_all;%进行交易的
% % % % % % % % % % % % % % % % % % % % % % % %
parfor i_stragey = 1:num_all_strategy
if ~any(strcmp(origin_strategy(i_stragey).name,parent_log)) %父代不参与模拟交易 节约时间
tic
disp([num2str(fanzhi_num),’次繁殖.第’,num2str(i_stragey),’策略,策略名称:’,origin_strategy(i_stragey).name,’策略回测中。。。’]);
s_temp(i_stragey)=sim_trade12(origin_strategy(i_stragey),s_time,s_data,sg1,sg2,sg3,sg4,sg5,sg6,sg7,sg8,sum_sg);%并行计算的时候去掉s_temp(i_strategy)中的i_strategy
origin_strategy(i_stragey)=evaluate_strategy(s_temp(i_stragey),cost,i_i_num3); %股指0.4个点 评价函数学习的范围
toc;
end
goal(i_stragey) = origin_strategy(i_stragey).score;%*origin_strategy0(i_stragey).score;+origin_strategy1(i_stragey).score
%输出显示
% plot(cumsum(origin_strategy(i_stragey).profit)); %画图使用
%
% pause(0.15);%画图使用停顿0.1 可以显示
% hold on; %画图使用
end
% hold off;%画图使用
% pause(2);%画图使用
[~,sort_index]=sort(goal,’descend’);
parent = origin_strategy(sort_index(1:num_strategy));
%%记录名字,在名单的就不用进行交易了
for i_name =1:num_strategy
parent_log{i_name}=parent(i_name).name;
if parent(i_name).score==inf
parent(i_name).score=0;%检查得分情况
end
end
% % % % % % % % % % % % % % % %
mgoal=0;
for i_seed = 1:num_all_strategy
mgoal = mgoal +origin_strategy(i_seed ).score;
end
mgoal = mgoal/num_all_strategy;
%%%%%%%显示评价得分值
disp([‘平均值:’,num2str(mgoal)])
pause(0.15);%画图使用停顿0.1 可以显示
mgoal(i_seed ) = mgoal;
if mgoal(i_seed )>goalnum %%……%选择过程得分高于一定程度的策略&seed(1).rec_order.score seed(1).rec_order.score>50
for e_i_seed = 1:num_all_strategy
if s_temp(e_i_seed).score>0
[buy_profit,sell_profit]=myselect_evaluate_strategy(s_temp(e_i_seed),cost,i_i_num3);
if (buy_profit/(buy_profit+sell_profit))>1/buy_ratio&&(sell_profit/(buy_profit+sell_profit))>1/sell_ratio&&buy_profit>0&&sell_profit>0
myseed{1,myi_i}=s_temp(e_i_seed);
myi_i=myi_i+1;
end
end
end
end
%% 进行下一代的繁殖
multi_rate=0.9;
mut_rate=0.15;
if fanzhi_num<num_generate
goal = goal/sum(goal); %归一化
child_num = num_all_strategy-num_strategy;
child = repmat(new_strategy(‘s’,input_num,output_num,sum_sg),child_num,1);
for i_stragey =1:child_num
f_strategy = origin_strategy(select_strategy(goal));
m_strategy = origin_strategy(select_strategy(goal));
child(i_stragey) = init_strategy(multiply_strategy(num2str(strategy_name),f_strategy,m_strategy,multi_rate,mut_rate,sum_sg),num_init);
strategy_name=strategy_name+1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%
if myi_i==1
myseed{1,1}=f_strategy(1);
end
s_mysdi_i_i=0;
s_num=length(myseed{1,1});
%%%输入途中记录的策略
for s_mysdi=1:length(myseed)
for s_mysdi_i=1:s_num
s_dongseed(s_mysdi_i_i+s_mysdi_i)=myseed{1,s_mysdi}(s_mysdi_i);
end
s_mysdi_i_i=s_num+s_mysdi_i_i;
end
%输入最后的进化的策略的结果
for s_p_i=1:length(f_strategy)
s_dongseed(s_p_i+s_mysdi_i_i)=f_strategy(s_p_i);
end
%%%从中筛选策略
s_ii=1;
for i=1:length(s_dongseed)
if s_dongseed(i).score>goalnum%选择得分的策略
[buy_profit,sell_profit]=myselect_evaluate_strategy(s_dongseed(i),cost);
if (sum(buy_profit)/sum(buy_profit+sell_profit))>1/buy_ratio&&(sum(sell_profit)/sum(buy_profit+sell_profit))>1/sell_ratio&&sum(buy_profit)>0&&sum(sell_profit)>0
s_huanseed(s_ii)=s_dongseed(i);
s_ii=s_ii+1;
end
end
end
if s_ii>1
if length(s_huanseed)>=length(parent)%插入选择的策略
for i_ch_num=1:floor(length(child)/2)
child(i_ch_num)= s_huanseed(length( s_huanseed)-i_ch_num+1);
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
origin_strategy=[parent;child];
if floor(breed_num/4)>1
for i_p =1:floor(length(parent)/3)
parent(end-i_p+1) = init_strategy(new_strategy(‘s’,input_num,output_num,sum_sg),0);
end
end
else
strategy = parent;
end
end
if myi_i==1
myseed{1,1}=strategy(1);
end
mysdi_i_i=0;
num=length(myseed{1,1});
%%%输入途中记录的策略
for mysdi=1:length(myseed)
for mysdi_i=1:num
dongseed(mysdi_i_i+mysdi_i)=myseed{1,mysdi}(mysdi_i);
end
mysdi_i_i=num+mysdi_i_i;
end
%输入最后的进化的策略的结果
for p_i=1:length(strategy)
dongseed(i+mysdi_i_i)=strategy(p_i);
i=i+1;
end
%%%从中筛选策略
ii=1;
for i=1:length(dongseed)
if dongseed(i).score>goalnum%选择得分的策略
[buy_profit,sell_profit]=myselect_evaluate_strategy(dongseed(i),cost);
if (sum(buy_profit)/sum(buy_profit+sell_profit))>1/buy_ratio&&(sum(sell_profit)/sum(buy_profit+sell_profit))>1/sell_ratio&&sum(buy_profit)>0&&sum(sell_profit)>0
huanseed(ii)=dongseed(i);
ii=ii+1;
end
end
end
if ii==1
ii_sh=1;
disp(‘没有选择出适合的策略’);
for ii_ss=1:length(strategy)
if strategy(ii_ss).score>0
huanseed(ii_sh)=strategy(ii_ss);
ii_sh=ii_sh+1;
end
end
end
if select_num>=length(huanseed)
select_num=length(huanseed);
end
parfor i_stragey=1:length(huanseed)
myoutsamplestrategy(i_stragey) = strategyForRealTrade( huanseed(i_stragey),i_stragey,1000);%数据清原
% %
% % % % % % % % % % % % % % % % % % % % % % 样本外的数据
new_strategy1(i_stragey)=sim_trade12(myoutsamplestrategy(i_stragey),alltime,alldata,sg1,sg2,sg3,sg4,sg5,sg6,sg7,sg8,sum_sg);%%%%%%%这个有问题
% % % % % % % % % % % % % 检验样本外数据的交易
samnewstrategy(i_stragey)=evaluate_strategy(new_strategy1(i_stragey),cost_s,i_i_num3);
end
newss=samnewstrategy’;
[new_strategy,index] =
select_lowest_corr_strategy( newss,select_num);% 从策略中选择出num个相关性最小的策略来;
%现实相关度和资金趋势
distribute_strategy(new_strategy); %按照盈亏比和胜率看各个策略分布情况(剔除过度优化);
mean_profit = combine_strategy(new_strategy);
print(‘-djpeg’,[‘F:\遗传策略 -模式11\遗传策略 -模式\figure\’,num2str(d_i),num2str(d_i),datestr(date,30),’.jpeg’]);
close;
print(‘-djpeg’,[‘F:\遗传策略 -模式11\遗传策略 -模式\figure\’,num2str(d_i),num2str(d_i+1),datestr(date,30),’.jpeg’]);
close;
print(‘-djpeg’,[‘F:\遗传策略 -模式11\遗传策略 -模式\figure\’,num2str(d_i),num2str(d_i+2),datestr(date,30),’.jpeg’]);
close;
pause(0.15);
% % % % % % % % % % % % % % % % % % % % % % 样本外的数据
parfor i_stragey=1:length(new_strategy)
new_strategy(i_stragey) = strategyForRealTrade( new_strategy(i_stragey),i_stragey,1000);%数据清原
new_strategy(i_stragey)=sim_trade12(new_strategy(i_stragey),alltime_s,alldata_s,sg1,sg2,sg3,sg4,sg5,sg6,sg7,sg8,sum_sg);%%%%%%%这个有问题
new_strategy(i_stragey)=evaluate_strategy(new_strategy(i_stragey),cost_s,i_i_num3);
end
distribute_strategy(new_strategy); %按照盈亏比和胜率看各个策略分布情况(剔除过度优化)
mean_profit1 = combine_strategy(new_strategy);
print(‘-djpeg’,[‘F:\遗传策略 -模式11\遗传策略 -模式\figure\’,num2str(d_i),num2str(d_i+3),datestr(date,30),’.jpeg’]);
close;
print(‘-djpeg’,[‘F:\遗传策略 -模式11\遗传策略 -模式\figure\’,num2str(d_i),num2str(d_i+4),datestr(date,30),’.jpeg’]);
close;
print(‘-djpeg’,[‘F:\遗传策略 -模式11\遗传策略 -模式\figure\’,num2str(d_i),num2str(d_i+5),datestr(date,30),’.jpeg’]);
close;
pause(0.15);
%%%%输出策略
for ii_s=1:select_num
% fileoutsim_trade1([‘strategy’,num2str(d_i),num2str(ii_s),’.txt’],new_strategy(ii_s),len,sg,sgin,sgout);
fileoutsim_trade12([‘F:\遗传策略 -模式11\遗传策略 -模式\strategy\’,’strategy12′,num2str(d_i),num2str(ii_s),datestr(date,30),’.txt’],new_strategy(ii_s),len,sg1,sg2,sg3,sg4,sg5,sg6,sg7,sg8);
%输出策略的表现
% // showstrategy(new_strategy(ii_s),cost);
% print(‘-djpeg’,[‘F:\遗传策略 -模式11\遗传策略 -模式\figure\’,num2str(d_i),num2str(d_i+1+ii_s),’.jpeg’]);
end
pause(0.15);
i_s_i=1;
s_randm=strategy;
for i_s=length(s_randm)+1:length(huanseed)
s_randm(i_s)=huanseed(i_s_i);
i_s_i= i_s_i+1;
end
clear(‘dongseed’);
save([‘new_strategy’,num2str(d_i)],’new_strategy’);
clear(‘huanseed’);
clear(‘new_strategy’);
clear(‘samnewstrategy’);
clear(‘new_strategy1’);
clear(‘myoutsamplestrategy’);
clear(‘s’);
close all;
clear(‘data_all’);
clear(‘time_all’);
end
% pause;
%% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %%
% % % %组合策略的平均收益情况
% new_strategy=parent;
% mean_profit = combine_strategy(new_strategy);
% % 评价单个策略
% % 输入参数:单个策略,交易成本;
% % % % % % % % % for i_stragey=1:length(new_strategy)
% % % % % % % % % myoutsamplestrategy(i_stragey) = strategyForRealTrade( new_strategy(i_stragey),i_stragey,1000);%数据清原
% % % % % % % % % % %
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 样本外的数据
% % % % % % % % % new_strategy0(i_stragey)=sim_trade12(myoutsamplestrategy(i_stragey),alltime,alldata,sg,sum_sg);%%%%%%%
% % % % % % % % % new_strategy1(i_stragey)=sim_trade12(myoutsamplestrategy(i_stragey),alltime_s,alldata_s,sg,sum_sg);%%%%%%%
% % % % % % % % % % % % % % % % % % % % % % 检验样本外数据的交易
% % % % % % % % % new_strategy0(i_stragey)=evaluate_strategy(new_strategy0(i_stragey),cost_s,i_i_num3);
% % % % % % % % % new_strategy1(i_stragey)=evaluate_strategy(new_strategy1(i_stragey),cost_s,i_i_num3);
% % % % % % % % % end
% % % % % % % % % newss0=new_strategy0′;
% % % % % % % % % mean_profit10 = combine_strategy(newss0);
% % % % % % % % % mean_profit20 = mycombine_strategy(newss0);
% % % % % % % % %
% % % % % % % % % newss=new_strategy1′;
% % % % % % % % % mean_profit1 = combine_strategy(newss);
% % % % % % % % % mean_profit2 = mycombine_strategy(newss);
% % % % % % % % % clear([‘mean_profit1′,’mean_profit2′,’newss’,’mean_profit10′,’mean_profit20′,’new_strategy1′,’new_strategy0′,’myoutsamplestrategy’])
% mean_profit = combine_strategy(new_strategy);
% % %%准备实盘交易
% % % for ir=1:length(strategy)
% % % real_strategy(ir) = strategyForRealTrade(strategy(ir),’tradeForPP’);
% % % mastrategy(ir)=sim_trade1(real_strategy(ir),alltime,alldata,len);
% % % evaluate_strategy(mastrategy(ir),cost);
% % % end
%
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/68626
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!