楼主: 治感冒
4934 5

[问答] 如何优化股票最大回撤的代码?以及循环效率?运行速度很慢 [推广有奖]

  • 1关注
  • 1粉丝

博士生

82%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.0036
学术水平
2 点
热心指数
2 点
信用等级
1 点
经验
341 点
帖子
178
精华
0
在线时间
452 小时
注册时间
2007-3-9
最后登录
2020-1-8

楼主
治感冒 发表于 2016-4-5 14:45:02 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
手工写了个最大回撤的计算代码,如下。但是效率很低,请问可以怎么优化下?dataset是输入的数据框,"CLOSE"表示其中的收盘价,这个是最关键的数据列,这个dataset可以包含其他任何数据,没有限制。

span是最大回撤计算的时间跨度。

  1. maxdraw <- function(dataset, span) {
  2.   
  3.   maxdraw <- NULL
  4.   
  5.   n <- dim(dataset)[1]
  6.   
  7.   for (i in 1:(n - span)) {
  8.     temp <- NULL
  9.    
  10.     for (j in i:(i + span)) {
  11.       peak <- max(dataset[seq(i, j, 1), "CLOSE"])
  12.       t <- (peak - dataset[j, "CLOSE"]) / peak
  13.       temp <- c(temp, t)
  14.     }
  15.    
  16.     maxdraw_temp <- max(temp)
  17.     maxdraw <- c(maxdraw, maxdraw_temp)
  18.   }
  19.   
  20.   maxdraw <- data.frame(maxdraw)
  21.   
  22.   return(maxdraw)
  23. }
复制代码
代码运行倒是没啥问题,就是特别慢。估计使用了太多显性for循环的原因吧?


二维码

扫码加我 拉你入群

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

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

关键词:dataset DataS Close Data draw 如何 手工

沙发
cheetahfly 在职认证  发表于 2016-4-5 22:59:20
确实是循环用得太多了,不是R语言的风格。我写了一个:

  1. drawdown <- function(vec, n = 0, # n代表求回撤的范围,若n=0则求全部向量;
  2.                      absolute_return = TRUE) { #absolute_return表示输出的类型是否是绝对值还是百分比,默认为绝对值;
  3.   require(zoo, quietly = TRUE)
  4.   if (n == 0) n <- length(vec)
  5.   maxvalue <- c(cummax(vec[1:(n - 1)]), rollapply(vec, n, max))
  6.   drawdown <- vec - maxvalue
  7.   if(absolute_return)
  8.     return(min(drawdown))
  9.   else return(min(drawdown/maxvalue))
  10. }
复制代码


藤椅
wangfs111222 发表于 2016-4-6 11:26:17
min(cumsum(x)-cummax(x))


另外可以参考perforamanceanalytic包。里面有各种评价指标。

板凳
治感冒 发表于 2016-4-8 09:22:48
cheetahfly 发表于 2016-4-5 22:59
确实是循环用得太多了,不是R语言的风格。我写了一个:
谢谢,你的代码跟我想要的还是不一样,不过提供了很大的启发!我重新修改成以下代码就快很多了,
  1. maxdraw <- function(dataset, span) {
  2.   n <- dim(dataset)[1]
  3.   maxdraw <- rollapply(dataset$close, span, draw)
  4.   start <- dataset[c(1:(n - span +1 )), "time"]
  5.   end <- dataset[c(span:n),"time"]
  6.   maxdraw <- data.frame(start, end, maxdraw)
  7.   return(maxdraw)
  8. }
  9. draw <- function(dataset) {
  10.   draw <- max((cummax(dataset) - dataset)/cummax(dataset))
  11.   return(draw)
  12. }
复制代码

报纸
治感冒 发表于 2016-4-8 09:23:47
wangfs111222 发表于 2016-4-6 11:26
min(cumsum(x)-cummax(x))
谢谢,回头研究下你的包。不过我还是倾向于使用一些基础的包写代码,不然每次为了一个新的计算需求就要研究一个包,我也是很头大。

地板
jmq19950824 发表于 2018-6-3 21:36:39
可用profvis()函数查看代码各部分运行时间

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

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