量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python)(转)
<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 + " ";
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模型必须把母单分割成为许多小的子单,并在一个指定的时间段内逐步送出去。这样做的效果就是降低了大单对市场的冲击,改善了执行效果;同时增加了大单的隐秘性。显然,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不考虑交易量的因素。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-排序](.NET源码学习)& LINQ & Lambda
[算法1-排序](.NET源码学习)& LINQ & Lambda 说起排序算法,在日常实际开发中我们基本不在意这些事情,有API不用不是没事找事嘛.但必要的基础还是需要了解掌握. 排 ...
- c# winform 中的 工具栏自动隐藏 splitter用法 带源码
c# winform 中的 工具栏自动隐藏 splitter用法 带源码 代码下载地址 http://download.csdn.net/detail/simadi/7649313
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- eclipse中导入外部包却无法查看对应源码或Javadoc的入坑指南
eclipse中导入外部包却无法查看对应源码或Javadoc的 入坑指南 出现这个错误的原因是,你虽然导入了.jar包,但没有配置对应的Javadoc或源码路径,所以在编辑器中无法查看源 码和对应AP ...
- Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析
Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...
- Java中的容器(集合)之HashMap源码解析
1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...
- vue系列---理解Vue中的computed,watch,methods的区别及源码实现(六)
_ 阅读目录 一. 理解Vue中的computed用法 二:computed 和 methods的区别? 三:Vue中的watch的用法 四:computed的基本原理及源码实现 回到顶部 一. 理解 ...
- 数据挖掘Aprior算法详解及c++源码
[算法大致描述] Aprior算法主要有两个操作,扫描数据库+统计.计算每一阶频繁项集都要扫描一次数据库并且统计出满足支持度的n阶项集. [算法主要步骤] 一.频繁一项集 算法开始第一步,通过扫描数据 ...
- java动态代理基本原理及proxy源码分析一
本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章 为了尽快进入正题,这里 ...
随机推荐
- Mvc异步
<h3>MVC 自带的yibu请求</h3> <%-- 1.要执行的方法,2.控制器,3.Ajax操作--%> <%using (Ajax.BeginForm ...
- DG archive gap
什么是archive gap Archive Gap就是standby端日志应用的过程中丢失的一段范围的redo.典型的发生在standby端不能接收primary的redo信息或者接收后不能应用这些 ...
- Ansible学习记录一:Linux下部署
0.Ansible介绍 Ansible 是一个简单的自动化运维管理工具,可以用来自动化部署应用.配置.编排 task(持续交付.无宕机更新等),采用 paramiko 协议库(fabric 也使用这个 ...
- logwatch日志监控
1. 介绍 在维护Linux服务器时,经常需要查看系统中各种服务的日志,以检查服务器的运行状态. 如登陆历史.邮件.软件安装等日志.系统管理员一个个去检查会十分不方便:且大多时候,这会是一种被动的检查 ...
- Java设计模式23种(搞笑版) (转)
昨天做了一下支付宝的笔试题目被打击了,大量的逻辑推理和数学规律运算题目,其中还有问道Java设计模式的题目,一点都不知道,今天看到一份不错的介绍,非常好理解,作者是谁我没有办法考证,但是所有权 ...
- 洛谷——P2678 跳石头
https://www.luogu.org/problem/show?pid=2678#sub 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着 ...
- 南阳oj 士兵杀敌(二) 题目116 NYOJ 数据结构
/*士兵杀敌(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描写叙述 南将军手下有N个士兵.分别编号1到N.这些士兵的杀敌数都是已知的. 小工是南将军手下的军师, ...
- HDU 1533 Going Home(KM完美匹配)
HDU 1533 Going Home 题目链接 题意:就是一个H要相应一个m,使得总曼哈顿距离最小 思路:KM完美匹配,因为是要最小.所以边权建负数来处理就可以 代码: #include <c ...
- apache activemq Failed to bind to server socket 61616
windows环境上: 首先 nestat -ano | findstr "61616" 查看是否有进程,有的话kill掉, 若没有发现,查看windows Internet Co ...
- linux host主机名配置
1.查看主机名 #hostname 2.查看ip #ifconfig 2.添加主机名配置 #vi /etc/hosts 新增一行 172.23.26.195 vhost145.idmp.safe