社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
先罗列一下我知道的量化策略:
由于每种策略的持仓清仓逻辑不一样,反映在代码中的表现也就各不相同,以后如果有时间,会把上述量化策略全部实现一遍,今天先来整个最经典的入门级别的活。
首先,啥叫双均线?
从名字上来看,就是两条均线的意思。没错,双均线策略的基本逻辑就是纯粹依靠两条均线进行调仓。
两条均线分别是短期均线和长期均线。我们对于某一支股票的变动,先取一个较小时间段内的股价移动平均画出一条线(短期均线),再取一个较长时间段内的股价移动平均画出一条线(长期均线),然后把它们画在一张图里,定眼…睛一看,我们一定会发现这样的规律:
在经验上,常用的短期均线有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日左右,短期均线向上穿过长期均线,股价趋势线开始上行。
我们给「短期均线向下穿过长期均线」形成的叉叉起了个名字叫死叉,给「短期均线向上穿过长期均线」形成的叉叉起了个名字叫金叉。这样我们自然而然得会想到一种持仓策略:不管什么股票,我只要在形成金叉的时候买进,死叉的时候卖出,岂不是稳赚不赔?
既然我们想出来了这种稳赚不赔的策略,那赶紧来算一算这种方法到底怎么样,是不是直接就掌握财富密码,可以从此不做打工人了呢?
我们现在假设一个场景:你现在手里有辛辛苦苦存下来的十万块钱,准备从现在开始通过股市暴富。你盯准了股价堪比黄金的茅台,想要把钱全投进去。假设从你做这个决定的时刻开始(因为我们的股价数据是从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站首发,其余与本作品一致的内容均为转载
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!