Python股票双均线策略

(185) 2024-03-02 12:01:01

        使用Python的第三方模块pandas,matplotlibtushare(获取股票数据的接口)来绘制双均线并找出金叉与死叉。

        双移动平均线_百度百科

        金叉_百度百科

死亡交叉(股市术语)_百度百科     

  • 首先绘制双均线我们要先得到股票的数据,示例中我用code=600006(东风汽车)的股票代码来演示操作过程。

首先对获取的数据进行一些处理,具体为:

  1. 改变date列的数据类型
  2. 删除没有用的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]) #参数可以自己设定

Python股票双均线策略 (https://mushiming.com/)  第1张

  •  求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的情况,同样也是返回布尔类型的数据

判断死叉:

Python股票双均线策略 (https://mushiming.com/)  第2张

 通过图片我们可以看出把s2整体向下移动一格,他与s1重叠的True即使我们想要得到的死叉点。

即:death=s1 & s2.shift(1)

判断金叉:

Python股票双均线策略 (https://mushiming.com/)  第3张

 同样我们可以判断出: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)

THE END

发表回复