從上一篇分析已經得知均線黃金交叉原則并不適用于震蕩期,那有什么辦法可以規避震蕩期呢或者說有什么辦法可以減少無腦跟的損失?我們繼續玩一下,
Required Packages
```r library(quantmod) library(ggplot2) library(scales) ```
Postpone Trading
第一個嘗試的方法是推遲買入時間,
若股價處于震蕩期,那么有可能就是今天漲了明天跌,我們可以在買入信號出現的時候暫時抑制內心買買買的沖動,推遲個3-5天觀察一下股價是否還處于上升期,若是,我們再大膽出手,
######
buy <- which(signals$Signal == 1)
sell <- which(signals$Signal == -1)
for(ii in 1:length(buy)){
tmp <- 0
index <- buy[ii]
signals$Signal[index] <- 0
for(jj in 1:delay_days)
tmp <- tmp + signals$Trade[index + jj]
if(tmp == delay_days)
signals$Signal[index + delay_days] <- 1
else
signals$Signal[sell[ii]] <- 0
}
######
假設我們在買入信號出現的時候推遲 3 天且這 3 天內短期均線依然高于長期均線,則出手買入,那么從 2018-01-01 開始至 2019-11-07(上次分析的截止時間) 至今一共有 22 次交易 (買賣合計),相較于上一篇的分析中少了 8 次交易,本金最后為 92,293.10,虧損 7,706.90,虧損率由 19% 降為 7%,另外從圖中我們也可以看見推遲買入也減少了在 2018 年的頻繁交易


Early Termination
第二個嘗試的方法是提前終止交易,俗稱止損,
我們可以設定止損線,即股價跌破某一個位置的時候無論是否為死亡黃金交叉都選擇賣出,即時止損,
#####
buy <- which(signals$Signal == 1)
sell <- which(signals$Signal == -1)
iteration <- min(length(buy), length(sell))
if(sell_ratio > 0) {
for(ii in 1:iteration){
buy_index <- buy[ii]
sell_index <- sell[ii]
for(jj in buy_index:sell_index){
if(signals$Value[jj]/signals$Value[buy_index] < 1- (sell_ratio - 0.02)) {
signals$Signal[sell_index] <- 0
signals$Signal[jj] <- -1
signals$Trade[jj] <- 0
break
}
}
}
}
#####
假設我們將止損額設為 7%, 即現在比買入價低于 7% 則賣出,那么從 2018-01-01 開始至 2019-11-07(上次分析的截止時間) 至今一共有 30 次交易 (買賣合計),盈利交易一共有 6 次,本金最后為 84,796.95,虧損 15,203.05,虧損率由 19% 降為 15%,


Differentiate
我們都知道均線是延后表達的, 我們沒有辦法 100% 預判此時此刻是不是在震蕩期內,但是通常震蕩期內的均線大部分是趨于平緩的(即斜率接近于零),而趨勢期內的均線是傾斜的,而且越傾斜(斜率越大)上漲的空間也越大,該表現用長期均線判定更為準確,
我們利用均線的斜率過濾一些表現為平緩趨勢的買入點,即只有當買入信號出現且此時的均線斜率大于某值時才買入,否則不做交易,
#####
switch(filter_type,
"NO_FILTER" = print("No Filter!"),
"DIFF_SHORTTERM_GREATER_THAN_POINT_5" = signals <- signals[-c(which(signals$Signal == 1 & signals$Diff_1 < 0.5),
which(signals$Signal == 1 & signals$Diff_1 < 0.5) + 1),]
)
#####
假設我們將買入過濾器設為5日均線的斜率大于 0.5 (傾斜角約為 26.5°), 即買入信號的5日均線的斜率大于 0.5 才真正地買入,那么從 2018-01-01 開始至 2019-11-07(上次分析的截止時間) 至今一共有 20 次交易 (買賣合計),盈利交易一共有 6 次,本金最后為 99,788.09,虧損 211.91,虧損率由 19% 降為 0.02%,從圖中我們也可以看見過濾器過濾了一些震蕩期中的交易,


Questions
這些方法都能在一定程度上讓我們避開在震蕩期交易,但是如果要確切的使用上這些方法,那么具體的數字應該設定為多少才是合適的呢,即針對某一只股票應該推遲多少天買入避開震蕩期呢?或者設定多少的止損線呢?又或者均線的斜率設定為多少作為過濾呢?以后有機會再用一些更先進的方法玩一下,
相關文章:R與金錢游戲:均線黃金交叉1
Code
```r get_signals <- function(data, mas_1=5, mas_2=20, delay_days= 3, sell_ratio = 0.07, filter_type="NO_FILTER") { if(mas_1 == 0) ma_name_1 <- "Value" else ma_name_1 <- paste('MA', mas_1, sep='') ma_name_2 <- paste('MA', mas_2, sep='') ma_data <- data[, c("Value", ma_name_1, ma_name_2)] signals <- data.frame(Index=index(ma_data), coredata(ma_data)) signals$Trade <- ifelse(signals[,c(ma_name_1)] > signals[,c(ma_name_2)], 1, 0) signals <- signals[-c(1:mas_2),] signals$Signal <- c(signals$Trade[1],diff(signals$Trade)) signals$Diff_1 <- c(NA, diff(signals[,c(ma_name_1)])) signals$Diff_2 <- c(NA, diff(signals[,c(ma_name_2)]))
add code block here
signals <- signals[which(signals$Signal != 0),]
if(length(signals$Index) < 1) {
print("No trading signal!")
return (signals)
}
if(nrow(signals)%%2 == 1) {
if(signals$Trade[1] == 1)
signals <- signals[-c(nrow(signals)),]
else
signals <- signals[-c(1),]
}
if(signals$Trade[1] == 0) {
signals <- signals[-c(nrow(signals)),]
signals <- signals[-c(1),]
}
signals <- signals[,-which(names(signals)%in% c(ma_name_1, ma_name_2, "Diff_1", "Diff_2"))]
return (signals)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/1971.html
標籤:R
上一篇:RStudio 不中斷下載依賴包
