量化交易中VWAPTWAP算法的基本原理和简单源码实现
(C++和python)
算法交易其实主要是⽤在基⾦公司、券商量化⽐较多。例如我已经选好股,要⼤量买⼊,但是单凭交易员的操作海量单⽽且要完成买⼊100万股这些的操作是有点的困难的。那么这时候怎样解决拆单,防⽌冲击成本的问题呢?只有依靠算法交易了。
根据各个算法交易中算法的主动程度不同,可以把算法交易分为被动型算法交易、主动型算法交易、综合型算法交易三⼤类。⽽TWAP(时间加权平均价格)、VWAP(成交量加权平均价格)就属于被动型算法交易,也是在⽇常算法交易中应⽤最为⼴泛的策略算法。
VWAP
VWAP是Volume Weighted Average Price的缩写,译为成交量加权平均价,VWAP策略是⼀种拆分⼤额委托单,在约定时间段内分批执⾏,以期使得最终买⼊或卖出成交均价尽量接近这段时间内整个市场成交均价的交易策略。它是量化交易系统中常⽤的⼀个基准。作为⼀个基准量,VWAP就是⼀个计算公式:
Vwap=∑ni=1pricei∗volumei∑ni=1volumeiVwap=∑i=1npricei∗volumei∑i=1nvolumei
要做到这⼀点,VWAP模型必须把母单分割成为许多⼩的⼦单,并在⼀个指定的时间段内逐步送出去。这样做的效果就是降低了⼤单对市场的冲击,改善了执⾏效果;同时增加了⼤单的隐秘性。显然,VWAP模型的核⼼就是如何在市场千变万化的情况下,有的放⽮地确定⼦单的⼤⼩、价格和发送时间。
VWAP模型做到这⼀点的关键是历史成交量、未来成交量的预测、市场动态总成交量以及拆单的时间段(就是总共要将总单拆分成多少单分别以怎样的时间频率交易)。较为⾼级的VWAP模型要使⽤交易所单簿(Order Book)的详细信息,这要求系统能够得到即时的第⼆级市场数据(Level II Market Data)。
VWAP模型对于在⼏个⼩时内执⾏⼤单的效果最好。在交易量⼤的市场中,VWAP效果⽐在流动性差的市场中要好。在市场出现重要事件的时候往往效果不那么好。如果订单⾮常⼤,譬如超过市场⽇交易量的1%的话,即便VWAP可以在相当⼤的程度上改善市场冲击,但市场冲击仍然会以积累的⽅式改变市场,最终使得模型的效果差于预期。
VWAP算法交易的⽬的是最⼩化冲击成本,并不寻求最⼩化所有成本。理论上,在没有额外的信息,也没有针对股票价格趋势的预测的情况下,VWAP 是最优的算法交易策略。
TWAP
TWAP交易时间加权平均价格Time Weighted Average Price 模型是把⼀个母单的数量平均地分配到⼀个交易时段上。该模型将交易时间进⾏均匀分割,并在每个分割节点上将拆分的订单进⾏提交。例如,可以将某个交易⽇的交易时间平均分为N 段,TWAP 策略会将该交易⽇需要执⾏的订单均匀分配在这N 个时间段上去执⾏,从⽽使得交易均价跟踪TWAP,也是⼀个计算公式:
Twap=∑ni=1priceinTwap=∑i=1npricein
TWAP不考虑交易量的因素。TWAP的基准是交易时段的平均价格,它试图付出⽐此时段内平均买卖差价⼩的代价执⾏⼀个⼤订单。TWAP 模型设计的⽬的是使交易对市场影响减⼩的同时提供⼀个较低的平均成交价格,从⽽达到减⼩交易成本的⽬的。在分时成交量⽆法准确估计的情况下,该模型可以较好地实现算法交易的基本⽬的。但是使⽤TWAP过程中的⼀个问题是,在订单规模很⼤的情况下,均匀分配到每个节点上的下单量仍然较⼤,当市场流动性不⾜时仍可能对市场造成⼀定的冲击。另⼀⽅⾯,真实市场的成交量总是在波动变化的,将所有的订单均匀分配到每个节点上显然是不够合理的。因此,算法交易研究⼈员很快建⽴了基于成交量变动预测的VWAP 模型。不过,由于TWAP 操作和理解起来⾮常简单,因此其对于流动性较好的市场和订单规模较⼩的交易仍然适⽤。
代码实现
以A股 平安银⾏ 的股票某⼀天的分钟线⾏情为例,分别⽤C++和python实现twap和vwap的求解。
在实际的交易系统中,将得到的价格分不同时段将⼤单拆成⼩单挂单交易,以下是twap和vwap计算的简单实现C++
double calc_vwap(std::vector<std::vector<std::string>> &marketDataTable) {
int n = marketDataTable.size() - 1; // skip the first title line
double total_sum = 0.0;
int volume_sum = 0;
for (int i = 1; i <= n; i++)
{
// get the price and volume according to table structure
double high_price = atof(marketDataTable[i][9].c_str());
double low_price = atof(marketDataTable[i][10].c_str());
double price = (high_price + low_price) / 2;
int volume = atoi(marketDataTable[i][11].c_str());
// compute total sum and volume sum
total_sum += price * volume;
volume_sum += volume;
}
return total_sum / volume_sum;
}
// calculate twap value
double calc_twap(std::vector<std::vector<std::string>> &marketDataTable) {快速排序python实现
int n = marketDataTable.size() - 1; // skip the first title line
double price_sum = 0.0;
for (int i = 1; i <= n; i++)
{
// get the price and volume according to table structure
double high_price = atof(marketDataTable[i][9].c_str());
double low_price = atof(marketDataTable[i][10].c_str());
double price = (high_price + low_price) / 2;
// compute price sum and time sum
// here use the 1 min K-line data, so total time is n minutes
price_sum += price;
}
return price_sum / n;
}
python
def calc_vwap(marketDataTable):
n = len(marketDataTable) - 1
total_sum = 0.0
volume_sum = 0
for i in range(1, n + 1):
high_price = float(marketDataTable[i][9])        low_price = float(marketDataTable[i][10])        price = (high_price + low_price) / 2
volume = int(marketDataTable[i][11])
total_sum += price * volume
volume_sum += volume
return total_sum / volume_sum
# calculate vwap value
def calc_twap(marketDataTable):
n = len(marketDataTable) - 1
price_sum = 0.0
for i in range(1, n + 1):
high_price = float(marketDataTable[i][9])        low_price = float(marketDataTable[i][10])        price = (high_price + low_price) / 2
price_sum += price
return price_sum / n
运⾏结果
reading market data
calculating TWAP and VWAP
VWAP: 8.66789
TWAP: 8.66475
完整demo下载
csdn:
github:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。