专业正规安全的配资公司炒股平台门户网
关键词不能为空

期货配资

导航

「天然橡胶期现基差多少才能套利」 天然橡胶期

未知
admin

天然橡胶期现基差多少才能套利: 天然橡胶期货的套利投资-百度知道

展开全部 在期货市场上,套利投资是稳健型投资者偏好的投资形式。尤其在天然橡胶等较活跃的期货品种上,这种模式更受青睐。跨期套利需掌握合适时机。 上海期货交易所的天然橡胶合约套利分为跨期、跨市和期现套利。所谓跨期套利,指通过买入一种商品的某一个交割月份的期货合约,同时卖出同种商品的另一个交割月份的期货合约,然后在有利时机将这两个合约进行实物交割或对冲平仓而获利。由于天然橡胶期货(下称天胶期货)的价格波动强烈,当期货价格大涨大跌时,不同交割期的合约会出现不同幅度的涨跌,价差变化甚大,因此可进行套利操作。期货分析师表示,跨期套利可分为对冲平仓式和实物交割式两种形式。一般说,影响实物交割跨期套利盈亏的有多种因素,包括买入合约价格、卖出远期合约价格、仓储费、资金利息、增值税、交易手续费、交割费等。该形式的套利利润=卖出远期合约价格-买入合约价格-仓储费-资金利息-增值税-交割费。而天胶套利实物交割的具体费用更复杂,不妨来看一个假设案例。X=卖出远期合约价格-买入合约价格;仓储费=0.8元/吨/天*30天=24元/吨;交易手续费=15*2/5=6元/吨;交割手续费=80/5=16元/吨;增值税=X*13%/1.13;过户费=10元/吨;资金利息=5.22%*30/365*13000元/吨=55.78元/吨(设天胶期货价格为13000元/吨).根据上式计算公式可得:套利利润=X-X*0.13/1.13-(24+6+16+10+55.78)。当套利利润=0时,可得盈亏平衡点,即X≈126元/吨。换句话说,当两个月天胶期货价格的差价达到126元/吨以上,就可进行跨期套利。中日橡胶实现跨市套利世界上的天胶期货品种主要集中在亚洲,其中有日本的东京工业品交易所(TOCOM)、中国的上海期交所、新加坡的SICOM及马来西亚的KLCE期交所。目前国内关注较多的主要是TOCOM天胶价格。由于TO-COM的交易时间比上海期交所早一个小时,这就为实现跨市套利交易提供了可能。一方面,东京橡胶的交易时间为早上8:00至14:30,下午16:00至18:00,上海橡胶的交易时间为早上9:00至11:30,下午13:30至15:00;另一方面,两者都以国际标准3号烟片胶为可供交割品级。东京橡胶的合约标的是3号烟片胶,报价单位是日元/公斤;上海橡胶的合约标的是国产5号标胶,报价单位是人民币/公吨。由于上海橡胶同时允许进口三号烟片胶交割,因此两个市场间就建立了套利的基础。一般说,上海橡胶与东京橡胶的套利计算公式为:东京胶期价的进口完税价=[东京橡胶价(日元/公斤)*1000/美元兑日元汇率+40]*1.20*1.17.(先算成美元价格,再换成人民币,美元兑日元等按当日汇率,17%增值税,20%关税,40美元/吨海运费).投资者进行套利操作时需要注意,首先,套利的交易单位最好是10手或10手的整数倍,尽可能符合两个市场的持仓限制;其次,计算利润应考虑多项费用,天胶进口如需通过进口经营企业代理,进口者须考虑代理和保险费用、国内短途运输费、上海期交所交割费及资金利息。为尽量降低跨市场套利的风险,投资者的入市套利价差必须超出上述费用的总和。此外,套利虽然为投资者提供了一定的保护机制,但并非全无风险。如国家贸易政策变化会对贸易成本产生极大影响,直接关系到套利交易成败,投资者还应谨慎。 收起回答

天然橡胶期现基差多少才能套利: 塑料期货基差多少可以套利?

我是一名经纪人,我很多客户套利,说下我的经验吧。套利分牛市套利和熊市套利。我觉得主要还是要把握好这2点。基差的话,我建议在10个点左右。短点的话,5个点也行。最后不是亏在基差上,而是亏在对牛市套利和熊市套利的把握上。最后出现1个都亏损...

其他答案:可以的,都可以做套利的 期货:在看似简单的开仓、平仓背后是需要掌握一套专业技术的交易理念和交易思想,想要在期货市场上生存并盈利不是一件简单的事。 其实,说简单也简单,就看你是否掌握了期货的分析和操作技巧:不同的期货品种波动规律是不一样的,掌握规律,做好几个品种就够了!想做好期货:要学会等待机会,不能频繁操作,手勤的人肯定亏钱! 大繁至简,顺势而为;只需看分时线,利用区间突破,再结合一分钟K线里的布林带进行短线操作,等待机会再出手,一天稳定抓住10个点就够了,这样就可以收益4%了;止损点一定一定要在系统里设好:他可以克服人性的弱点,你舍不得止损,让系统来帮你!我们是个团队,指导操作同时也代客操盘,利润分成! 做久了才知道,期货大起大落,我们不求大赚,只求每天稳定赚钱! 要知道:在想到利润之前首先要想到的是风险!期货里爆赚爆亏的人太多,比爆赚爆亏更重要的是长久而稳定的盈利!

其他答案:套期保值,主要是规避风险。如果你认为现货风险很大,必须规避,那不论基差多大,你都应当采取措施。 在价格波动不是很剧烈的时候,可以选择套保交易的时机,这时才需要考虑基差的问题。 对于套保交易者来说,最好是没有交易风险。这时价格要位于“无风险套利边界”之外,可以弥补套保交易者的成本。对于买入套保者,买入价格要选取边界下沿;而对于卖出套保者,则要选取边界上沿。

其他答案:看你的运输费,储存费,等等一系列的费用吧。

天然橡胶期现基差多少才能套利: 当月期货一般基差多少能期现套利

请问期货中的\\“”期限套利\\“是什么意思?具体一点。…5250

其他答案:理论上期货价格是市场对于未来现货市场价格的预估值,而现货价格与期货价格之间的联系则用基差来表示。国债期货的基差指的是用经过转换因子调整之后期货价格与其现货价格之间的差额。国债的期货现货套利策略,本质上则是对于基差的预期变化进行交易。 国债期货交割的时候期现基差是0,因此如果市场上出现负基差,就可以做多基差,如果在后续交易中出现正基差,可以平仓获利,或者持有至交割,获取基差的利润,这是基差交易的基本思路。 基差交易的利润来源于持有期收益和基差变化。基差交易是利用基差的预期变化,在国债现货和期货市场同时或者几乎同时进行交易的交易方式。买入基差或者基差的多头就是买入现货国债并卖出相当于转换因子数量的期货合约;卖出基差或者基差的空头则恰恰相反,指的是卖空现货国债并买入相当于转换因子数量的期货合约。 基差的多头从基差的扩大中获取利润,如果国债净持有收益为正,那么基差的多头还可以另外获得该持有收益;基差的空头从基差的缩小中获取利润,如果国债净持有收益为正,那么基差的空头会损失该净持有收益。 相较于其他品种,国债期货最大的特殊性在于其现货标的由多只可交割债券决定,而其他金融期货一般只有一个现货标的,这就决定了为投资者所熟知的期现套利策略可以在国债期货的多只可交割债券上运用。在多只可交割债券上运用的期现套利,其收益机会来源不再是简单的由投资者情绪造成的二级市场期现价格的错杀,由于国债期货跟踪标的会在一篮子可交割券中变动,也就是最便宜可交割券(下简称ctd券)会发生变动,这使得国债期货期现套利有更丰富的收益机会。 市场投资者一般把这种在国债期货运用上延伸了的期现套利称为基差交易策略,可以说基差交易是更广泛意义上的期现套利,期现套利只是基差交易中的一种特殊情况。

天然橡胶期现基差多少才能套利: 天然橡胶期货的跨期套利-百度知道

所谓跨期套利,是指利用同种商品两个不同期货合约间的价格差异进行套利的一种投资方式。它通过买入一种商品的某一个交割月份的期货合约,同时卖出同种商品的另一个交割月份的期货合约,然后再有利时机将这两个合约进行实物交割或者对冲平仓而获利。因此,跨期套利主要利用的两个合约的价差变动来进行获利,当价差偏离合理区间后可以在这两个合同上进行相应的操作来获得盈利。 天然橡胶期货已经成为期货市场最活跃的期货品种之一,其价格波动非常强烈,而在出现大涨大跌的行情时,不同交割期的合约也会出现不同程度的涨跌幅度,价差变化非常大。因此,一旦出现偏离合理区间后,即可进行套利操作,在后期回归至合理区间后进行平仓获利。天然橡胶期货跨期套利可行性分析跨期套利的核心是寻找合理的价差区间。选用的是2010年7月12日沪胶市场的收盘价,而这里用到的两个合约是1011和1101合约。在计算合理价差的方法上,主要采用了两种计算方法:第一个是从交易所的交割程序方面开始计算买入1011同时卖出1101合约,模拟采用实际交割来进行套利的手法,从中计算整个套利过程中所涉及的成本;而另一种方法是从历史的价差入手,对两个合约的历史价差进行统计分析,以其均值作为合理价差区间的中间值。而这两种方法都涉及到了价差区间间隔的计算和确定,这对整个套利过程中的盈利和切入点等都有致关重要的作用。首先,先从计算模拟交割的套利成本开始入手。过程之中涉及到的较为确定的费用如下:1. 交割手续费:4元/吨。两个合约收两次,总计为8元/吨。2. 出/入库检验费:15元/吨。出/入库分别收两次,总计为30元/吨。3. 仓储费:0.8元/天、吨。1011和1101合约分别按照交割月的16日为交割日期,共计60天,因此仓储费总计为0.8*60=48元/吨。4. 过户费:10元/吨。两个合约对应两次过户,共计20元/吨。5. 交易手续费:5元/手。这里主要采用了期货公司所收取的手续费,两个合约开仓共计10元/吨。而进行跨期套利过程中并不确定的费用如下:6. 资金借贷成本。假定套利过程中,先行开仓两个合约,再等到价差回归至正常过程中,所涉及的资金使用主要两个合约的保证金。这里采用期货公司收取的大约是14%的保证金比例。而借贷利率采用人民银行的6个月贷款比率4.86%,折算为2个月的借贷利率。期货合约价格采用的是7月12日的收盘价。计算结果如下:7. 增值税。增值税是整个套利过程中最不确定的因素。从上期所的天胶品种简介中来看:“在天然橡胶期货交易中,由于要发生实物交割,相应也带来了增值税发票的开具问题,因增值税是由国家税务机关进行管理和收取,交易所和会员在其中担当的责任和如何操作也成为大家必须要了解的内容。上期所天然橡胶的标准交割品种分进口和国产天然橡胶,他们在收取增值税的操作中也有不同的计算方法。海关对进口天然橡胶代征17%增值税,而上海期货交易所规定会员或投资者在实物交割时开具的增值税专用发票,进口天然橡胶仍适用17%税率,国产天然橡胶适用13%税率。”“增值税发票上的价税合计=(该期货合约最后交易日的结算价-贴水)*卖出交割量”因此,计算增值税需要的是两个合约最后交易日的结算价,这个在我们计算过程中无法测算也没有办法提前估算。我们采用的是收盘价作为结算价差,那么我们要承担的增值税就是1011合约和1101合约的价差再乘以相应的税率。这里采用国产胶13%的增值税税率。最后,增值税计算结果如下:总计的1011合约和1101合约跨期套利成本为:8+30+48+20+10+246+65=427元/吨总结以上的计算,可以发现,主要不确定性因素在于借贷成本和增值税的计算。其中借贷成本由于保证金的关系,对的套利成本影响最大,利率和保证金的确定是决定借贷成本的关键。而另一个不确定性因素是增值税问题,由于两个合约未来的最后一个交易日的结算价并不确定,增值税存在很大变数。 收起回答

天然橡胶期现基差多少才能套利:天然橡胶期货早评

2019年10月6日 天胶早评

国内现货报价:上海地区,SCR5含税11100元/吨,RSS3含税13900元/吨,山东地区,SCR5,11150元/吨,RSS3含税,13700元/吨。青岛保税区:STR20#复合11200元/吨,SMR20#复合11000元/吨。

胶受资金推动强势拉涨,而现货市场跟涨盘面100-300元/吨不等,而据贸易商反馈市场询盘气氛依然低迷,主流成交稀少。销区18年全乳胶主流价格区间在11300-11400元/吨;泰国3#烟片货源供应量稀少,主流报价13950-14150元/吨高挺运行,实单放量有限;山东地区越南3L胶报价11350元/吨(13税报价),整体成交情况一般。

原料:泰国原料收购价格小涨,生胶片37.77,涨0.46;烟胶片39.90,涨0.41;胶水38.00,涨0.1;杯胶31.50,持稳。(泰铢/公斤)

工厂:目前国内多数轮胎企业运行稳定,整体开工七成左右,个别轮企开工接近满负荷。月初多数价格政策暂无新的调整,走货情况一般。终端需求难有利好支撑,贸易商走货压力不减,社会货源流通不畅。整体来看,节性需求淡季开始显现,部分地区轮胎市场逐渐进入销售淡季,销量难以维持,短期内轮胎市场延续弱势运行为主,轮胎价格不乏稳中走低的可能。

综合分析:沪胶再度获得资金的增仓流入,强势拉升 ,并逼近12260的前高位置,从技术形态上看显著走强。供应面来看,泰国进入到生产旺季,胶农补贴计划也在进行,因此有利于供应的释放。目前供应端仍偏宽松,后期套利盘补仓的令现货到港集中,并且云南产区目前新胶产量较高,年底还有替代种植进口,因此整体看当前的供应仍有压力。11月交易所注销仓单在32为万吨,预计将大大减轻仓单压力。下游目前从重卡销量和物流景气度来看,均有环比改善。盘面资金增仓拉涨,不排除是炒作棕榈联动橡胶,同时今天宏观给出MLF降息等流动性利好,橡胶得到多配。沪胶底部抬升,但追涨风险较高,建议卖出RU2001P11500看跌期权继续持有,后市仍逢低做多05合约。

天然橡胶期现基差多少才能套利:套利那些事儿17:从期现结构寻找套利机会

更多精彩内容,欢迎关注公众号:交易法门(ID:JMtrader),入群请加助理微信:zhuliqiqi7

很多交易者在进行期货分析的过程中,也希望能够进行基本面分析,但是苦于相关数据获取的成本比较高,而不得不只进行技术分析。其实无非就是一些库存、利润、产能、开工率、产量等相关的数据,这些数据变化的结果最终都会从期现结构上得到体现,所以把商品期货的期现结构理解了,基本上能够从中看到这个品种基本面的根本情况。

常见的两种期现结构

商品期货最常见的两种市场结构是Contango和Backwardation,即正向市场和反向市场。Contango结构表明现货市场是熊市结构,当前阶段现货供过于求,买方不愿意为当下购买商品而支付更高的溢价,所以现货价格非常低,与此同时,由于对未来存在较为乐观的预期,预期未来这种供过于求的情况会改变,所以远月价格最高,期现结构呈现出现货价格低于近月合约价格,近月合约价格低于远月合约价格的情况。

Backwardation结构表明现货市场是牛市结构,当前阶段现货供不应求,买方愿意为当下购买商品而支付更高的溢价,所以现货价格高企,与此同时,高价格下的高利润会导致未来产能和产量的释放,预期未来这种供不应求的情况会改变,所以远月预期比较悲观,远月价格最低,期现结构呈现出现货价格高于近月合约价格,近月合约价格高于远月合约价格的情况。

通过对历史的观察,我发现了一下一些规律:

1)当一个品种的价格处于底部区域,往往会呈现出Contango结构,例如当前的油脂、橡胶等品种。

2)当一个品种的价格处于顶部区域,往往会呈现出Backwardation结构,例如黑色系品种。

3)当一个品种的期现结构在低位从Contango结构变为Backwardation结构,往往暗示着这个品种的基本面发生了转折,从空头市场变为多头市场,目前白糖的期现结构可能要发生变化,需要注意。

4)当一个品种的期现结构从Backwardation结构变为Contango结构,往往暗示着这个品种的基本面发生了转折,从多头市场变为空头市场,例如去年的甲醇就是这样。

5)由以上4点可以推理得出,任何一个品种发生历史级别的大行情的时候,现货的涨跌幅度远远大于期货的涨跌幅度。

所以,当一个品种的期现结构如果没有发生根本性变化,那就是小的基本面变化;当一个品种的期现结构如果发生了根本性变化,那就是大的基本面变化。小基本面的变化可能结合相关基本面数据,可以做一些波动性的行情;大的基本面变化往往是一个长期趋势性行情。即使你不知道相关的数据,从商品的期现结构的变化,可以判断出这个品种的基本面是否发生了根本性的变化。

单纯从这种期现结构自身来看,Contango结构利于做反套,尤其是结合仓单有效期强制注销的合约,当有大量仓单生成的时候,做反套效果往往比较好;Backwardation结构利于做正套,尤其是结合临近交割时虚实盘比比较大的时候,做正套效果往往比较好。

从单边角度来讲,Backwardation结构利于长期做多,不断换月,尤其是在价格处于历史低位阶段,因为如果是价格处于历史高位,需要换很长时间,尽管每次换月的时候,你都亏钱,但是当换到远月合约时,可以开相同的手数,同时保持账户资金使用率基本不会发生太大变化,用现货的话来说,货的数量没变,只不过货贬值了而已。但是如果从价格高位这样换月,容易出现一个问题,你会发现换月过程中市场结构逐渐发生变化了,变成了Contango,这种情况就容易亏损了。

所以利用Backwardation结构,在价格处于历史低位的时候,可以这样去轮动换月。之前很多人都说,价格在低位怎么可能同时出现低库存和低利润的情况呢?低库存和低利润再加上预期好,那价格岂不是早就涨起来了吗?你会发现有时候会出现这种情况,一个品种的供应本身非常大的,库存非常高,但是现货涨了没多久,库存反而集体不见了,显性库存就非常低了。这让我想起了傅海棠先生在一个视频中曾经说过的,当期货贴水,价格处于低位,库存比价高,但是市场上买不到货了,这个时候可以重仓搞一把。所以我个人非常认同傅海棠先生的这个观点。

期现结构异常带来的机会

有时候上述两种的期现结构会发生异常,农产品比工业品更容易发生期现结构的异常,主要是因为农产品的季节性规律更加明显一些,所以对于季节性规律特别强的月份,期现结构可能会发生异常。相比较之下,工业品受到这种情况要少一些。

有时候也会由于事件驱动或者其他因素,导致期现结构在某个合约上发生了明显的异常。例如在Contango结构中由于事件冲击,导致01合约的价值明显低估;或者在Backwardation结构中由于事件冲击或者其他因素,导致01合约的价值明显高估。这个时候我们需要分析出现这种期现结构的原因,从而判断是否存在期现结构进行修正的套利机会。

例如,上图第一种情况,往往出现在01合约是仓单有效期到期,需要进行强制注销的情况,在期货临近交割的时候,近月合约价格面临巨大的抛压,而且本身品质相比现货质量差一些,所以近月合约最终跌到贴水于现货。如果是这种情况,显然是不适合参与期现结构的修复。

再比如,上图第一种的期现结构,最近就有一个例子,就是菜油,由于事件驱动,导致市场预期菜籽供应偏紧,近月合约价格大涨,打破了原来的Contango结构,显然近月合约是高估了的,而且近月合约恰好又是仓单强制注销的合约,目前交易所仓单数量又是历史高位,这可能最终出现期现结构的修复,从而产生套利机会。

对于这种期现结构在某个合约发生异常的品种,需要找到异常的原因,如果这种原因的影响是持续的,那么就规避,如果是不可持续的,可能为我们提供套利的机会,正套、反套、蝶式等都有操作的空间。但是反套的风险还是大于正套,因为任何意外事件的影响,往往都会导致预期供应偏紧,近月主力合约有可能大涨,使得原来的逻辑失效,这一次菜油的情况就是一个非常典型的例子。

两种特殊的期现结构

对于那些逐月交割的品种来说,例如基本金属中的铜、锌、铝等,还有股指期货,有时候这些品种的期现结构排列比较奇怪,呈现出U型或者倒U型的结构。无论是U型结构还是倒U型结构,本质上反映了市场预期相对混乱,未能够趋于一致。

U型结构反映了短期现货市场供需偏紧,但对中期预期偏悲观,反而对远期又偏乐观;倒U型结构反映了短期现货市场供需宽松,但中期预期乐观,反而对远期却是悲观的。但实际上,交易者对中期和远期的预期很难把握好明确的界线,所以预期悲观的近月价格和预期乐观的远月价格往往容易发生预期修正,预期乐观的近月价格和预期悲观的远月价格也容易发生预期修正。

从操作的角度来讲,对于U型结构来说,买在左下角,卖在右上角。因为从现货价格和近月价格的期现结构来说,短期现货市场依然偏紧,贴水做多依然是比较安全的选择;远月价格已经平水甚至升水,从近月价格和远月价格的期现结构来看,预期现货市场供需宽松,适合做期现套利。所以这种U型结构从交易角度来说,买U型底部的近月合约,卖出U型顶部的远月合约。同样的道理,对于倒U型结构来说,卖在左上角,买在右下角。只要这种结构还在保持,还可以进行移仓滚动操作。

现货利润和盘面利润的期现结构

对于跨期套利来说,我们主要是根据价差的期现结构去选择正套或者反套;对于跨品种套利来说,我们主要是根据现货利润和盘面利润的期现结构去选择正套或者反套。交易的思路都是类似的。

以MTO利润为例,假设现在MTO的现货利润和盘面利润期现结构是这样的,现货利润尚可,盘面05合约利润较高,而09合约和01合约盘面利润较低。在这种情况下,显然05合约盘面利润可能被高估,单纯从05合约来说,做空盘面利润可能更合适一些;但就像之前介绍的矩阵套利,我们还可以用套利对套利进行对冲,空05MTO利润,多09MTO利润,做利润的期现结构修复。当然,我这是利用MTO利润举个例子,实际情况并不一定真实如此。

另外,我们还需要观察一段时间以来这种期现结构的变化,当天的期现结构、一周之前的期现机构、一个月之前的期现结构、三个月之前的期现结构、六个月之前的期现结构、一年之前的期现结构,根据期现结构的变化来理解商品背后大的基本面的变化。

当然,有些品种除了现货市场、期货市场之外,还存在纸货市场,也可以利用现货市场、纸货市场、期货市场之间进行套利,这就需要关注现货、纸货、期货的期现结构。

当然,这里仅仅是从期现结构一个角度去分析套利的机会,不同的市场结构背后能够反映很多相通的逻辑,一般情况下Backwardation结构的背后往往暗示着低库存、低仓单的逻辑,所以说有时候做跨期套利,顺仓单逻辑、顺库存逻辑、顺基差逻辑,本质上满足一个的情况下,那两个在很多时候也是自然满足的。

——————

推荐阅读

  1. 史上最全的金融投资系列书籍1-50
  2. 史上最全的金融投资系列书籍51-100
  3. 史上最全的金融投资系列书籍101-150
  4. 史上最全的金融投资系列书籍151-200
  5. 史上最全的金融投资系列书籍201-250
  6. 史上最全的金融投资系列书籍251-300

天然橡胶期现基差多少才能套利:【量子研报实战系列】商品期货套利之“三十六计”(附代码)--【量子金服投研平台出品】

引言

商品期货套利是期货套利交易的一种类型,其基本原理在于当市场价格关系处于不正常状态时进行双边交易以获取低风险差价。本文将结合海通证券发布于2016年8月3日的研究报告《绝对收益策略系列研究之二——商品期货套利策略》向大家简单介绍这一策略,并在量子金服投研管理平台上加以实现。

概念简介

商品期货套利主要有四种模式:

1) 期现套利

期现套利是指利用同一种商品,在期货市场与现货市场之间存在不合理的价差进行套利的行为。商品期货价格与现货价格之间的差值被称为“基差”,基差的值在一段时间内都应当是稳定的。当基差出现不合理的偏差时,套利者即可通过构建现货与期货的套利组合,以期望基差在未来回归合理的价值区间从而获取利润。

2) 跨期套利

跨期套利是指利用同一商品、两个不同结算时间的合约,在市场上同时买进、卖出,通过价差的扩大和缩小来获取利润。跨期套利策略包括基本面套利和统计套利。基本面套利需要实际考察商品的供需状态、消费库存比等等信息。而统计套利是利用不同期限合约直接的协整关系,建立一个有均值回复特征的多空组合。

3) 跨品种套利

跨品种套利是指利用两种不同的,但是有很强相关性的商品之间的合约进行套利交易。通过买卖相同时间的不同商品合约,以期在未来二者价差扩大或缩小,再对冲平仓获利。跨品种套利主要包括产业链套利和替代品种套利。产业链套利指的是在同一条产业链中选择两个或多个品种。这些品种往往相关性较高,无论从基本面还是统计结果出发都比较容易找到逻辑支撑,比较常见的产业链如炼钢、大豆压榨。而替代品种套利指的是选取功能上存在较强替代性的两种产品,其价格往往能够反映出一定的相关性,例如豆油和棕榈油。

4) 跨市场交易

跨市场交易是指在不同市场之间对同一期货合约进行套利交易。由于区域地理等差别因素,各商品合约存在一定的稳定价差关系。当这一价差由于不同市场的供求关系、市场环境甚至交易规则等方面的因素产生偏离时,套利者即可通过在不同市场买卖同一商品合约的行为获利。

在以上四种套利模式中,期现套利要求投资者参与现货市场交易,而跨市场交易则要求投资者在不同市场、主要是不同国家的市场进行交易,在操作上存在一定的不便,我们在本文中不再多加讨论。针对跨期套利中的统计套利,与跨品种套利中的替代品套利,下面我们将制定简单的交易策略。

策略思路

商品套利的策略逻辑基本一致,都在于判断时点,买入卖出同时进行,赚取差价。不同套利策略主要的差异在于投资标的选择的不同,以及时点判断方式的不同。具体的步骤为:

1) 选择合约标的,一般数量为两个。记为合约A,B,两者满足较强的相关关系;

2) 制定A相对于B的相对价格指标,记为S;

3) 当S大于开仓阈值时,开多A、开空B;当S小于平仓阈值或大于止损阈值时时,平仓;反之亦然;

策略细节

1) 标的选取

对于跨期套利策略,我们选取流动性良好,且统计检验满足协整关系的橡胶期货合约作为投资标的。橡胶期货主力合约在1,5,9三个月切换,且主力合约在交割前一个月的月初完成。因此我们在每年的12、1、2、3月交易5月和9月的合约,4、5、6、7月交易9月和1月合约,8、9、10、11月交易1月和5月合约,在3、7、11月的最后一个交易日收盘时平仓,下个交易日起更换套利合约。

对于跨品种套利策略,我们选取替代性较强,相关性较好的豆油、棕榈油作为标的。选取每天的主力合约进行交易。

2) 相对价格指标

经过回归得到协整系数近似为1,因此取头寸比例固定为1:1

对价差进行标准化处理:

其中为过去N个价差的平均值,为价差的标准差。基于均值回复的特征,当价差大于开仓阈值时建仓,回复至平仓阈值或是突破止损阈值时平仓,具体参数如下:

3) 交易手数

每次双边各交易相同手数

4) 保证金(MARGIN)

设为50%,即杠杆率为2

5) 回溯期(N)

可自行定义

6) 开仓阈值(ENTRYSCORE)

2倍标准差

7) 平仓阈值(EXITSCORE)

0.5倍标准差

7) 止损阈值(STOPSCORE)

3倍标准差


在实现过程中,参数设置:

WINDOW=100 nENTRY_SCORE=2 nEXIT_SCORE=0.5 nSTOP_LOSS_SCORE=3 nMARGIN=0.5

策略实现

1) 跨品种套利

交易标的:豆油(Y)、棕榈油(P)主力合约

回测时间:2012.01.01~2017.01.01

回测时长:5年

收益曲线


收益归因


业绩分析


如图,我们的收益很一般,为了分析原因,我们对相对价格指标和它标准化后的结果作图分析:


如图,红色线为相对价格指标,蓝色线为标准化后的指标。从图中可以发现,在回测期间内(2012.01.01~2017.01.01)价格指标呈现较大幅度的波动,但总体依然表现出了均值复归的特质。且标准化后的指标变动与原价差变动相对吻合,应当有一定程度的预测作用。收益率过低可能是因为我们使用了50%的保证金,杠杆率过低。


如图,我们的策略在最多的时候也只使用了不到35%的保证金,持有过多现金可能是导致我们收益率平庸的原因。

下调保证金率后:




如图所示,收益率显著提升。当然,更高的杠杆率也带来更大的风险,我们的回撤与波动率都上升较大。不过策略的夏普比率也有较大提升,可以说总体是表现更好的。

2) 跨期套利

交易标的:天然橡胶主力合约

回测时间:2015.01.01~2016.05.01

回测时长:16个月

收益曲线


收益归因


业绩分析

可以发现,在最大回撤52.9%的情况下,该天然橡胶期货的跨期套利策略实现年化收益率19.4%,总收益率25.07%。策略中的回溯期N为50,保证金比率统一设置为13%。每次开仓均利用可用余额的80%进行操作。由于杠杆率较高,实现了不错的收益率。

另一方面,发现在15年4月与16年1月之间交易较少,猜想阈值设置偏高,导致交易触发事件减少。实际操作时可根据自身需要进行参数设置。

小结

本文对商品期货的跨品种套利和跨期套利策略进行了简单的介绍。通过量子金服投研平台我们实现了这两种策略并进行分析。需要指出的是,我们采用的是日线操作,而商品期货套利的机会稍纵即逝,在实际操作中采用分钟线为好,这里我们仅做介绍,读者可通过量子金服投研平台自行编写策略进行实现。作为一种比较成熟的期货套利方式,商品期货的跨期和跨品种套利策略在回测过程中实现了较好的收益率,但该策略在实际使用过程中的诸多参数设置,读者需要根据实际情况进行调整,切不可一成不变。

Code

1)跨品种套利

# -*-ncoding:utf-8 -*-nnnnfrom CloudQuant import SDKCoreEngine # 导入量子金服SDKnnfrom CloudQuant import AssetTypennfrom CloudQuant import QuoteCyclennfrom CloudQuant import OrderTypennimport numpy as np # 使用numpynnimport pandas as pdnnimport mathnnimport matplotlib.pyplot as pltnnnnnp.seterr(invalid='ignore')nnnnCOMMODITY=['Y.DCE','P.DCE']nnWINDOW=100nnENTRY_SCORE=2nnEXIT_SCORE=0.5nnSTOP_LOSS_SCORE=3nnMARGIN=0.1nnnnglobal score_storednnscore_stored=[]nnglobal deltanndelta=[]nnnnconfig = {nn 'username': 'pengkun',nn 'password': '111111',nn 'rootpath': 'c:/cStrategy', # 客户端所在路径  'assetType': AssetType.Future,nn 'initCapitalFuture': 10000000, # 初始资金  'startDate': 20120101, # 交易开始日期  'endDate': 20170101, # 交易结束日期  'cycle': QuoteCycle.D, # 回放粒度为1分钟线  'feeRate': 0.001,nn 'feeLimit': 5,nn 'strategyName': 'commodity_arbitrage', # 策略名  "logfile": "ma.log",nn 'dealByVolume': Truenn}nnnndef dateAdd(year_month,add):nn year=int(year_month[0:2])nn month=int(year_month[2:4])nn month=month+addnn if month>12:nn year+=1nn month-=12nn return str(year*100+month)nnnndef initial(sdk):nn flag = 0.0 # 标记状态  sdk.setGlobal('flag', flag)nnnnnndef initPerDay(sdk):nnnn #获取当前主力合约  date=sdk.getNowDate()nn year_month=str(date)[2:6]nn code=sdk.getFactorData("LZ_CN_CF_CODE")nn main_contract=sdk.getFactorData("LZ_CN_CF_DOMINANT_CONTRACT")[-1]nn main_contract=pd.Series(main_contract,index=code)nn contract=[]nn for c in COMMODITY:nn temp = 0nn while(temp!=1):nn temp_c=c[0]+year_month+c[1:]nn if temp_c in main_contract:nn temp=main_contract[temp_c]nn year_month=dateAdd(year_month,1)nn contract.append(temp_c)nn sdk.setGlobal("c_a",contract[0][0:5])nn sdk.setGlobal("c_b",contract[1][0:5])nnnndef strategy(sdk):nn flag=sdk.getGlobal('flag')nn contract_a=COMMODITY[0]nn contract_b=COMMODITY[1]nn contract=[contract_a,contract_b]nn print contractnn hist=sdk.getLatest(contract,WINDOW,"D",2)nn if len(hist[contract_a])>=WINDOW and len(hist[contract_b])>=WINDOW:nn hist_a=[0.0]*WINDOWnn hist_b=[0.0]*WINDOWnn for i in range(WINDOW):nn hist_a[i]=math.log(hist[contract_a][i].close)nn hist_b[i]=math.log(hist[contract_b][i].close)nn hist_a=np.array(hist_a)nn hist_b=np.array(hist_b)nn #nspread=hist_b-hist_ann spread=hist_a-hist_bnn mean=np.nanmean(spread)nn std=np.std(spread)nn score=(spread[-1]-mean)/stdnnnn contract_a = sdk.getGlobal("c_a")nn contract_b = sdk.getGlobal("c_b")nn contract = [contract_a, contract_b]nn print contractnn q=sdk.getQuotes(contract,2)nn price_a=q[contract_a].opennn price_b=q[contract_b].opennnnnnn margin_a=MARGINnn margin_b=MARGINnnnn multiple_a=10nn multiple_b=10nnnn volume_a= (sdk.getAccountInfo(tsInd=2).availableCash)n//(price_a*margin_a*multiple_a+price_b*margin_b*multiple_b)nn volume_a=int(volume_a)nn volume_b=volume_annnn pos_a=0nn pos_b=0nn #清仓  pos=sdk.getPositions(2)nn for f in pos:nn if f.code==contract_a:nn pos_a=f.optPositionnn elif f.code==contract_b:nn pos_b=f.optPositionnn else:nn ordertype=f.orderTypenn quote=sdk.getQuote(f.code,tsInd=2)nn if quote:nn price=quote.opennnnn sdk.makeOrder(f.code,price,f.optPosition,-ordertype,tsInd=2)nnnnnn if (score EXIT_SCORE) or (score>STOP_LOSS_SCORE and flag-EXIT_SCORE and flag<-EXIT_SCORE) or (score<-STOP_LOSS_SCORE and flag>-STOP_LOSS_SCORE): #上穿止盈点,平仓  sdk.makeOrder(contract_a, price_a, pos_a, -2, tsInd=2)nn sdk.makeOrder(contract_b, price_b, pos_b, -1, tsInd=2)nn sdk.sdklog("------------------------------------------")nn sdk.sdklog(sdk.getNowDate(), "DATE")nn sdk.sdklog([contract_a, price_a, pos_a, -2], 'CLOSE_SHORT')nn sdk.sdklog([contract_b, price_b, pos_b, -1], 'CLOSE_LONG')nnnn if score<-ENTRY_SCORE and flag>-ENTRY_SCORE: #下穿下界,买入  sdk.makeOrder(contract_a, price_a, volume_a, 2, tsInd=2)nn sdk.makeOrder(contract_b, price_b, volume_b, 1, tsInd=2)nn sdk.sdklog("------------------------------------------")nn sdk.sdklog(sdk.getNowDate(), "DATE")nn sdk.sdklog([contract_a, price_a, volume_a, 2], 'OPEN_SHORT')nn sdk.sdklog([contract_b, price_b, volume_b, 1], 'OPEN_LONG')nnnn if score>ENTRY_SCORE and flagSTOP_LOSS_SCORE:nn flag=STOP_LOSS_SCORE+1nn elif score>ENTRY_SCORE:nn flag=(STOP_LOSS_SCORE+ENTRY_SCORE)/2nn elif score>EXIT_SCORE:nn flag=(ENTRY_SCORE+EXIT_SCORE)/2nn elif score>-EXIT_SCORE:nn flag=0nn elif score>-ENTRY_SCORE:nn flag=(-ENTRY_SCORE-EXIT_SCORE)/2nn elif score>-STOP_LOSS_SCORE:nn flag=(-STOP_LOSS_SCORE-ENTRY_SCORE)/2nn else:nn flag=-STOP_LOSS_SCORE-1nnnn print flagnn score_stored.append(score)nn delta.append(spread[-1])nn sdk.setGlobal("flag",flag)nnnnnndef main():nn # 将策略函数加入  config['initial'] = initialnn config['strategy'] = strategynn config['preparePerDay'] = initPerDaynn # 启动SDKnn SDKCoreEngine(**config).run()nn fig=plt.figure()nn #nplt.plot(score_stored)nn # plt.plot(delta)nn ax1 = fig.add_subplot(111)nn ax1.plot(score_stored,label='score_standard')nn ax1.plot([2]*len(score_stored),'--')nn ax1.plot([-2] * len(score_stored), '--')nn ax1.plot([3] * len(score_stored), '--')nn ax1.plot([-3] * len(score_stored), '--')nn ax1.plot([0] * len(score_stored), '--')nn ax1.plot([0.5] * len(score_stored), '--')nn ax1.plot([-0.5] * len(score_stored), '--')nnnnnn ax2 = ax1.twinx() # this is the important functionnn ax2.plot(delta,'r',label="score")nnnnnn plt.show()nnnnif __name__ == "__main__":nn main()

2)天然橡胶跨期套利(节选)

# -*- coding=UTF-8n-*-nnnnfrom CloudQuant import SDKCoreEngine # 导入量子金服SDKnnfrom CloudQuant import AssetTypennfrom CloudQuant import QuoteCyclennimport numpy as npnnimport pandas as pdnnimport matplotlib as mlnnnnconfig = {nn 'username': 'maodaren', # 访问SDK所使用的用户名,即云宽客的登录名  'password': '111111', # 访问SDK所使用的用户名对应的密码  'rootpath': 'd:/cStrategy/', # 基础数据存放的路径,即客户端所在路径  'initCapitalFuture': 10000000, # 期货初始资金 1千万  'startDate': 20150101, # 回测开始时的日期  'endDate': 20160501, # 回测结束时的日期  'cycle': QuoteCycle.D, # 进行回测前的时间粒度,int类型,定义在枚举QuoteCycle中  'assetType':nAssetType.Future,nn 'feeRate': 0.001, # 手续费率  'feeLimit': 5, # 最低手续费  'strategyName': '跨品种套利RU', # 策略名  'dealByVolume': True # 撮合是否考虑实际交易量 }nnflag = []nndef initial(sdk):nn count = -1nn days = 20nn sdk.setGlobal('DAYS', days)nn sdk.setGlobal('COUNT', count)nnnndef initPerDay(sdk):nn COUNT = sdk.getGlobal('COUNT')nn COUNT += 1nn sdk.setGlobal('COUNT', COUNT)nnnndef strategy(sdk):nn # 获取全局变量  deal_cal =nnp.array(sdk.getFactorData('LZ_CN_CF_EXCH_CAL')) # 商品期货交易日历  futureClose =nnp.array(sdk.getFactorData("LZ_CN_CF_QUOTE_CLOSE")) # 获取商品期货收盘价因子  futureOI =nnp.array(sdk.getFactorData("LZ_CN_CF_QUOTE_OI")) # 获取商品期货持仓量因子  futureList =nnp.array(sdk.getFactorData("LZ_CN_CF_CODE")) # 商品期货合约代码因子  heyuechengshu =nnp.array(sdk.getFactorData('LZ_CN_CF_MULTIPLIER'))nnnn COUNT = sdk.getGlobal('COUNT')nn print '第',COUNT+1,'天'nn now_date =nsdk.getNowDate()nn # 当前月份  print now_datenn now_day = now_date%100nn now_month =nnow_date/100%100nn now_year =nnow_date/10000%100nn now_date_fresh =nnow_month+now_year*100nnnn deal_month_1 = [12,1,2,3]nn deal_month_2 = [4,5,6,7]nn deal_month_3 = [8,9,10,11]nnnn varietyname = ['RU']nn futurecodes = {}nn futurecodes_1 = {}nnnn for i in range(len(varietyname)):nn futureCode = []nn futureIflist = []nn futureIflistSite = []nn futurecodes[varietyname[i]] = []nn futurecodes_1 = {}nnnn for j in range(len(futureList)):nn  futurecode = futureList[j][:-4]nn futurecodes_1[futurecode]=[]nn if varietyname[i].lower()n== futurecode[:len(varietyname[i])].lower():nn futureIflist.append(futurecode)nn futureIflistSite.append(j)nn  futurecodes[varietyname[i]].append(futurecode)nn futurecodes_1[futurecode].append(j)nn if futureIflist is None:nn print '该类期货目前没有合约'nn breaknn #选择出今年的主力合约 1,5,9月份  main_future = {}nn main_future['thisyear']={}nn main_future['thisyear']['1']=[]nn main_future['thisyear']['5']=[]nn main_future['thisyear']['9']=[]nn main_future['nextyear']={}nn main_future['nextyear']['1'] = []nn main_future['nextyear']['5'] = []nn main_future['nextyear']['9'] = []nn for num in range(len(futurecodes['RU'])):nn temp = (int(futurecodes['RU'][num][2]) != 0)nn if temp:nn if int(futurecodes['RU'][num][2:])/100 == now_year:nn if int(futurecodes['RU'][num][2:])%100 == 1:nn main_future['thisyear']['1'].append(futurecodes['RU'][num])nn elif int(futurecodes['RU'][num][2:])%100 == 5:nn main_future['thisyear']['5'].append(futurecodes['RU'][num])nn elif int(futurecodes['RU'][num][2:])%100 == 9:nn main_future['thisyear']['9'].append(futurecodes['RU'][num])nn else:nn passnn  elif int(futurecodes['RU'][num][2:])/100 == now_year+1:nn if int(futurecodes['RU'][num][2:])%100 == 1:nn main_future['nextyear']['1'].append(futurecodes['RU'][num])nn elif int(futurecodes['RU'][num][2:])%100 == 5:nn main_future['nextyear']['5'].append(futurecodes['RU'][num])nn elif int(futurecodes['RU'][num][2:])%100 == 9:nn main_future['nextyear']['9'].append(futurecodes['RU'][num])nn else:nn passnnnn if now_month in deal_month_1: #当前月份为[12,1,2,3],交易5月和9月合约。  if now_month is not 12:nnnn position1 =nfuturecodes_1[main_future['thisyear']['5'][0]]nn position2 =nfuturecodes_1[main_future['thisyear']['9'][0]]nn heyuecs =nheyuechengshu[position1]nn price_serials_1 =nfutureClose[-50:, position1]nn price_serials_2 =nfutureClose[-50:, position2]nn cut =nnp.array(np.log(price_serials_1) - np.log(price_serials_2))nn cut_std = np.std(cut)nn avg = np.nanmean(cut)nn st = (cut[-1] - avg) /ncut_stdnn # 判断flag值  if 0 < st < 0.5:nn flag.append(0.5)nn elif -0.5 < st < 0:nn flag.append(-0.5)nn elif 3 > st > 2:nn flag.append(2)nn elif -3 < st < -2:nn flag.append(-2)nn elif st > 3:nn flag.append(3)nn elif st < -3:nn flag.append(-3)nn else:nn flag.append(0)nn print '今日flag:%f'%flag[-1]nnnnnn # 交易今年主力合约 即买入5月合约卖出9月合约  if abs(flag[-1]) == 0.5 : #平仓操作开始触发  #获取持仓列表  print '平仓操作开始触发'nn pos =nsdk.getPositions(tsInd = AssetType.Future)nn if pos is None:nn print '取不到持仓行情信息,退出'nn returnnn if pos:nn for i in pos:nn quote =nsdk.getQuote(i.code,tsInd=AssetType.Future)nn if i.orderType == 1:nn sdk.makeOrder(i.code,quote.close,i.optPosition,-1,2)nn if i.orderType == 2:nn sdk.makeOrder(i.code, quote.close, i.optPosition, -2, 2)nn if i.orderType == -1:nn sdk.makeOrder(i.code,quote.close,i.optPosition,1,2)nn if i.orderType == -2:nn sdk.makeOrder(i.code,quote.close,i.optPosition,2,2)nnnn if COUNT > 0 and flag[-1] ==2 and flag[-2] != 2: #开仓操作开始触发  print 'flag = 2,开仓操作开始触发'nn account =nsdk.getAccountInfo(AssetType.Future) # 获取账户信息  budget =naccount.availableCash # 用可用余额进行建仓操作  if account is None:nn returnnn print 'Account's availablenCash', budgetnn quote =nsdk.getQuote(main_future['thisyear']['5'][0],tsInd=nAssetType.Future)nn quote_1 =nsdk.getQuote(main_future['thisyear']['9'][0],tsInd=nAssetType.Future)nn if quote is None or quote_1 is None:nn print '取不到合约行情,退出'nn returnnn volume =0.8*budget//(0.13*(quote_1.close+quote.close)*int(heyuecs[0][-1][:2]))nn sdk.makeOrder(main_future['thisyear']['5'][0],quote.close,volume,1,2)nn sdk.makeOrder(main_future['thisyear']['9'][0],quote_1.close,volume,-1,2)nnnn if COUNT > 0 and flag[-1] ==-2 and flag[-2] != -2: #开仓操作开始触发  print 'flag = -2,开仓操作开始触发'nn account =nsdk.getAccountInfo(AssetType.Future) # 获取账户信息  budget =naccount.availableCash # 用可用余额进行建仓操作  if account is None:nn returnnn print 'Account's availablenCash', budgetnn quote =nsdk.getQuote(main_future['thisyear']['5'][0],tsInd=nAssetType.Future)nn quote_1 =nsdk.getQuote(main_future['thisyear']['9'][0],tsInd=nAssetType.Future)nn if quote is None or quote_1 is None:nn  print '取不到合约行情,退出'nn returnnn volume =0.8*budget//(0.13*(quote_1.close+quote.close)*int(heyuecs[0][-1][:2]))nn print volumenn print main_future['thisyear']['5'][0],quote.close,volumenn sdk.makeOrder(main_future['thisyear']['5'][0],quote.close,volume,-1,2)nn print 1nn sdk.makeOrder(main_future['thisyear']['9'][0],quote_1.close,volume,1,2)nnnn if COUNT > 0 and flag[-1] ==3 and flag[-2] != 3: #止损操作开始触发  print 'flag = 3,止损操作开始触发'nn account =nsdk.getAccountInfo(AssetType.Future) # 获取账户信息  budget =naccount.availableCash # 用可用余额进行建仓操作  if account is None:nn returnnn print 'Account's availablenCash', budgetnn quote =nsdk.getQuote(main_future['thisyear']['5'][0],tsInd=nAssetType.Future)nn quote_1 =nsdk.getQuote(main_future['thisyear']['9'][0],tsInd=nAssetType.Future)nn if quote is None or quote_1 is None:nn print '取不到合约行情,退出'nn returnnn volume =0.8*budget//(0.13*(quote_1.close+quote.close)*int(heyuecs[0][-1][:2]))nn sdk.makeOrder(main_future['thisyear']['5'][0],quote.close,volume,1,2)nn sdk.makeOrder(main_future['thisyear']['9'][0],quote_1.close,volume,-1,2)nnnn if COUNT > 0 and flag[-1] ==-3 and flag[-2] != -3: #止损操作开始触发  print 'flag = -3,止损操作开始触发'nn account =nsdk.getAccountInfo(AssetType.Future) # 获取账户信息  budget =naccount.availableCash # 用可用余额进行建仓操作  if account is None:nn returnnn print 'Account's availablenCash', budgetnn quote =nsdk.getQuote(main_future['thisyear']['5'][0],tsInd=nAssetType.Future)nn quote_1 =nsdk.getQuote(main_future['thisyear']['9'][0],tsInd=nAssetType.Future)nn if quote is None or quote_1 is None:nn  print '取不到合约行情,退出'nn returnnn volume =0.8*budget//(0.13*(quote_1.close+quote.close)*int(heyuecs[0][-1][:2]))nn sdk.makeOrder(main_future['thisyear']['5'][0],quote.close,volume,-1,2)nn sdk.makeOrder(main_future['thisyear']['9'][0],quote_1.close,volume,1,2)nn else:nn position1 =nfuturecodes_1[main_future['thisyear']['5'][0]]nn position2 =nfuturecodes_1[main_future['thisyear']['9'][0]]nnnn heyuecs =nheyuechengshu[position1]nn print heyuecsnnnnnn price_serials_1 =nfutureClose[-50:, position1]nn price_serials_2 =nfutureClose[-50:, position2]nn cut =nnp.array(np.log(price_serials_1) - np.log(price_serials_2))nn cut_std = np.std(cut)nn avg = np.nanmean(cut)nn st = (cut[-1] - avg) /ncut_stdnn # 判断flag值  if 0 < st < 0.5:nn flag.append(0.5)nn elif -0.5 < st < 0:nn flag.append(-0.5)nn elif 3 > st > 2:nn flag.append(2)nn elif -3 < st < -2:nn flag.append(-2)nn elif st > 3:nn flag.append(3)nn elif st < -3:nn flag.append(-3)nn else:nn flag.append(0)nn print '今日flag:%d'%flag[-1]nnnnnn # 交易今年主力合约 即买入5月合约卖出9月合约  if abs(flag[-1]) == 0.5 : #平仓操作开始触发  #获取持仓列表  print '平仓操作开始触发'nn pos =nsdk.getPositions(tsInd = AssetType.Future)nn if pos is None:nn print '取不到持仓行情信息,退出'nn returnnn if pos:nn for i in pos:nn quote = sdk.getQuote(i.code,tsInd=AssetType.Future)nn if i.orderType == 1:nn sdk.makeOrder(i.code,quote.close,i.optPosition,-1,2)nn if i.orderType == 2:nn sdk.makeOrder(i.code, quote.close, i.optPosition, -2, 2)nn if i.orderType == -1:nn sdk.makeOrder(i.code,quote.close,i.optPosition,1,2)nn if i.orderType == -2:nn sdk.makeOrder(i.code,quote.close,i.optPosition,2,2)nnnn if COUNT > 0 and flag[-1] ==2 and flag[-2] != 2: #开仓操作开始触发  print 'flag = 2,开仓操作开始触发'nn account =nsdk.getAccountInfo(AssetType.Future) # 获取账户信息  budget =naccount.availableCash # 用可用余额进行建仓操作  if account is None:nn returnnn print 'Account's availablenCash', budgetnn quote =nsdk.getQuote(main_future['thisyear']['5'][0],tsInd=nAssetType.Future)nn quote_1 =nsdk.getQuote(main_future['thisyear']['9'][0],tsInd=nAssetType.Future)nn if quote is None or quote_1 is None:nn print '取不到合约行情,退出'nn returnnn volume =0.8*budget//(0.13*(quote_1.close+quote.close)*int(heyuecs[0][-1][:2]))nn sdk.makeOrder(main_future['thisyear']['5'][0],quote.close,volume,1,2)nn sdk.makeOrder(main_future['thisyear']['9'][0],quote_1.close,volume,-1,2)nnnn if COUNT > 0 and flag[-1] ==-2 and flag[-2] != -2: #开仓操作开始触发  print 'flag = -2,开仓操作开始触发'nn account =nsdk.getAccountInfo(AssetType.Future) # 获取账户信息  budget =naccount.availableCash # 用可用余额进行建仓操作  if account is None:nn returnnn print 'Account's availablenCash', budgetnn quote =nsdk.getQuote(main_future['thisyear']['5'][0],tsInd=nAssetType.Future)nn quote_1 =nsdk.getQuote(main_future['thisyear']['9'][0],tsInd=nAssetType.Future)nn if quote is None or quote_1 is None:nn  print '取不到合约行情,退出'nn returnnn volume =0.8*budget//(0.13*(quote_1.close+quote.close)*int(heyuecs[0][-1][:2]))nn print volumenn print main_future['thisyear']['5'][0],quote.close,volumenn sdk.makeOrder(main_future['thisyear']['5'][0],quote.close,volume,-1,2)nn print 1nn sdk.makeOrder(main_future['thisyear']['9'][0],quote_1.close,volume,1,2)nnnn if COUNT > 0 and flag[-1] ==3 and flag[-2] != 3: #止损操作开始触发  print 'flag = 3,止损操作开始触发'nn account =nsdk.getAccountInfo(AssetType.Future) # 获取账户信息  budget =naccount.availableCash # 用可用余额进行建仓操作  if account is None:nn returnnn print 'Account's availablenCash', budgetnn quote =nsdk.getQuote(main_future['thisyear']['5'][0],tsInd=nAssetType.Future)nn quote_1 =nsdk.getQuote(main_future['thisyear']['9'][0],tsInd=nAssetType.Future)nn if quote is None or quote_1 is None:nn print '取不到合约行情,退出'nn returnnn volume =0.8*budget//(0.13*(quote_1.close+quote.close)*int(heyuecs[0][-1][:2]))nn sdk.makeOrder(main_future['thisyear']['5'][0],quote.close,volume,1,2)nn sdk.makeOrder(main_future['thisyear']['9'][0],quote_1.close,volume,-1,2)nnnn if COUNT > 0 and flag[-1] ==-3 and flag[-2] != -3: #止损操作开始触发  print 'flag = -3,止损操作开始触发'nn account =nsdk.getAccountInfo(AssetType.Future) # 获取账户信息  budget =naccount.availableCash # 用可用余额进行建仓操作  if account is None:nn returnnn print 'Account's availablenCash', budgetnn quote =nsdk.getQuote(main_future['thisyear']['5'][0],tsInd=nAssetType.Future)nn quote_1 =nsdk.getQuote(main_future['thisyear']['9'][0],tsInd=nAssetType.Future)nn if quote is None or quote_1 is None:nn  print '取不到合约行情,退出'nn returnnn volume =0.8*budget//(0.13*(quote_1.close+quote.close)*int(heyuecs[0][-1][:2]))nn sdk.makeOrder(main_future['thisyear']['5'][0],quote.close,volume,-1,2)nn sdk.makeOrder(main_future['thisyear']['9'][0],quote_1.close,volume,1,2)nnnn if now_month == 3 and 25<=now_day<=30: #清仓  print '月末平仓'nn pos =nsdk.getPositions(tsInd=AssetType.Future)nn if pos is None:nn print '取不到持仓行情信息,退出'nn returnnn if pos:nn for i in pos:nn quote =nsdk.getQuote(i.code, tsInd=AssetType.Future)nn if i.orderType == 1:nn sdk.makeOrder(i.code, quote.close, i.optPosition, -1, 2)nn if i.orderType == 2:nn sdk.makeOrder(i.code, quote.close, i.optPosition, -2, 2)nn if i.orderType == -1:nn sdk.makeOrder(i.code, quote.close, i.optPosition, 1, 2)nn if i.orderType == -2:nn sdk.makeOrder(i.code, quote.close, i.optPosition, 2, 2)ndef main():nn # 将策略函数加入  config['initial'] = initialnn config['strategy'] = strategynn config['preparePerDay'] = initPerDaynn # 启动SDKnn SDKCoreEngine(**config).run()nnnnif __name__ == "__main__":nn import timenn starttime = time.time()nn main()nn endtime = time.time()nn print endtime -nstarttime

参考资料:《绝对收益策略系列研究之二——商品期货套利策略》,海通证券金融工程研究团队

量子投研管理平台下载地址:http://www.yunkuanke.com/download