移植自JavaScript版本的「商品期货跨期对冲 - 百行代码实现」,本策略为简单的教学策略,意图展示Python语言的商品期货策略设计。主要用于学习策略编写、参考设计思路。

class Hedge:

'对冲控制类'

def __init__(self, q, e, initAccount, symbolA, symbolB, hedgeSpread, coverSpread):

self.q = q

self.initAccount = initAccount

self.status = 0

self.symbolA = symbolA

self.symbolB = symbolB

self.e = e

self.isBusy = False

self.hedgeSpread = hedgeSpread

self.coverSpread = coverSpread

self.opAmount = OpAmount

def poll(self):

if (self.isBusy or not exchange.IO("status")) or not ext.IsTrading(self.symbolA):

Sleep(1000)

return

insDetailA = exchange.SetContractType(self.symbolA)

if not insDetailA:

return

tickerA = exchange.GetTicker()

if not tickerA:

return

insDetailB = exchange.SetContractType(self.symbolB)

if not insDetailB:

return

tickerB = exchange.GetTicker()

if not tickerB:

return

LogStatus(_D(), "A卖B买", _N(tickerA["Buy"] - tickerB["Sell"]), "A买B卖", _N(tickerA["Sell"] - tickerB["Buy"]))

action = 0

if self.status == 0:

if (tickerA["Buy"] - tickerB["Sell"]) > self.hedgeSpread:

Log("开仓 A卖B买", tickerA["Buy"], tickerB["Sell"], "#FF0000")

action = 1

elif (tickerB["Buy"] - tickerA["Sell"]) > self.hedgeSpread:

Log("开仓 B卖A买", tickerB["Buy"], tickerA["Sell"], "#FF0000")

action = 2

elif self.status == 1 and (tickerA["Sell"] - tickerB["Buy"]) <= self.coverSpread:

Log("平仓 A买B卖", tickerA["Sell"], tickerB["Buy"], "#FF0000")

action = 2

elif self.status == 2 and (tickerB["Sell"] - tickerA["Buy"]) <= self.coverSpread:

Log("平仓 B买A卖", tickerB["Sell"] - tickerA["Buy"], "#FF0000")

action = 1

if action == 0:

return

self.isBusy = True

tasks = []

if action == 1:

tasks.append([self.symbolA, "sell" if self.status == 0 else "closebuy"])

tasks.append([self.symbolB, "buy" if self.status == 0 else "closesell"])

elif action == 2:

tasks.append([self.symbolA, "buy" if self.status == 0 else "closesell"])

tasks.append([self.symbolB, "sell" if self.status == 0 else "closebuy"])

def callBack(task, ret):

def callBack(task, ret):

self.isBusy = False

if task["action"] == "sell":

self.status = 2

elif task["action"] == "buy":

self.status = 1

else:

self.status = 0

account = _C(exchange.GetAccount)

LogProfit(account["Balance"] - self.initAccount["Balance"], account)

self.q.pushTask(self.e, tasks[1][0], tasks[1][1], self.opAmount, callBack)

self.q.pushTask(self.e, tasks[0][0], tasks[0][1], self.opAmount, callBack)

def main():

SetErrorFilter("ready|login|timeout")

Log("正在与交易服务器连接...")

while not exchange.IO("status"):

Sleep(1000)

Log("与交易服务器连接成功")

initAccount = _C(exchange.GetAccount)

Log(initAccount)

n = 0

def callBack(task, ret):

Log(task["desc"], "成功" if ret else "失败")

q = ext.NewTaskQueue(callBack)

if CoverAll:

Log("开始平掉所有残余仓位...")

ext.NewPositionManager().CoverAll()

Log("操作完成")

t = Hedge(q, exchange, initAccount, SA, SB, HedgeSpread, CoverSpread)

while True:

q.poll()

t.poll()

只是移植一下代码,感觉有点太简单了,我们继续来做一些改造,给策略加上图表。

在LogStatus函数调用的位置之前加上以下代码,把实时的价格差做成K线统计出来,self.preBarTime是Hedge类增加的一个成员,用来记录最新BAR的时间戳,画图我们使用「画线类库」,直接调用画图接口,很简单就可以画出图表。

# 计算差价K线

r = exchange.GetRecords()

if not r:

return

diff = tickerB["Last"] - tickerA["Last"]

if r[-1]["Time"] != self.preBarTime:

# 更新

self.records.append({"Time": r[-1]["Time"], "High": diff, "Low": diff, "Open": diff, "Close": diff, "Volume": 0})

self.preBarTime = r[-1]["Time"]

if diff > self.records[-1]["High"]:

self.records[-1]["High"] = diff

if diff < self.records[-1]["Low"]:

self.records[-1]["Low"] = diff

self.records[-1]["Close"] = diff

ext.PlotRecords(self.records, "diff:B-A")

ext.PlotHLine(self.hedgeSpread if diff > 0 else -self.hedgeSpread, "hedgeSpread")

ext.PlotHLine(self.coverSpread if diff > 0 else -self.coverSpread, "coverSpread")

回测时的效果:

接下来,我们再加入交互功能,让策略在运行时可以修改HedgeSpread和CoverSpread参数,控制对冲开仓差价、平仓差价。还需要一个一键平仓的按钮。我们在策略编辑页面增加这几个控件。

然后在策略的主循环中,q.poll(),t.poll()调用之后,加上交互控制代码。

while True:

q.poll()

t.poll()

# 以下交互控制代码

cmd = GetCommand()

if cmd:

arr = cmd.split(":")

if arr[0] == "AllCover":

p.CoverAll()

elif arr[0] == "SetHedgeSpread":

t.SetHedgeSpread(float(arr[1]))

elif arr[0] == "SetCoverSpread":

t.SetCoverSpread(float(arr[1]))

策略用于教学,实盘根据自身需求优化调整。

如有问题,欢迎留言。

python 期货策略_Python版商品期货跨期对冲策略相关推荐

  1. python 期货策略_Python版商品期货跨期布林对冲策略 (教学)

    classHedge:'对冲控制类' def __init__(self, q, e, initAccount, symbolA, symbolB, maPeriod, atrRatio, opAmo ...

  2. python 期货策略_Python版商品期货多品种均线策略

    '''backteststart: 2019-07-01 09:00:00end: 2020-03-25 15:00:00period: 1dexchanges: [{"eid": ...

  3. 策略 python_Python版商品期货多品种均线策略

    完全移植自「CTP商品期货多品种均线策略」,由于Python版本商品期货策略还没有一个多品种的策略,所以就移植了JavaScript版本的「CTP商品期货多品种均线策略」.提供一些Python商品期货 ...

  4. python 网格策略_Python版简单网格策略

    Python版简单网格策略 策略广场上的Python策略不多,这里编写了一个Python版本的网格策略.策略原理十分简单,在一个价格区间内固定价格距离产生一系列的网格节点,当行情变化时,价格到达一个网 ...

  5. python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...

    布林指标突破策略,思路非常简单.使用Python语言编写该策略,也非常容易实现,加上回测配置信息,有70行代码,实际可以更加精简,鉴于教学策略,没有使用难懂的Python语法,使用的是比较基础的语句. ...

  6. python macd背离_Python 精简多品种 MACD 趋势策略

    Python 精简多品种 MACD 趋势策略 Python 精简多品种 MACD 趋势策略 Author: Zero, Date: 2017-06-18 11:35:13 Tags: 趋势 Pytho ...

  7. python全局变量定义_Python 3 实现定义跨模块的全局变量和使用

    尽管某些书籍上总是说避免使用全局变量,但是在实际的需求不断变化中,往往定义一个全局变量是最可靠的方法,但是又必须要避免变量名覆盖. Python 中 global 关键字可以定义一个变量为全局变量,但 ...

  8. python对话框大小_Python 版 AR 对话框

    周末了,用 Python 代码给大家带来一个好玩的视频特效:Python 版 AR 对话框https://www.zhihu.com/video/1110617264784699392 摄像头拍摄的视 ...

  9. python rm 条件_python版rm命令

    安全的linux rm 命令 -- python版rm命令 众所周知 linux 下 大杀器之一 rm 是多么恐怖的东西存在 众多系统管理员 对此命令是又爱 又恨, 基于本人也是一枚系统管理员, 写下 ...

  10. python容器装水_Python版LeetCode11. 盛最多水的容器

    本文转载自[微信公众号:机器学习算法与Python精研,ID:AITop100]经微信公众号授权转载,如需转载与原文作者联系 题目: 给定 个非负整数 1,2,...,n,每个数代表坐标中的一个点 ( ...

最新文章

  1. 作业——08 爬虫综合大作业
  2. java清除控制台_Java:清除控制台
  3. 用.XML填充TreeView
  4. 机器人陪你玩“谁是卧底游戏
  5. php发请求的方法,php发送http请求的几种方法
  6. 网络编程释疑之:TCP连接拔掉网线后会发生什么
  7. Adwords 账户细分思路
  8. DateUtils.paraseDate(String sDate,String[] parasePatterns);转换时间不对,pattern数组顺序
  9. php获取一个文件名的函数,PHP 文件系统函数之获取文件名及文件名后缀-php文件...
  10. ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?
  11. 电脑故障扫描修复软件_电脑故障分析:电脑安装软件提示没有权限的解决方法...
  12. 2017 最值得关注的十大 APP、Web 界面设计趋势
  13. 黄聪:wordpress博客用Slimbox2实现lightbox效果(免插件)(转)
  14. HDU2013 蟠桃记【递推】
  15. Facebook采取赤裸裸抄袭的战略 争夺用户
  16. android弹窗警告,Android 开发使用PopupWindow实现弹出警告框的复用类示例
  17. mysql视图子查询_MySQL:FROM子句限制中的带有子查询的视图
  18. js代码实现百度换肤
  19. python 爬取链家二手房信息
  20. 浏览器字体和html字体,如何正确设置兼容浏览器的中文字体

热门文章

  1. C# 泛型2---排序
  2. 第六届中国电子信息博览会今日正式开幕,智享新时代!
  3. linux 安装tuxedo
  4. bzoj 2623 所罗门的咒语
  5. Android API 中文 (54) —— Filterable
  6. 失焦事件触发_JavaScript event 事件详解
  7. 在shell或bash执行一个bin文件或者脚本的流程
  8. 深入解读Linux内存管理系列(8)——SLAB初始化
  9. ffmpeg 如何音视频同步
  10. H.264RTP封包原理