python 期货程序化_期货程序化交易
在这里给大家一个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 = '106474'
_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='20160101', enddate = '20171231', 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)
python 期货程序化_期货程序化交易相关推荐
- python 期货交易接口_期货数据接口(期货数据接口 python)
期货数据接口,聚宽,恒生聚宽,菜狗均可以接口聚宽ip列表小收费:聚宽聚宽-trader.com恒生聚宽ip列表,nae 我们公司用股票接口,你可以试一下websocket.high.js这个 聚宽和华 ...
- 股票自动交易python下单接口_股票自动交易Python下单接口
股票自动交易软件助手的 Order.dll 自动下单接口不仅仅能在大智慧,通达信,飞狐等软件公式里调用,也可以在windows程序里直接调用,支持 Python, C/C++/C#接口调用.有编程能力 ...
- 期货CTP接口与程序化(量化交易)的对接(2)——基本概念
上一讲:期货CTP接口与程序化(量化交易)的对接(1) 先理清几个概念. 策略 这是交易思路. 举一个简单的例子.下文都用这个例子来说明问题. 假如我给自己规定:"每当出现长阳,我就买进,每 ...
- 如何用Python下载并分析期货持仓数据
期货持仓报告 期货持仓报告,简称COT(Commitment of Traders)报告,记录机构投资者包括商业公司和对冲基金的期货持仓数据.由美国期货交易委员会(CFTC)公布,公布时间是每周五下午 ...
- 程序化交易系统主观辅助交易策略编写和演示 及文华tb单个品种指数合成方法
程序化交易系统主观辅助交易策略编写和演示 def tick_zhishu(ls):"""从数据库中读取合约后,合成约指数最新价,用于合成指数合约k线,采用持仓量加权:pa ...
- 恒指期货的特性及相应交易技巧
恒生指数是众多日内交易者喜欢的投资品种,越来越多的人从认识,接纳到追捧,确立了恒生指数"亚洲指数之王"的权威性与广泛性.然而,由于缺乏对恒指期货特性的深入了解,很多人盲目操作,导致 ...
- 用Python下载并分析期货持仓数据
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Trochil蜂鸟数据 ,作者蜂鸟数据Trochil 期货持仓报告 ...
- 量化交易python入门书籍推荐_求量化投资入门书籍或课程推介。?
入门,还是要看一个人的知识背景. 1.有一本:西蒙斯打开量化投资的黑箱,还有西蒙斯的文艺复兴公司的介绍(喜马拉雅),另外B站有西门斯的演讲. 通过对西蒙斯的了解,你要对自己的知识结构.背景.资源和量化 ...
- Python 实战之 什么是量化交易?它与python之间的关系
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本文章来自腾讯云 作者:somenzz 想要学习Python?有问题得不到第一时间 ...
最新文章
- JAVA EE 中之AJAX 无刷新地区下拉列表三级联动
- TF之LSTM:利用基于顺序的LSTM回归算法对DIY数据集sin曲线(蓝虚)预测cos(红实)(matplotlib动态演示)
- Road Construction
- Docker与CI持续集成/CD(转)
- python重定向到socket_python套接字流重定向实例汇总
- 31省份开学时间一览表
- cordova混合开发流程
- Github使用之git回退到某个历史版本
- VLFeat在matlab中的使用
- win11系统正式版介绍
- spark-sql配置并优化
- 新库上线 | CnOpenData中国环境统计年鉴数据
- matlab对比度拉伸代码,图像增强常用代码
- 搭建开源物联网平台教程
- 推动服务网格社区前进
- 快播将关闭QVOD服务器 清理低俗和盗版内容
- 《Blender图解教程:新手入门练习》
- Android java.lang.IllegalStateException: Underflow in restore - more restores than saves
- 如何反汇编exe之VB程序
- caffe 提取LMDB时可能出现的错误