1. 资源
百科:https://baike.baidu.com/item/RSI/6130115
平台:http://www.cftsc.com/chaomaichaomaizhibiao/617.html
博文:
趋势交易策略长期以来被认为具有良好的获利能力,因此,交易员常围绕它思考两个问题:如何判断趋势和如何利用它进行交易。捕捉趋势最普遍的方法为移动平均线:
简单移动平均数 (Simple Moving Average:SMA)
指数加权移动平均数 (Weighted Moving Average:WMA)
指数移动平均数 (Exponential Moving Average:EXPMA或EMA )
2. 简单移动平均
2.1 简单移动平均数


……
# 导入包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 获取青岛啤酒交易数据
TsingTao = pd.read_csv('TsingTao_data.csv')
TsingTao.index = TsingTao.iloc[:,1]
TsingTao.index = pd.to_datetime(TsingTao.index, format='%Y-%m-%d')
TsingTao = TsingTao.iloc[:,2:]
# 选取收盘价
Close = TsingTao.Close
# 可视化青岛啤酒收盘价序列
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize = (10,6))
plt.plot(Close,'k')
plt.xlabel('date')
plt.ylabel('Close')
plt.title('图1 2014年青岛啤酒股票收盘价时序图')
plt.show()

# 计算5日简单移动平均数
Sma5 = pd.Series(0.0,index=Close.index)
for i in range(4,len(Close)):
Sma5[i] = np.mean(Close[(i-4):(i+1)])
# 可视化对比图
plt.figure(figsize=(12,6))
plt.plot(Close[4:],label="Close",color='g')
plt.plot(Sma5[4:],label="Sma5",color='r',linestyle='dashed')
plt.title("图2 青岛啤酒股票价格图")
plt.ylim(35,50)
plt.legend()
plt.show()

2.2 定义简单移动平均函数
# 定义简单移动平均函数
def SmaCal(tsPrice,k):
Sma = pd.Series(0.0,index=tsPrice.index)
for i in range(k-1,len(Close)):
Sma[i] = sum(Close[(i-k+1):(i+1)]) / k
return(Sma)
# 运用移动平均函数计算简单移动平均价格
Sma5 = SmaCal(Close ,5)
2.3 期数的选择(t=n)
事件发展的周期性。
对趋势平均性的要求。
对趋势反映近期变化敏感程度的要求。
3. 加权移动平均
3.1 加权移动平均数

其中,w_1 + w_2 + w_3 + w_4 + w_5 = 1。
# 定义权重
w = np.array([1,2,3,4,5]) / sum(b)
# 根据前5日收盘价计算第5日的加权平均数
Wma5 = pd.Series(0.0,index=Close.index)
for i in range(4,len(Close)):
Wma5[i] = sum(w * Close[(i-4):(i+1)])
# 可视化
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10,6))
plt.plot(Close[4:],label="Close",color='g')
plt.plot(Wma5[4:],label="Wma5",color='r',linestyle='dashed')
plt.title("图3 青岛啤酒收盘价加权移动平均线")
plt.ylim(35,50)
plt.legend()
plt.show()

3.2 加权移动平均函数
# 定义加权移动平均函数
def WmaCal(tsPrice,weight):
k = len(weight)
arrWeight = np.array(weight)
Wma = pd.Series(0.0,index=tsPrice.index)
for i in range(k-1,len(tsPrice.index)):
Wma[i] = sum(arrWeight*tsPrice[(i-k+1):(i+1)])
return(Wma)
# 运用加权移动平均函数计算加权移动平均价格
wma5 = WmaCal(Close,w) 4. 指数加权移动平均
4.1 指数加权移动平均数

# 计算第5天(Close[0:5])的指数移动平均数
Ema5_number1 = np.mean(Close[0:5])
# 计算第6天(Close[1:6])的指数移动平均数
Ema5_number2 = 0.2 * Close[5] + (1-0.2) * Ema5_number1
Ema5 = pd.Series(0.0,index=Close.index)
Ema5[4] = Ema5_number1 # 第5天
Ema5[5] = Ema5_number2 # 第6天
# 计算第7天及以后的指数移动平均数
for i in range(6,len(Close)):
expo = np.array(sorted(range(i-4),reverse=True))
w = (1-0.2) ** expo
Ema5[i] = 0.2 * sum(w * Close[5:(i+1)]) + Ema5_number1 * (1 - 0.2) ** (i-5)
# 可视化
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10,6))
plt.plot(Close[4:],label="Close",color='k')
plt.plot(Ema5[4:],label="Ema5",color='g',linestyle='-.')
plt.title("图4 青岛啤酒收盘价指数移动平均线")
plt.ylim(35,50)
plt.legend()
plt.show()

4.2 指数加权移动平均函数
# 定义指数加权移动平均函数
def Ewma_Cal(tsprice,period=5,exponential=0.2):
Ewma = pd.Series(0.0,index=tsprice.index)
Ewma[period-1] = np.mean(tsprice[:period])
for i in range(period,len(tsprice)):
Ewma[i] = exponential * tsprice[i] + (1 - exponential) * Ewma[period-1]
return(Ewma)
# 运用指数加权移动平均函数计算指数加权移动平均价格
Ewma = Ewma_Cal(Close,5,0.2)4.3 创建movingAverage模块(movingAverage.py)
############################# movingAverage.py ################################
import pandas as pd
import numpy as np
def smaCal(tsPrice,k):
Sma=pd.Series(0.0,index=tsPrice.index)
for i in range(k-1,len(tsPrice)):
Sma[i]=sum(tsPrice[(i-k+1):(i+1)])/k
return(Sma)
def wmaCal(tsPrice,weight):
import pandas as pd
import numpy as np
k=len(weight)
arrWeight=np.array(weight)
Wma=pd.Series(0.0,index=tsPrice.index)
for i in range(k-1,len(tsPrice.index)):
Wma[i]=sum(arrWeight*tsPrice[(i-k+1):(i+1)])
return(Wma)
def ewmaCal(tsprice,period=5,exponential=0.2):
Ewma=pd.Series(0.0,index=tsprice.index)
Ewma[period-1]=np.mean(tsprice[0:period])
for i in range(period,len(tsprice)):
Ewma[i]=exponential*tsprice[i]+(1-exponential)*Ewma[i-1]
return(Ewma)import movingAverage as ma # 加载movingAverage模块
Ewma10 = ma.ewmaCal(Close,10,0.2)4.4 平均方法的比较
案例1:中国银行股价不同均线分析比较

注:详细代码参见博文!
案例2:中国银行股价均线时间跨度比较

注:详细代码参见博文!
5. 中国银行股票均线系统交易
简单移动平均线制定中国银行股票的买卖点

注:详细代码参见博文!
双均线交叉捕捉中国银行股票的买卖点

注:详细代码参见博文!
6. 异同移动平均(MACD)
异同均线 (Moving Average Convergence / Divergence) 是由指数均线演变过来,由Gerald Appel在20世纪70年代提出,是股票分析中一种常见的指标。
MACD指标由两线一柱组合起来形成,快速线为DIF,慢速线为DEA,柱状图为MACD。
快速线DIF一般由12日指数加权移动平均值减掉26日指数加权移动平均值得到
慢速线DEA是DIF的9日指数加权移动平均值
MACD指标可以反映出股票近期价格走势的能量和变化强度,通过分析快慢速线和柱状图来把握股票的买入和卖出点。
一般默认MACD的求值参数为12, 26和9,在投资实践中,可以对这些参数进行优化。
(1)MACD的计算




注:详细代码参见博文!
(2)MACD捕捉中国银行的买卖点

注:详细代码参见博文!
结论:
【1】当DIF和DEA都在零刻度线上方时,表明市场可能是多头行情;反之,当DIF和DEA都在零刻度下方时,表明市场可能处于空头行情。
在投资实战中,“零上双金叉”策略广为人们使用。DIF和DEA都在零刻度线上方,在一段时间内,DIF先上穿DEA线,不久DIF下跌到DEA线的下方,然后DIF又上穿DEA线,此时,说明股票价格上升趋势较强,市场处于上涨行情中。
【2】当DIF下穿信号线DEA时,释放出买入信号;当D工F向上穿过信号线DEA时,释放出卖出信号。
在中国银行2015年交易行情中,DIF几乎都处于DEA的上方,两条线相交的次数较少,释放出的买卖信号也较少。
在2015年3月4日附近,DIF(实线)从上向下穿越DEA(虚线),DIF和DEA的取值都小于0;
观察K线图,可以推测市场可能处于下跌行情:在3月9日附近,两条线都呈现上升趋势,DIF从下向上穿越DEA,释放出市场慢慢走强的信号。从3月9日以后,市场大体上处于上升行情中。
【3】MACD中的柱形图表示DIF与DEA的差值。柱形图的高低表示DIF与DEA差值的大小。
柱形图在零刻度附近时,释放出买卖信号。
柱形图在零刻度线上方,表示DIF大于DEA,市场走势较强。
柱形图在零刻度线下方,表示DIF小于DEA,市场走势较弱。
【4】在投资实战中,柱形图的形态也是投资者关注的一大焦点,MACD指标的形态分析方法可以套用一般的形态分析理论与方法。
MACD柱形图高低的变化与价格线走势的背离情况也可以被解读为交易信号。
7. 均线组合策略实战
将这3个交易策略综合在一起,共同捕捉买卖点。尝试运用多种指标捕捉买卖点,一方面可以捕捉到更多的买卖点;另一方面,在买卖点信号方面,不同指标释放的交易信号甚至可能会相反。比如,简单移动平均线是在某一交易日期放出买入信号,而双均线交叉策略在当期释放出卖出信号。多种指标分析有助于我们多方面研判市场行情,交易决策的制定会更加谨慎,进而有可能提高交易策略的获胜率。
在实际交易时,会有交易资金、购买股票的份额等方面的考虑。在综合运用多种均线指标制定交易策略时,除了捕捉买卖点以外,还可以把交易资金、购买股票的份额等实际因素考虑进去。在以下交易策略的制定上,考虑下面的三大问题。
计算指标,制定买卖交易信号。
设定初始资金,有交易信号时,进行买卖交易。
投资交易的回测与评价。

注:详细代码参见博文!
8. 附件
数据源
模块

