[問題] 迴圈轉向量或apply,關於股票macd技術指標

看板R_Language作者 (serena)時間6年前 (2018/03/17 09:16), 6年前編輯推噓1(1016)
留言17則, 3人參與, 6年前最新討論串1/2 (看更多)
[問題類型]: 效能諮詢(我想讓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://www.ptt.cc/bbs/R_Language/M.1521249374.A.564.html ※ 編輯: a3236852 (114.44.145.186), 03/17/2018 09:21:39

03/17 09:41, 6年前 , 1F
我沒實際跑你的code,但我猜是
03/17 09:41, 1F

03/17 09:41, 6年前 , 2F
sapply(c((total+1):nrow(data)), function(w) {})
03/17 09:41, 2F

03/17 09:42, 6年前 , 3F
{}裡面放你要跑的迴圈,你合併資料的那邊會有問題
03/17 09:42, 3F

03/17 09:42, 6年前 , 4F
可能要寫在apply外面再合併,我沒實際跑,有問題再說一
03/17 09:42, 4F

03/17 09:42, 6年前 , 5F
03/17 09:42, 5F
我將公式寫成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

03/17 13:53, 6年前 , 6F
依我經驗這種要記憶variable的好像不太適合用apply,如
03/17 13:53, 6F

03/17 13:54, 6年前 , 7F
果真的有還期望版上其他大大解惑
03/17 13:54, 7F

03/17 14:09, 6年前 , 8F
H大的見解比較貼近我寫R經驗,但是一樣可能做到
03/17 14:09, 8F
我覺得我問的問題好像太鎖定要用apply,但其實我是想能不能讓這個程式執行的更快, 所以更改了一點內文,也很謝謝clan大讓我更了解sapply的用法!! ※ 編輯: a3236852 (61.58.76.213), 03/17/2018 15:29:10

03/17 15:44, 6年前 , 9F
迴圈不一定比apply慢.... 只是能向量化的話會比較好
03/17 15:44, 9F

03/17 15:45, 6年前 , 10F
可以在板上找preallocation, 我有寫到這方面
03/17 15:45, 10F

03/17 17:27, 6年前 , 11F
印象中某一版R有大修過
03/17 17:27, 11F

03/17 18:18, 6年前 , 12F
樓上說的應該是3.4的R有JIT吧
03/17 18:18, 12F

03/17 18:18, 6年前 , 13F
但是就算是JIT 還是不如用向量快
03/17 18:18, 13F

03/17 18:26, 6年前 , 14F
沒錯,實測上向量化真的最快,如果能向量化的話
03/17 18:26, 14F

03/17 18:26, 6年前 , 15F
一定要做向量化的預處理
03/17 18:26, 15F

03/17 18:27, 6年前 , 16F
樓主的這個要實際跑過才有辦法了解,時間不多只能請原
03/17 18:27, 16F

03/17 18:27, 6年前 , 17F
PO自己研究一下如何向量化了
03/17 18:27, 17F
好的,我有看了preallocation,受益良多 我會朝向量化處理去查資料,謝謝大家^^ 如果有更細緻精準的問題再來發問,謝謝! ※ 編輯: a3236852 (61.58.76.213), 03/17/2018 20:41:51 ※ 編輯: a3236852 (61.58.76.213), 03/17/2018 20:42:39
文章代碼(AID): #1Qh6nULa (R_Language)
文章代碼(AID): #1Qh6nULa (R_Language)