使用Python的第三方模块pandas,matplotlib和tushare(获取股票数据的接口)来绘制双均线并找出金叉与死叉。
-
首先绘制双均线我们要先得到股票的数据,示例中我用code=600006(东风汽车)的股票代码来演示操作过程。
首先对获取的数据进行一些处理,具体为:
- 改变date列的数据类型
- 删除没有用的code列
如果想的话,还可以把数据持久化存储
df=ts.get_k_data(code='600006',start='2018-01-01') #通过接口获取茅台股票数据
df.drop(labels='code',axis=1,inplace=True) #可以删除没有用的列
# df.to_csv('maotai.csv') #可将数据进行持久化存储
# df=pd.read_csv('maotai.csv') #使用pandas模块读取数据
df['date']=pd.to_datetime(df['date']) #更改date列的数据类型
df.set_index('date',inplace=True) #把行索引设置为date列,且直接在源数据上进行改动
绘制双均线(这里以5天均线和30天均线为例):
ma5=df['close'].rolling(5).mean() #求5日均线
ma30=df['close'].rolling(30).mean() #30日均线
plt.plot(ma5[30:800])
plt.plot(ma30[30:800]) #参数可以自己设定
-
求2018年至今该股票的金叉与死叉
先对数据进行切片操作(因为长均线为30天,因此我们的数据前30个值为空,需要删除)
ma5=ma5[30:]
ma30=ma30[30:]
df=df[30:]
判断金叉与死叉:
s1=ma5<ma30
s2=ma5>ma30
death=s1 & s2.shift(1) #判定死叉的条件
death_date=df.loc[death].index #死叉的所有时间
golden=~(s1|s2.shift()) #判定金叉的条件
golden_date=df.loc[golden].index #金叉的所有时间
s1是我们判断ma5小于ma30的情况,返回布尔类型的数据
s2是ma5大于ma30的情况,同样也是返回布尔类型的数据
判断死叉:
通过图片我们可以看出把s2整体向下移动一格,他与s1重叠的True即使我们想要得到的死叉点。
即:death=s1 & s2.shift(1)
判断金叉:
同样我们可以判断出:s1 | s2.shift(1)得到的False即使我们想要得到的金叉点,但是由于相关判断条件的因素,我们需要将True与False进行反转,即:golden=~(s1|s2.shift())
如此我们便得到了金叉与死叉。
完整代码如下:
# -*- coding: utf-8 -*-
import pandas as pd
import tushare as ts
import matplotlib.pyplot as plt
df=ts.get_k_data(code='600006',start='2018-01-01') #通过接口获取茅台股票数据
df.drop(labels='code',axis=1,inplace=True) #可以删除没有用的列
# df.to_csv('maotai.csv') #可将数据进行持久化存储
# df=pd.read_csv('maotai.csv') #使用pandas模块读取数据
df['date']=pd.to_datetime(df['date']) #更改date列的数据类型
df.set_index('date',inplace=True) #把行索引设置为date列,且直接在源数据上进行改动
'''绘制5日均线图与30日均线图来示范'''
ma5=df['close'].rolling(5).mean() #求5日均线
ma30=df['close'].rolling(30).mean() #30日均线
plt.plot(ma5[30:800])
plt.plot(ma30[30:800]) #参数可以自己设定
"""求2018年至今该股票的金叉与死叉"""
'''因为我们长均线是30日均线所以我们要先对df,ma5,ma30进行切片操作'''
ma5=ma5[30:]
ma30=ma30[30:]
df=df[30:]
s1=ma5<ma30
s2=ma5>ma30
death=s1 & s2.shift(1) #判定死叉的条件
death_date=df.loc[death].index #死叉的所有时间
golden=~(s1|s2.shift()) #判定金叉的条件
golden_date=df.loc[golden].index #金叉的所有时间
if __name__=='__main__':
print(death_date)
print(golden_date)