双11临近的我发现自己真的很穷很穷很穷(重要的问题说三遍)……

贫穷催人上进。于是我就寻思着在空闲时间自己捣鼓一下钱生钱的游戏是怎么玩的,毕竟就算注定做韭菜也要做一根有知识有理想的韭菜。

第一个要玩的模型就是股票交易中的均线黄金交叉。

作为一个基础的韭菜一定听说过均线黄金交叉原则,也就是说当短期移动平均线向上突破长期移动平均线,表明趋势见涨,适合买入;相反地如果短期移动平均线向下突破长期移动平均线,表明趋势看跌,适合卖出。

那么这个韭菜们都知道的交易原则是不是真的能帮大家赚钱呢?下面我们以中国平安为例(其实选A股分析还是很尴尬,万一无论如何都不能赚钱呢……)就建模简单地验证一下。

Required Packages


```r
library(quantmod)
library(ggplot2)
library(scales)
```

Get Data


首先利用 quantmod 包下载股价数据。股票的代码可以在[雅虎财经](https://finance.yahoo.com/)查到。

stock_code <- "601318.SS"
start <- as.Date("2018-01-01")
end <- as.Date("2020-01-01")
stock <- getSymbols(stock_code, from=start, auto.assign=FALSE)
names(stock) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted")
stock <- stock[paste(start, end, sep='/')]$Close

Calculate Moving Average


移动平均数通常可分为简单移动平均数 (SMA),加权移动平均数 (WMA) 和指数移动平均数 (EMA)。

通常我们会选用指数移动平均数。因为移动平均数在一定程度上都会落后于股价的实时趋势,而指数移动平均数在计算时越新的数据加权比重越大,能更快地反映股价的变化。

ma <- function(data, mas=c(5, 20, 60)) {
ma_data <- data
for(m in mas) {
ma_data <- merge(ma_data, EMA(data, m))
}
ma_data <- na.locf(ma_data, fromLast = TRUE)
names(ma_data) <- c('Value', paste('MA', mas, sep=''))
return(ma_data)
}

我们可以将计算结果画成图形:

Get Trading Signals


以 5 日和 20 日均线为例,我们可以按照均线黄金交叉原则找到买卖交易点,即某一天的 5 日移动平均数大于 20 日移动平均数时为买入,反之某一天的 5 日移动平均数小于 20 日移动平均数时为卖出。

我们可以将数据分组。当 5 日均线大于 20 日均线时为 “buy”; 当 5 日均线小于 20 日均线时为 “sell”。 其中 “buy” 和 “sell” 是以不定数量间隔出现的,那么每一段中第一个 “buy” 出现的时候为买入, 第一个 “sell” 出现的时候为卖出。在模拟交易的时候为了方便计算利润,我们将买入设为第一次交易,卖出设为最后一次交易。

如果我们一直依照均线黄金交叉原则,那么从 2018-01-01 开始至今一共有 30 次交易 (买卖合计)。

get_signals<- function(data, mas_1=5, mas_2=20) {
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)] #please calculate ma value before and get a dataframe like the section above
down_data <- ma_data[which(ma_data[, c(ma_name_1)] > ma_data[, c(ma_name_2)]), c("Value")]
up_data <- ma_data[which(ma_data[, c(ma_name_1)] < ma_data[, c(ma_name_2)]), c("Value")]
result <- merge(down_data, up_data)
names(result) <- c("buy", "sell")
result <- fortify(result, melt=TRUE)
result<- result[-which(is.na(result$Value)),]
signals <- result[order(result$Index),]
signals$Signal <- ifelse(signals$Series == "buy", 1, 0)
signals$Signal <- c(ifelse(signals$Series[1] == "buy", 1, -1),diff(signals$Signal))
signals <- signals[which(signals$Signal != 0),]
#delete odd rows
if(nrow(signals)%%2 == 1) {
if(signals$Series[1] == "buy")
signals <- signals[-c(nrow(signals)),]
else
signals <- signals[-c(1),]
}
if(signals$Series[1] == "sell") {
signals <- signals[-c(nrow(signals)),]
signals <- signals[-c(1),]
}
return (signals)
}

Mock Trading


上面我们已经找出交易点,但其实我们找出这些可能的历史交易点目的就是为了知道如果严格按照这些交易点进行交易能不能赚钱呀?

下面我们可以模拟一下交易的过程:

假设我们有 100,000 本金,全仓进入,交易费率为 0.3%

mock_trading <- function(signals, capital=100000, position=1, fee=0.003){
amount <- 0
cash <- capital * position
ticks <- data.frame() for(ii in 1:nrow(signals)){
row <- signals[ii,]
if(row$Series == "buy") {
amount <- floor((cash/(1+fee))/row$Value)
amount <- (amount%/%100)*100
cash <- cash - amount * row$Value - (amount * row$Value) * fee
}
if(row$Series == "sell") {
cash <- cash + amount * row$Value - (amount * row$Value) * fee
amount <- 0
}
row$cash <- cash
row$amount <- amount
row$asset<- cash + amount * row$Value
row$fee <- (amount * row$Value) * fee
ticks<-rbind(ticks, row)
}
ticks$diff <- c(0, diff(ticks$asset)) rise <- ticks[c(which(ticks$diff > 0)-1, which(ticks$diff > 0)),]
rise <- rise[order(rise$Index),]
fall <- ticks[c(which(ticks$Series=="sell" & ticks$diff < 0)-1, which(ticks$Series=="sell" & ticks$diff < 0)),]
fall <- rise[order(fall$Index),] return(list(
ticks = ticks,
rise = rise,
fall = fall
))
}

如果严格按照均线黄金交叉原则,那么经过2年的股海沉浮之后,最后我们的本金只有 80,688.14,亏损 19,311.89, 而赚钱的交易只有6次 (买卖合计)。

我们将资产和股价曲线画成图形对比可以看出我们在前期的交易中是亏损很多的。一方面是股价走势确实是跌跌不休 (经历了 2018 年的韭菜们都知道),那还有没有交易选择错误的原因呢?

我们将盈利和亏损的交易分别画出来,就可以看出亏损的交易多在股价尚未形成趋势还在震荡,如 2018-08,以及 2018-10-2018-11 期间。所以从数据上来看,均线黄金交叉原则只能对股价已形成趋势的股票起指导作用。

不过我们也可以乐观地认为,只要我们能够避开震荡期,那么均线黄金交叉原则还是能够帮助我们小小赚一笔的。可是今日不知明日事,一个有知识有理想的韭菜单凭肉眼是很难看出某一个交叉点是否就在趋势上。

我们又可以引入什么指标来避开震荡期呢?后面会继续探讨一下的。

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

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

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

  2. R与金钱游戏:美股与ARIMA模型预测

    似乎突如其来,似乎合情合理,我们和巴菲特老先生一起亲见了一次,又一次,双一次,叒一次的美股熔断.身处历史的洪流,渺小的我们会不禁发问:那以后呢?还会有叕一次吗?于是就有了这篇记录:利用ARIMA模型来 ...

  3. [libgdx游戏开发教程]使用Libgdx进行游戏开发(3)-给游戏添加一些控制功能

    每个游戏中都有一些只有程序员自己才知道的控制功能,比如增加金钱,满血复活,无视防御,不死等等. 都是为了方便自己调试而在测试阶段使用的功能. 正如上一章提到的:我们也需要加些只有程序员才知道的控制功能 ...

  4. FC红白机游戏列表(维基百科)

    1055个fc游戏列表 日文名 中文译名 英文版名 发行日期 发行商 ドンキーコング 大金刚 Donkey Kong 1983年7月15日 任天堂 ドンキーコングJR. 大金刚Jr. Donkey K ...

  5. WeQuant交易策略—简单均线

    简单双均线策略(Simple Moving Average) 策略介绍简单双均线策略,通过一短一长(一快一慢)两个回看时间窗口收盘价的简单移动平均绘制两条均线,利用均线的交叉来跟踪价格的趋势.这里说的 ...

  6. Unity游戏开发图片纹理压缩方案

    Unity3D引擎对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式. 在Texture2D的设置选项中,你可以针对不同的平台,设 ...

  7. [libgdx游戏开发教程]使用Libgdx进行游戏开发(2)-游戏框架搭建

    让我们抛开理论开始code吧. 入口类CanyonBunnyMain的代码: package com.packtpub.libgdx.canyonbunny; import com.badlogic. ...

  8. 如何看K线图基础知识

    在日K线图中一般白线.黄线.紫线.绿线依次分别表示:5.10.20.60日移动平均线,但这并不是固定的,会根据设置的不同而不同,比如你也可以在系统里把它们设为5.15.30.60均线. 你看K线图的上 ...

  9. 趋势型指标——MACD

    1.简要介绍▪ 计算方法▪ DIFF▪ DEA▪ MACD▪ 构造原理▪ 缺点2.实战技巧3.运用技巧▪ 应用原理▪ 经典用法▪ 实战战法▪ 捕捉卖点▪ 买卖策略▪ 短线实战4.组合指标运用5.一般研 ...

随机推荐

  1. JPA技术之EntityManager使用方法

    Session bean or MD bean对Entity bean的操作(包括所有的query, insert, update, delete操作)都是通过EntityManager实例来完成的. ...

  2. Linux中用postfix搭建邮件服务器实战详解

    Linux中用postfix搭建邮件服务器实战详解 postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.Postfix试图更快.更容易管理.更安全,同时 ...

  3. SAP MM Purchase Order History Category

    SAP MM Purchase Order History Category 1) ,These are different categories of PO history which is con ...

  4. 信号量(Posix)

    Posix信号量分为有名信号量和无名信号量 1. Posix有名信号量 有名信号量既可以用于线程间的同步也可以用于进程间的同步 sem都是创建在/dev/shm目录下,名字格式sem.xxx,只需要指 ...

  5. vue学习指南:第三篇(详细) - vue的生命周期

    今天小编给大家详细讲解一下 vue 的生命周期.希望大家多多指教,哪里有遗漏的地方,也请大家指点出来 谢谢. 一. 怎么理解 Vue 的生命周期的? 生命周期:从无到有,到到无的一个过程.Vue的生命 ...

  6. ucoreOS_lab1 实验报告

    由于我个人不太懂 AT&T 语法,在完成实验的过程中遇到了相当大的阻碍,甚至有点怀疑人生,我是否心太大了,妄想在短时间内学懂大清的课程.ucoreOS_lab1 这个实验前前后后做到了现在才勉 ...

  7. 澄清Fundebug录屏技术的几点误会

    1. "视频"并非真的视频.也不是通过连续播放大量截图来实现 首先请大家观看这个视频: 视频中,当鼠标点击"场景重现",会立即播放一段"视频" ...

  8. MarkdownPad 2破解

    MarkdownPad 2 是一款较不错的Markdown编辑器,可快速将文本转换为美观的HTML/XHTML的网页格式代码,且操作方便,用户可以通过键盘快捷键和工具栏按钮来使用或者移除Markdow ...

  9. Linux IO 概念(2)【转】

    转自:https://www.cnblogs.com/qq289736032/p/9188455.html 在上一篇IO底层的概念中杂合了很多模糊的概念,受知识水平的限制,只是从网上抄了很多过来.从l ...

  10. 【软件工程1916|W(福州大学)_助教博客】2019年上学期期末问卷调查结果公示

    1.调查问卷概况 福州大学2019W班,收集到有效答卷44份 2. 调查问卷情况 Q1:请问你平均每周在课程上花费多少小时? 去除自估水平超过40小时的,平均16.6H Q2.软工实践的各次作业分别花 ...