用Python写一个简单的双均线策略分析 - Go语言中文社区

用Python写一个简单的双均线策略分析


用Python写一个简单的双均线策略

双均线策略

先罗列一下我知道的量化策略:

  • 双均线:一句话来讲就是金叉买死叉卖。
  • 布林带:突破压力线(上轨)清仓,跌破支撑线(下轨)持仓。
  • PEG:根据PE/G调整仓位。
  • 均值回归:跌下去的要涨,涨上来的要跌(废话。
  • 羊驼:随机选股,定期调仓(意外地能赚?

由于每种策略的持仓清仓逻辑不一样,反映在代码中的表现也就各不相同,以后如果有时间,会把上述量化策略全部实现一遍,今天先来整个最经典的入门级别的活。

首先,啥叫双均线?

从名字上来看,就是两条均线的意思。没错,双均线策略的基本逻辑就是纯粹依靠两条均线进行调仓。

两条均线分别是短期均线和长期均线。我们对于某一支股票的变动,先取一个较小时间段内的股价移动平均画出一条线(短期均线),再取一个较长时间段内的股价移动平均画出一条线(长期均线),然后把它们画在一张图里,定眼…睛一看,我们一定会发现这样的规律:

  • 短期均线的波动比长期均线剧烈。从图的角度来直观的说,就是短期均线更加陡峭,长期均线更加平缓。
  • 大多数股价走势中,如果短期均线向上穿过了长期均线,那么股价在接下来的一段时间一定会上涨;反过来,如果短期均线向下穿过了长期均线,那么股价在接下来的一段时间一定会下跌。

在经验上,常用的短期均线有5、10、20日均线;常用的长期均线有60、90、120日均线。

我们来直观的感受一下:

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("D:pythonProjectDataAnalysis-masterMaotai.csv", index_col="date", parse_dates=['date'])

用茅台2019年10月到2020年1月的数据,观察一下短期均线(这里选用5日均线)、长期均线(这里选用60日均线)和股价走势自身的规律。

df_ma5 = df['close'].rolling(5).mean() #计算收盘价5日短期移动平均
df_ma60 = df['close'].rolling(60).mean() #计算收盘价60日长期移动平均
df_ma5o = df_ma5['2020-03':'2020-04'] #取2020年3月和2020年4月的数据
df_ma60o = df_ma60['2020-03':'2020-04']
df_org = df['close']['2020-03':'2020-04']
plt.figure(figsize=(15, 8)) #调整图片大小
plt.plot(df_ma5o.index, df_ma5o, label='5 days moving average')
plt.plot(df_ma60o.index, df_ma60o, label='60 days moving average')
plt.plot(df_org.index, df_org, label='price')
plt.xticks(df_ma60o.index[::10], rotation=45)
plt.gcf().subplots_adjust(bottom=0.20)
plt.legend(loc='upper left') #左上加上图例
plt.show()

得到下图
在这里插入图片描述

我们可以看到,在大概2020年3月16日左右,短期均线向下穿过了长期均线,同时绿色的股价趋势线开始下行;3月30日左右,短期均线向上穿过长期均线,股价趋势线开始上行。

我们给「短期均线向下穿过长期均线」形成的叉叉起了个名字叫死叉,给「短期均线向上穿过长期均线」形成的叉叉起了个名字叫金叉。这样我们自然而然得会想到一种持仓策略:不管什么股票,我只要在形成金叉的时候买进,死叉的时候卖出,岂不是稳赚不赔?

用Python实现

既然我们想出来了这种稳赚不赔的策略,那赶紧来算一算这种方法到底怎么样,是不是直接就掌握财富密码,可以从此不做打工人了呢?

我们现在假设一个场景:你现在手里有辛辛苦苦存下来的十万块钱,准备从现在开始通过股市暴富。你盯准了股价堪比黄金的茅台,想要把钱全投进去。假设从你做这个决定的时刻开始(因为我们的股价数据是从2018年7月开始的所以这个时刻就是2018年7月),碰到茅台的一个金叉你就all in,碰到一个死叉就all out。但是买只能买整手,也就是100股的倍数。

在这个假设场景下,我们看看到今天(2021年3月),你的身家有没有过百万。

先看一看在我们的数据范围内,金叉和死叉是什么一个情况。

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("D:pythonProjectDataAnalysis-masterMaotai.csv", index_col="date", parse_dates=['date'])
df_ma5 = df['close'].rolling(5).mean()
df_ma60 = df['close'].rolling(60).mean()
x = df.index
plt.figure(figsize=(15, 8))
plt.plot(x, df_ma5, color='#FF0000', label='5 days moving average')
plt.plot(x, df_ma60, color='#0000FF', label='60 days moving average')
plt.gcf().subplots_adjust(bottom=0.10) #调整一下图片底部余白
plt.legend(loc="upper left")
plt.show()

得到下图
在这里插入图片描述

由于数据比较多,短期均线和原本的价格趋势线看上去好像重合了,实际上没有。(有一说一茅台是真的顶…

然后我们来算一算到底这样买能赚多少。

golden = [] #定义一个空列表golden,用来承接之后返回的符合金叉条件的行次
for i in range(1, len(df_ma60)-1):
    if df_ma60[i-1] > df_ma5[i-1] and df_ma60[i] <= df_ma5[i]:
        golden.append(i)

death = [] #定义一个空列表death,用来承接之后返回的符合死叉条件的行次
for i in range(1, len(df_ma60)-1):
    if df_ma60[i-1] < df_ma5[i-1] and df_ma60[i] >= df_ma5[i]:
        death.append(i)

dfg = df['close'][golden]  #在原数据中取出所有金叉的收盘价
dfd = df['close'][death]  #在原数据中取出所有死叉的收盘价

# 决策:一共10万块,每个金叉买进死叉卖出,只能买整数手。
ini = 100000
for i in range(0, len(dfd)):
    ini = ini - int(ini/(dfg[i]*100))*dfg[i]*100 + int(ini/(dfg[i]*100))*dfd[i]*100
print(ini)

最后我们得到的结果是:
在这里插入图片描述
好家伙,身价直接翻倍!

这岂不是成了?!每天在汤臣一品最高层积累脂肪的枯燥人生在向我招手了?!

醒醒醒醒别做梦了,领导又喊你加班了。

如果这钱真这么好赚,那岂不是人人都是百万富翁(也就相当于人人都不是百万富翁),钞票变厕纸,盖房用黄金了?

这个策略确实是理想的,但它也是理想的(不是套娃。

首先,上面的运算都是我们站在未来的角度回头看,才能准确地判断什么时候是金叉什么时候是死叉,而当你跳出未来视角身处当时,你会发现完全不可能准确的判断金叉和死叉的出现,能看到的只能是两条线靠近和分离的趋势(金…哎还没金呢 ,也就是说,这个策略存在滞后性。

其次,即使我们在过后准确判断了买进卖出信号进行了及时的交易,也不一定是稳赚不赔。我们可以观察2020.03.06出现的金叉和2020.03.17出现的死叉,这两天的收盘价分别是1155和1045,也就是说,在6号的金叉信号买入17号的死叉信号卖出,这一手反而赔了。

我们之前说,交叉之后的走势大多呈现这样那样的规律,大多就意味着少数情况不是这样,即即使短期均线向上(下)穿过长期均线,之后股价的走势也有可能是下行(上行)的。因此也有很多会在定义金叉和死叉的时候刨除这种同向变动的情况,将「短期向上穿过长期,且股价上行」的叉叉定义为金叉。

归根结底,让你身价翻倍的不是因为你的策略,而是因为茅台…

作者及声明

LI ZHIGENG
现就读于早稻田大学经济学研究科

本作品于CSDN站首发,其余与本作品一致的内容均为转载

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_55854987/article/details/115178375
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢