数模实操演示|投影寻踪法评价十支最值得购买的股票

前言

        本文展示实际操作的代码和效果,不作数学推导哦~本文用到的源码和数据都会给出,小伙伴们有需要自行领取。网上有许许多多使用遗传算法优化,我的观点是根本跑不出来,为了保证迭代的效果,迭代次数较多,模拟退火跑出来的时间都非常长,更别说在实际建模过程中的数据量和遗传的复杂度了。不过建模用遗传,结果用退火跑,也是可以的(狡猾)。

        本文一共四个步骤进行求解:

        建立无监督评价指标。这是因为附录只给出收盘价,只用这一指标进行求解太过单调,参考价值过低。

        数据和代码见百度网盘:

        链接:https://pan.baidu.com/s/1p9uSNuDBFubvTNfI03PC_g?pwd=hvaz 

        提取码:hvaz


目录

前言

题目

Step 1.  建立无监督评价指标

最大回辙率(极小型):

收盘价稳定度(极小型):

平均日收益率(极大型):

Step2. 数据预处理 

Step3. 投影寻踪

Step4. 模拟退火

Step5 .结果展示

最优投影值:

最值得购买的十支股票:

灵敏度分析:

Step6 .完整源码


题目

        已有50支股票135天内的收盘价,请评价出十支最值得购买的股票。

8ef361f3006440f5833edd3c955a52d9.png

图1 股票收盘价数据(局部) 

Step 1.  建立无监督评价指标

最大回辙率(极小型):

a48eb9fec7414611a5379470eb219817.png

drawdown0=zeros(n-1,m);%回辙率初始化
drawdown=zeros(1,m);% 最大回辙率初始化
for j=1:m
    for i=1:n-1
        drawnow0(i,j)=(close_price(i,j)-close_price(i+1,j))/close_price(i,j);
    end
end
drawdown=max(drawnow0);

图2 最大回辙率代码 

收盘价稳定度(极小型):

0f61de3b53a54d2fa25c6c97c5ec7111.png

stability=zeros(1,m);% 收盘价稳定度初始化
for j=1:m
        stability(j)=((max(close_price(:,j))-min(close_price(:,j)))/max(close_price(:,j))+min(close_price(:,j)))*std(close_price(:,j));
end

图3 收盘价稳定度代码 

平均日收益率(极大型):

000f4d4ceba54be68610670ab8bffd71.png

dailyrate0=zeros(n,m);% 日收益率初始化
for j=1:m
    for i=1:n-1
        dailyrate0(i,j)=(close_price(i+1,j)-close_price(i,j))/close_price(i,j);
    end
end
dailyrate=sum(dailyrate0)/n;

% 整理成一个表格
indicators(:,1)=drawdown';
indicators(:,2)=stability';
indicators(:,3)=dailyrate';

图4 平均日收益率代码 

d2464743c02c42b5bad3811638af8d29.png

Step2. 数据预处理 

对两个极小型指标进行正向化:d1d412d89d8946418ed1b30d5447c4b2.png

[n1,m1]=size(indicators);
for j=1:m1-1
    indicators(:,j)=max(indicators(:,j))-indicators(:,j);% 对两个极小型指标进行正向化
end

图5 正向化代码 

 然后对三个评价指标进行归一化:

24786ca7308f4928ad5b642b7fc7b3e2.png

normal_indicators=zeros(50,3);% 归一化矩阵初始化
for j=1:m1
    for i=1:n1
        normal_indicators(i,j)=(indicators(i,j)-0.02*min(indicators(:,j)))/(0.98*max(indicators(:,j))-0.02*min(indicators(:,j)));
    end
end

图6 归一化代码 

Step3. 投影寻踪

n为股票数,值为50,m为指标数,值为3。

计算各支股票的一维线性投影:

82bca150ccbc4bedab6fa8ad55c17acb.png

 定义投影寻踪的目标函数为:

0e2bb853600b4700a0d9d85dffa31b95.png

其中Sa为一维线性投影的标准差:

eeecb503de2c4bc3aabd9f084bfc90c5.png

 定义一维线性投影之间的距离:

bfed75b3acbf4d7ab47d667615fad185.png

定义阶跃函数:

f797ab86154d411c83f5f1fae1f0c831.png

因此投影寻踪优化模型如下:

314c017cdec14edb81bb6adc8a13e1df.png

function Qa=LinearPr(X,a)
% 计算线性投影
[n,m]=size(X);
for i=1:n
    sum1=0;
    for j=1:m
        sum1=sum1+a(j)*X(i,j);
    end
    Z(i)=sum1;
end
Sa=std(Z);% 线性投影值的方差 类间距离
R=0.1*Sa;% 领域半径
% 计算局部密度
Da=0;% 类内密度
for i=1:n
    for j=1:n
        r=abs(Z(i)-Z(j));% 线性投影间距
        t=R-r;% 阶跃信号
        if t<0
            u=0;
        else
            u=1;
        end
        Da=Da+t*u;
    end
end
Qa=Sa*Da;% 目标函数
end

图7 投影寻踪线性函数代码 

Step4. 模拟退火

 外层循环迭代次数:100次

初始温度:temper=1000

内层循环迭代次数:iter=10

退火速率:0.999

退火终止温度:0.0001

灵敏度分析:用一个sensitivity数组去记录每次内层循环迭代出来的最优目标函数值,在退火过程结束后绘制出sensitivity的折线图,观察其是否收敛,若收敛则可以说明模拟退火求解的结果有效。

% 模拟退火优化投影寻踪
% sensitivity=[];% 灵敏度分析矩阵
for i=1:100
    sensitivity=[];% 灵敏度分析矩阵
    temper=1000;% 初始温度
    iter=10;% 迭代次数
    temp=rand(1,3);% 生成一个线性投影初始解
    templinear=temp;% 存储最优线性投影
    Qa=LinearPr(normal_indicators,temp);% 生成初始目标函数值
    sensitivity =[Qa];
    while temper>0.0001% 退火
        for j=1:iter
            temp1=rand(1,3);
            Qa1=LinearPr(normal_indicators,temp1);
            if Qa1>Qa
                Qa=Qa1;
                templinear=temp1;
            else
                if exp((Qa1-Qa)/temper)>rand()
                    Qa=Qa1;
                    templinear=temp1;
                    sensitivity = [sensitivity, Qa];
                end
            end
            sensitivity = [sensitivity, Qa];
        end
        temper=temper*0.999;
        TempLinear(i,:)=templinear;% 存储各样本的线性投影值
    end
%     plot(sensitivity)
    Y(i)=Qa;
    i
end
plot(sensitivity)% 绘制灵敏度分析图
target=TempLinear(find(max(Y)==Y),:)% 先找出最大的评价值,然后在从投影向量矩阵TempLinear中寻找该向量
score=sum(normal_indicators.*target,2);

图8 模拟退火代码 

Step5 .结果展示

最优投影值:

e14f54b1586c484e816b74083fa3cd1f.png

 图9 最优投影向量 

最值得购买的十支股票:

14ab98d0f773432fbd391bae64a77415.png

图10 最优股票

灵敏度分析:

        可以看出目标函数值在经过狠多次迭代之后已经收敛了,本文认为模拟退火有效。因为时间的关系,我的迭代次数没有设置那么多,大家可以试试迭代更久。

57d49f4d4c604604901490d1ccbd2556.png

 图11 灵敏度分析 

Step6 .完整源码

clear;clc
tic
close_price=xlsread("50支股票的收盘价.xlsx");
[n,m]=size(close_price);
close_price=close_price([2:136],:);

% 建立无监督评价指标
drawdown0=zeros(n-1,m);%回辙率初始化
drawdown=zeros(1,m);% 最大回辙率初始化
for j=1:m
    for i=1:n-1
        drawnow0(i,j)=(close_price(i,j)-close_price(i+1,j))/close_price(i,j);
    end
end
drawdown=max(drawnow0);

stability=zeros(1,m);% 收盘价稳定度初始化
for j=1:m
        stability(j)=((max(close_price(:,j))-min(close_price(:,j)))/max(close_price(:,j))+min(close_price(:,j)))*std(close_price(:,j));
end

dailyrate0=zeros(n,m);% 日收益率初始化
for j=1:m
    for i=1:n-1
        dailyrate0(i,j)=(close_price(i+1,j)-close_price(i,j))/close_price(i,j);
    end
end
dailyrate=sum(dailyrate0)/n;

% 整理成一个表格
indicators(:,1)=drawdown';
indicators(:,2)=stability';
indicators(:,3)=dailyrate';

% 数据预处理
[n1,m1]=size(indicators);
for j=1:m1-1
    indicators(:,j)=max(indicators(:,j))-indicators(:,j);% 对两个极小型指标进行正向化
end
normal_indicators=zeros(50,3);% 归一化矩阵初始化
for j=1:m1
    for i=1:n1
        normal_indicators(i,j)=(indicators(i,j)-0.02*min(indicators(:,j)))/(0.98*max(indicators(:,j))-0.02*min(indicators(:,j)));
    end
end

% 模拟退火优化投影寻踪
% sensitivity=[];% 灵敏度分析矩阵
for i=1:100
    sensitivity=[];% 灵敏度分析矩阵
    temper=1000;% 初始温度
    iter=10;% 迭代次数
    temp=rand(1,3);% 生成一个线性投影初始解
    templinear=temp;% 存储最优线性投影
    Qa=LinearPr(normal_indicators,temp);% 生成初始目标函数值
    sensitivity =[Qa];
    while temper>0.0001% 退火
        for j=1:iter
            temp1=rand(1,3);
            Qa1=LinearPr(normal_indicators,temp1);
            if Qa1>Qa
                Qa=Qa1;
                templinear=temp1;
            else
                if exp((Qa1-Qa)/temper)>rand()
                    Qa=Qa1;
                    templinear=temp1;
                    sensitivity = [sensitivity, Qa];
                end
            end
            sensitivity = [sensitivity, Qa];
        end
        temper=temper*0.999;
        TempLinear(i,:)=templinear;% 存储各样本的线性投影值
    end
    Y(i)=Qa;
    i
end
plot(sensitivity)% 绘制灵敏度分析图
target=TempLinear(find(max(Y)==Y),:)% 先找出最大的评价值,然后在从投影向量矩阵TempLinear中寻找该向量
score=sum(normal_indicators.*target,2);
toc

function Qa=LinearPr(X,a)
% 计算线性投影
[n,m]=size(X);
for i=1:n
    sum1=0;
    for j=1:m
        sum1=sum1+a(j)*X(i,j);
    end
    Z(i)=sum1;
end
Sa=std(Z);% 线性投影值的方差 类间距离
R=0.1*Sa;% 领域半径
% 计算局部密度
sum2=0;
for i=1:n
    for j=1:n
        r=abs(Z(i)-Z(j));% 线性投影间距
        t=R-r;% 阶跃信号
        if t<0
            u=0;
        else
            u=1;
        end
        sum2=sum2+t*u;
    end
end
da=sum2;% 类内密度
Qa=Sa*da;% 目标函数
end

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一份基于寻踪投影评价的 MATLAB 代码,希望能对你有所帮助: ```matlab function [s, g, f] = trace_projection_evaluation(I, R, T, P) % I: image to be evaluated % R: reference image % T: translation vector (x, y) for aligning I with R % P: projection vector (theta) for aligning I with R % s: similarity score % g: gradient of similarity score % f: transformed image % convert I and R to double precision grayscale images I = im2double(rgb2gray(I)); R = im2double(rgb2gray(R)); % rotate and translate I using P and T Tform = affine2d([cosd(P) -sind(P) 0; sind(P) cosd(P) 0; T(1) T(2) 1]); I = imwarp(I, Tform, 'OutputView', imref2d(size(R))); % calculate similarity score s s = sum(sum(I .* R)) / sqrt(sum(sum(I .^ 2)) * sum(sum(R .^ 2))); % calculate gradient of similarity score g g = zeros(2, 1); for i = 1:2 % calculate gradient of I in direction i if i == 1 [dx, dy] = gradient(I); else [dy, dx] = gradient(I); end % rotate and translate gradient of I using P and T dx = imwarp(dx, Tform, 'OutputView', imref2d(size(R))); dy = imwarp(dy, Tform, 'OutputView', imref2d(size(R))); % calculate gradient of similarity score in direction i g(i) = 2 * sum(sum((dx .* R + I .* dy) .* R)) / sqrt(sum(sum(I .^ 2)) * sum(sum(R .^ 2))); end % calculate transformed image f f = imwarp(I, Tform, 'OutputView', imref2d(size(R))); end ``` 该代码实现了寻踪投影评价的三个步骤:旋转和平移,计算相似度得分和梯度。输入参数包括待评估的图像 I、参考图像 R、平移向量 T 和旋转角度 P。输出结果包括相似度得分 s、相似度得分的梯度 g 和变换后的图像 f。 注意:该代码仅供参考,具体实现应根据具体需求进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值