分类
外汇交易新手指南

2行程式碼完成均線交叉策略

plan1和plan2同时存在的盈利区间。

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

在这里插入图片描述

运行效果如下图所示:

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

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

在这里插入图片描述

输出结果如图:

1.5 直接使用mplfinance库来绘制

在这里插入图片描述

图像效果如下:

2.加权移动平均

2.1 加权移动平均数

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

2.3 绘制加权移动平均线

在这里插入图片描述

图像效果展示如下:

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 * 前一天指数移动平均
后边的按此公式以此类推。

  • 由其计算特点可知,即便选择的时间跨度相同,权重相同。选择的研究日期起点不同,指数加权移动平均数也会不同。因为首个值是用算术平均的方法计算的。

3.2 指数加权移动平均线

在这里插入图片描述

结果如图所示:

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

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 绘图代码

在这里插入图片描述

生成结果如下:

6.3常用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指标的形态分析也是一大关注焦点,可以套用一般的形态分析理论与方法。
  1. 先求出DIF(离差值,快线)、DEA(信号线,慢线)的值;
  2. DIF、DEA均为正,DIF向上突破DEA,买入信号。
  3. DIF、DEA均为负,DIF向下跌破DEA,卖出信号。

版权声明: 本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

python股票量化交易(1)---K线图、均线与成交量绘制

python股票量化交易(1)---K线图、均线与成交量绘制_成交量

作者:悠悠做神仙:恒生LIGHT云社区 上一篇文章 量化交易入门系列1:编程语言与数据源,介绍了关于量化交易的基本概念,以及要做量化交易的编程语言选择,和量化交易的一些数据源获取工.

Python量化交易学习笔记(21)——A股股票列表更新

Python量化交易学习笔记(14)——均线交叉策略

Python量化交易学习笔记(39)——BaoStock股票数据下载

Python量化交易实战-42双均线策略股票量化交易模拟实战

Python量化交易学习笔记(16)——策略筛股

Python量化交易学习笔记(3)——第一个策略回测程序v1

Python量化交易学习笔记(41)——深度学习挖短线股1

python股票量化交易(10)-使用机器学习算法预测股票涨跌

Python量化交易学习笔记(45)——深度学习挖短线股5

Python量化交易学习笔记(19)——连续下跌买入止盈止损卖出策略

Python量化交易学习笔记(17)——多只股票同时策略回测

Python量化交易学习笔记(15)——衍生数据

Python量化交易学习笔记(5)——第一个策略回测程序v3

在v1和v2部分,以及搭建好了回测的基础框架,v3则是在程序中加载真实的股票数据。程序v3-添加价格数据(Data Feed):from_future_import(absolute_import,division,print_function,unicode_literals)import datetime.

2行程式碼完成均線交叉策略

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: [email protected]

stock-ma

前言

目录

1. 移动平均线

计算公式: MA = (C1+C2+C3+C4+C5+….+Cn)/n ,C为收盘价,n为移动平均周期数例如,5日移动平均价格计算方法为:

  • 简单移动平均线(SMA):又称“算术移动平均线”,是指对特定期间的收盘价进行简单平均化的意思。一般所提及之移动平均线即指简单移动平均线(SMA)。
  • 加权移动平均线(WMA):加权移动平均线(Weighted Moving Average 简称WMA),是一种按时间进行加权运算的移动平均线。时间越近越近的价格,权重越大。计算方式是基于加权移动平均线日数,将每一个之前日 数比重提升。每一价格会乘以一个比重,最新的价格会有最大的比重,其之前的每一日的比重将会递减。加权移动平均线是移动平均线(MA)的改良。
  • 指数平滑移动平均线(EMA):指数平滑移动平均线EXPMA(Exponential Moving Average),为解决一旦价格已脱离均线差值扩大,而平均线未能立即反应,EXPMA可以减少类似缺点。

2. 均线模型

300104

以乐视网(300104)股票日K图为例,截取2012年8月到2014年7月的股价数据。

  • 黄金交叉,当10日均线由下往上穿越30日均线,10日均线在上,30日均线在下,其交叉点就是黄金交叉,黄金交叉是多头的表现,出现黄金交叉后,后市会有一定的涨幅空间,这是进场的最佳时机。
  • 死亡交叉,当30日均线与10日平均线交叉时,30日均线由下住上穿越10日平均线,形成30日平均线在上,10日均线在下时,其交点称之为”死亡交叉”,”死亡交叉”预示空头市场来临,股市将下跌此时是出场的最佳时机。
  • 移动平均线是股价定型后产生的图形,反映较慢,只适用于日间交易。
  • 移动平均线不能反映股价在当日的变化及成交量的大小,不适用于日内交易。
  • 移动平均线是趋势性模型,如果股价未形成趋势,只是频繁波动,模型不适用。

3. 用R语言实现均线模型

3.1 从互联网下载数据

利用quantmod包的getSymbols()函数,默认会通过Yahoo的金融开放API下载数据,我们选择IBM的股票数据,从2010-01-01到今天2014-07-09的4年多的日间交易数据。数据类型为xts格式的时间序列,数据包括7个列,以日期做索引列,其他6列分别为 开盘价(Open), 最高价(High), 最低价(Low), 收盘价(Close), 交易量(Volume), 调整价(Adjusted)。

3.2 实现简单的蜡烛图

ibm_1

ibm_2

3.3 自定义均线图

  • 日期时间序列为索引
  • 收盘价做为价格指标
  • 不考虑成交量及其他维度字段
  • 取2010-01-01至2012-01-01,形成趋势的数据
  • 画出价格曲线,5日均线,20日均线,60日是均线

maline

3.4 2行程式碼完成均線交叉策略 一条均线的交易策略

  • 1. 以股价和20日均线的交叉,进行交易信号的判断。
  • 2. 当股价上穿20日均线则买入(红色),下穿20日均线卖出(蓝色)。

line1_1

line1_2

line1_3

3.5 二条均线的交易策略

line2_1

line2_2

line2_3

3.6 对比两个模型的盈利情况

line3_1

plan1的盈利区间。

line3_2

plan1和plan2同时存在的盈利区间。

2行程式碼完成均線交叉策略

来源:网络综合 53 2022-05-29


百倍加速!Python量化策略的算法性能提升指南

# 这个测试目标在于仿造一个类似于实盘中,不断有新的数据推送过来, # 然后需要计算移动平均线数值,这么一个比较常见的任务。 from __future__ import divisionimport timeimport random # 生成测试用的数据 data = [] data_length = 100000 # 总数据量 ma_length = 500 # 移动均线的窗口 test_times = 10 # 测试次数for i in range(data_length): data.append(random.randint(1, 100))

测试用电脑的配置情况:Core i7-6700K 4.0G/16G/Windows 7。

# 计算500期的移动均线,并将结果保存到一个列表里返回def ma_basic(data, ma_length): # 用于保存均线输出结果的列表 ma = [] # 计算均线用的数据窗口 data_window = data[:ma_length] # 测试用数据(去除了之前初始化用的部分) test_data = data[ma_length:] # 模拟实盘不断收到新数据推送的情景,遍历历史数据计算均线 for new_tick in test_data: # 移除最老的数据点并增加最新的数据点 data_window.pop(0) data_window.append(new_tick) # 遍历求均线 sum_tick = 0 for tick in data_window: sum_tick += tick ma.append(sum_tick/ma_length) # 返回数据 return ma # 运行测试 start = time.time()for i in range(test_times): result = ma_basic(data, ma_length) time_per_test = (time.time()-start)/test_times time_per_point = time_per_test/(data_length - ma_length) print u'单次耗时:%s秒' %time_per_test print u'单个数据点耗时:%s微秒' %(time_per_point*1000000) print u'最后10个移动平均值:', result[-10:]

大约10万个数据点(说大约因为有500个用于初始化了),这个测试结果不能说很好但也还过得去。考虑到一个简单的双均线CTA策略(Double SMA Strategy),每个数据点来了后会进行两次均线计算,通常均线窗口不会超过500,且比较两根均线交叉情况的算法开销更低,估计策略单纯在信号计算方面的耗时会在30微秒以内,对于一个通常跑在1分钟线甚至更高时间周期上的策略而言已经是绰绰有余。

# 改用numpy(首先是一种常见的错误用法)import numpy as np def ma_numpy_wrong(data, ma_length): ma = [] data_window = data[:ma_length] test_data = data[ma_length:] for new_tick in test_data: data_window.pop(0) data_window.append(2行程式碼完成均線交叉策略 new_tick) # 使用numpy求均线,注意这里本质上每次循环 # 都在创建一个新的numpy数组对象,开销很大 data_array = np.array(data_window) ma.append(data_array.mean()) return ma

# numpy的正确用法def ma_numpy_right(data, ma_length): ma = [] # 用numpy数组来缓存计算窗口内的数据 data_window = np.array(data[:ma_length]) test_data = data[ma_length:] for new_tick in test_data: # 使用numpy数组的底层数据偏移来实现数据更新 data_window[0:ma_length-1] = data_window[1:2行程式碼完成均線交叉策略 ma_length] data_window[-1] = new_tick ma.append(data_window.mean()) return ma

# 使用numba加速,ma_numba函数和ma_basic完全一样import numba @numba.jit def ma_numba(data, ma_length): ma = [] data_window = data[:ma_length] test_data = data[ma_length:]for new_tick 2行程式碼完成均線交叉策略 in test_data: data_window.pop(0) data_window.append(new_tick) sum_tick = 0 for tick in data_window: sum_tick += tick ma.append(sum_tick/ma_length)return ma

# 将均线计算改写为高速算法def ma_online(data, ma_length): ma = [] data_window = data[:ma_length] test_data = data[ma_length:] # 缓存的窗口内数据求和结果 sum_buffer = 0 for new_tick in test_data: old_tick = data_window.pop(0) data_window.append(new_tick) # 如果缓存结果为空,则先通过遍历求第一次结果 if not sum_buffer: sum_tick = 0 for tick in data_window: sum_tick += tick ma.append(sum_tick/ma_length) # 将求和结果缓存下来 sum_buffer = sum_tick else: # 这里的算法将计算复杂度从O(n)降低到了O(1) sum_buffer = sum_buffer - old_tick + new_tick ma.append(sum_buffer/ma_length) return ma

# 高速算法和numba结合,ma_online_numba函数和ma_online完全一样 2行程式碼完成均線交叉策略 @numba.jit def ma_online_numba(data, ma_length): ma = [] data_window = data[:ma_length] test_data = 2行程式碼完成均線交叉策略 data[ma_length:] sum_buffer = 0 for new_tick in test_data: old_tick = data_window.pop(0) data_window.append(new_tick) if not sum_buffer: sum_tick = 0 for tick in data_window: sum_tick += tick ma.append(sum_tick/ma_length) sum_buffer = sum_tick else: sum_buffer = sum_buffer - old_tick + new_tick ma.2行程式碼完成均線交叉策略 append(sum_buffer/ma_length) return ma

# 基础的cython加速def ma_cython(data, ma_length): ma = [] data_window = data[:ma_length] test_data = data[ma_length:] for new_tick in test_data: data_window.pop(0) data_window.append(new_tick) sum_tick = 0 for tick in data_window: sum_tick += tick ma.append(sum_tick/ma_length) return ma

# cython和高速算法def ma_cython_online(data, ma_length): # 静态声明变量 cdef int sum_buffer, sum_tick, old_tick, new_tick ma = [] data_window = data[:ma_length] test_data = data[ma_length:] sum_buffer = 0 for new_tick in test_data: old_tick = data_window.pop(0) data_window.append(new_tick) if not sum_buffer: sum_tick = 0 for tick in data_window: sum_tick += tick ma.append(sum_tick/ma_length) sum_buffer = sum_tick else: sum_buffer = sum_buffer - old_tick + new_tick ma.append(sum_buffer/ma_length) return ma