最简单的量化交易:以05-07年中国大牛市为例分析

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-1] and sma5[j]>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()

运行结果:
在这里插入图片描述

发布了273 篇原创文章 · 获赞 40 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_41855010/article/details/104847430