这一次是先判断金叉和死叉,然后把其输出结果作为新的两张表,然后在新的两张表里分别进行判断是否是背离点。
import baostock as bs
import pandas as pd
import talib as ta
import matplotlib.pyplot as plt
def computeMACD(code, startdate, enddate):
login_result = bs.login(user_id='anonymous', password='123456')
print(login_result)
###获取股票日K线数据###
rs = bs.query_history_k_data(code,
"date,code,close,tradeStatus",
start_date=startdate, end_date=enddate,
frequency="d", adjustflag="3")
#### 打印结果集 ####
result_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
result_list.append(rs.get_row_data())
df = pd.DataFrame(result_list, columns=rs.fields)
# 剔除停盘数据
df2 = df[df['tradeStatus'] == '1']
# 获取dif,dea,hist,它们的数据类似是tuple,且跟df2的date日期一一对应
# 记住了dif,dea,hist前33个为Nan,所以推荐用于计算的数据量一般为你所求日期之间数据量的3倍
# 这里计算的hist就是dif-dea,而很多证券商计算的MACD=hist*2=(dif-dea)*2
dif, dea, hist = ta.MACD(df2['close'].astype(float).values, fastperiod=12, slowperiod=26, signalperiod=9)
df3 = pd.DataFrame({'dif': dif[33:], 'dea': dea[33:], 'hist': hist[33:]},
index=df2['date'][33:], columns=['dif', 'dea', 'hist'])
df3.plot(title='MACD')
df4= pd.merge(df3, df2, on='date', how='left')
plt.show()
df4.to_csv("./test2_df4.csv", index=False)
#print(df4)
# 寻找MACD金叉和死叉
datenumber = int(df3.shape[0])
#金叉表
today_data = pd.DataFrame(columns=['date', 'dif', 'dea', 'close'])
lastday_data = pd.DataFrame(columns=['date', 'dif', 'dea', 'close'])
#死叉表
today_data2 = pd.DataFrame(columns=['date', 'dif', 'dea', 'close'])
lastday_data2 = pd.DataFrame(columns=['date', 'dif', 'dea', 'close'])
for i in range(datenumber - 1):
if((df4.iloc[i, 1] <= df4.iloc[i, 2]) & (df4.iloc[i + 1, 1] >= df4.iloc[i + 1, 2])):#判断金叉
#print("期货代码:{},MACD金叉的日期:{}, 价格:{},dif:{},dea:{}".format(code, df4.iloc[i + 1, 0], df4.iloc[i + 1, 5],df4.iloc[i + 1, 1], df4.iloc[i + 1, 2]))
#if (df3.iloc[i, 0] <= df3.iloc[i, 1]) & (df3.iloc[i + 1, 0] >= df3.iloc[i + 1, 1]):
dict1={'date':df4.iloc[i + 1, 0],'dif':df4.iloc[i + 1, 1],'dea':df4.iloc[i + 1, 2],'close':df4.iloc[i + 1, 5]}
dict2={'date':df4.iloc[i, 0],'dif':df4.iloc[i, 1],'dea':df4.iloc[i, 2],'close':df4.iloc[i, 5]}
today_data = today_data.append(dict1, ignore_index=True)
lastday_data = lastday_data.append(dict2, ignore_index=True)
if ((df4.iloc[i, 1] >= df4.iloc[i, 2]) & (df4.iloc[i + 1, 1] <= df4.iloc[i + 1, 2])):#判断死叉
dict1 = {'date': df4.iloc[i + 1, 0], 'dif': df4.iloc[i + 1, 1], 'dea': df4.iloc[i + 1, 2],'close': df4.iloc[i + 1, 5]}
dict2 = {'date': df4.iloc[i , 0], 'dif': df4.iloc[i, 1], 'dea': df4.iloc[i, 2],'close': df4.iloc[i, 5]}
today_data2 = today_data2.append(dict1, ignore_index=True)
lastday_data2 = lastday_data2.append(dict2, ignore_index=True)
print(today_data)
print(lastday_data)
print(today_data2)
print(lastday_data2)
# 下面开始判断背离点
flag = False
for j in range(today_data.shape[0] - 1):
if ((lastday_data.iloc[j, 1] >today_data.iloc[j+1 , 1]) & (lastday_data.iloc[j, 3] < today_data.iloc[j+1, 3])): #判断顶背离
flag = True
print("期货代码:{},顶背离时间:{}, 价格:{}".format(code, today_data.iloc[j+1, 0], today_data.iloc[j+1, 3]))
if not flag:
print("没有顶背离点")
flag=False
for j in range(today_data2.shape[0]-1):
if((lastday_data2.iloc[j, 1] < today_data2.iloc[j+1, 1]) & (lastday_data2.iloc[j, 3] > today_data2.iloc[j+1 , 3])): #判断底背离
flag=True
print("期货代码:{},底背离时间:{}, 价格:{}".format(code, today_data2.iloc[j+1, 0], today_data2.iloc[j+1, 3]))
if not flag:
print("没有底背离点")
bs.logout()
return (dif, dea, hist)
if __name__ == '__main__':
code = 'sh.600000'
startdate = '2019-06-08'
enddate = '2020-01-08'
(dif, dea, hist) = computeMACD(code, startdate, enddate)