zoukankan      html  css  js  c++  java
  • R与金钱游戏:均线黄金交叉2

    上一篇分析已经得知均线黄金交叉原则并不适用于震荡期,那有什么办法可以规避震荡期呢或者说有什么办法可以减少无脑跟的损失?我们继续玩一下。

    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 年的频繁交易
    01
    02

    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%。
    03
    04

    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%。从图中我们也可以看见过滤器过滤了一些震荡期中的交易。
    05
    06

    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)
    }

    作者:Yuki
    本文版权归作者和博客园所有,欢迎转载,转载请标明出处(附上博客链接)。 如果您觉得本篇博文对您有所收获,请点击右下角的 [推荐],谢谢!

    关注我的公众号,不定期更新学习心得
  • 相关阅读:
    (6)STM32使用HAL库实现modbus的简单通讯
    (4)STM32使用HAL库实现串口通讯——理论讲解
    (3)STM32使用HAL库操作外部中断——实战操作
    (2)STM32使用HAL库操作外部中断——理论讲解
    对图片进行压缩、水印、伸缩变换、透明处理、格式转换操作1
    文件压缩、解压工具类。文件压缩格式为zip
    Bean与Map的转换 和 Map与Bean的转换
    正则 身份证的验证
    金钱处理工具类 人民币转换为大写
    正则表达式工具类,验证数据是否符合规范
  • 原文地址:https://www.cnblogs.com/yukiwu/p/12012594.html
Copyright © 2011-2022 走看看