网格交易法以及在数字货币中基于Python的量化实现

介绍

我一直觉得程序员都应该试试量化投资,因为在投资里最忌讳的就是情绪波动,而程序员们都相对理性一些,更加愿意相信规则与数据,而同时程序员们又有能力去实现自动交易,所以我这篇文章主要的目标是面向程序员,给大家介绍一些投资、交易里面比较初级的东西以及背后的原理,关于代码部分会少一些特别细节的说明。所以这篇文章需要的大概背景是会 Python 就行。

网格交易是一个很好的入门的策略。在交易里,我们会有像哲学三大问题一样的疑问:

  • 买什么
  • 什么时候买,什么时候卖
  • 买多少,卖多少

而网格交易主要针对的就是后两个问题的,尝试性地给出一种答案

遇到的问题

废话不多说,先上一个例子。

例子1

这张图是黄金在 19年10月10日 到 23日左右1小时的一个走势图。之前是更高的位置,然后经历一次 0.9% 的下跌到了A的位置,然后又在B的位置跌了一个 0.77%,已知在这段时间里黄金都是一个振荡的趋势。这时候我们经常就会听见一些分析师大概会分享这么个说法(或者类似的说法):

  1. 在振荡盘中,A处是上方跌下来的,并且保持了一段时间,所以这个是一个阻力位,而B这个位置是一个支撑位,所以我们在这个振荡区间里,就可以做高抛低吸。

  2. 简单来说就是如果我们还有持仓,那我们在 C 这个位置就应该抛掉,如果我们错过了C,这个市场还给了我们 D,E两次机会,如果都没抛掉,那在F的时候就跌下来了。

  3. 而如果我们这时到了 F 这个位置后呢,因为有 B 这个支撑点,所以可以开始买入。

  4. 然后一直到 H 处,又来到了上方阻力位,然后我们就可以卖出

这个说法好像听起来不错,理论都是好的,但是实际情况是什么样的呢?假设对于处于振荡区间这点是确定的条件了,我们实际上会遇到的情况将会是这样的:[图2]

阻力线

哪条才是阻力线? 又或者: [图3]

支撑线

哪条才是支撑线?

如果图2里我们说用之前跌的最低点作为阻力的话,那在图2里最后一根大涨起来之前的一个绿十字星要卖么?还是冒险等一等真的上穿阻力了才卖?
同理如果图3里我们也用之前收盘最低点作为支撑线的话,那最后一根大跌的红线结束后我们要卖么?这时候可是还没跌破支撑哦。

所以这其实就是我们遇到的实际情况,看上去好像我们有一个很详细的操作策略,但到了实盘的时候,我们其实并没有很明确的标准,而最初第一张图里分析师的那些说法虽然没错,但却犯了一个很经典的量化里面的错误就是 “未来函数”,简单的说就是在画线的时候,我是根据未来一段时间的情况画的线,然后再来指导我们当下每个时间点的分析,相当于预知未来了。(这让我想起了小时候老师讲卷子,拿着答案给我们讲过程,讲的头头是道最后发现拿错了一份答案)

网格交易给出的答案

而网格交易的方案是这样的(先看个大概,再下一节有针对每一步的例子):

  • 第一步,先估计出未来看盘时间的震荡范围,高值和低值都不用特别找某个特殊值,确定一个就可以。这个高值意味着如果价格超过这点时,我们仓位就会是空仓,而低值意味着如果价格掉到这个值以下,我们就是满仓。到现在为止和刚才的支撑止损线都还是一致的。

  • 第二步,选定网格数量,这里我们为了方便计算,就选定为10条线分为11个格子,这样就可以每10%一档从空仓0% 到满仓 100% 全都覆盖了。然后我们为了避免在一条线附近快速震荡,我们在最下一条线之下再画一条线(本质上来说相当于11条线分为12个格子,但这里这么说主要为了更方便解释和操作)

  • 第三步,确定初始仓位,我们就可以直接按照第一条 K 线的收盘价落在哪个区间来确定仓位

前面的准备工作做好之后,之后的调仓逻辑如下:

  • 记穿越的是第n条线,线从上往下数字增大

  • 如果价格上穿第 n-1 条线,卖 10%

  • 如果价格下穿第 n+1 条线,买 10%

  • 回到调仓逻辑第一步

它和我们普通的交易区别在于什么呢,表面上来看,它把原来的一次交易分成了很多次,实质里有如下一些好处:

  • 越密的网格,交易机会越多(但要注意交易手续费),在前面对比的策略中,不到预计的点不交易,如果振荡幅度不够,就会错过很多次交易机会,而在网格交易里,只要振荡到了一个小的格子,就有一次的交易机会。

  • 每一个格子其实就相当于交易的 “信心度”,价格涨跌信心不足的时候轻仓做,价格涨跌到信心很足的时候重仓做。在交易里,所谓的信心度也就是经常提到的“概率”:数学期望(预期收益)和方差(风险)之间有一个好的比率的时候,就要重仓,如果没有好的比率的时候,就要轻仓甚至空仓

手动操作网格交易

在这里我们把上面的流程举例说一下:

预备阶段

  • 第一步,建立振荡范围,我们计划做黄金19年10月份的交易,下图是黄金19年9月份的走势,可以看出是一个振荡市场,最高在1535左右,最低在1460左右,我们可以随意一些,把高值定为1540,把低值定为 1450:

初始范围

  • 第二步,分为11个格子,以 10%间隔,分别覆盖从 0% 到 100%。下面多画一条绿色的辅助线,

初始画线

  • 第三步,我们来到10月份的图形,黑圈是10月份最初的价格,我们可以看到它是落在70%仓位区间,也就是第8条线之上,所以我们要建立 70% 的仓位(多头,这例子不涉及到做空,下同):

10月份图形

交易阶段

  1. 我们刚建仓,所以在这里 n = 8

  2. 第 n-1 条线也就是第7条线,如果收盘价到了这里,我们就以收盘价卖 10%

  3. 第 n+1 条线也就是第9条线,如果收盘价到了这里,里我们以收盘价买 10%

  4. 接下来的一个事件是一条长绿阳线上穿第7条线,所以我们卖10%(仓位:60%)此时 n = 7,重新计算买卖的价格线:第6条线卖10%,第8条线买10%

  5. 长绿阳线上穿第7条线之后有一小段回落到第7条线以下,但并没有碰到第6条线,所以我们不做操作,否则如果价格在第7条线上下抖动,那么我们来回买卖10%的仓位就会付出大量的手续费,这也是最下面的绿线存在的原因,我们可以模拟数一数最后是下穿绿线才会真正满仓

  6. 随后一直进行下去,如果掉一格就买,涨一格就卖

盈利来源

这样交易怎么赚到的钱呢?我们看下面的简图:

盈利来源

本质上来说,我们在A点建的10%仓是在H点卖掉的,B点建的仓是在G点卖掉的,所以每次我们都有”一格“的利润,所以如果价格在我们框定的范围振荡,那么我们就不断地在以低价买入,高价卖出。

风险点

有收益就会有风险,不讲风险的投资都是耍流氓,在网格交易里主要会遇到的风险有如下几点:

  1. 过高的交易手续费,我们每一格赚到的钱一定要能 cover 住相应手续费

  2. 价格滑点,我们如果买卖量比较大的话,很有可能没办法按我们希望的价格买到或者卖出

  3. 市场不再振荡而是进入趋势,如果市场大跌你就会发现网格交易是满仓跌,如果市场大涨你会发现网格交易是空仓

所以我们在实盘之前要模拟一下这些问题并做一些相应的策略调优,而处理大量数据做模拟盘对于我们程序员来说最好的方式就是:量化交易

BackTrader 介绍

BackTrader 是一个基础的量化框架,当然现在市面上也有很多的宽客平台可以使用,但如果我们做完测试想用真钱做交易的时候,就会遇到一些问题。有些平台可能不支持我们自己账号所在的 broker(比方说数字货币),或者做高频交易的时候没办法选到距离 exchange 最近的服务器来提升速度等,所以我们基于一个开源平台来搭建自己的回测框架和模型就是比较可控的,我们市面上常见的回测框架有 backtrader、zipline 等,在选择平台的时候我综合考虑了代码结构、可扩展性、易用性、性能、文档清晰全面、社区等各因素,最终我选择了 backtrader。

文档地址在这里:backtrader 文档

github项目:github

由于作者是一个严谨的德国人,服务器也放在了德国,所以文档访问起来还是有点慢,有梯子的上梯子,没梯子的我也会在之后的文章里找机会慢慢给大家介绍它的特性。

建立一个策略

安装 backtrader 库:pip install backtrader

建立一个空的策略框架:

import backtrader as btclass GridStrategy(bt.Strategy):def __init__(self):passdef next(self):pass

关于 Python 语言的部分我不过多介绍,如果对 Python 不熟悉的可以先去看看 Python 的文档,关于 Python 进阶一些的东西可以看一下我写的 Python 相关的文章。

在这里我们需要继承一下 bt.Strategy,然后定义自己的构造函数和 next 函数,我们可以在构造函数里初始化一些东西,比方说画格子什么的,但还不能做交易,要做交易的话我们需要在 next 函数里,而 next 函数会被 backtrader 调用,每产生一条新的 K 线就会调用一次。

思路

在上面的网格交易里我们是先确定最大值和最小值,在这里我编程的时候先算出中间值,然后从中间值往上下,价格每改变 0.5% 画一个格子,这样的好处是为了应对过高的手续费问题,如果我们的格子太小,就 cover 不住手续费,如果我们以格子宽度做为参数那我们可以通过调节宽度来一定程度上应对手续费问题。但整体逻辑是一样的,这就好比 距离(高低点差) = 速度(格子宽度) x 时间(格子数量),我们可以任选两个变量从而确定第三个值。

建立一个Indicator

首先我们要根据数据建立一个高点一个低点,然后求中间值,这里我直接用 backtrader 里提供的 indicator 来建立:

def __init__(self):# 1440个单位K线图高点的最高点self.highest = bt.indicators.Highest(self.data.high, period=1440, subplot=False)# 1440个单位K线图低点的最低点self.lowest = bt.indicators.Lowest(self.data.low, period=1440, subplot=False)mid = (self.highest + self.lowest)/2

建立网格

由于 Python 的 range 不支持小数,这里我们用 numpy 库里的 arange

#百分比区间
perc_levels = [x for x in np.arange(1 + 0.005 * 5,#这里多1/2,是因为 arange函数是左闭右开区间。1 - 0.005 * 5 - 0.005/2,-0.005)]
#价格区间
self.price_levels = [mid * x for x in perc_levels]

记录上一次穿越的网格

self.last_price_index = None

交易逻辑

开仓部分

if self.last_price_index == None:for i in range(len(self.price_levels)):if self.data.close > self.price_levels[i]:self.last_price_index = iself.order_target_percent(target=i/(len(self.price_levels) - 1))return

计算 n-1 和 n+1 条线

upper = None #n-1
lower = None #n+1
if self.last_price_index > 0:upper = self.price_levels[self.last_price_index - 1]
if self.last_price_index < len(self.price_levels) - 1:lower = self.price_levels[self.last_price_index + 1]if upper != None and self.data.close > upper:self.last_price_index = self.last_price_index - 1self.order_target_percent(target=self.last_price_index/(len(self.price_levels) - 1))
if lower != None and self.data.close < lower:self.last_price_index = self.last_price_index + 1self.order_target_percent(target=self.last_price_index/(len(self.price_levels) - 1))

其中 order_target_percent函数是直接调整到目标仓位,相当好用,不用考虑买多少卖多少问题

这里有一个问题是有可能一条K线会穿过多个网格,所以我们要处理一下:

#调仓信号
signal = False
while True:upper = Nonelower = Noneif self.last_price_index > 0:upper = self.price_levels[self.last_price_index - 1]if self.last_price_index < len(self.price_levels) - 1:lower = self.price_levels[self.last_price_index + 1]# 还不是最轻仓,继续涨,就再卖一档if upper != None and self.data.close > upper:self.last_price_index = self.last_price_index - 1signal = Truecontinue# 还不是最重仓,继续跌,再买一档if lower != None and self.data.close < lower:self.last_price_index = self.last_price_index + 1signal = Truecontinuebreak
if signal:self.order_target_percent(target=self.last_price_index/(len(self.price_levels) - 1))

剩下的就是一些跑引擎的逻辑,我放在源码里了

回测数据

我这里使用了一段 Binance 的数据,因为数字货币这边提供给我们的数据更细一些,可以让我们有更多的可能性去做回测,然后在没有任何调优的情况下,策略收益:16.5%,持仓不动的收益:15%
数据时间长度是1个月,因为这里是分钟级别的数据,所以我把最高值最低值都按1440分钟的最高最低算,也就是过去一天里的最高最低值作为参考(实际会算成中间值)

回测结果

小结

网格交易法是一个交易策略,但它更是一个仓位管理策略,在这篇文里没有特别涉及到仓位管理主要还是希望能先把网格交易先说明白,能让程序员们了解一下交易的基本东西,这个策略也没做什么优化,并没有加入大跌止损的逻辑,也没有考虑手续费问题,都是为了让内容更集中在网格交易本身。

P.S. 写代码比画图要快多了,作图不易,觉得好还请点个赞,留个言啥的

源码在这里

我的博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35534.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何获取免费的数字货币历史数据

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

数字货币量化交易策略—基于移动平均线MA

本文介绍金融市场中的量化交易策略之移动平均线MA策略。 一、概念 移动平均线&#xff0c;Moving Average&#xff0c;简称MA&#xff0c;MA是用统计分析的方法&#xff0c;将一定时期内的证券价格&#xff08;指数&#xff09;加以平均&#xff0c;并把不同时间的平均值连接…

中国央行将发行全球首个法定数字货币,你准备好了吗?

二月初央行推动的基于区块链的数字票据交易平台已测试成功&#xff0c;由央行发行的法定数字货币已在该平台试运行。这一消息表明中国成为全球首个发行数字货币的国家&#xff0c;长达4年的研究让中国在数字货币领域走在了世界前列。 数字货币是什么&#xff1f;央行又为何如此…

全球传统证券外汇交易商进军区块链数字资产·统计(一)

越来越多合规的基础设施建立完善之后&#xff0c;这些资产管理公司与持牌机构将有能力为这些传统的「老钱」打通投资渠道&#xff0c;那么现有的市场份额会成倍的增加&#xff0c;同时也会打破现有的行业市场格局。 目录 一、eToro互联网券商 二、盈透证券集团 三、TD Ameri…

数字货币量化交易策略操作(61BTC分享)

数字货币基金量化主要进行无风险套利和趋势套利两类操作&#xff0c;其中 无风险套利主要包括&#xff1a; 1、比特币在不同交易所的价差搬砖 2、流通性比较好的代币的三角套利 3、盘口价差很大&#xff0c;交易活跃的盘口套利 4、期货对冲套利。 趋势套利主要包括 5、杠…

mac checkra1n越狱14.0-14.8

首先安装checkra1n 请到官网自行下载安装 All Releases checkra1n 可参考 Sina Visitor System 启动软件件操作 1、 进入初始界面&#xff0c;如果start按键亮到&#xff0c;直接到 3 2、设置步骤内容 如下内容 3、准备开始 4、操作越狱操作界面&#xff08;重点&#x…

iOS逆向一iPhone手机越狱/APP脱壳/IPA签名

全工具&#xff0c;无门槛。 iPhone越狱一一某助手 APP脱壳一一CrackerXI IPA签名一一某助手 iPhone越狱 越狱方法和步骤&#xff1a; 1.下载并打开某助手电脑端&#xff0c;将需要越狱设备连接至电脑。 2.在某助手“工具箱”中&#xff0c;找到并打开“一键越狱”功能。…

iOS安全攻防(二十):越狱检测的攻与防

越狱检测的攻与防 在应用开发过程中,我们希望知道设备是否越狱,正以什么权限运行程序,好对应采取一些防御和安全提示措施。iOS7相比之前版本的系统而言,升级了沙盒机制,封锁了几乎全部应用沙盒可以共享数据的入口。即使在越狱情况下,限制也非常多,大大增加了应用层攻击难…

iOS 越狱-砸壳工具的使用

1.越狱概述 1.1 通过iOS系统安全启动链漏洞&#xff0c;从而禁止掉信任链中负责验证的组件。拿到iOS系统最大权限ROOT权限. 1.2 当启动一台iOS设备时&#xff0c;系统首先会从只读的ROM中读取初始化指令&#xff0c;也就是系统的引导程序(事实上所有的操作系统启动时都要经过这…

iOS(越狱) 应用脱壳反编译hook教程 (系统ios11.3.1)

为什么会有这边博文? 因为公司原因,领导又让我捡起荒废了一年多的ios,了解对ios应用脱壳以及反编译hook相关知识.相比于安卓的hook来说(想了解安卓hook的可以参考我的另外一篇文章),ios的hook要麻烦的多,前人栽树后人乘凉,希望我的这边文章能给大家对ios的hook有个清晰的认识…

iOS 越狱检测/反越狱

在 iOS 越狱设备上&#xff0c;游戏外挂开发人员可以对游戏程序砸壳用于逆向分析&#xff0c;也可以利用 substrate 对游戏逻辑进行 hook 从而制作出各种游戏外挂。这些游戏外挂程序可以被其他越狱玩家直接安装&#xff0c;也可以通过 cydia 商店进行分发。鉴于用户使用越狱设备…

初涉iOS逆向工程:免越狱修改微信(外观篇)

点击上方“iOS开发”&#xff0c;选择“置顶公众号” 关键时刻&#xff0c;第一时间送达&#xff01; 美国学者埃德加戴尔&#xff08;Edgar Dale&#xff09;1946年提出了“学习金字塔”&#xff08;Cone of Learning&#xff09;的理论。他提到&#xff1a;学习效果在50%以上…

【电商运营】如何吸引客户?经典WhatsApp营销案例分享!

关键词&#xff1a;电商运营&#xff0c;WhatsApp营销 电子商务日趋成熟&#xff0c;竞争也越来越激烈。如果企业想保持领先地位&#xff0c;持续吸引客户&#xff0c;则需要将WhatsApp等消息传递应用程序添加到你的营销渠道。但是什么类型的WhatsApp营销活动适合电子商务呢&a…

通达信超跌反弹选股公式,使用筹码函数WINNER

在前面的文章中&#xff0c;已经介绍了WINNER函数&#xff0c;不过对于如何使用函数&#xff0c;当时只进行了简单举例&#xff0c;没有做深入研究。本文将结合WINNER函数的特性&#xff0c;编写通达信超跌反弹选股公式。 WINNER函数表示获利盘比例&#xff0c;取值范围是0-1&…

散户打板,一夜暴富?Pyhton量化11万次涨停,跟着买,收益竟...?【邢不行

你问我涨停敢死队算什么东西&#xff1f;我现在告诉你&#xff0c;你们机构不敢买的涨停&#xff0c;我们买&#xff1b;你们机构不敢割的肉&#xff0c;我们割。 一句话&#xff0c;机构能买的我们买&#xff0c;机构不能买的我们更要买&#xff01;追逐涨停&#xff0c;只买…

交易员普遍使用的几个高胜率指标公式分享给你

交易者普遍运用的都是以下几个技术指标&#xff1a; 1、MACD指标 2、DMI指标 3、KDJ指标 4、布林线 5、移动平均线 6、RSI指标 7、波段买卖点技术指标 第7个那个指标我也是听朋友说他在做的比较好用的&#xff0c;而且没有滞后性。具体如下&#xff1a; 看下图 &…

教你炒股票7:给-赚-了指数亏-了-钱的一些忠告

教你炒股票7&#xff1a;给-赚-了指数亏-了-钱的一些忠告 2006/11/16 12:00:01 周四 今天不宠幸孔-二爷了&#xff0c;宠幸一下股票。早就说过&#xff0c;中国没有人有资格和本ID谈论股票。国庆前&#xff0c;香-港有几个大的基-金-经理过来&#xff0c;吃饭时让本ID给修理了一…

Java 的完整故事-从 1991 年到 2022 年

Java 的完整故事&#xff0c;从 1991 年到 2022 年 个人网站&#xff1a;www.gydblog.com 01、前言 今天&#xff0c;Java已经发展为世界上最流行和最受欢迎的编程语言之一&#xff0c;每年有超过数以万计的人在学习Java或从事Java开发相关的工作。毋庸置疑&#xff0c;Java技…

53岁周鸿祎晒清华录取通知书,攻读博士!网友:导师管你你服管吗?

上一篇&#xff1a;阿里将推行季度考核&#xff0c;员工转岗需先离职再入职 导读&#xff1a;今天换一换口味&#xff0c;摘个瓜尝尝。我们发现360创始人周鸿祎这两天又上了微博热搜了。 近日&#xff0c;周鸿祎在个人微博晒出清华大学录取通知书&#xff0c;称“终于考上了&am…

海尔智家业绩尚可,但其智能家居“全场景”没做起来

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 近日&#xff0c;海尔智家发布了其2022年年报&#xff0c;数据显示&#xff0c;2022年海尔智家实现收入2435.14亿元&#xff0c;同比增长7.2%&#xff1b;扣非归母净利润139.63亿元&#xff0c;同比增长18%&#xff0c;利润…