跨期套利策略

策略想法:选取某一期货品种的主力合约和次主力合约,得到两个合约价格的价差,运用布林带指标,取前20分钟和2倍标准差,如果价差在布林带之外,入场,回到均值出场。

如下为策略代码:

#选取zn1701和zn1702合约的11月份交易分钟数据#数据经过excel处理,两个合约数据按时间合并#设置手续费和滑点为10元(两个合约买卖一次),平仓时扣除,import pandas as pdfrom pandas import Series,DataFrameimport numpy as npimport matplotlib.pyplot as pltfrom numpy import nandata=pd.read_excel(‘zn01_zn02.xlsx‘)data[‘spread‘]=data[‘ZN01‘]-data[‘ZN02‘]T=len(data.index)#记录每次交易收益率minute_return=[]up_cross_up_limit=Falsedown_cross_down_limit=Falseresult_up= DataFrame(columns=[‘ZN01‘, ‘ZN02‘, ‘spread‘, ‘ZN01买卖方向‘, ‘ZN01开平‘, ‘ZN02买卖方向‘, ‘ZN02开平‘])result_down= DataFrame(columns=[‘ZN01‘, ‘ZN02‘, ‘spread‘, ‘ZN01买卖方向‘, ‘ZN01开平‘, ‘ZN02买卖方向‘, ‘ZN02开平‘])total_mean_line=[]total_up_line=[]total_down_line=[]#生成T-20个元素为0列表,a=[0]*(T-20)for i in range(20,T):#得到第i个spread前20个数据,并计算均值、方差、up_line、down_line    #计算结果均为整数    data_spread=data.iloc[i-20:i,2].values    # print(data_spread)    mean_20day_spread=data_spread.mean()    total_mean_line.append(mean_20day_spread)    # print(mean_20day_spread)    std_20day_spread=data_spread.std()    up_line=mean_20day_spread+2*std_20day_spread    total_up_line.append(up_line)    down_line=mean_20day_spread-2*std_20day_spread    total_down_line.append(down_line)    #将第i个spread与前20个spread得到up_line比较,决定是否开仓    if data.iloc[i,2]>up_line and not up_cross_up_limit:        up_open=data.iloc[i:i+1,:]        up_open = DataFrame(up_open,columns=[‘ZN01‘, ‘ZN02‘, ‘spread‘, ‘ZN01买卖方向‘, ‘ZN01开平‘, ‘ZN02买卖方向‘, ‘ZN02开平‘])        up_open[‘ZN01买卖方向‘] = ‘卖出‘        up_open[‘ZN01开平‘] = ‘开仓‘        up_open[‘ZN02买卖方向‘] = ‘买入‘        up_open[‘ZN02开平‘] = ‘开仓‘        #汇总        result_up=pd.concat([result_up,up_open])        #得到开仓spread        hold_spread = data.iloc[i, 2]        up_cross_up_limit=True        #i从20开始        a[i-20]=1    # 将第i个spread与前20个spread得到mean_20day_spread比较,决定是否平仓    elif data.iloc[i,2]<=mean_20day_spread and up_cross_up_limit:        down_close=data.iloc[i:i+1,:]        down_close = DataFrame(down_close,columns=[‘ZN01‘, ‘ZN02‘, ‘spread‘, ‘ZN01买卖方向‘, ‘ZN01开平‘, ‘ZN02买卖方向‘, ‘ZN02开平‘])        down_close[‘ZN01买卖方向‘] = ‘买入‘        down_close[‘ZN01开平‘] = ‘平仓‘        down_close[‘ZN02买卖方向‘] = ‘卖出‘        down_close[‘ZN02开平‘] = ‘平仓‘        result_up=pd.concat([result_up,down_close])        profit_yield = (hold_spread - data.iloc[i, 2] - 20) / (data.iloc[i, 0] + data.iloc[i, 1])        minute_return.append(profit_yield)        up_cross_up_limit=False        a[i-20] = 1    # 将第i个spread与前20个spread得到down_line比较,决定是否开仓    elif data.iloc[i,2]<down_line and not down_cross_down_limit:        down_open=data.iloc[i:i+1,:]        down_open = DataFrame(down_open,columns=[‘ZN01‘, ‘ZN02‘, ‘spread‘, ‘ZN01买卖方向‘, ‘ZN01开平‘, ‘ZN02买卖方向‘, ‘ZN02开平‘])        down_open[‘ZN01买卖方向‘] = ‘买入‘        down_open[‘ZN01开平‘] = ‘开仓‘        down_open[‘ZN02买卖方向‘] = ‘卖出‘        down_open[‘ZN02开平‘] = ‘开仓‘        #汇总        result_down=pd.concat([result_down,down_open])        hold_spread = data.iloc[i, 2]        down_cross_down_limit=True        a[i-20] = 1    # 将第i个spread与前20个spread得到down_line比较,决定是否平仓    elif data.iloc[i,2]>=mean_20day_spread and down_cross_down_limit:        up_close=data.iloc[i:i+1,:]        up_close = DataFrame(up_close,columns=[‘ZN01‘, ‘ZN02‘, ‘spread‘, ‘ZN01买卖方向‘, ‘ZN01开平‘, ‘ZN02买卖方向‘, ‘ZN02开平‘])        up_close[‘ZN01买卖方向‘] = ‘卖出‘        up_close[‘ZN01开平‘] = ‘平仓‘        up_close[‘ZN02买卖方向‘] = ‘买入‘        up_close[‘ZN02开平‘] = ‘平仓‘        result_down=pd.concat([result_down,up_close])        profit_yield = (data.iloc[i, 2] - hold_spread - 20)/ (data.iloc[i, 0] + data.iloc[i, 1])        minute_return.append(profit_yield)        down_cross_down_limit=False        a[i-20] = 1print(‘-------------‘)transation=pd.concat([result_up,result_down]).sort_index()# transation.to_csv(‘transation_detail.csv‘)

#计算sharpe#计算总回报total_return=np.expm1(np.log1p(minute_return).sum())#计算年化回报annual_return=(1+total_return)**(365/30)-1risk_free_rate=0.015std=np.array(minute_return).std()volatility=std*(len(minute_return)**0.5)annual_factor=12annual_volatility=volatility*((annual_factor)**0.5)sharpe=(annual_return-risk_free_rate)/annual_volatility# print(total_return,annual_return,std,volatility,annual_volatility,sharpe)print(‘夏普比率:{}‘.format(sharpe))

#计算最大回撤#计算df_cum=np.exp(np.log1p(minute_return).cumsum())max_return=np.maximum.accumulate(df_cum)max_drawdown=((max_return-df_cum)/max_return).max()print(‘-----------------‘)print(‘最大回撤: {}‘.format(max_drawdown))

#计算盈亏比plrfrom collections import Counter# win_times=Counter(x>0 for x in minute_return)# loss_times=Counter(x<0 for x in minute_return)win_times=sum(x>0 for x in minute_return)loss_times=sum(x<0 for x in minute_return)plr=win_times/loss_timesprint(‘----------------------------‘)print(‘盈利次数:{}‘.format(win_times))print(‘亏损次数:{}‘.format(loss_times))print(‘盈亏比:{}‘.format(plr))

#画出净值走势图fig=plt.figure()ax1=fig.add_subplot(2,1,1)cum_net_worth,=plt.plot(df_cum,label=‘cum_net_worth‘)plt.legend([cum_net_worth],[‘cum_net_worth‘])ax2=fig.add_subplot(2,1,2)spread=data.iloc[20:,2].valuesplt.plot(total_mean_line)plt.plot(total_up_line)plt.plot(total_down_line)plt.plot(spread)#标记进场、出场位置,先将格式转换为listspread_mark=spread.tolist()for i in range(T-20):    if a[i]==0:        spread_mark[i]=nan    elif a[i]==1:        spread_mark[i]=spread_mark[i]plt.plot(spread_mark,‘*‘)plt.show()

下面为运行结果图:

进场出场放大图:

				
时间: 2024-08-27 21:30:24

跨期套利策略的相关文章

常见商品期货量化交易策略

商品期货套利策略 套利策略一般包括期现套利.跨期套利.跨市场套利.跨品种套利等. 对于商品期货而言,期现套利必须交易大量的商品实物,这对大多数机构投资者而言并不合适.因此,我们仅介绍跨期套利.跨市场套利和跨品种套利. 1.跨期套利 跨期套利的思路一般如下:对某一品种主力合约和次主力合约的价差做统计(一般是厚尾分布),然后选取恰当的分位数设定阈值,则可进行反转套利.我们前期的报告<趋强避弱商品期货套利策略>中对其已有详细的研究,在此就不赘述了. 2.跨市场套利 跨市场套利即对同一期货品种在不同市

win2003从组策略关闭端口(445/135/137/138/139/3389等)教程

一些恶劣的病毒会从某些端口入侵计算机,因此关闭某些用不到的而又具有高风险的端口就显得很有必要,是服务器管理员要做的基本的安全防范.本文将介绍win2003系统在组策略关闭某一个端口的教程,文章以关闭445端口为例. 首先要说明的是,此方法不仅仅适用于win2003,也适用于win7,且操作方法完全相同,所以win7用户也可以按照本文教程操作. 1.打开组策略编辑器 按组合键WIN+R打开运行窗口,然后输入gpedit.msc,按回车键,即可进入组策略编辑器. 2.创建 IP 安全策略 展开选项"

NFSv3 NFSv3针对防火墙端口开通策略 生产环境实践

针对NFSv4版本需要服务官方说明: NFS version 4 (NFSv4) works throughfirewalls and on the Internet, no longer requires an rpcbind service, supportsACLs, and utilizes stateful operations. Red Hat Enterprise Linux 6 supportsNFSv2, NFSv3, and NFSv4 clients. When mount

PHP设计模式-策略模式

<?php//策略模式//将一组特定的算法或行为 封装成一个类,以适应上下文环境 //策略的接口文件 约定策略的行为 针对一种情况 产生具体的策略interface Policy{ function showAd();} class Female implements Policy{ public function showAd() { echo __CLASS__.' policy'; }} class Male implements Policy{ public function showA

PowerShell~执行策略的介绍

首先看一下无法加载ps1脚本的解决方法 事实上也是由于策略导致的  解决方法主是开启对应的策略 set-ExecutionPolicy RemoteSigned 执行策略更改 执行策略可以防止您执行不信任的脚本.更改执行策略可能会使您面临 about_Execution_Policies 帮助主题中所述的安全风险.是否要更改执行策略? [Y] 是(Y) [N] 否(N) [S] 挂起(S) [?] 帮助 (默认值为“Y”): y 回车就可以了 查看当前的策略 get-executionpolic

对设计模式的总结之简单工厂与策略模式

前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓,本文就说说我对本人对简单工厂模式.策略模式的见解. 简单工厂模式与策略模式 简单工厂模式 工作中,常常遇到需要做一个功能(鸭子),这个功能中含有可控个数的子操作功能(鸭子叫,鸭子跑,鸭子飞),而且子功能在不同的情况下处理方式又不相同(成年鸭子/小鸭子叫,成年鸭子/小鸭子跑,成年鸭子/小鸭子飞).我

[廖雪峰] Git 分支管理策略

通常,合并分支时,如果可能,Git 会用 Fast forward 模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制 禁用 Fast forward 模式,Git 就会在 merge 时生成一个新的 commit,这样,从分支历史上就可以看出分支信息. 下面我们实战一下 --no-ff 方式的 git merge: 首先,仍然创建并切换 dev 分支: $ git checkout -b dev Switched to a new branch 'dev' 修改 readme.txt

再见!春节红包大战隐退是策略转移

对于近两三年的春节来说,大众印象最深刻的不是美酒佳肴.无聊春晚.鞭炮礼花啥的,而是以排山倒海之势袭来的红包雨.支付宝.微信支付都在春节时刻不断发力,以发红包的方式承包了大众春节的大部分娱乐时间.但在今年,支付宝和微信似乎是有了心灵感应一般,都表示不会再在春节期间展开红包大战,这是否就意味着以后我们就要与其说再见了? 但细细看支付宝.微信支付近来的动作却不难发现,春节红包大战的隐退实际上只是一种策略上的转移.春节红包对它们来说已经完成了既定的开拓移动支付应用场景的任务,但这并不意味着春节红包就真地

组策略 之 驱动器映射

目的:用户登陆自动挂载预设的网络驱动器. 可以根据不同的用户组来分类,例如:财务的共享文件夹,人资的共享文件夹. 在文件服务器共享设置好权限的文件夹然后使用策略发布给相应的用户或者组. 策略位置:用户配置---首选项---windows设置----驱动器映射 一.选择 "驱动器映射"  "新建" 说明:1."操作"选择:"更新",正常情况下选择此选项. 2.位置    :可直接属于共享文件夹的位置,例如:\\dc01\shar