捕捉趋势最普遍的方法为移动平均线,根据求平均的方式不同,移动平均数又可分为简单移动平均数(Simple Moving Average, SMA),加权移动平均数(Weighted Moving Average, WMA),和指数移动平均数(Exponential Moving Average, EXPMA或EMA)。

目录

  • 获取数据
  • 1.简单移动平均(SMA)
    • 1.1 简单移动平均数
    • 1.2 绘制5&10日简单移动平均线
    • 1.3 定义简单移动平均计算函数
    • 1.4 定义简单移动平均绘图函数
    • 1.5 直接使用mplfinance库来绘制
  • 2.加权移动平均
    • 2.1 加权移动平均数
    • 2.2 定义加权移动平均计算函数
    • 2.3 绘制加权移动平均线
  • 3.指数加权移动平均(EMA)(EXPMA)(EWMA)
    • 3.1指数加权移动平均数
    • 3.2 指数加权移动平均线
    • 3.2定义计算指数加权移动平均数函数
  • 4.常用平均方法比较
  • 5.双均线交叉策略
  • 6.异同移动平均线(MACD)
    • 6.1 指标概述
    • 6.2 绘图代码
    • 6.3常用MACD交易思想

获取数据

以从Tushare获取深证成指(‘399001.SZ’)股价数据为例。

# 导入相关模块
import os
import numpy as np
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
# from pylab import mpltoken = 'Your token'   # 输入你的接口密匙,获取方式及相关权限见Tushare官网。
pro = ts.pro_api(token)
df = pro.index_daily(ts_code='399001.SZ')  #index_daily为指数日线的接口。股票的则为daily。# 将获取到的DataFrame数据进行标准化处理,转换为方便自己使用的一种规范格式。
df = df.loc[:, ['trade_date', 'open', 'high', 'low', 'close', 'vol']]
df.rename(columns={'trade_date': 'Date', 'open': 'Open','high': 'High', 'low': 'Low','close': 'Close', 'vol': 'Volume'},inplace=True)       # 重定义列名,方便统一规范操作。
df['Date'] = pd.to_datetime(df['Date'])  # 转换日期列的格式,便于作图
df.set_index(['Date'], inplace=True)  # 将日期列作为行索引
df = df.sort_index()  # 倒序,因为Tushare的数据是最近的交易日数据显示在DataFrame上方,倒序后方能保证作图时X轴从左到右时间序列递增。
Close = df['Close']   # 取出收盘数据。now = datetime.now()  # 现在时间
today = now.strftime('%Y-%m-%d')   # 今日日期# 设置一会儿生成的图像文件的保存路径,这里该三行命令在D盘创建一个以今日日期命名的文件夹。
path = 'D:/' + today
if not os.path.exists(path):os.mkdir(path)
# 准备工作完毕,走起!

1.简单移动平均(SMA)

1.1 简单移动平均数

  • 即以算术平均的方式对目标数据对象求均值。(5日为例)
    SMAt=5 = p1+p2+p3+p4+p55\displaystyle {\frac{p1+p2+p3+p4+p5}{5} }5p1+p2+p3+p4+p5​
# 求取5日简单移动平均数
Sma5 = pd.Series(0.0,index=Close.index)
for i in range(4,len(Close)):Sma5[i] = sum(Close[i-4:(i+1)])/5
# 求取10日简单移动平均数
Sma10 = pd.Series(0.0,index=Close.index)
for i in range(9,len(Close)):Sma10[i] = sum(Close[i-9:(i+1)])/10

1.2 绘制5&10日简单移动平均线

# 取2020年的数据绘图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(Close['2020'], label="Close", color='g')
plt.plot(Sma5['2020'], label="Sma5", color='r', linestyle='dashed')
plt.plot(Sma10['2020'], label="Sma10", color='b', linestyle='dashed')
plt.title('深证成指近2020全年收盘数据附5&10日MAV图')
plt.legend()  # 增设图例
plt.show()
# plt.savefig(path + '/深证成指2020年收盘数据时序图附5&10日MAV.png')

运行效果如下图所示:

1.3 定义简单移动平均计算函数

def smaCal(tsPrice, k):import pandas as pdSma = pd.Series(0.0, index=tsPrice.index)for i in range(k-1, len(tsPrice)):Sma[i] = sum(tsPrice[(i-k+1):(i+1)])/kreturn(Sma)# 调用
smaCal(Close['2020'], 5)

1.4 定义简单移动平均绘图函数

# 设定传入三个参数:name:序列名字(如“深证成指”,便于注明于图像标题。)
# tsPrice: Series类型的数据序列。
# 不定参数我们规定为最多只能五个,即最多添加五根均线。
def plot_smaCal(name,tsPrice, *args):if len(args)>5:print('提示:添加均线数量最多是五个!')return Noneimport pandas as pdplt.plot(tsPrice, label="Close", color='g')colors = ['r', 'k', 'b', 'c', 'y']   # 设定5个颜色,也即关系到上边均线数量的上限。j = 0   # 用于颜色索引转换for k in args: 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)])/kplt.plot(Sma[k-1:], label="Sma"+str(k), color=colors[j], linestyle='dashed')j += 1days='&'.join([str(ints) for ints in args])plt.title(name + '收盘数据附' + days + '日MAV图')plt.legend()  # 增设图例plt.show()#  plt.savefig(path + '/' + name + '收盘数据时序图附' + days + 'MAV.png')# 调用
plot_smaCal('深证成指',Close['2020'],5,10,20,50)

输出结果如图:

1.5 直接使用mplfinance库来绘制

直接使用mplfinance库来绘制不失为一种更简单的方法。

import mplfinance as mpf
road = path + '/深证成指2020年收盘数据附5&10日MAV图.jpg'
s = mpf.make_mpf_style(base_mpf_style='blueskies', rc={'font.family': 'SimHei'})   # 解决mplfinance绘制输出中文乱码
mpf.plot(df['2020'], type='line',ylabel="price", style=s, title='深证成指2020年时序图附5&10日双均线', mav=(5, 10), volume=True, ylabel_lower="volume(shares)", savefig=road)
# 通过设定不定长参数mav,即想要得到简单移动平均线的时间跨度,来获取想要的结果。
然后在前边指定的目录即可查看到图像(这里是保存在D盘今日日期命名的文件夹里边)

图像效果如下:


2.加权移动平均

2.1 加权移动平均数

加权移动平均,即对数据赋予一定的权重后再求平均。
一般认为离当前时间点越近的数据越具有代表性,越远则越没有代表性。
WMAt=5 = w1p1 + w2p2 + w3p3 + w4p4 + w5p5
(其中w1 + w2 + w3 + w4 + w5 = 1)

# 5日加权移动平均线
b1 = np.array([1, 2, 3, 4, 5])
w1 = b1/sum(b1)    # 定义一组权重
Wma5 = pd.Series(0.0, index=Close.index)
for i in range(4,len(Close)):Wma5[i] = sum(w1*Close[i-4:(i+1)])
# 10日加权移动平均线
b2 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
w2 = b2/sum(b2)   # 定义一组权重
Wma10 = pd.Series(0.0, index=Close.index)
for i in range(9,len(Close)):Wma10[i] = sum(w2*Close[i-9:(i+1)])

2.2 定义加权移动平均计算函数

def wmaCal(tsPrice, weight):import pandas as pdimport numpy as npk = 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)# 调用
b = np.array([1, 2, 3, 4, 5])
w = b1/sum(b)
wmaCal(Close['2020'],w)

2.3 绘制加权移动平均线

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(Close['2020'], label="Close", color='g')
plt.plot(Wma5['2020'], label="Wma5", color='r', linestyle='dashed')
plt.plot(Wma10['2020'], label="Wma10", color='b', linestyle='dashed')
plt.title('深证成指近2020年收盘数据附5&10日加权WAV图')
plt.legend()  # 增设图例
plt.show()
# plt.savefig(path + '/深证成指2020年收盘数据时序图附5&10日MAV.png')

图像效果展示如下:


3.指数加权移动平均(EMA)(EXPMA)(EWMA)

3.1指数加权移动平均数

指数加权移动平均也可简称指数移动平均,相当于一种比较特别的加权移动平均。需要先给定一个权重值w,比如0.2。时间跨度为k。第k期的EWMAt=k为前k期的算数平均数。
第k+1期EWMAt=k+1 = w * pk+1 + (1-w) * EWMA t=k
即当天指数移动平均数 = 0.2*当天股价 + 0.8 * 前一天指数移动平均
后边的按此公式以此类推。

# 第五天指数加权移动平均数为前五天的算数平均数
Ewma5_number1 = np.mean(Close[0:5])
Ewma5 = pd.Series(0.0, index=Close.index)
Ewma5[4]=Ewma5_number1# 计算第六天及以后的指数移动平均数
for i in range(5, len(Close)):Ewma5[i] = Ewma5[i-1]*0.8 + Close[i]*0.2Ewma5.head(10)
  • 由其计算特点可知,即便选择的时间跨度相同,权重相同。选择的研究日期起点不同,指数加权移动平均数也会不同。因为首个值是用算术平均的方法计算的。

3.2 指数加权移动平均线

# 绘制指数加权移动平均线图像
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(Close['2020'], label="Close", color='r')
plt.plot(Ewma5['2020'], label="Ewma5", color='g', linestyle='-.')
plt.title('深证成指近2020年收盘数据时序图附5日指数移动平均线')
plt.legend()
plt.show()

结果如图所示:

3.2定义计算指数加权移动平均数函数

def ewmaCal(tsPrice, period=5,exponential=0.2):import pandas as pdimport numpy as npEwma = 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[i-1]return(Ewma)# 调用
Ewma=ewmaCal(Close,5,0.2)
Ewma.head(10)

4.常用平均方法比较

  • 简单移动平均(SMA)对前n期的价格求算术平均,所有价格数据同等权重。
  • 加权移动平均(WMA)赋予价格数据不同的权重。一般近期数据权重大,远期数据权重小。
  • 指数移动平均(EMA)类似于加权移动平均,是以指数形式递减加权的移动平均。
  • 三条均线对收盘价曲线的变化往往都有一定的滞后性。

5.双均线交叉策略

利用长短期均线的相对关系,来识别价格趋势的变化。

  1. 先求出短期均线和长期均线。
  2. 当短期均线从下向上穿过长期均线时,释放出买入信号。
  3. 当短期均线从上向下穿过长期均线时,释放出买入信号。
    长短均线的时间跨度的选择,因人而异。

6.异同移动平均线(MACD)

6.1 指标概述

  • MACD指标由两线一柱组合起来形成。
  • 快速线为DIF,慢速线为DEA,柱状图为MACD。
  • 快速线DIF一般由12日指数加权移动平均值减掉26日指数加权移动平均值得到,慢速线DEA是DIF的9日指数加权移动平均值。
  • 柱状图MACD由快速线DIF与慢速线DEA作差得到。
  • MACD指标可以反映出股票近期价格走势的能量和变化强度,通过快慢速线和柱状图来把握股票的买入点和卖出点。
  • 一般默认MACD的求值参数为12、26和9。
  • DIF = EMA(close,12) - EMA(close,26)
  • DEA = EMA(DIF,9)
  • MACD = DIF - DEA

6.2 绘图代码

# 计算相关指标,用到了上边定义过的函数ewmaCal()。
DIF = ewmaCal(Close, 12, 2/(1+12)) - ewmaCal(Close, 26, 2/(1+26))
DEA = ewmaCal(DIF, 9, 2 / (1+9))  # DEA的线图也被称为信号线
MACD = DIF - DEA
MACD1 = MACD[MACD.values > 0]  # MACD数据大于零的部分 作图体现为红色
MACD2 = MACD[MACD.values < 0]  # MACD数据小于零的部分 作图体现为绿色# 绘制2020年全年深证成指MACD图像
plt.rcParams['font.sans-serif'] = ['SimHei']   # 设定显示中文
plt.rcParams['axes.unicode_minus'] = False   # 设定正常显示负号
plt.subplot(211)
plt.plot(DIF['2020'], label="DIF", color="k")
plt.plot(DEA['2020'], label="DEA", color="b",linestyle='dashed')
plt.title("信号线DIF与DEA")
plt.xlabel('date')
plt.ylabel('value')
plt.legend()
plt.subplot(212)
plt.bar(MACD1['2020'].index, height=MACD1['2020'], color='r', edgecolor='k')
plt.bar(MACD2['2020'].index, height=MACD2['2020'], color='g', edgecolor='k')
plt.title('MACD')
plt.xlabel('date')
plt.ylabel('value')
plt.show()
# plt.savefig(path + '/深证成指2020年MACD指标图.png')

生成结果如下:

6.3常用MACD交易思想

这里我们阐述一些常用的MACD交易思想:

  1. 当DIF和DEA都在零刻度线上方时,表明市场是多头行情;反之,当DIF和DEA都在零刻度线下方时,表明市场是空头行情。投资实战中,“零上双金叉” 策略广为人们使用:当DIF和DEA都在零刻度线上方,在一段时间内,DIF先上穿DEA线,不久DIF下跌到DEA线的下方,然后DIF又上穿DEA线,此时,说明股价上涨趋势较强,市场处于上涨行情中。
  2. 当DIF下穿信号线DEA时,释放出买入信号;当DIF向上穿过信号线DEA时,释放出卖出信号。
  3. MACD柱状图的高低表示DIF与DEA的离差值大小,柱状图在零刻度附近时,释放出买卖信号。柱形图在零刻度线上方,表示DIF大于DEA,市场走势较强;柱形图在零刻度线下方,表示DIF小于DEA,市场走势较弱。
  4. MACD指标的形态分析也是一大关注焦点,可以套用一般的形态分析理论与方法。

DIF与DEA的交叉与背离策略分析:

  1. 先求出DIF(离差值,快线)、DEA(信号线,慢线)的值;
  2. DIF、DEA均为正,DIF向上突破DEA,买入信号。
  3. DIF、DEA均为负,DIF向下跌破DEA,卖出信号。

Python 金融量化 均线系统交易策略专题(简单移动平均,加权移动平均,指数加权移动平均,异同移动平均MACD等解读与绘图)相关推荐

  1. Python 金融量化 随机指标交易策略

    目录 1.随机指标概述 2.随机指标原理 3.获取数据 4. 计算RSV 5. 计算K.D指标值 5.1 K值.D值指标概述 5.2 计算代码 6.计算J值 7.绘制KDJ线 8. KDJ交易策略 1 ...

  2. python金融量化分析 | 闲杂笔记

    最近事情好像有点多,处理得心不在焉.之前国庆计划把张五常老师的经济解释卷二看完,但也是只把第三章生产的成本看了一下,哈哈~ 这是一篇python金融量化分析的闲杂且入门的笔记,感觉学习价值较低,我只是 ...

  3. Python金融量化 | 从入门到高阶实战应用

    引言 今天给大家分享一个微信公众号"Python金融量化",作者是金融学博士,堪萨斯大学访问学者,专注于分享Python在金融量化领域的实战应用,坚持走原创路线,持续输出技术干货, ...

  4. 【Python金融量化】零基础如何开始学?

    前言 Python可以说是当前非常流行的编程语言,甚至有点"网红"的感觉.网上还流行一句话"Life is short, I use Python"(人生短暂, ...

  5. 【Python金融量化】财经新闻文本分析

    内容来自:微信公众号:python金融量化 关注可了解更多的金融与Python干货. 引言 "80%的商业信息来自非结构化数据,主要是文本数据"(Seth Grimes),这一说法 ...

  6. 免费的量化交易软件的交易策略?

    免费的量化交易软件的交易策略: 一.波段交易 俗称低买高卖,最常用的股票交易方法,也是用的最广的一种股票交易方法:抄底买入抄底买入摸顶卖出摸顶卖出. 二.止盈止损 不会止盈,就无法保证既得的股票收益, ...

  7. python金融实战 源代码_穆棱市seo总代直销python金融量化营业实战课程 python量化项目实战源码+课件+视频...

    python金融量化生意实战课程 python量化项目实战源码+课件+视频 1. 自愿化生意综述 重要实质: 课程实质综述,自愿化/算法生意先容,python正在自愿生意中的使用简介 2. 量化生意体 ...

  8. python量化平台怎么搭建_Python_量化投资领域, 平台, 交易策略, 项目全覆盖

    Python在量化领域的现状 就跟Java在web领域无可撼动的地位一样,Python也已经在金融量化投资领域占据了重要位置,从各个业务链条都能找到相应的框架实现. 在量化投资(证券和比特币)开源项目 ...

  9. python金融量化风险_【手把手教你】Python量化策略风险指标

    如何衡量一个量化策略的好坏?一是比较稳定的收益,二是有严谨的回测,三是有清晰的逻辑.--刘富兵 引言 尽管过去不能代表未来,通过历史回测来评估量化策略仍然是量化投资非常重要的一环.量化回测过程中常用到 ...

最新文章

  1. 首个国产量子操作系统「本源司南」重磅问世!!!
  2. linux写命令时方便的快捷键以及Vim必备命令
  3. oracle基础建表
  4. Fedora 33更新异常:Errors during downloading metadata for repository ‘updates‘
  5. mysqL学习之实例
  6. Linux网络基本网络配置
  7. IDE / Qt / 浅谈 qmake 之 pro、pri、prf、prl文件
  8. Python Excel表格操作总结
  9. linux 二进制转十进制脚本,linux-shell 脚本转换 十六进制 十进制 八进制 二进制...
  10. java 上传文件到服务器_java上传文件到OSS云服务器(二)
  11. Tips for vcpkg
  12. 《Android和PHP开发最佳实践》一1.3 如何学习Android和PHP
  13. 简单学生成绩管理系统Java版(GUI+Microsoft Access数据库)
  14. 《暗时间》读书笔记与读后感
  15. poj 1945 Power Hungry Cows 启发式搜索
  16. Gyroscope in smartphone 手机中的陀螺仪传感器
  17. nginx配置静态页面html,nginx 服务器配置静态网页
  18. 计算机语言中beta是什么意思,Tea语言迎来1.0第一个Beta版本
  19. Unity篇——Minimap小地图
  20. mysql 日志重做,設置MySQL重做日志大小

热门文章

  1. 上网方式不正确导致路由器无法连接外网
  2. html代码硬件加速优化,详解CSS3开启硬件加速的使用和坑
  3. 计算机考研复试-离散数学
  4. 饭局给领导送礼被打脸,高手用这3个技巧,感情和人脉“双到位”
  5. 室内装饰培训 室内设计如何学习
  6. 使用雪碧图Css Sprite精灵 | 加速网页响应速度
  7. c++ 并发-读写锁(shared_mutex,shared_lock)
  8. wordpress linux 目录,Linux系统二级目录无法安装Wordpress解决办法 | 无忧主机
  9. Turtle库入门案例:Python一键画出海绵宝宝小可爱!!
  10. java poi 导出xlsx_java 使用poi存储Excel(.xlsx格式)