量化合约指的是目标或任务具体明确,可以清晰度量。现货合约对冲交易所系统开发详细:I35-7O98-O7I8 根据不同情况,表现为数量多少,具体的统计数字,范围衡量,时间长度等等。所谓量化就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示。经过抽样的图像,只是在空间上被离散成为像素(样本)的阵列。而每个样本灰度值还是一个由无穷多个取值的连续变化量,必须将其转化为有限个离散值,赋予不同码字才能真正成为数字图像。这种转化称为量化。
合约量化,就是系统根据设置,自动进行买卖交易,上涨到一定点数则卖出平仓,下跌至相应点数则进行加仓操作,等待价格回调则卖出。不断的操作,达到自动化交易,让交易者不用时时刻刻紧盯市场,使用自动化交易,摈弃了用户的个人主观情绪,让交易变得更为“理智”。
目前合约量化的具体提现为“量化系统”、“量化软件”、“量化机器人等等”,每一种都略微有着不一样,但是大部分核心原理就是马丁倍投策略,马丁倍投策略是来自于现货市场的策略,但运用至合约上依然合理。
交易策略是一套规则,包括进出条件、资金管理和风险控制等。有简单的策略也有复杂的策略。简单策略通常使用技术指标和价格行为,而复杂策略使用高阶数学和统计模型。通常我们认为复杂模型更好,但实证分析和学术研究表明,复杂模型往往过度挖掘历史数据,无法适应剧烈的市场变化,相反,简单模型从长期来看更稳定。本文由系统开发对接V:MrsFu123编辑整理发布。
策略逻辑与实现其自动化交易:
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)#以市价单开多仓到仓位
以下是完整的策略代码:
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): V+MrsFu123
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)