雙11臨近的我發現本身真的很窮很窮很窮(重要的問題說三遍)……api
貧窮催人上進。因而我就尋思着在空閒時間本身搗鼓一下錢生錢的遊戲是怎麼玩的,畢竟就算註定作韭菜也要作一根有知識有理想的韭菜。ui
第一個要玩的模型就是股票交易中的均線黃金交叉。3d
做爲一個基礎的韭菜必定據說過均線黃金交叉原則,也就是說當短時間移動平均線向上突破長期移動平均線,代表趨勢見漲,適合買入;相反地若是短時間移動平均線向下突破長期移動平均線,代表趨勢看跌,適合賣出。code
那麼這個韭菜們都知道的交易原則是否是真的能幫你們賺錢呢?下面咱們以中國平安爲例(其實選A股分析仍是很尷尬,萬一不管如何都不能賺錢呢……)就建模簡單地驗證一下。blog
library(quantmod) library(ggplot2) library(scales)
首先利用 quantmod 包下載股價數據。股票的代碼能夠在雅虎財經查到。遊戲
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
移動平均數一般可分爲簡單移動平均數 (SMA),加權移動平均數 (WMA) 和指數移動平均數 (EMA)。get
一般咱們會選用指數移動平均數。由於移動平均數在必定程度上都會落後於股價的實時趨勢,而指數移動平均數在計算時越新的數據加權比重越大,能更快地反映股價的變化。it
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) }
咱們能夠將計算結果畫成圖形:
io
以 5 日和 20 日均線爲例,咱們能夠按照均線黃金交叉原則找到買賣交易點,即某一天的 5 日移動平均數大於 20 日移動平均數時爲買入,反之某一天的 5 日移動平均數小於 20 日移動平均數時爲賣出。ast
咱們能夠將數據分組。當 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) }
上面咱們已經找出交易點,但其實咱們找出這些可能的歷史交易點目的就是爲了知道若是嚴格按照這些交易點進行交易能不能賺錢呀?
下面咱們能夠模擬一下交易的過程:
假設咱們有 10,000 本金,全倉進入,交易費率爲 0.3%
mock_trading <- function(signals, capital=10000, 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) 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年的股海沉浮以後,最後咱們的本金只有 7962.18,虧損 2037.82, 而賺錢的交易只有6次 (買賣合計)。
咱們將資產和股價曲線畫成圖形對比能夠看出咱們在前期的交易中是虧損不少的。一方面是股價走勢確實是跌跌不休 (經歷了 2018 年的韭菜們都知道),那還有沒有交易選擇錯誤的緣由呢?
咱們將盈利和虧損的交易分別畫出來,就能夠看出虧損的交易多在股價還沒有造成趨勢還在震盪,如 2018-08,以及 2018-10-2018-11 期間。因此從數據上來看,均線黃金交叉原則只能對股價已造成趨勢的股票起指導做用。
不過咱們也能夠樂觀地認爲,只要咱們可以避開震盪期,那麼均線黃金交叉原則仍是可以幫助咱們小小賺一筆的。但是今日不知明日事,一個有知識有理想的韭菜單憑肉眼是很難看出某一個交叉點是否就在趨勢上。
咱們又能夠引入什麼指標來避開震盪期呢?後面會繼續探討一下的。