双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. Java自学-集合框架 LinkedList

    Java集合框架 LinkedList 序列分先进先出FIFO,先进后出FILO FIFO在Java中又叫Queue 队列 FILO在Java中又叫Stack 栈 示例 1 : LinkedList ...

  2. java中设置session过期时间

    Web容器 apache-tomcat-8.0.26\conf\web.xml中设置 <session-config> <!-- 时间单位为分钟 --> <session ...

  3. 关于git回退版本的一点心得

    我由于开发中不小心在master分支上开发,忘记了切换分支,最后我直接在master分支上提交,push,在开发分支上merge了master分支. 然后,同事告诉我他的代码要准备上线了,然而我的代码 ...

  4. chrome安装react-devtools开发工具

    我开始安装react-devtools的时候 百度了一波,都是写的不清不楚,官网又都是英文的 也不是完全理解,经过一番折腾出来以后,写个文档记录一下,也可避免新手首次安装走弯路 我安装react-de ...

  5. pymysql之有序字典

    #!/usr/bin/env python #-*-coding:utf-8-*- import pymysql import json import collections conn = pymys ...

  6. FusionSphere产品功能

    华为Fusion产品 FusionSphere解决方案的三种场景 服务器虚拟化 NFVI:运营商基于openstack kvm协议的解决方案 云数据中心 FusionSphere服务器虚拟化解决方案 ...

  7. 1_ZedBoard开发板测试

    启动 将SD卡插入电脑进行格式化 格式化时,要将SD卡格式化为FAT32文件系统.块大小格式化为4096字节时后面会出现无法启动的情况,可以先复现一下这个错误.块大小我选择4096字节. 然后将Zed ...

  8. SQLserver 《深入分析sqlserver 2008》

    PDF版本: 链接:https://pan.baidu.com/s/1bheII-EdyleVJaR5r9lT9Q 提取码:f8zz

  9. 很不错的python 机器学习资源

    http://www.cuijiahua.com/resource.html 曾看过的书,感觉一些很有用的学习资料,推荐给大家! Python基础: 网络教程推荐: 系统学习python3可以看廖雪峰 ...

  10. 201871010123-吴丽丽《面向对象程序设计(Java)》第十一周学习总结

    201871010123-吴丽丽<面向对象程序设计(Java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...