,欢迎您
您当前位置:网站首页 >> 股市新闻 >> 「期货量化研究」什么是期货量化交易?风险大

「期货量化研究」什么是期货量化交易?风险大

2020-04-20 20:19:32 来源: 浏览:1
「期货量化研究」什么是期货量化交易?风险大是什么意思,没听说过「期货量化研究」什么是期货量化交易?风险大,让我们来认识和学习下。 期货量化研究:什么是期货量化交易?风险大吗? 量化投资理论是借助现代统计学和数学的方法,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定

期货量化研究:什么是期货量化交易?风险大吗?

量化投资理论是借助现代统计学和数学的方法,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定策略,用数量模型验证及固化这些规律和策略,然后严格执行已固化的策略来指导投资,以求获得可持续的、稳定且高于平均的超额回报 量化从一开始也不是作为定性的对立面而提出的方法,它是将定性分析中的技术分析策略用模型固化,替代过程中可以用电脑进行的部分并将其效用极大优化 量化交易策略几乎覆盖了投资的全过程,包括量化选股、量化择时、股指期货套利、商品期货套利、统计套利、算法交易,资产配置,风险控制等。风险也是有的,好好控制就行。华盛天成量化交易做的还不错,很有实力,推荐

期货量化研究:股指期货量化分析是什么

股指期货量化分析就是通过一定的“模型”对股指期货的历史数据进行回溯测试分析,从而应用到未来的走势进行预测,目标就是在盈利概率高的情况下进行交易以期获得在风险可控情况下持久稳定的盈利。量化分析就是数据分析,参考 http://zhidao.baidu.com/question/2122011.html对整个市场的预测是不容易的,相当于对(市场上交易的所有的)人的行为进行预测,或者说预测未来。目前主流的股指期货(包括其他商品期货)主要通过参数过滤来生成交易信号,如最简单的,MACD金叉做多开仓,死叉做空平仓。策略大致分两种,1)趋势跟踪,即突破追涨杀跌;2)均值回归,即高抛低吸。频率从分笔数据到日线,从每几天交易一次到每天交易几十次都有。实现手段基本都采用程序化交易,排除人为干扰。或自己写程序,或采用第三方软件(广告就不做了)。

期货量化研究:疯狂期货:量化和纯量化基金的区别

2009年以来,一股“量化基金”的热潮悄然掀起,中海基金、长盛基金、光大保德和富国基金先后推出了自己的量化产品,而富国正在推出的富国300增强基金还属于第一只增强型的指数基金,就是因为量化概念的引入。关于量化基金,国际资本市场,尤其是美国市场已经有了长足的发展并形成了相当的规模,量化基金通过数理统计分析,选择那些未来回报可能会超越基准的证券进行投资,以期获取超越指数基金的收益。区别于普通基金,量化基金主要采用量化投资策略来进行投资组合管理,总的来说,量化基金采用的策略包括:量化选股、量化择时、股指期货套利、商品期货套利、统计套利、期权套利、算法交易、资产配置等。

期货量化研究:期货中主观策略,量化策略是什么意思

期货中主观策略就是就是以优秀交易员自身这个人为根本,相信人的丰富多彩人的盈利能力,人的感觉敏觉和判断,人的风控和管理能力而不是相信死物的所谓程序化冰冷的机器会代替人。我就是人,一个主观的人。期货的量化策略除非是做大规模的风险对冲交易或者套利交易或者跨市场跨国家海量资金做对冲才能算得上量化交易,把具体的现状现象各种资料进行数字化图形化变成一种有用数据进行金融工程式的交易。国内全部所谓的量化策略,量化交易,程序化交易啥的,根本就是狗屁,完全就是自编概念自我神话所谓交易系统自抬身价自卖自夸彻底忽悠人,哪怕有一点点大概率盈利的可能它也不会让你投资分享利益,所以勿信这些鼓吹的。

期货量化研究:期货量化交易平台有哪些

国内支持期货量化交易进行多策略多账户的平台,我所知道有 /掘/金/量/化/

期货量化研究:如何利用期货量化交易取得稳定盈利

不同的期货品种波动规律是不一样的,专心研究把握走势规律,做好几个品种就够了!想做好期货:要学会等待机会,不能频繁操作,手勤的人肯定亏钱! 不需要看太多复杂的指标,大繁至简,顺势而为;只需看日线定趋势,利用分时线区间突破,再结合一分钟K线里的布林带进行短线操作,等待机会再出手,止损点要严格设置在支撑和阻力位,止盈可以先不设:这样就可以锁定风险,让利润奔跑!止损点一定一定要设好:他可以克服人性的弱点,你舍不得止损,让系统来帮你!我们是个团队,指导操作,利润分成! 做久了才知道,期货大起大落,我们不求大赚,只求每天稳定赚钱!要知道:在想到利润之前首先要想到的是风险!期货里爆赚爆亏的人太多,比爆赚爆亏更重要的是长久而稳定的盈利

期货量化研究:期货量化交易软件哪个好

这种问题怎么回答,会被屏蔽的市场还是有很多的,中金、和讯、同花顺、期获宝、新浪期货等,都有,自己去分别体验下

期货量化研究:量化分析是什么意思

量化分析 我们从字面去解释吧:分成两部分首先量化,就是把抽象的东西,用数字来说 ,或者就是用数次来替代,然后再去分析问题的。量化分析就是,把抽象的东西,或者模糊的东西用数字来分析问题。在股市上量化分析 就表现在 各种趋势图 就叫量化分析图在质量上 ,各种错误或缺陷,用数字分析,也叫量化分析还更多的方面用量化分析,就更透彻

期货量化研究:期货程序化交易中的基本面可以量化吗? 能不能把基本面量化成交易模型?

基本面交易很大程度上也是靠经验,要靠多年的积累,因为基本面交易也包含了很多因素,包括供求平衡关系、市场结构、微观因素、宏观因素等等有很多因素。这个交易经验或者说交易人,这种交易经验可复制性又非常差,就是想带一个成熟的交易员要经历很长的时间,如果靠基本面交易,特别是靠商品期货,一个人所带的资金就很有限,到一定规模我就很难以再扩大。在这种市场情况下,要想开展一部分程序化交易或者量化投资,一定要有所区别,因为现在市场上由于期货公司或者现在期货行业发展的现状,很多年轻人快速进入到量化投资这个领域,对基本面分析或者说交易经验比较少的情况下,做出来的交易模型大部分是纯数学化的模型。实际上量化做模型的背后有大量的数据采集,这个数据采集也包含了很多宏观、微观方面的一些数据,将这些数据整理、加工进行人工智能的分析。

期货量化研究:量化小白暑期研究笔记(10)——期货套利进阶(上)

资料来源:万矿量化培训阅前小贴士:注意代码!宝藏pandas技巧等你挖掘!大纲:

1、概论

1.1 国内市场品种筛选

1.2 平稳性检验

1.3 系数估计

1.3.1 回归匹配

1.3.2 波动率匹配

1.3.3 合约价值匹配

14 系数更新的频率

1.5 区间范围的确定

1.5.1 固定带宽的区间

1.5.2 滚动计算带宽

1.6 补充

2、构建套利策略

2.1 策略概况

2.2 策略小结

3、课程总结

一、概论

在之前课程中,我们示范了在上期所中寻找某一个相关性高的品种配对交易,在本节套利进阶中我们先对跨品种套利的做法进行拓展,特别地,我们将会详细介绍如何在全市场中筛选出合格的品种配对、各个配对之间如何估计系数已经系数更新的频率等细节,以求更加贴近实际应用。
在讲解了品种筛选、系数估计等细节后,课程的最后将构建一个套利策略并进行回测。
我们这里只在国内期货交易所之间寻找套利机会,不涉及海外市场,如果进行海外市场跨品种套利,则汇率风险是不可忽视的因素,可以通过购买专业的金融衍生品来对冲汇率风险,但这同时也会导致套利成本的增加

1.1 国内市场品种筛选

from WindPy import *nw.start()nimport numpy as npnimport pandas as pdnfrom WindCharts import *     #导入WindCharts库nimport seaborn as snsnimport matplotlib as mplnmpl.style.use('bmh')nimport matplotlib.pylab as pltnfrom datetime import  datetimenfrom pandas import DataFrame, Seriesnimport statsmodels.api as smnfrom statsmodels.tsa.stattools import adfuller as ADFnimport matplotlib.dates as mdatenfrom matplotlib.font_manager import FontPropertiesnmpl.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签nmpl.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号nnvalid_date = datetime.strftime(datetime(2018,9,21),"%Y-%m-%d") #用于判断合约是否活跃、当前有哪些合约的日期,一般取新一点的即可ntrack_date = datetime.strftime(datetime(2008,1,1),"%Y-%m-%d") #取历史数据的起始日期,一般选过去很长一段时间之前的nerror_code,raw_data_df = w.wset("sectorconstituent", "date="+valid_date+";sectorId=1000010084000000",usedf=True)nraw_data_df.head(10)

把上海黄金交易所的黄金白银现货剔掉。(???)

raw_data_future = raw_data_df.drop(['2','6'],axis=0)nnfuture_code= ','.join(raw_data_future['wind_code'].values) #期货品种按逗号拼接nerror_code,slice_data_future = w.wss(future_code, "sec_name,exch_eng,close,settle,volume","tradeDate="+valid_date+";priceAdj=U;cycle=D",usedf=True)nslice_data_future.head()

过滤掉不活跃的品种,我们这里认为成交量小于10000则为不活跃

un_active_f = slice_data_future[slice_data_future.VOLUME <= 10000 ]nactive_f = slice_data_future[slice_data_future.VOLUME > 10000 ]nactive_codes = active_f.index.tolist()#交易量不会太小的合约有这些nndf_wsd_future = []nfor code in active_codes:n    error_code,temp_raw_wsd = w.wsd(code, "windcode,close,settle", track_date, valid_date, "",usedf=True)n    df_wsd_future.append(temp_raw_wsd)nndf_future = pd.concat(df_wsd_future)ndf_future.head().append(df_future.tail())
df_future.index.name='date'nunstack_df = df_future.reset_index().set_index(['date','WINDCODE']).SETTLE.unstack()nunstack_df.set_index(unstack_df.index.strftime('%Y-%m-%d'),inplace=True)nunstack_df.index.name='trade_date'nunstack_df
#基于各品种收益率计算相关系数nall_future_df = pd.DataFrame(unstack_df,dtype=np.float)nfuture_corr = (all_future_df/all_future_df.shift(1)).applymap(lambda x: np.log(x)).corr(method='spearman')nfuture_corr
for i in range(len(future_corr.index)):n    future_corr.iloc[i,i] = 0 #令对角线上的元素为0,便于找出相关系数高的组合nfuture_corr
pair_temp_tuple =[(indexs,columns,future_corr.loc[indexs,columns]) for indexs in future_corr.index for columns in future_corr.columns]npair_temp_df = pd.DataFrame(pair_temp_tuple,columns=["commodity_1","commodity_2","coeff"])npair_temp_df = pair_temp_df.sort_values(by="coeff",ascending=False)npair_temp_df
top_num = 10 #要选多少对系数最高的组合?ntemp_pair_code = pair_temp_df.iloc[:2*top_num,:2].values.tolist()ntemp_pair_code
top_pairs = list(set([tuple(sorted(i)) for i in temp_pair_code])) #去掉顺序的影响,以下十对品种是相关系数最高的ntop_pairs
unstack_df
demo_pairs = unstack_df[['AG.SHF', 'AU.SHF']]ndemo_pairs = demo_pairs.dropna()ndemo_pairsnchart = WLine(title='品种间走势示例',subtitle='AG vs AU',data=demo_pairs, smooth=False, auto_yaxis=True,y_left=['AG.SHF'],y_right=['AU.SHF'])nchart.plot()

从图上看,我们选出来的品种走势的一致性还是很高的,接下来我们进行平稳性检验。

1.2 平稳性检验

以上我们找出了十对相关系数最高的商品配对(pair),现在我们对他们逐个进行平稳性检验。
套利交易实际上交易的是价差,而要计算价差,则要先计算品种之间的配对系数(???)。我们这里简化一点,计算品种间收益率之间的平稳性,或者说我们简化的认为:如果两个品种的收益率之差满足平稳性,则他们之间价差的线性组合也满足平稳性。

ret_RB = (unstack_df['RB.SHF']/unstack_df['RB.SHF'].shift(1)).apply(lambda x:np.log(x))nret_HC = (unstack_df['HC.SHF']/unstack_df['HC.SHF'].shift(1)).apply(lambda x:np.log(x))nntt = ADF((ret_RB - ret_HC).dropna()) #单个配对稳定性检验nnoutput=pd.DataFrame(index=['Test Statistic Value', "p-value", "Lags Used", "Number of Observations Used","Critical Value(1%)","Critical Value(5%)","Critical Value(10%)"],columns=['Y-value'])noutput['Y-value']['Test Statistic Value'] = tt[0]noutput['Y-value']['p-value'] = tt[1]noutput['Y-value']['Lags Used'] = tt[2]noutput['Y-value']['Number of Observations Used'] = tt[3]noutput['Y-value']['Critical Value(1%)'] = tt[4]['1%']noutput['Y-value']['Critical Value(5%)'] = tt[4]['5%']noutput['Y-value']['Critical Value(10%)'] = tt[4]['10%']noutput.columns.name = 'result of RB vs HC'nprint ("p-value of RB vs HC: ",tt[1])noutput
all_pair_test = pd.DataFrame()nfor i in range(len(top_pairs)):n    ret_1 = (unstack_df[top_pairs[i][0]]/unstack_df[top_pairs[i][0]].shift(1)).apply(lambda x:np.log(x))n    ret_2 = (unstack_df[top_pairs[i][1]]/unstack_df[top_pairs[i][1]].shift(1)).apply(lambda x:np.log(x))n    tt = ADF((ret_1 - ret_2).dropna()) n    pair_col_name = 'Y-value of {} vs {}'.format(top_pairs[i][0].split('.')[0], top_pairs[i][1].split('.')[0])n    output=pd.DataFrame(index=['Test Statistic Value', "p-value", "Lags Used", "Number of Observations Used","Critical Value(1%)","Critical Value(5%)","Critical Value(10%)"],columns=[pair_col_name])n    output[pair_col_name]['Test Statistic Value'] = tt[0]n    output[pair_col_name]['p-value'] = tt[1]n    output[pair_col_name]['Lags Used'] = tt[2]n    output[pair_col_name]['Number of Observations Used'] = tt[3]n    output[pair_col_name]['Critical Value(1%)'] = tt[4]['1%']n    output[pair_col_name]['Critical Value(5%)'] = tt[4]['5%']n    output[pair_col_name]['Critical Value(10%)'] = tt[4]['10%']n    print ("p-value of {} vs {}: ".format(top_pairs[i][0].split('.')[0], top_pairs[i][1].split('.')[0]),tt[1])n    all_pair_test = pd.concat([all_pair_test,output],axis=1)nall_pair_test

可以看到我们之前选出来的品种配对P值都明显小于显著水平,换言之,这些配对都很好的满足了平稳性条件。

1.3 系数估计

找出了合适的配对后,在开始交易之前我们需要知道配对之间怎么分配仓位。假如我们要对焦炭(J.DCE)与焦煤(JM.DCE)进行套利,那么一个很直接的问题就是:我们用多少手焦炭与焦煤对应?或者说:我们在套利时,如果开了N手焦炭的多单(空单),那么此时应该开多少手反方向的焦煤空单(多单)呢?
在实际应用中,系数估计的方法有这么三种:
1 回归匹配;2 波动率匹配;3 合约价值匹配
我们把这三种办法都介绍一下。

1.3.1 回归匹配
系数估计最常用的一种办法就是通过线性回归拟合,比如对于螺纹钢(RB.SHF)与热轧卷板(HC.SHF),我们以??????代表螺纹钢的价格,以?????代表热轧卷板的价格,那么对于跨品种套利,用回归的方法估计系数意味着首先拟合如下方程

(配对系数没看懂)

下面我们说明。

p_rb_hc = unstack_df[['RB.SHF','HC.SHF']]np_rb_hc = p_rb_hc.dropna()np_rb = pd.Series(p_rb_hc['RB.SHF'],dtype=np.float)np_hc = pd.Series(p_rb_hc['HC.SHF'],dtype=np.float)nhc_x = sm.add_constant(p_hc)nresult = (sm.OLS(p_rb,hc_x)).fit()nprint(result.summary())
result.params[1]

0.9877281167113431

#这一段的主要目的是取出两个品种的合约乘数与结算价nerror_code,his_rb_hc_df = w.wss("RB.SHF,HC.SHF", "trade_hiscode","tradeDate="+valid_date,usedf=True)nrb_hc_join = ','.join([his_rb_hc_df.iloc[i,0] for i in range(len(his_rb_hc_df.index))])n_,con_rb_hc = w.wss(rb_hc_join, "contractmultiplier,settle","tradeDate="+valid_date+";cycle=D",usedf=True)n#现在,我们已经得到合约乘数与价格,合约乘数与价格的乘积就是合约价值ncon_rb_hc
num_hc = result.params[1]*con_rb_hc.iloc[0,:].prod()/con_rb_hc.iloc[1,:].prod()nnum_hc

1.0236140041889539(没看懂上面的代码)

可以看出,回归后的系数为1手螺纹钢('RB.SHF')对应1.02手热轧卷板('HC.SHF'),基本是一比一的关系,这也是许多套利交易者钟爱交易螺纹钢与热轧卷板的原因之一。

1.3.2 波动率匹配

通过波动率来估计配对之间的系数也是一种很常用的做法,具体来说就是看看品种之间的波动性之比,波动性更大的品种配更少的手数,波动性更小的品种配更多的手数。

比如我们要在焦炭(J.DCE)与焦煤(JM.DCE)之间套利,我们以????表示焦炭收益率的波动率,以??????表示焦煤收益率的波动率。????表示焦炭的合约乘数, ??????表示焦炭的合约乘数,????表示焦炭的价格,??????表示焦煤的价格(这里的价格我们使用最新价即可 )。假设我们通过计算得到:

那么,在进行套利交易时,我们每当开????手焦炭的多单(空单),则会同时开????手反方向的焦煤空单(多单)与之匹配(感觉是NJM手,原文可能写错了吧)。下面具体举例:

#这一段的主要目的是取出两个品种的合约乘数与结算价nerror_code,hiscode_df = w.wss("J.DCE,JM.DCE", "trade_hiscode","tradeDate="+valid_date,usedf=True)ncode_join = ','.join([hiscode_df.iloc[i,0] for i in range(len(hiscode_df.index))])nerror_code,con_value = w.wss(code_join, "contractmultiplier,settle","tradeDate="+valid_date+";cycle=D",usedf=True)n#现在,我们已经得到合约乘数与价格,合约乘数与价格的乘积就是合约价值ncon_value
#接下来我们计算两个品种收益率的波动率,此处也可以选用计算具体合约的收益率波动率,但我们选用更长的时间宽度,计算主力连续的收益率波动率nret_j_jm = (unstack_df[['J.DCE','JM.DCE']]/unstack_df[['J.DCE','JM.DCE']].shift(1)).dropna().applymap(lambda x: np.log(x))ndev_j_jm = ret_j_jm.std() #得到两个品种各自收益率的波动率nJ_vs_JM = pd.DataFrame(index=['J', "JM", "J_vs_JM"],columns=['std','con_multi','settle_p'])nJ_vs_JM.iloc[:2,:] = np.concatenate((dev_j_jm.values.reshape(len(dev_j_jm),1),con_value.iloc[:,:].values),axis=1) #把焦炭和焦煤相应的值填入nJ_vs_JM.iloc[2,:] = J_vs_JM.iloc[0,:]/J_vs_JM.iloc[1,:]nJ_vs_JM

至此,收益率的波动率??、合约乘数??、合约最新结算价??都计算了出来。我们要在每个品种配置的手数之比就显而易见了。

ratio_J_JM = J_vs_JM.iloc[2,:].prod()nratio_J_JM

3.11569423413623

注意:我们这里计算的时候是用的焦炭除以焦煤,所以配比的时候,应该是每1手焦炭对应3.1手焦煤。

1.3.3 合约价值匹配
市场上有些人在进行统计套利时,采用的是一种类似于"市值中性"的做法,即:多单的合约价值与空单的合约价值匹配。这种做法的好处是简单直观,特别是对于一些产业链上相关的品种之间,这种做法也很符合套利的思想。 合约价值匹配的公式比较简单,只是在波动率匹配的基础上做简化。
比如我们要在菜油(OI.CZC)与棕榈油(P.DCE)之间套利,我们以??????表示菜油的合约乘数, ????表示棕榈油的合约乘数,??????表示菜油的价格,????表示棕榈油的价格(这里的价格我们使用最新价即可 )。假设我们通过计算得到:

代码波动率匹配相比有所简化,我们简单做个示例:

error_code,hiscode_df = w.wss("OI.CZC,P.DCE", "trade_hiscode","tradeDate="+valid_date,usedf=True)ncode_join = ','.join([hiscode_df.iloc[i,0] for i in range(len(hiscode_df.index))])nerror_code,con_value = w.wss(code_join, "contractmultiplier,settle","tradeDate="+valid_date+";cycle=D",usedf=True)n#现在,我们已经得到合约乘数与价格,合约乘数与价格的乘积就是合约价值ncon_value
ratio_OI_P = con_value.iloc[0,:].prod()/con_value.iloc[1,:].prod()nratio_OI_P

1.4145610278372591

这意味着,我们按照合约价值确定品种配比的时候,应该是每1手菜油对应1.4手棕榈油。

1.4 系数更新的频率

在上面三种估计系数的方法中,其实天然隐含着另一个问题:多久估计一次系数?或者说更新系数的频率是多久?如投资者所见,我们之前的计算都是用很长的数据计算,然后不再更新,而在实际运用中,系数一直保持恒定是一种不太可取的办法。从某种程度上说,多久更新一次系数属于个人的交易理念,常见的有每月更新,每季度更新等。 接下来我们以白银(AG.SHF)与黄金(AU.SHF)为例,示例一下每月更新系数的做法

top_pairs
p_ag_au = unstack_df[['AG.SHF', 'AU.SHF']].dropna()ntime_point_t = w.tdays(track_date,valid_date, "Period=M").Data[0]ntp_str = [x.strftime("%Y-%m-%d") for x in time_point_t]ntimes_ag_au = p_ag_au.index.tolist()ntp_str_t = [x for x in tp_str if x in times_ag_au]nj=0nfor i in range(3,len(tp_str_t)):n    last_m = tp_str_t[i-3]n    curr_m = tp_str_t[i]n    temp_ag_au = p_ag_au[['AG.SHF', 'AU.SHF']][last_m:curr_m]n    temp_ag = pd.Series(temp_ag_au['AG.SHF'],dtype=np.float)n    temp_au = pd.Series(temp_ag_au['AU.SHF'],dtype=np.float)n    temp_x = sm.add_constant(temp_au)n    result = (sm.OLS(temp_ag,temp_x)).fit()n    if result.rsquared>=0.9:n        j+=1n        print("=====The "+str(j)+"th OLS Regression Results=====n n")n        print(result.summary())

可以看到,每次的??还是有比较明显的差异的,??乘以合约价值之比就是配对系数,那么采用什么样的频率来更新参数便不可避免的对套利本身产生重大的影响了.

1.5 区间范围的确定

上面我们谈了套利品种配对如何寻找、品种之间的配比系数这两个问题,我们知道了这些之后,还需要知道的是:价差达到怎样的情况开始套利交易?
这就需要我们确定价差的合理范围,下面我们来讨论一下。

1.5.1 固定带宽的区间

最朴素的一种做法是:计算某一个时间段内的品种间价差的均值,作为均衡价格。然后加(减)一定的标准差或者ATR作为上(下)轨。我们以沥青(BU.SHF)与原油(SC.INE)为例,示范一下。
我们这里选定的带宽为两倍标准差,即:均线减去两倍标准差为下轨,加上两倍标准差为上轨。总的来说,带宽的设定会影响套利的交易频率。
选择越大的带宽,则套利交易的频率越低,但是价格向均衡回复的概率更大;选择更窄的带宽,套利交易的机会明显增加,价格向均衡回复的概率更小。

#('BU.SHF', 'SC.INE')nband_multi = 2 #设定上下轨偏离标准差多少倍np_bu_sc = unstack_df[['BU.SHF', 'SC.INE']].dropna()n#画图,沥青与原油的价差均线等nmean_b_s = (p_bu_sc['BU.SHF']-p_bu_sc['SC.INE']).mean()nstd_b_s = (p_bu_sc['BU.SHF']-p_bu_sc['SC.INE']).std()nfig = plt.figure(figsize=(14,8))n(p_bu_sc['BU.SHF']-p_bu_sc['SC.INE']).plot(color='#407CE2')nax = fig.add_subplot(1,1,1)nplt.axhline(mean_b_s, color="black")nax.axhline(mean_b_s+band_multi*std_b_s, color="red", linestyle="--")nax.axhline(mean_b_s-band_multi*std_b_s, color="green", linestyle="--")nplt.xlabel("Time"); plt.ylabel("Price spread of BU.SHF and SC.INE")nplt.legend(["Price spread", "Mean","Upper_band","Lower_band"])nplt.show()
1.5.2 滚定计算带宽

实际应用中,更普遍的做法是,滚动计算均线与标准差,并以此为标准来判断合理的价差区间,一旦价差偏离此区间,则进行套利交易。我们依然以沥青和原油为例来滚动计算一下合理区间。

我们这里同样选择均线加减两倍标准差形成上下轨。

#('BU.SHF', 'SC.INE')nband_multi = 2 #设定上下轨偏离标准差多少倍np_bu_sc = unstack_df[['BU.SHF', 'SC.INE']].dropna()n#画图,滚动计算合理区间nspread_b_s = p_bu_sc['BU.SHF']-p_bu_sc['SC.INE']nr_mean_b_s = spread_b_s.rolling(window=20).mean()nr_std_b_s = spread_b_s.rolling(window=20).std()nnpd.concat([spread_b_s,r_mean_b_s, r_mean_b_s+band_multi*r_std_b_s,r_mean_b_s-band_multi*r_std_b_s], axis=1).plot(figsize=(14,8))nplt.xlabel("Time"); plt.ylabel("Rolling bands of spread")nplt.legend(["Price spread", "Rolling Mean","Rolling Upper_band","Rolling Lower_band"])nplt.show()
1.5 补充

注意,以上我们的例子都是用的跨品种套利,而从本质上来说,套利可以认为是“价差交易” 所以无论是不同品种的价差还是同一个品种的不同合约月份之间的价差对于套利来说其实并没有什么不同。换言之,我们上面讨论的所有跨品种套利的研究都可以直接应用到跨期套利上,比如平稳性检验、参数估计等,在跨期套利上完全可以也这么做。

二、构建交易策略

接下来,我们构建一个套利交易系统,并把上面我们提到的一些知识点,应用到具体策略中。

2.1 策略概况
策略标的:商品期货市场观察周期:日线交易信号:首先挑选出相关系数最高的品种配对,并进行平稳性检验,对于通过检验的配对,通过上面提到的不同的系数估计方法计算配对系数。注意事项:策略中把系数估计方法,波动率幅度等都参数化了,用户可以自己选择参数估计方法、价差范围。回测时间:起始时间也参数化了,回测的结束时间是起始时间之后的一年(如果超过当前日期,则截止到当前日期)
from WindAlgo import *nfrom WindPy import *nw.start()nimport numpy as npnimport pandas as pdnimport seaborn as snsnimport matplotlib as mplnmpl.style.use('bmh')nimport matplotlib.pylab as pltnfrom datetime import  datetimenfrom pandas import DataFrame, Seriesnimport statsmodels.api as smnfrom statsmodels.tsa.stattools import adfuller as ADFnimport matplotlib.dates as mdatenfrom matplotlib.font_manager import FontPropertiesnmpl.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签nmpl.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号nnndef prepare_data(v_year,v_month,v_day,top_num = 10):n    valid_date = datetime.strftime(datetime(v_year,v_month,v_day),"%Y-%m-%d") #用于判断合约是否活跃、当前有哪些合约的日期,一般取新一点的即可n    valid_date_dt = w.tdaysoffset(1, valid_date, "").Data[0][0]n    valid_date = datetime.strftime(datetime(valid_date_dt.year,valid_date_dt.month,valid_date_dt.day),"%Y-%m-%d")n    track_date = datetime.strftime(datetime(v_year-1,valid_date_dt.month,valid_date_dt.day),"%Y-%m-%d") #取历史数据的起始日期,一般选过去很长一段时间之前的n    end_date = datetime.strftime(datetime(v_year+1,valid_date_dt.month,valid_date_dt.day),"%Y-%m-%d") #用于策略回测的截止日期,在取数据与计算相关性阶段为避免使用未来数据,用不到n    error_code_1,raw_data_df = w.wset("sectorconstituent", "date="+valid_date+";sectorId=1000010084000000",usedf=True)n    raw_data_future = raw_data_df.drop(['2','6'],axis=0) #去掉现货黄金与白银n    future_code= ','.join(raw_data_future['wind_code'].values) #期货品种按逗号拼接n    error_code_2,slice_data_future = w.wss(future_code, "sec_name,exch_eng,close,settle,volume","tradeDate="+valid_date+";priceAdj=U;cycle=D",usedf=True)n    un_active_f = slice_data_future[slice_data_future.VOLUME <= 10000 ]n    active_f = slice_data_future[slice_data_future.VOLUME > 10000 ]n    active_codes = active_f.index.tolist()#交易量不会太小的合约有这些n    df_wsd_future = []n    for code in active_codes:n        error_code,temp_raw_wsd = w.wsd(code, "windcode,close,settle", track_date, valid_date, "",usedf=True)n        df_wsd_future.append(temp_raw_wsd)n    df_future = pd.concat(df_wsd_future)n    df_future.index.name='date'n    unstack_df = df_future.reset_index().set_index(['date','WINDCODE']).SETTLE.unstack()n    unstack_df.set_index(unstack_df.index.strftime('%Y-%m-%d'),inplace=True)n    unstack_df.index.name='trade_date'n    all_future_df = pd.DataFrame(unstack_df,dtype=np.float)n    future_corr = (all_future_df/all_future_df.shift(1)).applymap(lambda x: np.log(x)).corr(method='spearman')n    for i in range(len(future_corr.index)):n        future_corr.iloc[i,i] = 0 #另对角线上的元素为0,便于找出相关系数高的组合n    pair_temp_tuple =[(indexs,columns,future_corr.loc[indexs,columns]) for indexs in future_corr.index for columns in future_corr.columns]n    pair_temp_df = pd.DataFrame(pair_temp_tuple,columns=["commodity_1","commodity_2","coeff"])n    pair_temp_df = pair_temp_df.sort_values(by="coeff",ascending=False)n    top_num = 10 #要选多少对系数最高的组合?n    temp_pair_code = pair_temp_df.iloc[:2*top_num,:2].values.tolist()n    top_pairs = list(set([tuple(sorted(i)) for i in temp_pair_code])) #去掉顺序的影响,以下十对品种是相关系数最高的n    return unstack_df,top_pairs,valid_date,end_datennn#初始化区域nfuture_df,top_10_pair,start_date,end_date = prepare_data(2017,11,9)ntarget_fu_str = ','.join(list(set(np.array([[pair for pair in pairs] for pairs in top_10_pair]).ravel())))ntarget_fu = list(set(np.array([[pair for pair in pairs] for pairs in top_10_pair]).ravel()))nholding_df = pd.DataFrame(index=top_10_pair,columns=['direction','vol_1','vol_2']) #记录品种配对的方向nholding_df.iloc[:,:] = 0n_,hiscode_df = w.wsd(target_fu_str, "trade_hiscode", start_date, end_date, "",usedf=True)ncontract_str = ','.join(list(set([hiscode_df.values[i][j] for i in range(hiscode_df.values.shape[0]) for j in range(hiscode_df.values.shape[1])])))n_,contract_df = w.wss(contract_str, "margin,contractmultiplier",usedf=True)nhiscode_df.set_index(hiscode_df.index.strftime('%Y-%m-%d'),inplace=True)nn#startndef initialize(context):n    context.capital = 10000000000n    context.securities = target_fun    context.start_date = start_daten    context.end_date = end_daten    context.period = 'd'n    context.hiscode_df = hiscode_dfn    context.coeff_df = pd.DataFrame(index=top_10_pair,columns=['fit_coeff']) #记录品种间的配对系数n    context.intresting_df = future_df[target_fu]n    context.holding_df = holding_df #记录品种配对的方向,以及持仓数量n    context.is_begin = False #用于标记是否第一天开始回测n    n#回归系数估计ndef evaluate_para(price_1,price_2,temp_con_info,method=1):n    #前两个参数是两个品种的价格序列,第三个参数是两个品种的具体合约以及合约乘数与结算价n    #method=1 线性回归估计参数;method=2 波动率匹配估计参数;method=3 合约价值匹配估计参数n    if method== 1:n        price_y = price_1n        price_x = price_2n        var_x = sm.add_constant(price_x)n        result = (sm.OLS(price_y,var_x)).fit()n        eval_coeff = result.params[1]*(temp_con_info.iloc[0,2:]/temp_con_info.iloc[1,2:]).prod()n        #print('采用线性回归法估计系数,系数为: n'+str(eval_coeff))n    elif method == 2:n        std_1 = (price_1/price_1.shift(1)).apply(lambda x:np.log(x)).std()n        std_2 = (price_2/price_2.shift(1)).apply(lambda x:np.log(x)).std()n        eval_coeff = ((std_1*temp_con_info.iloc[0,2:])/(std_2*temp_con_info.iloc[1,2:])).prod()n        #print('采用波动率匹配法估计系数,系数为: n'+str(eval_coeff))n    elif method == 3:n        eval_coeff = (temp_con_info.iloc[0,2:]/temp_con_info.iloc[1,2:]).prod()n        #print('采用合约价值法估计系数,系数为: n'+str(eval_coeff))n    else:n        raise Exception('参数错误,请按照格式输入参数')n        eval_coeff = np.nann        n    return eval_coeffnn#计算带宽ndef calculate_bands(price_1,price_2,band_multi = 2):n    #画图,滚动计算合理区间n    pair_spread = price_1 - price_2n    roll_mean = pair_spread.rolling(window=20).mean()n    roll_std = pair_spread.rolling(window=20).std()n    roll_up = roll_mean+band_multi*roll_stdn    roll_down = roll_mean-band_multi*roll_stdn    con_df = pd.concat([pair_spread,roll_mean, roll_up,roll_down], axis=1)n    con_df.columns = ['pair_spread','roll_mean','roll_up','roll_down']n    n    return con_dfnn#系数更新的频率ndef refresh_coeff(temp_pairs,temp_coeff,coeff_df,freq = 'm'):n    freq = str(freq).lower()n    t_pairs = tuple(temp_pairs.columns)n    if freq == 'd':n        coeff_df.iloc[[True if coeff_df.index[i]==t_pairs else False for i in range(len(coeff_df.index))],0] = temp_coeffn    elif freq == 'm':n        if datetime.strptime(temp_pairs.index[-1],"%Y-%m-%d").month != datetime.strptime(temp_pairs.index[-2],"%Y-%m-%d").month:n            coeff_df.iloc[[True if coeff_df.index[i]==t_pairs else False for i in range(len(coeff_df.index))],0] = temp_coeffn    else:n        raise Exception('目前只支持每日更新与每月更新,请按格式输入参数')n        n    return coeff_dfnnn#策略函数ndef handle_data(bar_datetime, context, bar_data):n    coeff_df = context.coeff_dfn    unit_cash = wa.query_capital().get_field('available_fund')[0]/len(top_10_pair)n    n    intr_columns = context.intresting_df.columns.tolist()n    intr_ind = datetime.strftime(datetime(bar_datetime.year,bar_datetime.month,bar_datetime.day),"%Y-%m-%d")n    current_settle = [bar_data[col]["settle"] for col in intr_columns]n    current_df = pd.DataFrame(current_settle,index=intr_columns,columns=[intr_ind]).Tn    if intr_ind not in context.intresting_df.index.tolist():n        context.intresting_df = pd.concat([context.intresting_df,current_df])n        context.is_begin = Falsen    else:n        context.is_begin = Truen    #取出当前各品种的具体合约以及合约价值n    con_info = pd.DataFrame(index = target_fu,columns=['contract','margin'.upper(),'contractmultiplier'.upper(),'settle'.upper()])n    con_info.contract = context.hiscode_df.loc[intr_ind]n    for ind_i in con_info.index:n        code_i = context.hiscode_df.loc[intr_ind][ind_i]n        con_info['MARGIN'][ind_i] = contract_df['MARGIN'][code_i]n        con_info.loc[ind_i][1:3] = contract_df.loc[code_i]n        con_info['settle'.upper()][ind_i] = bar_data[ind_i]['settle']n    #看看我们挑出的组合哪些偏离了均衡n    for pairs  in top_10_pair:n        temp_pairs = context.intresting_df[list(pairs)]n        temp_pairs = temp_pairs.dropna()n        #进行平稳性检验n        #############n        ret_1 = (temp_pairs[pairs[0]]/temp_pairs[pairs[0]].shift(1)).apply(lambda x:np.log(x))n        ret_2 = (temp_pairs[pairs[1]]/temp_pairs[pairs[1]].shift(1)).apply(lambda x:np.log(x))n        tt = ADF((ret_1 - ret_2).dropna()) #ADF检验n        pair_col_name = 'Y-value of {} vs {}'.format(pairs[0].split('.')[0], pairs[1].split('.')[0])n        output=pd.DataFrame(index=['Test Statistic Value', "p-value", "Lags Used", "Number of Observations Used","Critical Value(1%)","Critical Value(5%)","Critical Value(10%)"],columns=[pair_col_name])n        output[pair_col_name]['Test Statistic Value'] = tt[0]n        output[pair_col_name]['p-value'] = tt[1]n        output[pair_col_name]['Lags Used'] = tt[2]n        output[pair_col_name]['Number of Observations Used'] = tt[3]n        output[pair_col_name]['Critical Value(1%)'] = tt[4]['1%']n        output[pair_col_name]['Critical Value(5%)'] = tt[4]['5%']n        output[pair_col_name]['Critical Value(10%)'] = tt[4]['10%']n        #print ("p-value of {} vs {}: ".format(pairs[0].split('.')[0], pairs[1].split('.')[0]),tt[1])n        #P值小于0.00001,我们则认为是通过了平稳性检验,可以进行套利交易n        temp_con_info = con_info.loc[list(pairs)]n        bands_df = pd.DataFrame()n        if tt[1]<=0.00001:n            price_1 = pd.Series(temp_pairs[pairs[0]],dtype=np.float)n            price_2 = pd.Series(temp_pairs[pairs[1]],dtype=np.float)n            temp_coeff = evaluate_para(price_1,price_2,temp_con_info,method=2)n            if context.is_begin:n                coeff_df.iloc[[True if coeff_df.index[i]==pairs else False for i in range(len(coeff_df.index))],0] = temp_coeffn            coeff_df = refresh_coeff(temp_pairs,temp_coeff,coeff_df,freq = 'm')n            bands_df = calculate_bands(price_1,price_2,band_multi = 2)nn        #交易区域,对于偏离的配对执行交易n        if ~np.isnan(coeff_df['fit_coeff'][pairs]) and len(bands_df)>0:n            num_2 = int(round(coeff_df['fit_coeff'][pairs],1)*10)n            num_1 = 10n            pair_unit = (num_1*temp_con_info.iloc[temp_con_info.index==pairs[0],1:].prod(axis=1).values[0]+num_2*temp_con_info.iloc[temp_con_info.index==pairs[1],1:].prod(axis=1).values[0])/100n            num_2 = int(0.5*num_2*unit_cash/pair_unit)n            num_1 = int(0.5*num_1*unit_cash/pair_unit)n            #价差突破上轨,做空价差,如果之前做多了价差则先平仓n            if bands_df['pair_spread'][intr_ind]>bands_df['roll_up'][intr_ind] and context.holding_df['direction'][pairs]!=-1:n                #print(num_1,'  ',num_2)n                vol_1 = context.holding_df['vol_1'][pairs]n                vol_2 = context.holding_df['vol_2'][pairs]n                res_1 = wa.order(pairs[0],vol_1,'sell',price='close', volume_check=False)n                res_2 = wa.order(pairs[1],vol_2,'cover',price='close', volume_check=False)n                context.holding_df['vol_1'][pairs] = 0n                context.holding_df['vol_2'][pairs] = 0n                context.holding_df['direction'][pairs] = 0n                if num_1>0 and num_2>0:n                    res_3 = wa.order(pairs[0],num_1,'short',price='close', volume_check=False)n                    res_4 = wa.order(pairs[1],num_2,'buy',price='close', volume_check=False)n                    context.holding_df['vol_1'][pairs] = num_1n                    context.holding_df['vol_2'][pairs] = num_2n                    context.holding_df['direction'][pairs] = -1n            #做空价差后,价差回到中轨,则平仓n            if bands_df['pair_spread'][intr_ind]0 and num_2>0:n                    res_3 = wa.order(pairs[0],num_1,'buy',price='close', volume_check=False)n                    res_4 = wa.order(pairs[1],num_2,'short',price='close', volume_check=False)n                    context.holding_df['vol_1'][pairs] = num_1n                    context.holding_df['vol_2'][pairs] = num_2n                    context.holding_df['direction'][pairs] = 1n            #做多价差后,价格突破中轨,则平仓n            if bands_df['pair_spread'][intr_ind]>bands_df['roll_mean'][intr_ind] and context.holding_df['direction'][pairs]==1:n                vol_1 = context.holding_df['vol_1'][pairs]n                vol_2 = context.holding_df['vol_2'][pairs]n                res_1 = wa.order(pairs[0],vol_1,'sell',price='close', volume_check=False)n                res_2 = wa.order(pairs[1],vol_2,'cover',price='close', volume_check=False)n                context.holding_df['vol_1'][pairs] = 0n                context.holding_df['vol_2'][pairs] = 0n                context.holding_df['direction'][pairs] = 0n    context.coeff_df = coeff_dfn    nnwa = BackTest(init_func = initialize, handle_data_func=handle_data)   #实例化回测对象nres = wa.run(show_progress=True)          #调用run()函数开始回测,show_progress可用于指定是否显示回测净值曲线图nnav = wa.summary('nav')                  #获取回测结果  回测周期内每一天的组合净值
2.2 策略小结

我们可以看到套利策略的收益相对来说还是比较稳定的,尤其是在2018年A股处于比较弱势时,上述策略只有小幅亏损。当然,我们的主要目的是示范套利的一些做法,所以这里没有进行参数优化,投资者可以自己尝试各种系数估计的方法,或者各种大小的均衡价差。

三、课程总结

在本节课程中我们讲解了,套利的基本概念,并着重讲了套利交易中的几个关键点,并把它应用于策略中,在真实的套利交易中,投资者可以根据自己的需要对各个细节进行调整,选择自己认为最可行的办法。无论跨品种套利或者跨期套利,从本质上说都是“价差交易”,从这个角度说,套利交易要注意风险也是必须的。


本课程由WindQuant出品,版权归万矿所有。

期货量化研究:Quant必备工具箱:量化交易的技术框架

2019年,定下一个小目标:做一套Quant的工具箱,一边学,一边做,也一边分享。欢迎小伙伴们前来围观、拍砖。

工具箱将立足于三个领域

    量化开发——以交易后台开发为主研究——以机器学习研究框架为主交易——以期货和电子货币实盘为主

万水千山总是情,相信总有一款适合投身于量化领域的你。

第一期先听我BB一下量化开发(Developer),先讲总框架,之后再细究各个部分的设计和实现。

向量化回测系统

网络上已经存在了不少的开源回测框架和在线研究平台,他们都提供了完整的回测系统、归因分析,那为什么还需要自建一个回测系统?

因为慢。


是的,很简单的一个原因。那么回测快,很重要吗?

重要。

假设一个简单的双均线策略,使用2005年至2018年的数据进行回测。

日线级别,某在线量化平台:60s分钟线级别,离线向量化回测:0.1s

若将前者换算成分钟级别,二者相差5个数量级(A股每天交易240分钟 * 600倍)。

还不止如此,

    如果策略里包含了3000只股票,每只股票10个标签策略里往往都有2-3个参数,若每个参数有10个可取值,那么至少要在样本内回测1000次才能得到一个最优参数组合 策略不是一试就能出结果,不合适时要调整模型结构和逻辑,那么这个过程反复调整20次并不夸张。

如此算下来,用一整天时间很可能才跑出一个最优参数组合,而且还不能保证样本外效果良好,sad。

反过来,想象一下,如果以上过程仅在20秒内就全部结束,还能轮动回测多个时期,还能输出一份样本外的报告,你可以快速又直观地得知某个因子、或某个策略逻辑的效果,是否体验感会瞬间上升N个数量级呢。

好比机器学习,机器学习为什么比人更强,为什么alphago成为了世界第一的围棋高手,快就是其中的重要原因之一。因为快,所以能不断试错;试错更多,那么就能从中积累更多经验,学到更多知识。

所以速度快,很重要。你的时间就是最珍贵的财富。

技术解决方案:coming soon

技术栈要求: python xarray, empyrical, talib, mongo, hdf5


事件驱动回测系统

通过向量化的回测框架,你得以快速尝试和挖掘,终于回测到了一条不错的策略资金曲线,那么恭喜你,你通过自己的努力和创新发现了潜在的金矿。


但是,这仅仅是迈向圣杯的第一步。

你有没有考虑过:

    订单的撮合。订单并不是发出后就能成交,特别是中高频策略这种尤为看重订单成交率的策略,并不是仅靠添加滑点就能模拟的来的。 风险控制。总会几个策略失效或者黑天鹅的瞬间,在这个时刻,你能不能检测到浮盈后立刻退出这笔交易,而不是呆呆地等到某根bar跑完了再进行操作呢? 还有最重要的,如何把策略接入实盘跑起来?

如果没有,那么该向你介绍第二种回测框架了。

流行的回测框架大致分为两种:for-loop(轮询)和event-driven(事件驱动),本质上是在回测速度与实盘模拟这两个特性进行抉择权衡。

刚刚介绍的【向量化回测系统】就属于轮询回测,它速度更快,但不符合实盘交易的流程。而事件驱动则采用逐个bar/tick读取数据,并产生signal/order/trade的方式,利于统一回测和实盘的代码。而这样的回测系统,也很容易改造成一个能进行真实量化交易的系统,这点很重要。

技术解决方案:coming soon

技术栈要求: python, OOP


实时交易系统

策略只有最终上了实盘才有意义。应该没有人会质疑这句话,毕竟只有上实盘产生了PnL,策略才能算是真正落地。

富有的你一定实盘交易过,知道大概的交易流程,而我们的交易系统,就是把整个下单、盯盘的流程自动化。

当然,过程也并没有那么简单。


以数据流为例,讲一下系统从交易所收到一个tick数据,到一个订单最终成交的整个流程:

    程序的套接字捕捉到该tick数据解析,并向其他模块进行推送策略收到数据,进行信号计算,如触发信号,生成订单检查订单风险、有效性等检验检验通过后,向交易所发出下单请求成功下单(可能因为网络、账户、访问过频等原因而失败),交易所返回订单状态【待成交】根据市场情况,可能发出取消订单命令订单成交,返回订单状态【成交】,订单取消,返回订单状态【取消】策略处理订单状态,结束该笔交易

这个过程涉及的模块包括有:

    策略引擎负责多策略管理订单引擎负责管理订单,仓位,风控算法引擎负责订单算法(TWAP、VWAP、BLP)数据引擎负责持久化及查询日志引擎负责记录系统运行状态信息交易所连接引擎负责与交易所的信息交互控制界面负责信息交互、手动交易调整

不过整个过程,也不完全需要你撸起袖子从细节的一点一点完善。推荐两个开源项目vn.py & backtrader,其中有不少的特性和功能都值得借鉴,感谢作者和社区小伙伴,开源的力量真是伟大。

技术解决方案:coming soon

技术栈要求: python, OOP, 多线程, 设计模式, MVC架构, 敏捷开发


分布式交易服务器

实时交易系统开发完之后,顺利地在生产中运行了几个月,没有宕过,很开心。

但是,随着公司不断地上策略,卡、慢现象开始频发。100个策略,亦或是2000个标的对象,都会让系统无法承载。

你发现了原因:

    GIL限制动态语言开销大单机性能有限

嗯,重构的时间到了。为了横向提高系统吞吐量,纵向提高系统的信息处理速度,该让微服务和集群进入你的视野了。

庆幸自己以往模块化的设计,你发现将模块服务化并不困难。你会:

    用高IO速度的工具编写行情收发服务用高吞吐的消息中间件负责系统内信息路由服务用高性能的语言编写策略引擎、算法引擎、订单引擎等

技术解决方案:coming soon

技术栈要求: java, rabbitmq, protobuf, disruptor, docker


产品化

服务器成功地部署在云端,公司已经能用它跑起自营策略产生收益了,Congrats!!

那我们马到功成了?

不,还有更高的山等待着去攀爬,那就是产品化。

已知的量化系统产品化的方式:

    自用:承载公司自身策略的运行 软件销售:部署整套软件供机构本地使用 云平台服务:开放接口给更多机构、客户使用户 策略服务:云端策略销售,将策略完全零售化

只有想不到,没有做不到。


之后会逐期总结各个框架的设计构想和实现,下期主题是【向量化回测系统】,敬请期待哦

期货量化研究:我的量化踩坑经历(一)

这几天有点忙,程序并发有点bug,修了修。期货这几天开始震荡了,昨晚搞定bug 今天准备写点儿玩意儿。


做量化需要注意的细节太多了,我都不知道从哪里聊起,先从入坑经历开始写吧。


大学在哈商大读的,可能没听过(以我在的学校老师水平和自己的实力考上哈商大就不错了,哎自己不行啊~)在黑龙江还算不错的财经大学,学的投资学专业,大三接触一门田立(这个老师还是挺牛的)教授讲的 金融工程原理,走上金融工程的好奇之路,然后了解多了发现Qquant Pquant概念(期间学了不少卖方定价什么的基础知识),pquant比较好发展,然后就开始研究编程,刚开始也是从文化财经通达信这些指标入手,练了一年写指标还算流利,不要小看这种玩意儿,它有编程局限性所以你在上面能表达很多复杂的逻辑还是很锻炼编程能力。之后大四实习在一家私募,我16年毕业的,当时貌似15年下半年,那时候貌似vnpy已经出炉,掘金量化也有了,好像joinquant啥的还没有,ricequant好像有了。具体的记不清楚了。然后借助这些平台开始了解,初步学习之后决定搞vnpy,毕竟很专业。然后公司领导非要用c++,然后我就开始了自学c++做项目的练习之路(没人教,公司当时没有别的会编程的,c++完全自学),就这样阴差阳错练了一年,毕业之后还干了半年,终于c++编程不再是问题,然后16年下半年开始自己造轮子之路。


正式踏坑开始


第一次试水

在搞c++的同时,自己也研究vnpy,但是发现vnpy在服务器上挺卡的,写策略也不方便,回测起来也不好调,自己租的小云太小了。里面也有点bug和缺陷,用了vn交易了三个月,大概亏了两万多,(自己策略不行)。然后和一个北大老弟一起准备用C++造轮子。从2016年7月份左右开始,到2016年年底差不多造完了,然后调试BUG什么的测试策略等等折腾到了过完年。


题图是当年写的第一个平台,已经找不到截图了就暂时放以前截的图吧,可以看见上面显示时间是2017年2月份 后续我会把第一套平台开源,里头有些小BUG,反正好歹能凑合着交易,感兴趣可以自己研究研究=-= 熟悉python的还是玩VNPY吧~


第二次试水

重新用新平台和新开发的策略进行实盘交易,刚开始还好,赚了点钱,紧接着就开始亏,然后忍忍忍,最后实在不行,亏损告终


第三次试水

有了之前的经验,把交易平台做成客户端服务端分离的版本,然后增加一些功能修复一些BUG,重新优化代码,性能比以前高一两倍吧。然后新开发的一些策略重新试验。终于赚钱了。


如果给我时光倒流的机会,我觉得做量化需要几个关键的东西,第一个就是编程能力,然后是本金,不实盘亏一亏是学不会的。最后是策略灵感,这玩意儿看命了,如果始终不能领悟就没办法了。。


先做个概括总结,不是我不想单独把程序的坑啊 策略开发啊什么的单提出来写,关键是全混在脑子里提不出来=-=就这么着看吧~,后面一点一点详细写,知识太琐碎了,只能想到哪说到哪慢慢看吧,总会有收获,策略相关我也会在里头说的= = 关注后续文章~

盈时量化交易策略研究沙龙(青岛站)圆满落幕

9月21日下午,盈时量化交易策略研究沙龙第一期在青岛成功举办,本次沙龙由济南盈时数字技术有限公司、冠通期货青岛营业部、华西证券青岛营业部联合举办,盈时量化投资部总监张志鑫担任本次沙龙讲师。

沙龙第一阶段主要介绍了量化投资的基本情况、量化投资研究的体系框架和基本方法。在量化投资基本情况介绍部分,张志鑫主要介绍了量化投资的概念、特点、发展历史与现状。针对量化投资研究的基本知识,报告主要介绍了量化投资的研究工具、模型框架、研究方法和分析流程。量化投资的研究工具包括集成化研究平台、基础编程语言等,模型框架主要包括量化数据、定价模型、收益模型、风险模型、市场微观等组成部分,量化策略的分析流程则包括数据与环境准备、回测结果分析、策略改进与优化、模拟跟踪等。

沙龙第二阶段的核心内容是量化交易策略案例分析和量化投资实战经验分享。策略案例分析环节以双均线交易策略为例,系统说明了从策略逻辑梳理、策略代码开发、策略回测分析到策略改进优化的量化策略研究全过程。策略逻辑整理是量化投资研究的起点,基于逻辑清晰的策略思想,选定合适的研究平台,将策略思想精确转化为策略代码是量化策略研究的核心开发内容。针对策略代码开发,张志鑫详细介绍了策略代码框架、结构和开发注意事项。结合双均线交易策略的具体回测结果,报告详细说明了策略回测分析中应重点关注的绩效指标及其含义。逻辑改进和参数优化部分,张志鑫介绍了逻辑改进的主要思路方法以及参数优化的注意事项,并展示了针对双均线交易策略的具体改进优化方案和结果。量化投资实战经验分享环节主要介绍了量化投资的实战应用场景和注意事项,在市场数据扫描、实时行情监控、提示买卖信号、完全自动交易等方面,都可以应用量化投资的技术与方法。

展开剩余35%

量化交易策略研究沙龙是盈时服务投资者的重要举措,活动旨在帮助投资者了解量化、认识量化、学习量化进而应用量化。后期盈时将继续举办沙龙活动,进一步丰富沙龙的内容和形式,为投资者提供更全面的量化指导与服务。

文章来源:盈时

通过以上才知道「期货量化研究」什么是期货量化交易?风险大的内容,多的知识欢迎关注本站
发表评论
网名:
评论:
验证:
共有0人对本文发表评论查看所有评论(网友评论仅供表达个人看法,并不表明本站同意其观点或证实其描述)
关于我们 - 联系我们 - RSS订阅