不知道博客还能维持多久,反正写是写的不多了,偶尔发点朋友圈点评下新闻就不得了了,最近也花了点时间申请个公众号,反正折腾着好玩。
我在 12 年那篇文章,脚注说我可以提供自己当时使用的代码,后面不断受到各种邮件求代码和数据,不过因为邮箱是 gmail,我半年才会看一次。
我自己是无所谓,其实代码很简单,原理也在这个博客里面一篇文章里面说了,只要稍微懂点技术,自己就可以写出来,花不了多少时间。
我也在这里把核心函数贴出来,算是做个回应:
function curveData=filterP(picName)
% 专心做一个曲线过滤的小程序
% 用这个把数据搞出来,存起来
%clear; 函数,不能用 clear
%curveData 完全应该就是函数曲线的数据
%searchIndex 这个是对应的搜索量数据
%picName 数据图片名称
%indScale 数据图片刻度
% picName=input('name of the stock?','s');
% indScale=input('scale=');
% 因为这是是函数调用,在调用的时候,参数已经赋值进去了,所以不必有这一句了
I = imread(picName,'jpg');
[row,col,c] = size(I);% 理论上有这一句,下面的通用性讲大大增强
% 所以这一句我保留 但其实这里面 row=307 col=475 也为了下面修改容易
P = zeros(row,col);
% 处理成黑白图片,我要深浅颜色没用,但是这里就是图片处理的关键了
% 截取需要的那一段图像 横向上的截取
endcol=470;% 真正有数据的没 col 那么长,数据最后一个点坐标
startcol=6;% 有数据的 横坐标第一个点
endrow=220;% 纵坐标最后一个数据点
startrow=25;% 横坐标最后一个数据点
for i=1:row
for j=1:col
r = I(i,j,1);
g = I(i,j,2);
b = I(i,j,3);
if (r> 200 || g > 200) && b <200 && i<endrow+2 && i> startrow
P(i,j) = 1;% 这里已经把数据区域选定了 25<i<222 是纵向上的截取
else
P(i,j) = 0;
end
end
end
%==========for test
Pic=P;
Pic2=P;% 另外复制一组数据,否则下面对 P 的操作,会导致对自身的修改
% 不是基于前一次的信息操作
%==========end test
%x = 1:col;
y = zeros(1,endcol-startcol+1);% 用于存储横坐标数据 图像坐标系
for j=startcol:endcol % 因为图片尺度在我这里是标定的
col_P = P(:,j);
index = find(col_P == 1);
y(j-startcol+1)=mean(index);% 均值查找
% 这里 mean 熨平了一些极值这也是没有办法的事情, 需要进一步处理
end
y(1)=y(2);% 第一个数读不出来,直接补上去
curveData=endrow - y;% 普通坐标系 基线纵坐标位置
%============= 滤波 ============ 第二段处理,在第一段基础上进行
%==== 主要是依据位置,将不符合要求的点去掉
for i=3:304
for j=150:340 % 重新过滤到 y 尽头截止
temp=P(i-1,j-1)+P(i-1,j)*3+P(i-1,j+1)...
+P(i,j-1)*4+P(i,j)*6+P(i,j+1)*4+...
P(i+1,j-1)+P(i-1,j)*3+P(i+1,j+1)+...
P(i-1,j-2)+P(i,j-2)*3+P(i+1,j-2)+...
P(i-1,j+2)+P(i,j+2)*3+P(i+1,j+2);% 过滤算法的核心,其实就是一个圆
% 和信号强度的概念有点关系
if temp<15
Pic(i,j) = 0;% 找出躁点
end
end
end
%======================================
for i=5:row
for j=7:col % 重新过滤到 y 尽头截止
if Pic(i,j)==0
P(i,j) = 0;% 找出躁点
end
end
end
%================================
for j=startcol:endcol % 因为图片尺度在我这里是标定的
col_P = P(:,j);
index = find(col_P == 1);
y(j-startcol+1)=mean(index);% 均值查找
% 这里 mean 熨平了一些极值这也是没有办法的事情, 需要进一步处理
end
y(1)=y(2);% 第一个数读不出来,直接补上去
% %==============
% % 插值补全缺失点
% x0=1:465;
% y0=y;
% yy=spline(x0,y0,x0);
% %====================
%==== 总是有些数字缺失掉了,这里要补齐他们
% xtemp=6:470;
% for ii=1:465
% if isnan(y(ii))
% xtemp(ii)=NaN;
% end
% end
% xtemp2=6:470;
% ytemp2= spline(xtemp,y,xtemp2);
%=== 尝试有没有不出警告的办法
acty=465-sum(isnan(y));
spl=zeros(2,acty);% 这是为了避免数组重新复制,导致速度不行
tempk=0;
xtemp2=6:470;
for ii=1:465
if isnan(y(ii))==0
tempk=tempk+1;
spl(1,tempk)=xtemp2(ii);
spl(2,tempk)=y(ii);
end
end
ytemp2= spline(spl(1,:),spl(2,:),xtemp2);
% 这个办法插值成功了,并且没有警告
%=======================================
temp=[NaN NaN NaN NaN NaN NaN];% 填充前五个数字
yy=[temp,ytemp2];% 数据移动之后一致
curveData=endrow - yy;% 普通坐标系 基线纵坐标位置
% 效果展示部分
imshow(Pic2,[]);
title(picName);
%==========================================
hold on
plot(yy);
plot(curveData);
但是现在百度已经将和股票有关的搜索屏蔽了,其次有人在淘宝上卖更精确的结果,如果真想做研究,应该想其他方法,早就不需要用我这套东西了