jqgrid使用本地静态数据创建网格的例子_源码分享 | 用python中的Pandas库实现一个商品期货网格策略...

jqgrid使用本地静态数据创建网格的例子_源码分享 | 用python中的Pandas库实现一个商品期货网格策略..._第1张图片

jqgrid使用本地静态数据创建网格的例子_源码分享 | 用python中的Pandas库实现一个商品期货网格策略..._第2张图片

            如果你喜欢本文,麻烦分享与关注一下非常感谢!

『正文』

ˇ

关于Pandas

Pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

Pandas数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。

关于pandas的安装方法,这里不在赘述,在python环境下,一个简单的pip命令即可搞定,文档方面,请参阅它的官方网站:https://pandas.pydata.org

Pandas的数据结构

  • Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。

  • Time-Series:以时间为索引的Series。

  • DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。

  • Panel:三维的数组,可以理解为DataFrame的容器。

  • Panel4D:是像Panel一样的4维数据容器。

  • PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。

运用Pandas的强大特性来进行网格策略的编码

网格策略秉持的原则是“仓位策略比择时策略更重要”。其基本操作方式就是以某点为基点,每上涨戓下跌一定点数挂一定数量空单戓多单,设定盈利目标,但不设止损,当价格朝期望方向进展时获利平仓,并在原点位挂同样的买单戓卖单。这样布下的这些交易单形成了一张像鱼网样的阵列,在震荡的市场中来回获利。

本策略首先计算了过去300个价格数据的均值和标准差,并根据均值加减1和2个标准差得到网格的区间分界线,并分别配以0.3和0.5的仓位权重,然后根据价格所在的区间来配置仓位(+/-40为上下界,无实际意义):

  • (-40,-3],(-3,-2],(-2,2],(2,3],(3,40](具体价格等于均值+数字倍标准差)

  • -0.5, -0.3, 0.0, 0.3, 0.5

第一步,我们需要引入策略代码中需要用到的库

import types
import numpy as np
import pandas as pd

第二步,我们需要在发明者量化平台初始化合约数据,这个例子中,我们还是使用螺纹钢期货为例子。

def init():

# 订阅螺纹钢的2005合约,并且取得发明者量化平台当前周期的所有收盘价
exchange.SetContractType("rb2005")
records = exchange.GetRecords()
close_01 = records.Close

# 获取网格区间分界线
context.band = np.mean(close_01) + np.array([-40, -3, -2, 2, 3, 40]) * np.std(close_01)
# 设置网格的仓位
context.weight = [0.5, 0.3, 0.0, 0.3, 0.5]

第三步,也是最重要的,我们开始编写策略逻辑和实现自动化交易

这里需要注意的是,我们需要用到发明者量化平台的国内商品期货模版,模版地址为:https://www.fmz.com/strategy/24288 各位在发明者量化策略编写页面进行编码时,需要把此模版先复制到自己的策略库,然后在回测时勾选上,这里请各位读者注意

关于如何部署托管者和机器人,请参考我之前的文章:https://www.fmz.com/bbs-topic/4140

想购买自己云计算服务器部署托管者的读者,可以参考这篇文章:https://www.fmz.com/bbs-topic/2848

策略逻辑与实现其自动化交易:

def onTick(context, bars):

obj = ext.NewPositionManager() # 使用发明者量化交易类库

# 此处用来获取持仓信息
positions = exchange.GetPosition() # 获取持仓数组
if len(positions) == 0: # 如果持仓数组的长度是0
return 0 # 证明是空仓,返回0
for i in range(len(positions)): # 遍历持仓数组
if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
position_long = 1 # 将position_long标记为1

elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
position_short = -1 # 将position_short标记为-1

bar = bars[0]
# 根据价格落在(-40,-3],(-3,-2],(-2,2],(2,3],(3,40]的区间范围来获取最新收盘价所在的价格区间
grid = pd.cut([close_01], context.band, labels=[0, 1, 2, 3, 4])[0]

# 若无仓位且价格突破则按照设置好的区间开仓
if not position_long and not position_short and grid != 2:
# 大于3为在中间网格的上方,做多
if grid >= 3:
obj.OpenLong("rb2005", 1) # 以市价单开多仓到仓位
if grid <= 1:
obj.OpenShort("rb2005", 1) # 以市价单开空仓到仓位

# 持有多仓的处理
elif position_long:
if grid >= 3:
obj.OpenLong("rb2005", 1) # 以市价单调多仓到仓位
# 等于2为在中间网格,平仓
elif grid == 2:
obj.closebuy("rb2005", 1) # 以市价单全平多仓

# 小于1为在中间网格的下方,做空
elif grid <= 1:
obj.closebuy("rb2005", 1) # 以市价单全平多仓
obj.OpenShort("rb2005", 1) # 以市价单开空仓到仓位

# 持有空仓的处理
elif position_short:
# 小于1为在中间网格的下方,做空
if grid <= 1:
obj.OpenShort("rb2005", 1) # 以市价单调空仓到仓位
# 等于2为在中间网格,平仓
elif grid == 2:
obj.closesell("rb2005", 1) # 以市价单全平空仓

# 大于3为在中间网格的上方,做多
elif grid >= 3:
obj.closesell("rb2005", 1) # 以市价单全平空仓
obj.OpenLong("rb2005", 1) # 以市价单开多仓到仓位

最后,我们用一个Main函数把策略跑起来。这里建议大家学会部署自己的托管者,即使在自己的电脑中本地部署,这样对于调试程序和回测交易逻辑来讲都有莫大的有益,特别是对于pandas这样的第三方库的安装,运用本地的anaconda环境管理软件来管理这些python库和环境将会起到事半功倍的效果。

以下是完整的策略代码:

import types
import numpy as np
import pandas as pd

# 初始化合约数据
def init():

# 订阅螺纹钢的2005合约,并且取得发明者量化平台当前周期的所有收盘价
exchange.SetContractType("rb2005")
records = exchange.GetRecords()
close_01 = records.Close

# 获取网格区间分界线
context.band = np.mean(close_01) + np.array([-40, -3, -2, 2, 3, 40]) * np.std(close_01)
# 设置网格的仓位
context.weight = [0.5, 0.3, 0.0, 0.3, 0.5]

def onTick(context, bars):

obj = ext.NewPositionManager() # 使用发明者量化交易类库

# 此处用来获取持仓信息
positions = exchange.GetPosition() # 获取持仓数组
if len(positions) == 0: # 如果持仓数组的长度是0
return 0 # 证明是空仓,返回0
for i in range(len(positions)): # 遍历持仓数组
if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
position_long = 1 # 将position_long标记为1

elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
position_short = -1 # 将position_short标记为-1

bar = bars[0]
# 根据价格落在(-40,-3],(-3,-2],(-2,2],(2,3],(3,40]的区间范围来获取最新收盘价所在的价格区间
grid = pd.cut([close_01], context.band, labels=[0, 1, 2, 3, 4])[0]

# 若无仓位且价格突破则按照设置好的区间开仓
if not position_long and not position_short and grid != 2:
# 大于3为在中间网格的上方,做多
if grid >= 3:
obj.OpenLong("rb2005", 1) # 以市价单开多仓到仓位
if grid <= 1:
obj.OpenShort("rb2005", 1) # 以市价单开空仓到仓位

# 持有多仓的处理
elif position_long:
if grid >= 3:
obj.OpenLong("rb2005", 1) # 以市价单调多仓到仓位
# 等于2为在中间网格,平仓
elif grid == 2:
obj.closebuy("rb2005", 1) # 以市价单全平多仓

# 小于1为在中间网格的下方,做空
elif grid <= 1:
obj.closebuy("rb2005", 1) # 以市价单全平多仓
obj.OpenShort("rb2005", 1) # 以市价单开空仓到仓位

# 持有空仓的处理
elif position_short:
# 小于1为在中间网格的下方,做空
if grid <= 1:
obj.OpenShort("rb2005", 1) # 以市价单调空仓到仓位
# 等于2为在中间网格,平仓
elif grid == 2:
obj.closesell("rb2005", 1) # 以市价单全平空仓

# 大于3为在中间网格的上方,做多
elif grid >= 3:
obj.closesell("rb2005", 1) # 以市价单全平空仓
obj.OpenLong("rb2005", 1) # 以市价单开多仓到仓位

def main():
while True:
onTick()
Sleep(1000)

点击文末的阅读原文,注册发明者开发策略;

或者

打开注册链接:https://www.fmz.com/sign-up/2469923

----------------往期精彩内容----------------

量化微小课堂:

量化微课堂1期 | 通过波动率解调优参数,筛选品种,构建交易策略;

量化微课堂2期 | 浅谈高频交易策略的设计与实现(源码);

看盘指标系列:

看盘指标1期 | MACD线背,柱背,笔,段(源码)

看盘指标2期 | 提高交易胜率,SAR抛物线+均线斜率信号主图指标(源码);

看盘指标3期 | 主力资金进场启动点(含选股器)副图指标;

看盘指标4期 | 浮动筹码波段(含选股器)副图指标

精品自动交易策略库: 【SF09】: 资金流向交易策略源码,绩效突出,适应性兼容性强,5分钟短线交易模型; 【SF08】:经典KD指标另类使用有奇效,股指商品双版本策略;【SF01改进版】强势升级,升级资金管理模块,提高短距交易能力;

【股指日内】SF07(源码):股指日内模型来了!精细化控制,更加适应日内波动;(MC,金字塔,TB,文华8 四版本源码)

【全新升级】SF06(源码):过滤震荡,抓稳趋势,均线构建过滤通道,让利润奔跑(MC,金字塔,TB,文华8 四版本源码)

【SF06股指版】股指1分钟周期,小波动,小止损策略;

【SF05】全新商品期货策略,利用K线加权原理制作的突破系统,年化收益103%;

【高胜率模型源码SF04】股市行情火热特别推出股指1分钟周期模型,适用于股指1分钟周期,商品30分钟通用双版本(超值源码包)

【SF03】:5分钟短周期强普适应性模型,20品种500万盈利,年化108%+,最大回撤7.4%,胜率42%+;

【SF02】:一个核心参数,20+个品种适用。总盈利457万,年化101%+,最大回撤7.9%;

【SF01】:强普适性通用策略,胜率45%,最大回撤仅5.1%,通用核心参数2个,15个品种适用于5,15,30分钟周期;

jqgrid使用本地静态数据创建网格的例子_源码分享 | 用python中的Pandas库实现一个商品期货网格策略..._第3张图片

jqgrid使用本地静态数据创建网格的例子_源码分享 | 用python中的Pandas库实现一个商品期货网格策略..._第4张图片

jqgrid使用本地静态数据创建网格的例子_源码分享 | 用python中的Pandas库实现一个商品期货网格策略..._第5张图片

jqgrid使用本地静态数据创建网格的例子_源码分享 | 用python中的Pandas库实现一个商品期货网格策略..._第6张图片

你可能感兴趣的:(用java画一个网格)