作者a3236852 (serena)
看板R_Language
标题[问题] 回圈转向量或apply,关於股票macd技术指标
时间Sat Mar 17 09:16:09 2018
[问题类型]:
效能谘询(我想让R 跑更快)
[软体熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
我写了一个function,里面有使用回圈,我有看到人家说在R中使用回圈速度会变慢,
所以我希望能转成向量或apply,但如果有其他能加快这个程式的速度的方法都可以
我不晓得该怎麽改,让程式能跑更快,
在quantmod中有MACD()function跟我要做的事情其实一样
只是开头每日需求指数(Demand Index,DI),DI = (最高价 + 最低价 + 2 ? 收盘价) ?
它使用的是收盘价,我看了MACD的function看不懂,所以就自己看公式一条一条写出来
[程式范例]:
data2.csv档案,我使用google云端
https://drive.google.com/file/d/1ODee0oJyxXuCPNqg0fjv5SErMm1gs87i/view
程式码
https://ideone.com/8SMiD8
我是看以下公式写出来的
参考公式
http://nengfang.blogspot.tw/2014/09/macd-excel.html
http://www.ezchart.com.tw/inds.php?IND=MACD
[环境叙述]:
3.4.1
[关键字]:
回圈,向量,apply
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.44.145.186
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1521249374.A.564.html
※ 编辑: a3236852 (114.44.145.186), 03/17/2018 09:21:39
1F:→ clansoda: 我没实际跑你的code,但我猜是03/17 09:41
2F:→ clansoda: sapply(c((total+1):nrow(data)), function(w) {})03/17 09:41
3F:→ clansoda: {}里面放你要跑的回圈,你合并资料的那边会有问题03/17 09:42
4F:→ clansoda: 可能要写在apply外面再合并,我没实际跑,有问题再说一03/17 09:42
5F:→ clansoda: 下03/17 09:42
我将公式写成sapply(c((total+1):nrow(data)), function(w) {
todayCl <- as.numeric(Dl[w]) #每一天的Dl
nEMA=(nEMA*(fast-1)+todayCl*2)/(fast+1) #nEMA公式
mEMA=(mEMA*(slow-1)+todayCl*2)/(slow+1)#mEMA公式
DIF=nEMA-mEMA
})
发现在todayCl是正确的,但是nEMA第一次是从回圈外面抓 假设外面设为nEMA=1
因为我回圈里面是写nEMA=(nEMA*运算式) 当第一次跑回圈假设为2
我希望他记得mEMA是2,但之後的回圈好像又从外面继续抓nEMA为1做计算
可能是我不够理解sapply function,我用h=1
sapply(1:10,function(w){h=h+1})印出来答案都是2,请问我可以怎麽修改呢,谢谢你!!!
※ 编辑: a3236852 (61.58.76.213), 03/17/2018 12:43:11
※ 编辑: a3236852 (61.58.76.213), 03/17/2018 12:44:32
6F:→ HumuHumu: 依我经验这种要记忆variable的好像不太适合用apply,如03/17 13:53
7F:→ HumuHumu: 果真的有还期望版上其他大大解惑03/17 13:54
8F:→ clansoda: H大的见解比较贴近我写R经验,但是一样可能做到 03/17 14:09
我觉得我问的问题好像太锁定要用apply,但其实我是想能不能让这个程式执行的更快,
所以更改了一点内文,也很谢谢clan大让我更了解sapply的用法!!
※ 编辑: a3236852 (61.58.76.213), 03/17/2018 15:29:10
9F:推 celestialgod: 回圈不一定比apply慢.... 只是能向量化的话会比较好03/17 15:44
10F:→ celestialgod: 可以在板上找preallocation, 我有写到这方面03/17 15:45
11F:→ clansoda: 印象中某一版R有大修过03/17 17:27
12F:→ celestialgod: 楼上说的应该是3.4的R有JIT吧03/17 18:18
13F:→ celestialgod: 但是就算是JIT 还是不如用向量快03/17 18:18
14F:→ clansoda: 没错,实测上向量化真的最快,如果能向量化的话03/17 18:26
15F:→ clansoda: 一定要做向量化的预处理03/17 18:26
16F:→ clansoda: 楼主的这个要实际跑过才有办法了解,时间不多只能请原03/17 18:27
17F:→ clansoda: PO自己研究一下如何向量化了03/17 18:27
好的,我有看了preallocation,受益良多
我会朝向量化处理去查资料,谢谢大家^^
如果有更细致精准的问题再来发问,谢谢!
※ 编辑: a3236852 (61.58.76.213), 03/17/2018 20:41:51
※ 编辑: a3236852 (61.58.76.213), 03/17/2018 20:42:39