<h1>
<span class="link_title"><a href="/u012234115/article/details/72830003">
量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python) </a>
</span> </h1>

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

<div class="article_manage clearfix">
</div> <style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ } });
</script>
<div class="category clearfix">
</div>

参考文献:

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 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)
{
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

# calculate vwap value
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: twap/vwap code

github: twap/vwap code

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

  1. [算法1-排序](.NET源码学习)& LINQ & Lambda

    [算法1-排序](.NET源码学习)& LINQ & Lambda 说起排序算法,在日常实际开发中我们基本不在意这些事情,有API不用不是没事找事嘛.但必要的基础还是需要了解掌握. 排 ...

  2. c# winform 中的 工具栏自动隐藏 splitter用法 带源码

    c# winform 中的 工具栏自动隐藏 splitter用法 带源码 代码下载地址 http://download.csdn.net/detail/simadi/7649313

  3. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  4. eclipse中导入外部包却无法查看对应源码或Javadoc的入坑指南

    eclipse中导入外部包却无法查看对应源码或Javadoc的 入坑指南 出现这个错误的原因是,你虽然导入了.jar包,但没有配置对应的Javadoc或源码路径,所以在编辑器中无法查看源 码和对应AP ...

  5. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

  6. Java中的容器(集合)之HashMap源码解析

    1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...

  7. vue系列---理解Vue中的computed,watch,methods的区别及源码实现(六)

    _ 阅读目录 一. 理解Vue中的computed用法 二:computed 和 methods的区别? 三:Vue中的watch的用法 四:computed的基本原理及源码实现 回到顶部 一. 理解 ...

  8. 数据挖掘Aprior算法详解及c++源码

    [算法大致描述] Aprior算法主要有两个操作,扫描数据库+统计.计算每一阶频繁项集都要扫描一次数据库并且统计出满足支持度的n阶项集. [算法主要步骤] 一.频繁一项集 算法开始第一步,通过扫描数据 ...

  9. java动态代理基本原理及proxy源码分析一

    本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章 为了尽快进入正题,这里 ...

随机推荐

  1. ubuntu14.04-安装flash

    最近打开搜狐等在线视频,都提示我说flash没有安装,然后就点击安装.进入安装界面 如下所示 然后我们选择版本.之前我一直都是选择版本APT,因为里面标注的是适用于ubuntu10.04+,这时候它会 ...

  2. Spark MLlib回归算法LinearRegression

    算法说明 线性回归是利用称为线性回归方程的函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析方法,只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归,在实际情况中大多数都是多 ...

  3. HTML5多维度数据分析

    详情:http://echarts.baidu.com/index.html

  4. 如何优雅的写UI——(5)选项卡功能实现

    先在我们的选项卡可以说能用了,每个标签页都能点进去,但是这还远远没到能用的地步,比如说你把窗口最大化后. 立马就露出马脚了,所以这篇我们要先讲讲tabctrl的最基本的功能实现 改变选项卡大小 上图的 ...

  5. [PWA] Deal with caches in PWA

    The takeway is to know when we should cache the content? When we should clean the caches? 1. When sh ...

  6. HDU 2563 统计问题 (递推)

    A - 统计问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  7. Android学习笔记进阶17之LinearGradient

    具体的看一下博文:Android学习笔记进阶15之Shader渲染 package xiaosi.BitmapShader; import android.app.Activity; import a ...

  8. thinkphp多层volist实现多表查询

    thinkphp多层volist实现多表查询 一.总结 二.截图 三.代码 1.控制器 2.视图

  9. ios 获取手机信息(UIDevice、NSBundle、NSLocale)

    iOS的SDK中提供了UIDevice.NSBundle,NSLocale. UIDevice        UIDevice提供了多种属性.类函数及状态通知,帮助我们全方位了解设备状况. 从检測电池 ...

  10. Ubuntu配置sublime text 3的c编译环境

    新建编译系统 c语言 选择tool –> Build System –> New Build System 然后输入下面代码 { "shell_cmd": " ...