在这里给大家一个Python期货模型参考,作为入门参考应该还可以,这个我曾经写的第一个完整的python期货交易模型源码,历史数据来源于自己的数据库,交易接口也是基于CTP的自己的交易接口。
相当一部分函数是基于其他的python自定义类,太多了放不下,只放策略主题部分作为参考,高手们请忽略!
import math, sys, os, NMath
import NLog as lg
import NDateTime as dt
import Future as ft
import TradeQuery as tq
import time
# import numpy as np
_investorid = ”
_instrument = ‘rb1805’
#模型名称,默认为文件名称
_s_model_name = ‘Python:%s’ % os.path.basename(sys.argv[0])[:os.path.basename(sys.argv[0]).find(“.”)]
#模型参数
param_ma = 20
param_loss = 30
param_hl = 10
#信号记录
_signals = []
_math = NMath.NMath()
sf = ft.SingleFutureFast()
_dc_orginal_data = sf._get_data(‘rb’, sort = ‘asc’)#, startdate=”, enddate = ”, cycle=’d1′, ideliverydate=’1801′)
if _dc_orginal_data == None:
print(‘获取数据错误:要获取的合约数据量为0!’)
j = param_ma
while j < (len(_dc_orginal_data['index'])):
#动态止损SP;
if len(_signals) > 0 and (_signals[-1].sig == ‘BK’ or _signals[-1].sig == ‘BPK’) and _signals[-1].index < j:
if _signals[-1].price – _dc_orginal_data[‘dMinPrice’][j] > param_loss:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘SP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
if _signals[-1].index < j:
max1 = _math.max_series(_dc_orginal_data[‘dClosePrice’][_signals[-1].index : j])
max2 = _math.max_series(_dc_orginal_data[‘dOpenPrice’][_signals[-1].index : j])
max3 = _math.Nmax(max1, max2)
if max3 – _signals[-1].price >= 50 and max3 – _signals[-1].price < 100 and max3 - _dc_orginal_data['dClosePrice'][j] > 40:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘SP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
if max3 – _signals[-1].price >= 100 and max3 – _signals[-1].price < 200 and max3 - _dc_orginal_data['dClosePrice'][j] > 80:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘SP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
if max3 – _signals[-1].price >= 200 and max3 – _signals[-1].price < 400 and max3 - _dc_orginal_data['dClosePrice'][j] > 120:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘SP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
if max3 – _signals[-1].price >= 400 and max3 – _dc_orginal_data[‘dClosePrice’][j] > 200:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘SP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
# 动态止损BP
if len(_signals) > 0 and (_signals[-1].sig == ‘SK’ or _signals[-1].sig == ‘SPK’) and _signals[-1].index < j:
if _dc_orginal_data[‘dMaxPrice’][j] – _signals[-1].price > param_loss:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘BP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
if _signals[-1].index < j:
min1 = _math.min_series(_dc_orginal_data[‘dClosePrice’][_signals[-1].index : j])
min2 = _math.min_series(_dc_orginal_data[‘dOpenPrice’][_signals[-1].index : j])
min3 = _math.Nmin(max1, max2)
if _signals[-1].price – min3 >= 50 and _signals[-1].price – min3 < 100 and _dc_orginal_data['dClosePrice'][j] - min3 > 40:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘BP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
if _signals[-1].price – min3 >= 100 and _signals[-1].price – min3 < 200 and _dc_orginal_data['dClosePrice'][j] - min3 > 80:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘BP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
if _signals[-1].price – min3 >= 200 and _signals[-1].price – min3 < 400 and _dc_orginal_data['dClosePrice'][j] - min3 > 120:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘BP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
if _signals[-1].price – min3 >= 400 and _dc_orginal_data[‘dClosePrice’][j] – min3 > 200:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘BP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
mh = _math.ma_series(_dc_orginal_data[‘dMaxPrice’][j – param_ma : j – 1])
ml = _math.ma_series(_dc_orginal_data[‘dMinPrice’][j – param_ma : j – 1])
mc = _math.ma_series(_dc_orginal_data[‘dClosePrice’][j – param_ma : j – 1])
mo = _math.ma_series(_dc_orginal_data[‘dOpenPrice’][j – param_ma : j – 1])
mc = (mh + ml + mc + mo) / 4
if _dc_orginal_data[‘dMinPrice’][j] > mc and _dc_orginal_data[‘dOpenPrice’][j] < _dc_orginal_data['dClosePrice'][j]:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘BP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
if _dc_orginal_data[‘dMaxPrice’][j] < mc and _dc_orginal_data['dOpenPrice'][j] > _dc_orginal_data[‘dClosePrice’][j]:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘SP’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
min1 = _math.min_series(_dc_orginal_data[‘dClosePrice’][j – param_hl : j – 1])
min2 = _math.min_series(_dc_orginal_data[‘dOpenPrice’][j – param_hl : j – 1])
min3 = _math.Nmin(min1, min2)
max1 = _math.max_series(_dc_orginal_data[‘dClosePrice’][j – param_hl : j – 1])
max2 = _math.max_series(_dc_orginal_data[‘dOpenPrice’][j – param_hl : j – 1])
max3 = _math.Nmax(max1, max2)
if _dc_orginal_data[‘dClosePrice’][j] > mh and _dc_orginal_data[‘dMaxPrice’][j] > max3 and _dc_orginal_data[‘dClosePrice’][j] > _dc_orginal_data[‘dOpenPrice’][j]:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘BPK’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
if _dc_orginal_data[‘dClosePrice’][j] < ml and _dc_orginal_data['dMinPrice'][j] < min3 and _dc_orginal_data['dClosePrice'][j] < _dc_orginal_data['dOpenPrice'][j]:
_signals = ft.FilterAddWH(_signals, ft.whSignal(_dc_orginal_data[‘iReceiveDate’][j], ‘SPK’, _dc_orginal_data[‘dClosePrice’][j], _dc_orginal_data[‘index’][j]))
j += 1
k = 0
for _s in _signals:
print(_s.date, _s.sig, _s.price, _s.index)
k += 1
print(‘总盈利:’, ft.Signals_SUM(_signals))
#当日交易
_tq = tq.TradeQuery()
cur_date = dt.get_now_date_int()
_s_log = ‘_signals[-1].date=%s,_signals[-1].sig=%s,cur_date=%s’ % (_signals[-1].date, _signals[-1].sig, cur_date)
lg.NFileLog(_s_log)
if int(_signals[-1].date) == int(cur_date):
if _signals[-1].sig ==’BP’:
lg.NFileLog(‘进入BP信号处理’)
_list = _tq.QuerySignals(_s_model_name, ‘BUY’, ‘CLOSE’, ft.OpenVolume)
time.sleep(1)
if len(_list) == 0 or _list[7] < cur_date:
ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)
if _signals[-1].sig ==’BK’:
lg.NFileLog(‘进入BK信号处理’)
_list = _tq.QuerySignals(_s_model_name, ‘BUY’, ‘OPEN’, ft.OpenVolume)
time.sleep(1)
if len(_list) == 0 or _list[7] < cur_date:
ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)
if _signals[-1].sig ==’SP’:
lg.NFileLog(‘进入SP信号处理’)
_list = _tq.QuerySignals(_s_model_name, ‘SELL’, ‘CLOSE’, ft.OpenVolume)
time.sleep(1)
if len(_list) == 0 or _list[7] < cur_date:
ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)
if _signals[-1].sig ==’SK’:
lg.NFileLog(‘进入SK信号处理’)
_list = _tq.QuerySignals(_s_model_name, ‘SELL’, ‘OPEN’, ft.OpenVolume)
time.sleep(1)
if len(_list) == 0 or _list[7] < cur_date:
ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)
if _signals[-1].sig ==’BPK’:
lg.NFileLog(‘进入BPK信号处理’)
_list = _tq.QuerySignals(_s_model_name, ‘BUY’, ‘OPEN’, ft.OpenVolume)
time.sleep(1)
if len(_list) == 0 or _list[7] < cur_date:
ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)
if _signals[-1].sig ==’SPK’:
lg.NFileLog(‘进入SPK信号处理’)
_list = _tq.QuerySignals(_s_model_name, ‘SELL’, ‘OPEN’, ft.OpenVolume)
time.sleep(1)
if len(_list) == 0 or _list[7] < cur_date:
ft.ExecwhSignal(_signals[-1], _s_model_name, _investorid, _instrument)
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204552.html原文链接:https://javaforall.net
