R与金钱游戏:均线黄金交叉2

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

Required Packages


library(quantmod)
library(ggplot2)
library(scales)

Postpone Trading



第一个尝试的方法是推迟买入时间。

若股价处于震荡期,那么有可能就是今天涨了明天跌。我们可以在买入信号出现的时候暂时抑制内心买买买的冲动,推迟个3-5天观察一下股价是否还处于上升期。若是,我们再大胆出手。

get_signals <- function(data, mas_1=5, mas_2=20, delay_days= 3) {
  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)]))
  ######
  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
  }
  ######
  signals <- signals[which(signals$Signal != 0),]

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

假设我们在买入信号出现的时候推迟 3 天且这 3 天内短期均线依然高于长期均线,则出手买入。那么从 2018-01-01 开始至 2019-11-07(上次分析的截止时间) 至今一共有 22 次交易 (买卖合计),相较于上一篇的分析中少了 8 次交易。本金最后为 92,293.10,亏损 7,706.90。亏损率由 19% 降为 7%。另外从图中我们也可以看见推迟买入也减少了在 2018 年的频繁交易

Early Termination



第二个尝试的方法是提前终止交易,俗称止损。

我们可以设置止损线,即股价跌破某一个位置的时候无论是否为死亡黄金交叉都选择卖出,即时止损。

get_signals <- function(data, mas_1=5, mas_2=20, sell_ratio = 0.05) {
  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)]))
  #####
  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 | 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
        }
      }
    }
  }
  #####
  signals <- signals[which(signals$Signal != 0),]

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

假设我们将止损额设为 7%, 即现在比买入价低于 7% 则卖出。那么从 2018-01-01 开始至 2019-11-07(上次分析的截止时间) 至今一共有 30 次交易 (买卖合计),盈利交易一共有 6 次。本金最后为 84,796.95,亏损 15,203.05。亏损率由 19% 降为 15%。

Differentiate



我们都知道均线是延后表达的, 我们没有办法 100% 预判此时此刻是不是在震荡期内。但是通常震荡期内的均线大部分是趋于平缓的(即斜率接近于零),而趋势期内的均线是倾斜的,而且越倾斜(斜率越大)上涨的空间也越大。该表现用长期均线判定更为准确。

我们利用均线的斜率过滤一些表现为平缓趋势的买入点,即只有当买入信号出现且此时的均线斜率大于某值时才买入,否则不做交易。

get_signals <- function(data, mas_1=5, mas_2=20, filter_type=0) {
  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)]))
  signals <- signals[which(signals$Signal != 0),]

  #####
  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),]
  )
  #####

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

假设我们将买入过滤器设为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

原文地址:https://www.cnblogs.com/yukiwu/p/12012594.html

时间: 2024-10-15 05:26:27

R与金钱游戏:均线黄金交叉2的相关文章

结对编程:黄金点游戏

一.游戏内容 黄金点游戏是一个数字小游戏,其游戏规则是: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值.提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分.玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动. 二.程序实现功能 每次输入N个数字,计算出平均值和G点,输入数字最靠近G的同学得N分,离G最远的同学得到-2分

结对编程:黄金点小游戏

一.游戏要求 黄金点游戏是一个数字小游戏,其游戏规则是: N个同学(N通常大于10),每人写一个0-100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值.提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分.玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动. 现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下: 1.本作业属于结对编程项目,必须由二

结对编程——黄金点小游戏的设计与实现

个人感想 最近总是很纠结,关于如何平衡考研时间和学校课程时间,还有关于考研资料的选择.就是在这样一种状态下,我迎来了结对编程项目,两个人共同编程完成一个小游戏,说实话,刚开始时我对这个项目不怎么感兴趣,我总觉得应该把时间都放在考研上.还有一个原因就是,我觉得自己什么都不会,肯定会拖累队友,但是经过我们多次沟通后,我发现这个小游戏没有我想象中的那么难,而且我逐渐有点兴趣了,再加上和队友的多次沟通,我觉得结对编程是一件很有意思的事,两个人提出不同的想法然后讨论,再接着看着自己的想法都能慢慢的实现出来

10日均线--操盘线

一.10日均线的要义1.10日均线是短期均线,是短线的生命线,是波段操作的重要参考指标.2.在上升趋势中,10日均线是有力的支撑线.3.在下跌行情中,10日均线是重要的阻力线.4.股价在高位跌破10日均线,开始拐头向下,是行情变坏的标志(短线波段或有可能是中线).5.股价在低位上穿10日均线,开始拐头向上,是行情变好的标志(短线波段或有可能是中线). 二.10日均线是多空双方力量强弱或强弱市场的分界线1.当多方力量强于空方力量时,市场属于强势,股价就在10日均线之上运行,说明有更多的人愿意以高于

2014智能电视游戏峰会顺利召开,开启行业破冰序幕

由专业游戏引擎技术服务商橙子引擎(OGEngine)主办的2014智能电视游戏峰会于11月29日在深圳南山科技园召开.这次是智能电视游戏未来发展的行业盛会,是加速智能电视游戏发展的蓝海破冰之旅.本次会议业内巨头云集,精英汇聚,从引擎技术到电视游戏分发,共探讨电视游戏的发展.对于智能电视游戏,这个被认为手游市场饱和后的另一个蓝海,大家都在翘首以盼一个全新的游戏载体,一个全新的生态和商业机会. 那么本次会议又将有哪些看点呢?笔者现在就带大家一起来回顾一下. 亮点一:广受业界期待,会议报名火爆 自24

每日一招:黄金做单时间

每日一招:黄金做单时间 字体: 大 小 换肤: 收藏 2015-06-09 11:00:03 尾盘作为一天交易的总结,半小时中的交易往往是全天交易最集中也是多空较量最激烈的一段,是多空双方的争夺之时,会直接影响次日盘面走势,对次日开盘有直接的指示作用. 尾盘在时间上一般认为是最后15分钟,实际上从最后45分钟多空双方就已经开始暗暗较量了.若从最后45分钟到35分钟这段时间上涨,则最后的走势一般会以上涨结束全天走势.因为此时参与交易的投资者最多,当涨势明确时会有层出不穷的买盘涌进推高股指. 反之,

JAVA安卓植物大战僵尸主题四子棋游戏

@前言 这里使用安卓最基本的API实现双人四子棋游戏(无AI),开发语言为java,开发环境为Android Studio 2.1.2,目标SDK版本为24,最低为15: 界面采用植物大战僵尸主题,图片资源来源于网络,进行了PS加工,非原创: 游戏界面基本可以适配所有安卓手机分辨率,不过在分辨率太大或太小的手机上整体效果会有影响: Github源码: https://github.com/jiangxh1992/FourInRowGame 视频演示: https://vimeo.com/1875

3D塔防游戏实现 4.2 3D怪物连续刷新(Feekood语言)

(Feekood语言介绍与习) http://www.wooyoogame.com/doc/index(学习) http://www.wooyoogame.com(首页) http://www.feekood.com/ (开发页面) ---------- 该阶段同样用到http://www.wooyoogame.com资源: http://www.wooyoogame.com/resource/5399 (3D蝎子 ) http://www.wooyoogame.com/resource/507

结构体、枚举类型及其练习题,最后的对战游戏(基础版)

结构体:在内存中临时存储数据的方式1.变量.常量2.数组,可以存储固定长度统一类型的数据3.集合4.结构体 学生信息:姓名,性别,年龄,系别 结构体含义:就是将生活中的一些个体,封装成一个特殊的类型 结构体是:用户自定义数据类型 创建:创建的位置:main函数之外struct Student{ public int Code; public string Name; public string Sex; public int Old; public DateTime Birthday;} 定义: