量化合約對沖交易機器人app系統開發(fā),I34-I633-53I9,開發(fā)案例,開發(fā)源代碼,軟件定制,平臺搭建,模式定制
量化合約指的是目標或任務具體明確,可以清晰度量。根據不同情況,表現為數量多少,具體的統計數字,范圍衡量,時間長度等等。所謂量化就是把經過抽樣得到的瞬時值將其幅度離散,即用一組規(guī)定的電平,把瞬時抽樣值用接近的電平值來表示。經過抽樣的圖像,只是在空間上被離散成為像素(樣本)的陣列。而每個樣本灰度值還是一個由無窮多個取值的連續(xù)變化量,必須將其轉化為有限個離散值,賦予不同碼字才能真正成為數字圖像。這種轉化稱為量化。
量化合約策略部署代碼參考如下:
coding=utf-8
fromfutureimport print_function, absolute_import, unicode_literals
import numpy as np
import pandas as pd
from gm.api import *
'''
本策略標的為:SHFE.rb1901
價格中樞設定為:前一交易日的收盤價
從阻力位到壓力位分別為:1.03open、1.02open、1.01open、open、0.99open、0.98open、0.97open
每變動一個網格,交易量變化100個單位
回測數據為:SHFE.rb1901的1min數據
回測時間為:2017-07-01 08:00:00到2017-10-01 16:00:00
'''
def init(context):
#策略標的為SHFE.rb1901context.symbol='SHFE.rb1901'#訂閱SHFE.rb1901,bar頻率為1minsubscribe(symbols=context.symbol,frequency='60s')#設置每變動一格,增減的數量context.volume=1#儲存前一個網格所處區(qū)間,用來和網格所處區(qū)間作比較context.last_grid=0#以前一日的收盤價為中樞價格context.center=history_n(symbol=context.symbol,frequency='1d',end_time=context.now,count=1,fields='close')[0]['close']#記錄上一次交易時網格范圍的變化情況(例如從4區(qū)到5區(qū),記為4,5)context.grid_change_last=[0,0]
def on_bar(context, bars):
bar=bars[0]#獲取多倉倉位position_long=context.account().position(symbol=context.symbol,side=PositionSide_Long)#獲取空倉倉位position_short=context.account().position(symbol=context.symbol,side=PositionSide_Short)#設置網格和當前價格所處的網格區(qū)域context.band=np.array([0.97,0.98,0.99,1,1.01,1.02,1.03])*context.center
grid=pd.cut([bar.close],context.band,labels=[1,2,3,4,5,6])[0]#如果價格超出網格設置范圍,則提示調節(jié)網格寬度和數量ifnp.isnan(grid):
print('價格波動超過網格范圍,可適當調節(jié)網格寬度和數量')#如果新的價格所處網格區(qū)間和前一個價格所處的網格區(qū)間不同,說明觸碰到了網格線,需要進行交易#如果新網格大于前的網格,做空或平多ifcontext.last_grid<grid:#記錄新舊格子范圍(按照大小排序)
grid_change_new=[context.last_grid,grid]#幾種例外:
#當last_grid=0時是初始階段,不構成信號
#如果此時grid=3,說明當前價格僅在開盤價之下的3區(qū)域中,沒有突破網格線
#如果此時grid=4,說明當前價格僅在開盤價之上的4區(qū)域中,沒有突破網格線
ifcontext.last_grid==0:context.last_grid=grid
return
ifcontext.last_grid!=0:#如果前一次開倉是4-5,這一次是5-4,算是沒有突破,不成交
ifgrid_change_new!=context.grid_change_last:#更新前一次的數據
context.last_grid=gridcontext.grid_change_last=grid_change_new#如果有多倉,平多
ifposition_long:order_volume(symbol=context.symbol,volume=context.volume,side=OrderSide_Sell,order_type=OrderType_Market,position_effect=PositionEffect_Close)
print('以市價單平多倉{}手'.format(context.volume))#否則,做空
ifnotposition_long:order_volume(symbol=context.symbol,volume=context.volume,side=OrderSide_Sell