宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

量化交易中VWAP/TWAP算法的基本原理和简单源代码实现c和python )源地址: http://blog.csdn.net/u 012234115/article/details/72830000000

3359 en.Wikipedia.org/wiki/time-weighted _ average _ price

3359 en.Wikipedia.org/wiki/volume-weighted _ average _ price

3358 blog.Sina.com.cn/s/blog _ 163 a2 b 9700102 wdy0. html

3359 www.douban.com/note/214362575

算法交易实际上大多主要用于基金公司、证券公司的量化。 例如,我已经不得不选股、大量买入,但光靠交易员的操作就做了大量的订单,而且要完成买入100万股这个操作有点困难。 那么,此时如何解决解体票,防止冲击成本问题呢? 只能依靠算法交易。

根据算法在各算法交易中的主动度,可以将算法交易分为被动型算法交易、主动型算法交易、综合型算法交易三类。 另一方面,TWAP 时间加权平均价格)、VWAP 成交量加权平均价格) )是被动算法交易,也是日常算法交易中应用最广泛的策略算法。

VWAP VWAP是Volume Weighted Average Price的缩写,翻译为成交量加权平均价格。 VWAP战略是拆分大额委托书,在约定时间段内分批执行,以期使得最终买入或卖出成交均价尽量接近这段时间内整个市场成交均价的交易战略。 这是量化交易系统中常用的标准。 作为基准量,VWAP是计算公式。

为此,VWAP模型需要将父单子分割为很多小单子,并在指定的时间段内逐步发送。 这样做的效果是降低对市场的巨大打击,改善执行效果; 同时提高了大单的隐秘性。 显然,VWAP模型的核心是如何在市场千变万化的情况下,部分放矢地决定子单的大小、价格和发送时间。

VAP模型实现这一点的关键是过去的成交量、未来成交量的预测、市场动态总成交量和分批下单的时间段。 也就是说,将总订单分割成几个订单分别以多长时间为频率进行交易。 更高级的VWAP模型使用订单手册的详细信息。 这要求系统能够获取实时的二级市场数据Level II Market Data )。

VAP模型对于在几个小时内运行较大的单个模型最有效。 在交易量大的市场上,VWAP的效果比流动性差的市场更好。 市场上发生重要事件时,效果往往不那么好。 订单非常大,例如超过市场日交易量的1%,即使VWAP可以改善很多市场冲击,但市场冲击会不断改变市场,最终模型效果会不如预期。

VAP算法交易的目的是最小化冲击成本,而不是要求最小化所有成本。 理论上,在没有多余信息,也没有对股价趋势的预测的情况下,VWAP是最佳的算法交易策略。 TWAP

TWAP交易时间加权平均价格3358www.Sina.com/型号为Time Weighted Average Price。 该模型平均划分事务时间,并在每个划分节点上提交划分的订单。 例如,如果您将事务处理日期的事务处理时间平均分为n个段,则TWAP策略会将事务处理日期必须运行的订单平均分配给这n个段并执行,因此事务处理平均价格可以跟踪TWAP,也可以成为计算公式。

TWAP不考虑交易量的因素。 TWAP的标准是交易时段的平均价格,它试图以低于该时段平均交易差额的代价执行大订单。 TWAP模型设计的目的是降低交易对市场的影响,同时提供较低的平均成交价格,降低交易成本。 在时分交易量不能准确估计的情况下,该模型可以很好地达到算法交易的基本目的。 但是,使用TWAP的一个问题是,订单规模较大时,平均分配给各个节点的订单量依然较大,即使市场流动性不足,也可能对市场造成一定的冲击。 另一方面,实际市场成交量经常变动,将所有订单平均分配给各节点显然是不合理的。 为此,算法交易研究者很快建立了基于成交量波动预测的VWAP模型。 但是,TWAP非常容易操作和理解,因此也适合流动性高的市场和订单规模小的交易。 代码实现

以a股平安银行股票某一天的分线行情为例,分别在c和python上实现twap和vwap的求解。

在实际交易系统中,将得到的价格划分为不同的时间段,将大单分成小单交易,以下是twap和vwap计算的简单实现

把一个母单的数量平均地分配到一个交易时段上

//calculatevwapvaluedoublecalc _ vwap STD :3360 vectors TD 33603360 vectors TD 3360: stringmarketdatatable intn=

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 = atofmarketDataTable[i][9].c_str)); double low_price = atofmarketDataTable[i][10].c_str)); double price = high_price + low_price) / 2; int volume = atoimarketDataTable[i][11].c_str)); // compute total sum and volume sum total_sum += price * volume; volume_sum += volume; } return total_sum / volume_sum;}// calculate twap valuedouble calc_twapstd::vector<std::vector<std::string>> &marketDataTable){ 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 = atofmarketDataTable[i][9].c_str)); double low_price = atofmarketDataTable[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

# calculate vwap valuedef calc_vwapmarketDataTable): n = lenmarketDataTable) – 1 total_sum = 0.0 volume_sum = 0 for i in range1, n + 1): high_price = floatmarketDataTable[i][9]) low_price = floatmarketDataTable[i][10]) price = high_price + low_price) / 2 volume = intmarketDataTable[i][11]) total_sum += price * volume volume_sum += volume return total_sum / volume_sum# calculate vwap valuedef calc_twapmarketDataTable): n = lenmarketDataTable) – 1 price_sum = 0.0 for i in range1, n + 1): high_price = floatmarketDataTable[i][9]) low_price = floatmarketDataTable[i][10]) price = high_price + low_price) / 2 price_sum += price return price_sum / n

运行结果

reading market datacalculating TWAP and VWAPVWAP: 8.66789TWAP: 8.66475

完整demo下载
csdn: twap/vwap code
github: twap/vwap code

<script type=”text/javascript”> $function ) { $’pre.prettyprint code’).eachfunction ) { var lines = $this).text).split’\n’).length; var $numbering = $'<ul/>’).addClass’pre-numbering’).hide); $this).addClass’has-numbering’).parent).append$numbering); for i = 1; i <= lines; i++) { $numbering.append$'<li/>’).texti)); }; $numbering.fadeIn1700); }); }); </script> <div class=”readall_box csdn-tracking-statistics tracking-click readall_box_nobg” data-pid=”blog” data-mod=”popu_596″ style=”display: none;”> <div class=”read_more_mask”></div> <a class=”btn btn-large btn-gray-fred read_more_btn” target=”_self”>阅读全文</a></div><div class=”csdn-tracking-statistics” data-pid=”blog” data-mod=”popu_222″><a rel=”external nofollow” rel=”external nofollow” href=”javascript:void0);” target=”_blank”>&nbsp;</a> </div><div class=”csdn-tracking-statistics” data-pid=”blog” data-mod=”popu_223″> <a rel=”external nofollow” rel=”external nofollow” href=”javascript:void0);” target=”_blank”>&nbsp;</a></div> <div id=”digg” articleid=”72830003″> </div><script type=”text/javascript”> function btndigga) { $”.csdn-tracking-statistics[data-mod=’popu_222′] a”).click); } function btnburya) { $”.csdn-tracking-statistics[data-mod=’popu_223′] a”).click); } </script>

</ul><div style=”clear:both; height:10px;”></div>