python实现技术指标(简单移动平均,加权移动平均线,指数移动平均线)

本文主要是介绍python实现技术指标(简单移动平均,加权移动平均线,指数移动平均线),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

移动平均线是最常见的技术指标,它能够去除时间序列的短期波动,使得数据变得平滑,从而可以方便看出序列的趋势特征。常见的移动平均线有简单移动平均线,加权移动平均线,指数移动平均线。

一. 简单移动平均(SMA)

简单移动平均线(Simple Moving Average),很好理解,就是将过去n个窗口内的价格进行算术平均
S M A t ( n ) = 1 n ( X t − n + 1 + X t − n + 2 + . . . + X t ) SMA_t(n) = \frac{1}{n}(X_{t-n+1} + X_{t-n+2} + ... + X_t) SMAt(n)=n1(Xtn+1+Xtn+2+...+Xt)

以下是贵州茅台从 2018.6.1 2018.6.1 2018.6.1 2019.12.31 2019.12.31 2019.12.31收盘价的简单移动平均线。

import pandas as pd
import baostock as bs
import matplotlib.pyplot as pltdef get_data(code, start_date, end_date):lg = bs.login()rs = bs.query_history_k_data_plus(code,"date,code,open,high,low,close,volume",start_date=start_date, end_date=end_date,frequency="d", adjustflag="3")data_list = []while (rs.error_code == '0') & rs.next():data_list.append(rs.get_row_data())result = pd.DataFrame(data_list, columns=rs.fields)bs.logout()result['date'] = pd.to_datetime(result['date'])result['open'] = result['open'].astype(float)result['high'] = result['high'].astype(float)result['low'] = result['low'].astype(float)result['close'] = result['close'].astype(float)result['volume'] = result['volume'].astype(float)result.set_index(result['date'], inplace=True)return resultif __name__ == '__main__':data = get_data('sh.600519', '2018-06-01', '2019-12-31')data['SMA10'] = data['close'].rolling(10).mean()data['SMA20'] = data['close'].rolling(20).mean()fig = plt.figure(figsize=(20, 10))ax = fig.add_subplot()ax.plot(data.index, data['close'], linestyle='--', label='close')ax.plot(data.index, data['SMA10'], label='SMA10')ax.plot(data.index, data['SMA20'], label='SMA20')ax.legend()plt.show()

在这里插入图片描述

二. 加权移动平均(WMA)

加权移动平均(Weighted Moving Average)在计算平均值时,对最近的数据赋予的权重比历史数据的权重要大。
W M A ( n ) t = n X t + ( n − 1 ) X t − 1 + . . . + 2 X t − n + 2 + X t − n + 1 n + ( n − 1 ) + . . . + 2 + 1 WMA(n)_t = \frac{nX_t + (n-1)X_{t-1} + ... + 2X_{t-n+2} + X_{t-n+1}}{n + (n - 1) + ...+ 2 + 1} WMA(n)t=n+(n1)+...+2+1nXt+(n1)Xt1+...+2Xtn+2+Xtn+1

以下是贵州茅台从 2018.6.1 2018.6.1 2018.6.1 2019.12.31 2019.12.31 2019.12.31收盘价的加权移动平均线。

import numpy as np
import pandas as pd
import baostock as bs
import matplotlib.pyplot as pltdef get_data(code, start_date, end_date):lg = bs.login()rs = bs.query_history_k_data_plus(code,"date,code,open,high,low,close,volume",start_date=start_date, end_date=end_date,frequency="d", adjustflag="3")data_list = []while (rs.error_code == '0') & rs.next():data_list.append(rs.get_row_data())result = pd.DataFrame(data_list, columns=rs.fields)bs.logout()result['date'] = pd.to_datetime(result['date'])result['open'] = result['open'].astype(float)result['high'] = result['high'].astype(float)result['low'] = result['low'].astype(float)result['close'] = result['close'].astype(float)result['volume'] = result['volume'].astype(float)result.set_index(result['date'], inplace=True)return resultif __name__ == '__main__':data = get_data('sh.600519', '2018-06-01', '2019-12-31')n = 10weights = np.array(range(1, n + 1))weights_sum = np.sum(weights)data['WMA10'] = data['close'].rolling(window=n, min_periods=n).apply(lambda x: np.sum(x * weights) / weights_sum)fig = plt.figure(figsize=(20, 10))ax = fig.add_subplot()ax.plot(data.index, data['close'], linestyle='--', label='close')ax.plot(data.index, data['WMA10'], label='WMA10')ax.legend()plt.show()

在这里插入图片描述

三. 指数移动平均(EMA)

指数移动平均(Exponential Moving Average)跟加权移动平均类似,只是它对最近的数据赋予了更高的权重。
E M A t = α X t + ( 1 − α ) E M A t − 1 EMA_t = {\alpha}X_t + (1-\alpha)EMA_{t-1} EMAt=αXt+(1α)EMAt1
α \alpha α一般取 2 / ( n + 1 ) 2/(n + 1) 2/(n+1), n n n为数据序列长度,pandas中计算EMA一般可以使用ewm方法。

以下是贵州茅台从 2018.6.1 2018.6.1 2018.6.1 2019.12.31 2019.12.31 2019.12.31收盘价的指数移动平均线。

import numpy as np
import pandas as pd
import baostock as bs
import matplotlib.pyplot as pltdef get_data(code, start_date, end_date):lg = bs.login()rs = bs.query_history_k_data_plus(code,"date,code,open,high,low,close,volume",start_date=start_date, end_date=end_date,frequency="d", adjustflag="3")data_list = []while (rs.error_code == '0') & rs.next():data_list.append(rs.get_row_data())result = pd.DataFrame(data_list, columns=rs.fields)bs.logout()result['date'] = pd.to_datetime(result['date'])result['open'] = result['open'].astype(float)result['high'] = result['high'].astype(float)result['low'] = result['low'].astype(float)result['close'] = result['close'].astype(float)result['volume'] = result['volume'].astype(float)result.set_index(result['date'], inplace=True)return resultif __name__ == '__main__':data = get_data('sh.600519', '2018-06-01', '2019-12-31')[['date', 'close']]data['EMA10'] = data['close'].ewm(span=10, adjust=True).mean()fig = plt.figure(figsize=(20, 10))ax = fig.add_subplot()ax.plot(data.index, data['close'], linestyle='--', label='close')ax.plot(data.index, data['EMA10'], label='EMA10')ax.legend()plt.show()

在这里插入图片描述

四. 对比三种均线
1. 三种均线的权重对比

从权重思维来看,三种方法都可以认为是加权平均。

  • SMA:权重系数一致
  • WMA:权重系数随时间间隔线性递减
  • EMA:权重系数随时间间隔指数递减

下面通过程序展示三种均线的权重系数的递减情况

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltif __name__ == '__main__':n = 30# 简单移动平均权重weight_sma = np.ones(n)# 加权移动平均weights_wma = range(1, n + 1)weights_wma /= np.sum(weights_wma)weights_wma = weights_wma[::-1]# 指数移动平均alpha = 2 / (n + 1)t = np.array(range(0, n))weights_ema = alpha * (1 - alpha) ** tdf = pd.DataFrame({"SMA30-Weights": weight_sma, "WMA30-Weights": weights_wma, "EMA30-Weights": weights_ema})ax = df.plot.bar(subplots=True, figsize=(16, 6), title=['', '', ''])plt.show()

在这里插入图片描述
从上图中的权重系数随时间间隔衰减情况可以看出,指数移动平均系数衰减较快,也因此一般也能更快的发现趋势的变化。

2. 三种均线可视化

下面展示贵州茅台从2018.6.1到2019.12.31收盘价的三种移动均线。

import numpy as np
import pandas as pd
import baostock as bs
import matplotlib.pyplot as pltdef get_data(code, start_date, end_date):lg = bs.login()rs = bs.query_history_k_data_plus(code,"date,code,open,high,low,close,volume",start_date=start_date, end_date=end_date,frequency="d", adjustflag="3")data_list = []while (rs.error_code == '0') & rs.next():data_list.append(rs.get_row_data())result = pd.DataFrame(data_list, columns=rs.fields)bs.logout()result['date'] = pd.to_datetime(result['date'])result['open'] = result['open'].astype(float)result['high'] = result['high'].astype(float)result['low'] = result['low'].astype(float)result['close'] = result['close'].astype(float)result['volume'] = result['volume'].astype(float)result.set_index(result['date'], inplace=True)return result# 简单移动平均
def sma_demo(data, n):data['SMA20'] = data['close'].rolling(window=n, min_periods=n).mean()return data# 加权移动平均
def wma_demo(data, n):weights = np.array(range(1, n + 1))weights_sum = np.sum(weights)data['WMA20'] = data['close'].rolling(window = n, min_periods=n).apply(lambda x: np.sum(x * weights) / weights_sum)return data# 指数平均
def ema_demo(data, n):data['EMA20'] = data['close'].ewm(span=n, min_periods=n, adjust=True).mean()return dataif __name__ == '__main__':data = get_data('sh.600519', '2018-06-01', '2019-12-31')[['close']]data = sma_demo(data, 20)data = wma_demo(data, 20)data = ema_demo(data, 20)fig = plt.figure(figsize=(30, 20))ax = fig.add_subplot()ax.plot(data.index, data['close'], linestyle='--', label='close')ax.plot(data.index, data['SMA20'], label='SMA20')ax.plot(data.index, data['WMA20'], label='WMA20')ax.plot(data.index, data['EMA20'], label='EMA20')ax.legend()plt.show()

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

这篇关于python实现技术指标(简单移动平均,加权移动平均线,指数移动平均线)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088161

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服