python 网格交易源码_网格交易策略(难度:中级)
什么是网格交易策略
网格交易又名渔网交易,就是跌买涨卖。它适合震荡市,震荡市就是行情价围着一个数字上下浮动的,这个数字就是设置的价格中轴线。
设定中枢价格后,对投资标的进行机械式操作,下跌时,进行分档买入,上涨时,进行分档卖出。网格法不依赖人为的思考,完全是一种程序行为,像渔网一样,利用行情的波动在网格区间内低买高卖。通过反复循环差价赚取利润。
策略优缺点
优点: 网格交易策略适合价格在一个范围内波动的投资标的,能够在震荡市里不断积累利润,降低长线投资的成本……
缺点: 网格策略只适合震荡市;收益率较低;资金利用率低;操作时间长;长时间的浮亏……
网格交易实现过程
制定网格计划
在策略开始之前先设置中枢价格,在多头、空头方向分别建立网格系统(设置网格档位(格子)数量、每个网格的触发价格、持仓手数)。
(注: 各参数的具体值是根据策略使用者的经验以及对应不同合约进行调整、优化;网格的价格档位等参数可手动填入也可用计算机按一定比例计算出)
多头方向交易买入
如果行情最新价跌过下一个网格档位(多头的档位价格依次下跌)的价格时,则买入下一个档位对应的手数。
卖出
如果行情最新价涨过上个网格档位的价格(因为多头希望在一定价格买入后在更高的价格卖出,所以价格跌过一格就买入那一格的手数,涨过上一格才卖出当前格买入的手数),则进行减仓操作卖出当前档位对应的手数(如果当前在网格第一个档位,价格涨过起始价才能触发减仓的卖出操作)。
空头方向交易卖出
如果行情最新价涨过下一个网格档位(空头的档位价格依次上涨)的价格时,卖出下一个档位对应的手数。
买入
如果行情最新价跌过上个网格档位的价格(因为空头希望在一定价格卖出后在更低的价格买入,所以价格涨过一格就卖出那一格的手数,跌过上一格才买入当前格卖出的手数),则进行减仓操作买入当前档位对应的手数(如果当前在网格第一个档位,价格跌过起始价才能触发减仓的买入操作)。
实例说明(以多头方向为例)网格序号价格买入持仓手数卖出持仓手数
04047.001
14026.7712
24006.6323
33986.6034
43966.6745
53946.8356
63927.1067
73907.4678
83887.9289
93868.49910
103849.1410设置网格参数:如上表。假设:总资金100万,起始价格为4047元,建立多头方向的10个档位,包含4047到14元的10个价格。
开始策略
如果行情最新价每跌过一个价格档位,就买入对应的手数;最新价每涨过上一个档位,就卖出当前档位的持仓手数。如果当前档位是第一档, 则最新价在涨过起始价格时才卖出第一档买入的手数。
代码实现
方法:递归
设定网格计划参数网格起始价格(中枢价格);
网格在多、空头的档位数量(即网格格子数量);
多、空头网格每个档位的价格列表;
多、空头每格的持仓手数列表。from functools import reduce
from tqsdk import TqApi, TargetPosTask
SYMBOL = "DCE.jd2001" # 合约代码
START_PRICE = 4247 # 起始价位
GRID_AMOUNT = 10 # 网格在多头、空头方向的格子(档位)数量
api = TqApi()
grid_region_long = [0.005] * GRID_AMOUNT # 多头每格价格跌幅(网格密度)
grid_region_short = [0.005] * GRID_AMOUNT # 空头每格价格涨幅(网格密度)
grid_volume_long = [i for i in range(GRID_AMOUNT + 1)] # 多头每格持仓手数
grid_volume_short = [i for i in range(GRID_AMOUNT + 1)] # 空头每格持仓手数
grid_prices_long = [reduce(lambda p, r: p*(1-r), grid_region_long[:i], START_PRICE) for i in range(GRID_AMOUNT + 1)] # 多头每格的触发价位列表
grid_prices_short = [reduce(lambda p, r: p*(1+r), grid_region_short[:i], START_PRICE) for i in range(GRID_AMOUNT + 1)] # 空头每格的触发价位列表
print("策略开始运行, 起始价位: %f, 多头每格持仓手数:%s, 多头每格的价位:%s, 空头每格的价位:%s" % (START_PRICE, grid_volume_long, grid_prices_long, grid_prices_short))
(策略源码在文章最后)
实现方法
本策略使用递归实现,递归函数(wait_price(layer))的参数“layer”为当前所在的档位。策略初始参数为0,表示从起始价格开始进入判断最新价所在的网格方向、档位,此时持仓手数为0。
递归函数的逻辑为:先判断当前是处于多头的网格档位还是空头的网格档位:如果价格在网格的多头方向,则进入多头的循环:获取最新行情价格,判断价格是否穿越到网格的其他档位:如果当前档位还未到达最大档位并且最新价小于等于下一个档位的价格(如果当前档位已经等于最大档位,价格再跌也不会再加仓,也就不用再判断价格是否小于下一个档位了),那么就调整持仓手数为下一个档位对应的持仓手数,并进入下一层递归函数;如果从下一层递归函数返回到当前档位层次,则将持仓手数调整回下一个档位的手数(因为可能在下一档位中持仓手数已经被修改了)。
如果最新价大于当前档位的价格,则返回到上一档位层次,递归函数返回。def wait_price(layer):
"""等待行情最新价变动到其他档位,则进入下一档位或回退到上一档位; 如果从下一档位回退到当前档位,则设置为当前对应的持仓手数;
layer : 当前所在第几个档位层次; layer>0 表示多头方向, layer<0 表示空头方向
"""
if layer > 0 or quote.last_price <= grid_prices_long[1]: # 是多头方向
while True:
api.wait_update()
# 如果当前档位小于最大档位,并且最新价小于等于下一个档位的价格: 则设置为下一档位对应的手数后进入下一档位层次
if layer < GRID_AMOUNT and quote.last_price <= grid_prices_long[layer + 1]:
target_pos.set_target_volume(grid_volume_long[layer + 1])
print("最新价: %f, 进入: 多头第 %d 档" % (quote.last_price, layer + 1))
wait_price(layer + 1)
# 从下一档位回退到当前档位后, 设置回当前对应的持仓手数
target_pos.set_target_volume(grid_volume_long[layer + 1])
# 如果最新价大于当前档位的价格: 则回退到上一档位
if quote.last_price > grid_prices_long[layer]:
print("最新价: %f, 回退到: 多头第 %d 档" % (quote.last_price, layer))
return如果价格在网格的空头方向,则进入空头的循环:获取最新行情价格,判断价格是否穿越到网格的其他档位:如果当前档位还未到达最大档位,并且最新价大于等于下一个档位的价格,则调整持仓手数为下一个档位对应的持仓手数,并进入下一层递归函数;如果从下一层递归函数返回到当前档位层次,则将持仓手数调整回下一个档位的手数
如果最新价小于当前档位的价格,则返回到上一档位层次,递归函数返回
回测
回测参数设置初始账户资金:100万
回测日期:2018.9.10——2018.11.16
每跳动一档位手数变化:6手
起始价位:4944.63
多、空头每格涨跌幅(网格密度):0.005
回测时盘口行情quote的更新频率:和K线分钟线的更新频率一致
回测结果网格交易策略回测结果
合约代码合约品种收益率风险度最大回撤年化夏普率
CZCE.SR811白糖25.42%4.65%2.43%6.6779
上表回测结果的累计收益走势图
天勤内策略源代码:#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'limin'
"""
网格交易策略
参考: https://www.shinnytech.com/blog/grid-trading/
注: 该示例策略仅用于功能示范, 实盘时请根据自己的策略/经验进行修改
"""
from functools import reduce
from tqsdk import TqApi, TargetPosTask
SYMBOL = "DCE.jd2001" # 合约代码
START_PRICE = 4247 # 起始价位
GRID_AMOUNT = 10 # 网格在多头、空头方向的格子(档位)数量
api = TqApi()
grid_region_long = [0.005] * GRID_AMOUNT # 多头每格价格跌幅(网格密度)
grid_region_short = [0.005] * GRID_AMOUNT # 空头每格价格涨幅(网格密度)
grid_volume_long = [i for i in range(GRID_AMOUNT + 1)] # 多头每格持仓手数
grid_volume_short = [i for i in range(GRID_AMOUNT + 1)] # 空头每格持仓手数
grid_prices_long = [reduce(lambda p, r: p*(1-r), grid_region_long[:i], START_PRICE) for i in range(GRID_AMOUNT + 1)] # 多头每格的触发价位列表
grid_prices_short = [reduce(lambda p, r: p*(1+r), grid_region_short[:i], START_PRICE) for i in range(GRID_AMOUNT + 1)] # 空头每格的触发价位列表
print("策略开始运行, 起始价位: %f, 多头每格持仓手数:%s, 多头每格的价位:%s, 空头每格的价位:%s" % (START_PRICE, grid_volume_long, grid_prices_long, grid_prices_short))
quote = api.get_quote(SYMBOL) # 行情数据
target_pos = TargetPosTask(api, SYMBOL)
position = api.get_position(SYMBOL) # 持仓信息
def wait_price(layer):
"""等待行情最新价变动到其他档位,则进入下一档位或回退到上一档位; 如果从下一档位回退到当前档位,则设置为当前对应的持仓手数;
layer : 当前所在第几个档位层次; layer>0 表示多头方向, layer<0 表示空头方向
"""
if layer > 0 or quote.last_price <= grid_prices_long[1]: # 是多头方向
while True:
api.wait_update()
# 如果当前档位小于最大档位,并且最新价小于等于下一个档位的价格: 则设置为下一档位对应的手数后进入下一档位层次
if layer < GRID_AMOUNT and quote.last_price <= grid_prices_long[layer + 1]:
target_pos.set_target_volume(grid_volume_long[layer + 1])
print("最新价: %f, 进入: 多头第 %d 档" % (quote.last_price, layer + 1))
wait_price(layer + 1)
# 从下一档位回退到当前档位后, 设置回当前对应的持仓手数
target_pos.set_target_volume(grid_volume_long[layer + 1])
# 如果最新价大于当前档位的价格: 则回退到上一档位
if quote.last_price > grid_prices_long[layer]:
print("最新价: %f, 回退到: 多头第 %d 档" % (quote.last_price, layer))
return
elif layer < 0 or quote.last_price >= grid_prices_short[1]: # 是空头方向
layer = -layer # 转为正数便于计算
while True:
api.wait_update()
# 如果当前档位小于最大档位层次,并且最新价大于等于下一个档位的价格: 则设置为下一档位对应的持仓手数后进入下一档位层次
if layer < GRID_AMOUNT and quote.last_price >= grid_prices_short[layer + 1]:
target_pos.set_target_volume(-grid_volume_short[layer + 1])
print("最新价: %f, 进入: 空头第 %d 档" % (quote.last_price, layer + 1))
wait_price(-(layer + 1))
# 从下一档位回退到当前档位后, 设置回当前对应的持仓手数
target_pos.set_target_volume(-grid_volume_short[layer + 1])
# 如果最新价小于当前档位的价格: 则回退到上一档位
if quote.last_price < grid_prices_short[layer]:
print("最新价: %f, 回退到: 空头第 %d 档" % (quote.last_price, layer))
return
while True:
api.wait_update()
wait_price(0) # 从第0层开始进入网格
target_pos.set_target_volume(0)
python 网格交易源码_网格交易策略(难度:中级)相关推荐
- python 网格交易源码_网格交易法策略源码
网格交易法的源码 //+------------------------------------------------------------------+ //| Grid1.1.mq4 | // ...
- python 网格交易源码_网格交易策略[tb源码]
Params Numeric InitMP(0); // 初始仓位,+-表示多空 Numeric FirstGrid(3); // 第一格的间距,点数 Numeric To ...
- python 网格交易源码_网格交易策略源码(MT4.0源码)
//+------------------------------------------------------------------+ //| Grid1.1.mq4 | //| Copy* 顺 ...
- python 深度学习源码_「深度学习」用TensorFlow实现人脸识别(附源码,快速get技能)...
本文将会带你使用python码一个卷积神经网络模型,实现人脸识别,操作难度比较低,动手跟着做吧,让你的电脑认出你那帅气的脸. 由于代码篇幅较长,而且最重要的缩进都没了,建议直接打开源码或者点击分享-& ...
- python如何查看源码_查看“Python-2020-fall”的源代码
因为以下原因,您没有权限编辑本页: 您所请求的操作仅限于该用户组的用户使用:用户 您可以查看与复制此页面的源代码.== Python程序设计课程主页(2020年秋季学期) == Teacher: [h ...
- python支付程序源码_支付宝推出新活动,Python脚本能让你赚的更多!(附源码)...
写在前面 近期,马云大哥又在支付宝推出新活动了,不对,马云已经辞职了.不好意思哈,小编忘了. 但是呢,这个活动可是实实在在存在的哦~ 据说,只要你的手速够快,就能够赚去更多的余额宝体验金哦~ 下面,小 ...
- python爬虫技术源码_实战|手把手教你用Python爬虫(附详细源码)
大家好,我是J哥,专注原创,致力于用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识.最近J哥做了个爬虫小项目,感觉还挺适合新手入门的,于是迫不及待想分享给大家. 什么是爬虫? ...
- python股票分析源码_用python开发股票自动技术分析的软件
一.配置环境 python是个强大的工具,还有很多插件包可以用,所以完全可以考虑用python来编程实现股票的自动技术分析. 第一步就是实现股票历史数据的获取,这个有安装包TuShare可以用.首先是 ...
- python爬取图片源码_半次元图片爬取-python爬取半次元图片源码下载-西西软件下载...
python爬取半次元图片源码,由大神自制的python爬取工具,本源码针对半次元图片平台,可以爬取最新的网站图片资源,支持自定义保存目录,非常方便,需要requests库的支持,想要相关源码资源的朋 ...
最新文章
- 计算机应用发表论文,计算机应用论文发表.docx
- html网页布局对联,html javascript 网站两侧对联广告
- 在Linux添加网卡,Centos(RHEL) 6 添加网卡的方法
- java树遍历算法_Java递归算法实现目录树的遍历
- 用C语言来实现冒泡排序
- 开关电源环路补偿--开关电源进阶知识补充2 为什么要进行伯德图分析?
- bzoj1574[Usaco2009 Jan]地震损坏Damage*
- Visual Odometry技术 (Of VSLAM)
- 【NLP】文本情感分类
- android 自动语音提醒,Android 语音播报实现方案
- 「杂谈」Nanopore组装的拟南芥基因组效果如何?
- C语言并集编程,c语言求并集和交集的关键代码,谢谢
- android手机分辨率,xDpi,yDpi,尺寸等各种相关物理参数
- 谷歌要抛弃Android拥抱Andromeda
- UE4 4.27像素流公网布置教程
- OpenCV中GPU版MOG2的使用
- 个性化推荐系统设计(2.2)——Few-shot Learning用于冷启动的探索
- 【UI界面开发】基本组件概述
- 震惊!!原来JDK的下载竟如此简单!!(附详细教程)
- Ubuntu安装VMware tools工具