量化交易中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动态代理的本质原理做了一些研究,于是便有了这个系列的文章 为了尽快进入正题,这里 ...
 
随机推荐
- 轻松使用 Redis slowlog
			
之前中秋项目搞活动,用户比较活跃 SE.Redis 频繁报 Timeout 异常,狂翻了一波 issues 发现提这个问题还蛮多的,作者非常频繁的提到使用 slowlog 这个命令进行排查,那么问题就 ...
 - Yahoo!团队:网站性能优化的35条黄金守则(转)
			
Excetional Performance 团队总结出了一系列可以提高网站速度的方法.可以分为 7大类 35条.包括内容 .服务器 . CSS . JavaScript .Cookie .图片 .移 ...
 - mvc4 视图中的form如何获取
			
public ActionResult Index(FormCollection form) { var Name = form["字段名" ...
 - 用console.log分析Vue源码
			
前言 本文通过console.log的一些特性,结合vue.js的源码,通过一个简单的例子,让你了解Vue的各个过程的变化. 控制台输出的效果图 请用chrome查看,并打开控制台看效果 演示地址 准 ...
 - PythonOOP面向对象编程1
			
什么是对象? 对象是指现实中的物体或实体(拥有一系列变量.函数(方法)的) 什么事面向对象? 把一切看成对象(实例),让对象和对象之间建立关联关系 对象都有什么特征? 属性(名词)实例变量 姓名.年龄 ...
 - HDU——T 3336 Count the string
			
http://acm.hdu.edu.cn/showproblem.php?pid=3336 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
 - [React Native] Animate the Scale of a React Native Button using Animated.spring
			
In this lesson we will use Animated.spring and TouchableWithoutFeedback to animate the scale of a bu ...
 - iOS动画之模拟音量振动条
			
音量振动条 效果图: 假设实现? 创建3个layer.按顺序播放y轴缩放动画 利用CAReplicatorLayer实现 1.什么是CAReplicatorLayer? 一种能够复制自己子层的laye ...
 - poj 1001 java大精度
			
import java.io.* ; import java.math.* ; import java.util.* ; import java.text.* ; public class Main ...
 - Encoding encoding = Encoding.GetEncoding("gb2312"); 与byte[] ping = Encoding.UTF8.GetBytes(inputString);区别
			
Encoding encoding = Encoding.GetEncoding("gb2312"); 与byte[] ping = Encoding.UTF8.GetBytes( ...