在python分析股票MACD指标一文中,我介绍了如何使用python画出股市中的均线图。均线图的意义在于提供了除了指数之外的另外一种曲线,两条曲线的交点可以用来进行决策的判断条件。比如我们可以设定5日均线(sma5)向上穿越20日均线(sma20)时刻为买入点(bpoint),向下穿越为卖出点(spoint),这样就可以使用程序来进行交易了。以下,我们读取了2007年大牛市时期青岛啤酒这只股票的行情,并且使用python的matplotlib进行了买入卖出可视化的决策点显示。通过这个例子,我们可以掌握以下知识点:
1.列表生成式的使用;
2.pandas数据的生成、读取;
3.matplot绘制折线图(plot)和注释(annotate);
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
qdpj = pd.read_csv('qdpj_data.csv',index_col=2)
qdpj.index = pd.to_datetime(qdpj.index, format = '%Y%m%d')
qdpj = qdpj.iloc[:,2:]
close = qdpj.close
def SMA(n):
SMAn = pd.Series(0.0,index=close.index)
for i in range(n-1,len(close)):
SMAn[i] = np.mean(close[(i+1-n):(i+1)])
return SMAn
sma5 = SMA(5)
sma20 = SMA(20)
spoint_index = [ i for i in range(20,len(sma20)) if sma5[i-1]>sma20[i-1] and sma5[i]<sma20[i]] #理论上的死叉
bpoint_index = [ j for j in range(20,len(sma20)) if sma5[j-1]sma20[j]] #理论上的金叉
total_outcom = 0
total_income = 0
trade_times = min(len(bpoint_index),len(spoint_index))
print(len(bpoint_index))
print(len(spoint_index))
print(trade_times)
for i in range(trade_times):
total_outcom += close[bpoint_index[i]]
total_income += close[spoint_index[i]]
print(f'profit:{total_income-total_outcom}')
def draw_buy(bpoint_index):
for i in bpoint_index:
index = i
xy = (close.index[index],close[index])
xytext = (close.index[index],close[index]-1.5)
plt.annotate('Buy',xy=xy,xytext=xytext,arrowprops=dict(facecolor='black',shrink=0.05))
def draw_sell(spoint_index):
for i in spoint_index:
index = i
xy = (close.index[index],close[index])
xytext = (close.index[index],close[index]+1.5)
plt.annotate('Sell',xy=xy,xytext=xytext,arrowprops=dict(facecolor='black',shrink=0.05))
plt.figure(figsize=(16,12))
plt.plot(close[19:],label = 'close',color='g')
plt.plot(sma5[19:],label = 'SMA5',color='r',linestyle='dashed')
plt.plot(sma20[19:],label = 'SMA20',color='b',linestyle='dashed')
plt.title('QDPJ stock index trend')
draw_buy(bpoint_index)
draw_sell(spoint_index)
plt.legend()
plt.show()
运行结果: