量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python)

原文地址:http://blog.csdn.net/u012234115/article/details/72830003

参考文献:
https://en.wikipedia.org/wiki/Time-weighted_average_price
https://en.wikipedia.org/wiki/Volume-weighted_average_price
http://blog.sina.com.cn/s/blog_163a2b9700102wdy0.html
https://www.douban.com/note/214362575

算法交易其实主要是用在基金公司、券商量化比较多。例如我已经选好股,要大量买入,但是单凭交易员的操作海量单而且要完成买入100万股这些的操作是有点的困难的。那么这时候怎样解决拆单,防止冲击成本的问题呢?只有依靠算法交易了。
根据各个算法交易中算法的主动程度不同,可以把算法交易分为被动型算法交易、主动型算法交易、综合型算法交易三大类。而TWAP(时间加权平均价格)、VWAP(成交量加权平均价格)就属于被动型算法交易,也是在日常算法交易中应用最为广泛的策略算法。

VWAP

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

Vwap=∑ni=1pricei∗volumei∑ni=1volumei

要做到这一点,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=1pricein

TWAP不考虑交易量的因素。TWAP的基准是交易时段的平均价格,它试图付出比此时段内平均买卖差价小的代价执行一个大订单。TWAP模型设计的目的是使交易对市场影响减小的同时提供一个较低的平均成交价格,从而达到减小交易成本的目的。在分时成交量无法准确估计的情况下,该模型可以较好地实现算法交易的基本目的。但是使用TWAP过程中的一个问题是,在订单规模很大的情况下,均匀分配到每个节点上的下单量仍然较大,当市场流动性不足时仍可能对市场造成一定的冲击。另一方面,真实市场的成交量总是在波动变化的,将所有的订单均匀分配到每个节点上显然是不够合理的。因此,算法交易研究人员很快建立了基于成交量变动预测的VWAP 模型。不过,由于TWAP 操作和理解起来非常简单,因此其对于流动性较好的市场和订单规模较小的交易仍然适用。

代码实现

以A股 平安银行 的股票某一天的分钟线行情为例,分别用C++和python实现twap和vwap的求解。

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

C++

// calculate vwap value
double calc_vwap(std::vector<std::vector<std::string>> &marketDataTable)
{int n = marketDataTable.size() - 1; // skip the first title linedouble total_sum = 0.0;int volume_sum = 0;for (int i = 1; i <= n; i++){// get the price and volume according to table structuredouble 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 sumtotal_sum += price * volume;volume_sum += volume;}return total_sum / volume_sum;
}// calculate twap value
double calc_twap(std::vector<std::vector<std::string>> &marketDataTable)
{int n = marketDataTable.size() - 1; // skip the first title linedouble price_sum = 0.0;for (int i = 1; i <= n; i++){// get the price and volume according to table structuredouble 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 minutesprice_sum += price;}return price_sum / n;
}

python

# calculate vwap value
def calc_vwap(marketDataTable):n = len(marketDataTable) - 1total_sum = 0.0volume_sum = 0for i in range(1, n + 1):high_price = float(marketDataTable[i][9])low_price = float(marketDataTable[i][10])price = (high_price + low_price) / 2volume = int(marketDataTable[i][11])total_sum += price * volumevolume_sum += volumereturn total_sum / volume_sum# calculate vwap value
def calc_twap(marketDataTable):n = len(marketDataTable) - 1price_sum = 0.0for i in range(1, n + 1):high_price = float(marketDataTable[i][9])low_price = float(marketDataTable[i][10])price = (high_price + low_price) / 2price_sum += pricereturn price_sum / n

运行结果

reading market data
calculating TWAP and VWAP
VWAP: 8.66789
TWAP: 8.66475

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

    <script type="text/javascript">$(function () {$('pre.prettyprint code').each(function () {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/>').text(i));};$numbering.fadeIn(1700);});});</script>

转载于:https://www.cnblogs.com/jpfss/p/8327815.html

量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python)(转)相关推荐

  1. 量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python)

    参考文献: https://en.wikipedia.org/wiki/Time-weighted_average_price https://en.wikipedia.org/wiki/Volume ...

  2. 量化交易中,如何使用Python计算「筹码分布」指标【附代码】 [量化小讲堂-64]

    这是邢不行第 64 期量化小讲堂的分享 作者 | 邢不行.助教林奇 本文内容也有视频版本,点击观看:量化交易中,筹码分布指标如何计算[邢不行] 记得小时候的某个暑假,一边吃西瓜,一边看港剧<大时 ...

  3. 语音识别中的CTC算法的基本原理解释

    原标题:语音识别中的CTC算法的基本原理解释 目前主流的语音识别都大致分为特征提取,声学模型,语音模型几个部分.目前结合神经网络的端到端的声学模型训练方法主要CTC和基于Attention两种. 本文 ...

  4. opencv中人脸识别算法的基本原理

    opencv中人脸识别算法的基本原理(一) 使用opencv中自带的三种人脸识别算法进行实验后,特意去了解学习了一下其基本原理,在这里记录下. opencv人脸识别 关于如何使用opencv实现人脸识 ...

  5. 【图像去噪】基于matlab全变分算法图像去噪【含Matlab源码 626期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像去噪]基于matlab全变分算法图像去噪[含Matlab源码 626期] 获取代码方式2: 付费专栏Matlab图像处理(初级版) ...

  6. 粒子群算法求解带约束优化问题 源码实现

    算法原理 之前求解的无约束的问题. 粒子群算法求解无约束优化问题 源码实现 算法原理如下 今天讲解下求解约束优化的问题.该问题常用的方法是罚函数法.即如果一个解x不满足约束条件,就对适应度值设置一个惩 ...

  7. SHA224和SHA256哈希算法原理及实现(附源码)

    相关文章: SHA224和SHA256哈希算法原理及实现(附源码) 国密SM3哈希算法原理及实现(附源码) SHA1哈希算法原理及实现(附源码) MD5哈希算法原理及实现(附源码) MD4哈希算法原理 ...

  8. 【RF分类】基于matlab随机森林算法数据分类【含Matlab源码 2048期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[RF分类]基于matlab随机森林算法数据分类[含Matlab源码 2048期] 获取代码方式2: 付费专栏Matlab智能算法神经网络 ...

  9. SHA3系列(KECCAK)哈希算法原理及实现(附源码)

    相关文章: (本文持续更新中) SHA3系列(KECCAK)哈希算法原理及实现(附源码) SHA512系列哈希算法原理及实现(附源码) SHA224和SHA256哈希算法原理及实现(附源码) 国密SM ...

最新文章

  1. 信息系统项目管理师笔记(信息系统篇)第一讲
  2. VSCode工程文件右侧A M U 字母的含义
  3. 计算机函数select,请问关于select函数的操作程序?
  4. Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据
  5. 微信动态中的背景图更换
  6. MySQL 8.x 以前的版本修改密码规则
  7. *【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐打游戏(bfs,双元bfs,思维)
  8. div展示html文本,html – 使文本适合div
  9. cuckoo沙箱常见报错总结
  10. 红旗linux怎么更新,红旗linux7.0下自动更新firefox
  11. Too_many_open_files_问题的解决
  12. 编译android4.4 报错error: call to '__property_get_too_small_error' declared with attribute 的处理 (转载)...
  13. 万年历 html 代码,用javascript 实现的万年历代码。
  14. 上位机和下位机计算机联锁,上位机下位机各是什么意思?上位机下位机介绍
  15. 关于项目文档管理,现在开始就别揪心了!DOClever让你的项目文档纵享丝滑!
  16. WTEditor(windows窗口标题栏文字修改工具)绿色单文件版V1.0 | windows窗口标题文字怎么修改?
  17. 【开源教程9】疯壳·开源编队无人机-定时器(LED 航情灯、指示灯闪烁)
  18. 正向代理和反向代理(概念特点区别)
  19. 十进制转换成十六进制
  20. 新猿木子李:0基础学python培训教程 Python操作Redis之有序集合类型

热门文章

  1. 电脑删掉,如果彻底删除电脑文件,应该怎么做?
  2. java图形界面怎么进行布局_JAVA图形界面(GUI)之布局管理器
  3. 通过ppt制作圆形图标及自定义形状图形制作
  4. “互联网+”时代 餐饮业如何变局
  5. 我与一只流浪猫的相遇
  6. 练手的70个超火python小项目,小编建议收藏哦,送你们玩
  7. elementUI 中 table表格 图片 放大
  8. 【LeetCode】TreeNode
  9. layui 显示饼图_ECharts 饼图 如何显示比例值
  10. 网站都变成灰色了,这其中代码是怎么实现的?(发现文章,记录保存方便查看)