VWAP算法(成交量加权平均价格)在期货中的代码实现

VWAP介绍

根据各个算法交易中算法的主动程度不同,可以把算法交易分为被动型算法交易、主动型算法交易、综合型算法交易三大类。而成交量加权平均价格(VWAP)属于被动型算法交易,它也是在日常算法交易中应用最为广泛的交易策略算法,国外机构有一半的算法交易量是采取VWAP策略及其衍生算法交易完成的。

成交量加权平均价格(VWAP)算法就是将大额报单按照规定期限内预测的交易量分布比例拆分成多个小额订单进行委托交易。即先将交易时间分成等时长的时间片,然后根据历史各时间片的交易情况来预测当日内各时间片交易量在全天交易量的占比;最后根据预测的交易占比拆分总交易量到各个时间片执行交易。

其基本思路是从历史交易模式出发,统计归纳历史成交时间、成交量、价格分布等的规则,并将这些规则应用于之后的交易。原则是每一个时间单元完成交易的总量占这段计划交易时段内市场总交易的比例恒定,这一算法交易实现的成交价格的比较基准为一段时间内的市场成交量加权均价。

该策略不是最优的算法策略,将大额报单分拆成较小的报单在一段时间内分开交易,主要是为了降低大额报单对市场短时间的冲击成本,并达到隐藏交易行为的目的, 并不寻求最小化所有成本。理论上,在没有额外的信息,也没有针对价格趋势预测的情况下,VWAP是最优的算法交易策略。

VWAP代码实现

本VWAP策略代码使用Pandas及TiaQin Python SDK实现预测拆单计算和交易。

Pandas文档:http://pandas.pydata.org/pandas-docs/stable/index.html

TqSdk文档:http://doc.shinnytech.com/pysdk/latest/index.html

本策略代码实现与标准VWAP策略的定义在交易时间上有所不同,标准VWAP策略按照日内交易量分布预测,日内交易量分布即某一时间区间内的交易量占整个交易日交易量的比例。本代码实现将交易时段设置为一个交易日内可选的的任何时段,长度可手动修改设置。使策略的运用更加灵活。

另外,因为成交量占比是小数,成交量为整数,则每个成交量预测值为占比预测值乘以预设的目标手数后进行四舍五入得到,这可能会导致此时所有时间单元的成交量预测值的总和与目标手数不同。初始解决方案为把误差的手数修改到成交量最大的时间单元上,但它并非是一个确定能将误差减小的方法,因此选择另一种解决方案。此解决方案为,设置剩余手数初值为总目标手数,剩余占比值初值为1,循环所有时间单元的占比预测值:当前时间单元的成交量预测值为:剩余手数*(当前时间单元占比预测值/剩余占比值),然后将总占比值减去当前时间单元的占比值,将剩余成交量减去当前时间单元的成交量预测值。

本VWAP策略的实现可分为以下4个步骤:

  • 设定时间单元的长度、目标交易手数、用于计算成交量预测占比的样本长度(即过去交易日的天数)、计划交易时段的起止时间等参数;
  • 将过去每个交易日划分为若干等长时间单元,取出每个交易日的所有时间单元中包含在计划交易时段内的所有时间单元;
  • 计算每个选定时间单元的成交量在此交易时段内总成交量的占比,然后将所有交易日中处于同一时间的时间单元的占比求平均值(即为预测的每个时间单元的成交量占比值),用每个时间单元的占比预测值计算其成交量预测值;
  • 到达交易时段的起始时间即按照预测值进行等时长下单。

源代码

https://github.com/shinnytech/tqsdk-python/blob/master/tqsdk/demo/example/vwap.py