Python之Tushare模块实现双均线问题策划
股票知识简介
1、均线
均线里有一个相对简单的公司:N日移动平均线=N日收市价之和/N
对于每一个交易日,都可以计算出前N天的移动平均值,然后把这些移动平均值连起来,成为一条线,就叫做N日移动平均线。
2、双均线图
就是说,绘制两条均线,然后通过这两条均线的走势以及交点的情况来获得合适的购买股票和售出股票的日期或者说大致时间,从而有利于更好的决策,获得更高的效益.
3、金叉和死叉
金叉主要指股票行情指标的短期线向上穿越长期线的交叉,称之为金叉。
死叉是行情指标的短期线向下穿越长期线的交叉,称之为死叉。
金叉为买进信号,死叉为卖出信号,同时要结合这均线系统的组合时间周期来判断是短线买卖还是中线波段买卖,特别需要注意的是均线交叉之后的2根均线的方向,如果不是一致朝上或者朝下的,那就是普通的均线交叉,而不是“金叉”或“死叉”了。KDJ全名为随机指标(Stochastics),由George Lane所创,其综合动量观念,强弱指标及移动平均线的优点,早年应用在期货投资方面,功能颇为显著,目前为股市中最常用的技术分析指标之一。
死叉又称死亡交叉,是指下降中的短期移动平均线由上而下穿过下降的长期移动平均线,表示股价将继续下落,行情看跌。在技术分析的各种方法中,均线金叉或死叉是判断市场走势强弱的重要参考指标之一。
具体案例实现
一、获取数据并存储
# 股票分析
# 导入库
import numpy as np
import tushare as ts
import matplotlib.pyplot as plt
import pandas as pd
# 获取股票的数据
pro = ts.pro_api('c62ba9195fa8b54ff78a38cab1cec01b15def7f47c32f91fb273ee3a')
df = pro.daily(ts_code='000001.SZ', start_date='20180701', end_date='20200718')
# 存储数据到一个文件中
df.to_csv('./data.csv')
二、数据预处理
# 读取数据
df = pd.read_csv('./data.csv')
# 删除不需要的行
df = df.drop(['Unnamed: 0'], axis=1)
df = df.drop(['ts_code'], axis=1)
# 反转行使得时间是从前到后的
df = df.iloc[::-1, :]
# 将时间由数字转为字符串
for i in range(497):
df.iloc[i, 0] = str(df.iloc[i, 0])
# 将字符串转为时间类型的数据
df['trade_date'] = pd.to_datetime(df['trade_date'])
# 将时间设置为索引
df = df.set_index(['trade_date'])
df = df.iloc[:-1, :]
print(df)
# 结果:
open high low ... pct_chg vol amount
trade_date ...
2018-07-02 9.05 9.05 8.55 ... -5.2800 1315520.13 1158545.868
2018-07-03 8.69 8.70 8.45 ... 0.7000 1274838.57 1096657.033
2018-07-04 8.63 8.75 8.61 ... -0.6900 711153.37 617278.559
2018-07-05 8.62 8.73 8.55 ... -0.1200 835768.77 722169.579
2018-07-06 8.61 8.78 8.45 ... 0.7000 988282.69 852071.526
... ... ... ... ... ... ... ...
2020-07-10 15.35 15.48 14.76 ... -4.3142 2158773.26 3254272.377
2020-07-13 14.70 15.08 14.50 ... 0.2019 1937160.12 2871414.844
2020-07-14 14.90 15.19 14.55 ... -1.4103 1953566.27 2891773.817
2020-07-15 14.78 14.86 14.23 ... -2.7929 2042562.83 2947173.149
2020-07-16 14.30 14.55 14.12 ... -0.8409 1930891.29 2771496.391
[497 rows x 9 columns]
三、绘制双均线
记为:ma5 以及 ma30
ma5 = (df['close'].rolling(5).mean()).iloc[30:]
ma30 = (df['close'].rolling(30).mean()).iloc[30:]
plt.plot(ma5)
plt.plot(ma30)
plt.show()
绘制之后的的图形如下所示:
以上即就是绘制出来的双均线图像
四、找出金叉、死叉日期
此处寻找金叉和死叉的算法不做讲解了,有兴趣的可以自行摸索得出,此处仅展示代码实现
s1 = ma5 < ma30
s2 = ma5 > ma30
new_df = df.iloc[30:]
golden_date = new_df.loc[- (s1 | s2.shift(1))].index
print(golden_date)
dead_date = new_df.loc[s1 & s2.shift(1)].index
print(dead_date)
# 输出的结果:
DatetimeIndex(['2018-08-13', '2018-08-23', '2018-10-18', '2019-01-14',
'2019-04-01', '2019-06-14', '2019-08-12', '2019-09-05',
'2019-09-20', '2019-12-17', '2020-04-22', '2020-06-05',
'2020-07-03'],
dtype='datetime64[ns]', name='trade_date', freq=None)
DatetimeIndex(['2018-08-16', '2018-10-16', '2018-11-13', '2019-03-28',
'2019-05-08', '2019-08-06', '2019-08-30', '2019-09-18',
'2019-11-13', '2020-01-21', '2020-05-22', '2020-06-12'],
dtype='datetime64[ns]', name='trade_date', freq=None)
以上便是找出来的金叉以及死叉的对应日期啦~~~
最后谢谢大家阅读啦~~~