WeQuant交易策略—简单均线
简单双均线策略(Simple Moving Average)
策略介绍
简单双均线策略,通过一短一长(一快一慢)两个回看时间窗口收盘价的简单移动平均绘制两条均线,利用均线的交叉来跟踪价格的趋势。这里说的简单是指在求平均值的时候采用的是算术平均数(就是求和再除以总数),有些更为复杂的求平均值得方法,如加权移动平均,指数加权移动平均等等。我们这个策略只使用最基本的算术平均。移动平均线是股票趋势策略中最常见技术手段。
计算方法(以日频率举例)
N日移动平均(MA)的计算:
MA(N) = 最近N天的收盘价之和 / N
使用方法
我们选定一个短期一个长期两个时间窗口(如常见的5日和20日,10日和40日等等),分别绘制出短期和长期的简单移动平均线。短期均线要比长期均线更为敏感,变化更快。
(1) 当短期均线自下而上突破长期均线(或突破一定比例)时,产生买入信号
(2) 当短期均线自上而下跌破长期均线(或跌破一定比例时),产生卖出信号
优点
简单双均线策略计算很容易,看起来又一目了然,很容易帮助了解市场走势,使用效果较好,深受投资者的喜爱。
缺点
双均线对于趋势的行情跟踪的非常好,但是在震荡行情中表现较差。短均线和长均线可能会纠缠在一起,出现来回多次的假突破,甚至造成高买低卖的情况。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 策略代码总共分为三大部分,1)PARAMS变量 2)initialize函数 3)handle_data函数
# 请根据指示阅读。或者直接点击运行回测按钮,进行测试,查看策略效果。
# 策略名称:简单双均线策略
# 策略详细介绍:https://wequant.io/study/strategy.simple_moving_average.html
# 关键词:价格突破、趋势跟踪。
# 方法:
# 1)计算一长一短两个时间窗口的价格均线
# 2)利用均线的突破来决定买卖
import numpy as np
# 阅读1,首次阅读可跳过:
# PARAMS用于设定程序参数,回测的起始时间、结束时间、滑点误差、初始资金和持仓。
# 可以仿照格式修改,基本都能运行。如果想了解详情请参考新手学堂的API文档。
PARAMS = {
"start_time": "2017-02-01 00:00:00", # 回测起始时间
"end_time": "2017-08-01 00:00:00", # 回测结束时间
"slippage": 0.003, # 此处“slippage"包含佣金(千二)+交易滑点(千一)
"account_initial": {"huobi_cny_cash": 100000,
"huobi_cny_btc": 0}, # 设置账户初始状态
}
# 阅读2,遇到不明白的变量可以跳过,需要的时候回来查阅:
# initialize函数是两大核心函数之一(另一个是handle_data),用于初始化策略变量。
# 策略变量包含:必填变量,以及非必填(用户自己方便使用)的变量
def initialize(context):
# 设置回测频率, 可选:"1m", "5m", "15m", "30m", "60m", "4h", "1d", "1w"
context.frequency = "15m"
# 设置回测基准, 比特币:"huobi_cny_btc", 莱特币:"huobi_cny_ltc", 以太坊:"huobi_cny_eth"
context.benchmark = "huobi_cny_btc"
# 设置回测标的, 比特币:"huobi_cny_btc", 莱特币:"huobi_cny_ltc", 以太坊:"huobi_cny_eth"
context.security = "huobi_cny_btc"
# 设置策略参数
# 计算短线所需的历史bar数目,用户自定义的变量,可以被handle_data使用
context.user_data.window_short = 5
# 计算长线所需的历史bar数目,用户自定义的变量,可以被handle_data使用
context.user_data.window_long = 20
# 入场线, 用户自定义的变量,可以被handle_data使用
context.user_data.enter_threshold = 0.00
# 出场线, 用户自定义的变量,可以被handle_data使用
context.user_data.exit_threshold = 0.00
# 阅读3,策略核心逻辑:
# handle_data函数定义了策略的执行逻辑,按照frequency生成的bar依次读取并执行策略逻辑,直至程序结束。
# handle_data和bar的详细说明,请参考新手学堂的解释文档。
def handle_data(context):
# 获取历史数据, 取后window_long根bar
hist = context.data.get_price(context.security, count=context.user_data.window_long, frequency=context.frequency)
if len(hist.index) < context.user_data.window_long:
context.log.warn("bar的数量不足, 等待下一根bar...")
return
# 计算短均线值
close = np.array(hist["close"])
short_mean = np.mean(hist["close"][-1 * context.user_data.window_short:])
# 计算长均线值
long_mean = np.mean(hist["close"][-1 * context.user_data.window_long:])
# 价格上轨
upper = long_mean + context.user_data.enter_threshold * long_mean
# 价格下轨
lower = long_mean - context.user_data.exit_threshold * long_mean
context.log.info("当前 短期均线 = %s, 长期均线 = %s, 上轨 = %s, 下轨 = %s" % (short_mean, long_mean, upper, lower))
# 短期线突破长期线一定比例,产生买入信号
if short_mean > upper:
context.log.info("短期均线穿越上轨,产生买入信号")
if context.account.huobi_cny_cash >= HUOBI_CNY_BTC_MIN_ORDER_CASH_AMOUNT:
# 有买入信号,且持有现金,则市价单全仓买入
context.log.info("正在买入 %s" % context.security)
context.log.info("下单金额为 %s 元" % context.account.huobi_cny_cash)
context.order.buy_limit(context.security, quantity=str(context.account.huobi_cny_cash/close[-1]*0.98), price=str(close[-1]*1.02))
else:
context.log.info("现金不足,无法下单")
# 短期线低于长期线一定比例,产生卖出信号
elif short_mean < lower:
context.log.info("短期均线穿越下轨,产生卖出信号")
if context.account.huobi_cny_btc >= HUOBI_CNY_BTC_MIN_ORDER_QUANTITY:
# 有卖出信号,且持有仓位,则市价单全仓卖出
context.log.info("正在卖出 %s" % context.security)
context.log.info("卖出数量为 %s" % context.account.huobi_cny_btc)
context.order.sell_limit(context.security, quantity=str(context.account.huobi_cny_btc), price=str(close[-1]*0.98))
else:
context.log.info("仓位不足,无法卖出")
else:
context.log.info("无交易信号,进入下一根bar")
15m回测

30m

60m

4h

1d

1w

本策略采用了5小时和20小时均线来回测。
5小时均线 > 20小时均线 * (1+入场线),产生买入信号;
5小时均线 < 20小时均线 * (1-出场线),产生卖出信号。
这里入场线和出场线都设置为0,只要快线穿过慢线,就会产生交易信号。这样设置主要是因为我们采用小时为单位回测,希望抓住短期的价格波动,所以出入场线的设置要宽松一些,否则很难产生交易信号。如果以日为单位,希望捕捉大的趋势,则可以适当调大出入场线,使信号更加严格,只有当趋势确定形成时才交易,防止短期震荡产生干扰信号。
从回测结果可以看出,策略在判断行情,捕捉趋势上,十分成功,抓住了几波大幅的上涨,并且在下跌中能较早离场,锁定收益,最大回撤只有12%左右,远远好于基准。
由于虚拟货币市场波动很大,没有涨跌幅限制,所以暴涨暴跌可以在很短的时间内完成, 一天内的波动涨跌可以很大。所以本策略如果以日为单位,效果并不理想。策略没有跑赢基础,而且波动很大,在暴跌中反应迟缓,对市场变化不能及时做出反馈。
总结
简单双均线是一种简单而又有效的策略,逻辑清楚,买卖信号明确,非常适合初学者使用。在十分不稳定的虚拟货币市场,长周期(如日、周、月等)的均线滞后性明显,不适合用来产生买卖信号。
WeQuant交易策略—简单均线的更多相关文章
- WeQuant交易策略—网格交易
网格交易策略(Grid Trading) 策略介绍 网格策略本质上是一种低吸高抛的策略.标的物价格越低,吸纳的头寸越多:标的物价格越高,卖出的头寸越多.网格策略巧妙地借鉴了日常生活中渔翁撒网扑鱼的思路 ...
- WeQuant交易策略—5日均线
简单的价格突破策略.当前价格超过最近5个收盘价的均价,则全仓买入:低于均价,则全仓卖出 代码 # 简单的价格突破策略.当前价格超过最近5个收盘价的均价,则全仓买入:低于均价,则全仓卖出 # PARAM ...
- WeQuant交易策略—BOLL
BOLL(布林线指标)策略 简介 BOLL(布林线)指标是技术分析的常用工具之一,由美国股市分析家约翰•布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标.一般而言,价格的运动总是围 ...
- WeQuant交易策略—EMV
EMV指标策略 简介 EMV(Ease of Movement Value, 简易波动指标),它是由RichardW.ArmJr.根据等量图和压缩图的原理设计而成, 目的是将价格与成交量的变化结合成一 ...
- WeQuant交易策略—Dual Thrust
Dual Thrust策略 策略介绍 Dual Thrust是一个趋势跟踪系统,由Michael Chalek在20世纪80年代开发,曾被Future Thruth杂志评为最赚钱的策略之一. Dual ...
- WeQuant交易策略—ATR
ATR(真实波幅均值)策略 策略介绍 ATR(average true range,真实波幅均值),是用来衡量一段时间内价格的真实的平均波动范围,ATR不是一个领先指标,但是它测量最重要的市场参数之一 ...
- WeQuant交易策略—RSI
RSI指标策略 策略介绍 RSI(相对强弱指标),是通过一段时期内的平均收盘上涨和下跌数,计算价格上涨所产生的波动占整个波动的百分比,来分析市场买卖盘的意向和实力. 计算公式(以日为单位举例) RSI ...
- WeQuant交易策略—KDJ
KDJ随机指标策略策略介绍KDJ指标又叫随机指标,是一种相当新颖.实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具.随机指标KDJ ...
- WeQuant交易策略—MACD
MACD(指数平滑异同平均线)策略简介MACD指标应该是大家最常见的技术指标,在很多股票.比特币的软件中都是默认显示的.MACD是从双指数移动平均线发展而来的.意义和双移动平均线基本相同,即由快.慢均 ...
随机推荐
- iOS是最安全的?苹果iOS恶意软件数量增速首次超过Android
之前小编还说Android系统似乎已经成为世界各地病毒作者的首选目标,但是近日一份安全研究报告让小编啪啪打脸. Skycure的移动安全报告显示,近三个季度内,在iOS上运行的恶意软件增加了2倍多,而 ...
- javascript王国的一次旅行,一个没有类的世界怎么玩转面向对象?
1. 前言 作为Java 帝国的未来继承人,Java小王子受到了严格的教育, 不但精通Java语言.Java虚拟机.java类库和框架,还对各种官方的Java规范了如指掌. 近日他听说一个叫做Java ...
- Infer 在 Mac 上的安装和环境配置
Infer 在 Mac 上的安装和环境配置 Infer 介绍 Infer 是一个静态分析工具.Infer 可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题. 任何人都可以使 ...
- Linux下 两台机器文件/文件夹 相互拷贝
Linux下 两台机器文件/文件夹 相互拷贝 设有两台机器 :A:*.101及 B:*.102. 把A下的.temp/var/a.txt拷贝到B机器的/text/目录下: 进入B机器:scp root ...
- Dubbo负载均衡策略
在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用. 可以自行扩展负载均衡策略,参见:负载均衡扩展Random LoadBalance 随机,按权重设置随机概率. 在一个截面上 ...
- Python Socket 简单聊天室2
上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- 每周问题系列 - JavaFX界面没响应,Maven编译自动忽略rt包
本人博客文章网址:https://www.peretang.com/weekly-problem-session-week-31/ 前言 新开一个系列, 用来记录每周遇到的问题 JavaFX界面没响应 ...
- swift 获取文件大小
//获取文件大小 func getSize(url: URL)->UInt64 { var fileSize : UInt64 = 0 do { let attr = try FileManag ...
- SpringBoot基础梳理
1.入口类和@SpringBootApplication注解: SpringBoot通常有一个名为*Application的入口类,入口类里面有main方法,我们可以通过启动main方法启动sprin ...
- Cordova + idea 环境搭建
1.安装前期工作 1).安装Node.js http://nodejs.cn/download/ 里面内置了npm,可以用来安装 Cordova,把该路径添加到环境变量,这样就可以在 cmd 里面任何 ...