楼主: playmore
1987 3

请问这种带有方向的距离该如何计算 [推广有奖]

已卖:1645份资源

学科带头人

2%

还不是VIP/贵宾

-

TA的文库  其他...

R相关

经济学相关

金融工程

威望
1
论坛币
16356 个
通用积分
8.6697
学术水平
372 点
热心指数
394 点
信用等级
341 点
经验
15297 点
帖子
1194
精华
1
在线时间
1332 小时
注册时间
2007-1-11
最后登录
2025-12-1

初级学术勋章 初级热心勋章 中级热心勋章

楼主
playmore 发表于 2014-12-24 18:42:45 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我这里想算N支股票在同样一段时间内的收益率的距离
不但要得到距离的远近,还想得到距离的方向,即一支股票如果长期好于另一支股票,则该距离大于0,否则会小于0
想到的方法是用二者每日收益率之差求立方再加总,最后得到的结果再开立方
和求欧氏距离的方法类似,只不过欧氏距离是先平方,再开根号

我在SAS里找到有proc  distance可以计算欧氏距离,其中若method选择POWER(),p和r分别设为3,3的话,和我的要求类似,但是有一点区别,就是这里它先求立方,再取绝对值加总,最后再开立方。这样得到的最终结果是一个对称矩阵,而我要的结果在对称点上的两个数是互为相反数的,即股票A优于股票B,则股票B劣于股票A。

不知道在SAS里还有什么过程可以解决这个问题(我估计proc distance是不行了,它是求距离,我这里是求类似势的东西,有大小,有方向),多谢!

二维码

扫码加我 拉你入群

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

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

关键词:Distance stance Method Power 欧氏距离 如何

本帖被以下文库推荐

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

沙发
yongyitian 发表于 2014-12-25 11:16:31
估计你的数据要比下面的例子复杂。

这是数据步的算法.

  1. data test;
  2.    do i = 1 to 5;
  3.      stockID = cats('A', put(i,1.));     
  4.       return = ceil(ranuni(12345)*100);
  5.    output;
  6.    end; drop i;
  7. run;

  8. data want;
  9.   array ret{5} ; retain ret1-ret5;
  10.   if _n_ = 1 then do;
  11.        i = 1;
  12.      do until (last);
  13.       set test end=last;
  14.        ret[i] = return;
  15.        i+1;
  16.      end;
  17.   end;
  18.    array a{5} a1-a5;
  19.    set test;
  20.       do i = 1 to 5;
  21.         a[i] = return - ret[i];
  22.       end;
  23.    drop i ret1-ret5;
  24. run;
复制代码

如果你以得到的结果是对称矩阵形式的,可以先用 if _n_ = 1; loop 将原始的return值加如到数据步的array中,

然后用循环判断每个结果的符号.


藤椅
playmore 发表于 2014-12-26 08:45:02
yongyitian 发表于 2014-12-25 11:16
估计你的数据要比下面的例子复杂。

这是数据步的算法.
多谢回复,我后来也用了类似的data步的方法,但没有用到array
因为是写在一个大宏里,所以直接在data步里用的%do循环
速度非常慢,后来还是改用IML了
代码贴在下面,供参考
另外如果还有更好的办法,最好可以一个proc解决的,也请赐教,谢谢
  1. proc iml;
  2.         use GED_Res;
  3.         read all into SourceMatrix;
  4. /*        show SourceMatrix;*/
  5.         TargetMatrix=j(&GED_ColNum,&GED_ColNum,.);
  6.         %do i=1 %to &GED_ColNUm;
  7.                 %do j=1 %to &GED_ColNUm;
  8.                         %if %UPCASE(&Abs) EQ YES %then %do;
  9.                                 TargetMatrix[&i,&j]=SUM(ABS((SourceMatrix[,&i]-SourceMatrix[,&j])##&Power));
  10.                         %end;
  11.                         %else %if %UPCASE(&Abs) EQ NO %then %do;
  12.                                 TargetMatrix[&i,&j]=SUM((SourceMatrix[,&i]-SourceMatrix[,&j])##&Power);
  13.                         %end;
  14.                 %end;
  15.         %end;
  16.         create &TargetTable._Matrix from TargetMatrix[colname={&GED_InputVarName}];
  17.         append from TargetMatrix;
  18.         close GED_Res;
  19. quit;
复制代码

板凳
yongyitian 发表于 2014-12-27 08:32:22
playmore 发表于 2014-12-26 08:45
多谢回复,我后来也用了类似的data步的方法,但没有用到array
因为是写在一个大宏里,所以直接在data步里 ...
谢谢分享,proc iml 做矩阵运算确实比数据步有优势,其他的 procedure 就不太清楚了.

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-5 14:52