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

article/2025/9/26 18:17:14

参考文献:
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=1priceivolumeini=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


http://chatgpt.dhexx.cn/article/FXh8A5i0.shtml

相关文章

用高频交易的方式对TWAP算法优化(TWAP算法、算法实现、高频交易、冰山算法)

用高频交易的方式对TWAP算法进行优化。 以下内容主要基于执行算法的讨论。 什么是TWAP算法&#xff08;时间加权平均价格&#xff09;&#xff1f; TWAP交易时间加权平均价格Time Weighted Average Price 模型是把一个母单的数量平均地分配到一个交易时段上。该模型将交易时…

算法交易简介以及TWAP、VWAP算法原理

算法交易视频&#xff1a;算法交易视频 1&#xff0c;交易成本&#xff1a; 交易成本分成两类&#xff0c;一类是显性成本&#xff0c;包括佣金&#xff08;包括券商佣金&#xff08;券商收取&#xff09;&#xff0c;交易经手费&#xff08;交易所收取&#xff0c;千分之0.0…

时间加权平均价格算法(TWAP)和成交量平均算法(VWAP)在量化回测的应用

为什么要引入TWAP和 VWAP&#xff1f; 为了评估策略的资金容量&#xff0c;我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展&#xff0c;支持了策略能够按更丰富的算法交易价格&#xff08;WAP&#xff09;进行撮合。 如果资金是10万的话&#xff0c;那么在开…

平均价格算法:TWAP vs. VWAP

时间加权平均价格 (TWAP) 和成交量加权平均价格 (VWAP) 算法应用不同的方法来计算资产价格&#xff0c;这是所有去中心化金融 (DeFi) 原语的组成部分。 在本文中&#xff0c;我们介绍了 TWAP 和 VWAP 算法之间的差异&#xff0c;解释了它们如何在区块链环境中为资产定价&#…

json对象中的数组怎么转化为json字符串

注意&#xff1a;去掉数组下标&#xff0c;才有效&#xff1f; JSON是一种数据交换格式&#xff0c;与XML数据格式相比更加方便使用&#xff0c;互联网中的URL请求接口大部分都是已JSON数据格式进行交互&#xff0c;对接数据解析也是非常方便容易&#xff0c;在字符串与JSON对…

json对象转对象数组

对象的两种取值方式 let obj {name: wan}; console.log(obj.name); //wan这是最普通的一种方式&#xff0c;还有一种方式我们用的不太多&#xff0c;就是使用[]包住属性名取值 let obj {name: wan}; console.log(obj[name]); //wan将对象转化为数组 let obj {未完成:5, 已…

JSON对象/数组与JSON字符串之间的相互转换

文章目录 前言JSON介绍如何判断JS数据类型JSON数组转化为JSON字符串JSON对象转化为JSON字符串JSON字符串转化为JSON数组/对象注意点 前言 这里先介绍一个个人觉得很好用的谷歌浏览器的功能&#xff1a;snippet 就是类似收藏夹&#xff0c;平常你可能会用到的调试有关的东西都可…

json转数组(json数组对象)

哪位知道json格式怎么转换为word&#xff1f;哪位知道json格式 使用office工具进行转换 jquery如何读取并显示JSON数组 1、新建一个html文件&#xff0c;命名为test。html&#xff0c;用于讲解ajax怎么获取json数据并输出。 2、在test。html中&#xff0c;使用script标签加载j…

将数组转换为JSON数据

如何将数组转换为JSON数据&#xff1f;下面本篇就来给大家介绍一下将数组转换为JSON对象的方法&#xff0c;希望对大家有所帮助。 方法一&#xff1a;使用Object.assign() Object.assign()方法将枚举的所有属性的值从源对象&#xff08;一个或多个&#xff09;复制到目标对象 …

js中json对象转换为array

今天遇到了一个将json对象格式转换为js数组的问题&#xff0c;网上down了一下,发现只是对json进行了一些操作。在此写了一个小小的代码&#xff0c;以供有需要的人使用。 开门见山&#xff0c;先声明一个json对象数组&#xff0c;在此说一下&#xff0c;js中数组使用 " [ …

java json对象和json数组对象的处理

在开发过程中&#xff0c;经常需要和别的系统交换数据&#xff0c;数据交换的格式有XML、JSON等&#xff0c;JSON作为一个轻量级的数据格式比xml效率要高&#xff0c;XML需要很多的标签&#xff0c;这无疑占据了网络流量&#xff0c;JSON在这方面则做的很好&#xff0c;下面先看…

数组转JSON json对象 json字符串

入参格式JSON对象与JSON字符串的区别 1、Object.assign() Object.assign() 方法将所有可枚举&#xff08;Object.propertyIsEnumerable() 返回 true&#xff09;的自有&#xff08;Object.hasOwnProperty() 返回 true&#xff09;属性从一个或多个源对象复制到目标对象&#…

js 数组转json,json转数组

//数组转json串 var arr [1,2,3, { a : 1 } ]; JSON.stringify( arr );//json字符串转数组 var jsonStr [1,2,3,{"a":1}]; JSON.parse( jsonStr );

Java利用fastjson解析复杂嵌套json字符串、json数组;json字符串转Java对象,json数组转list数组

文章目录 前言一、什么是JSON对象&#xff1f;二、什么是json字符串&#xff1f;二、什么是JSON数组&#xff1f;三、复杂、嵌套的json字符串四、json字符串转换4.1 简单json字符串转换为java对象4.2 简单json字符串数组转换为list数组4.3 复杂嵌套json字符串数组转换为Java对象…

将嵌套的json对象转化为json数组(python列表推导式)

需求说明 想将一个json文件录入MongoDB&#xff0c;如下图所示。 但是原文件是嵌套json对象的形式&#xff0c;如果直接导入MongoDB&#xff0c;会整体变成一个Document&#xff1a; 注&#xff1a;MongoDB中的Document相当于SQL中Row的概念。 而我希望一个Document对应一个…

Oracle 基础总结:日期函数专题

Oracle 基础总结&#xff1a;日期函数专题 日期函数:1、SYSDATE2、日期函数&#xff1a;(1&#xff09; MONTHS_BETWEEN&#xff08;日期1&#xff0c;日期2&#xff09;&#xff1a;返回两个日期相差的月数。(2&#xff09; ADD_MONTHS&#xff08;日期&#xff0c;数值&#…

numtodsinterval mysql用法_Oracle函数 - 日期函数详解

Oracle中的时间类型只有date和TIMESTAMP&#xff0c;TIMESTAMP是比date更精确的类型。日期时间函数用于处理时间类型的数据&#xff0c;Oracle以7位数字格式来存放日期数据&#xff0c;包括世纪、年、月、日、小时、分钟、秒&#xff0c;并且默认日期显式格式为“DD-MON-YY”。…

常用Oracle日期函数及聚合函数

1、常用Oracle日期函数 &#xff08;1&#xff09;CURRENT_DATE CURRENT_DATE是一个SQL标准函数&#xff0c;返回当前日期&#xff08;不带时间&#xff09;&#xff0c;可以在SELECT语句中使用。例如&#xff1a; 1 SELECT CURRENT_DATE FROM DUAL; 返回当前日期&#xff…

Oracle数据库之日期函数

今天给大家介绍一下oracle数据中的日期函数的用法。废话不多说&#xff0c;我们看一下oracle给我们提供了那些函数&#xff1f; 1.sysdate   用途&#xff1a;获取当前系统时间。 2.to_date(字符类型,日期类型) 用途&#xff1a;将字符类型转化成日期类型的函数&#xff0c;…

Oracle日期函数总结

1.日期和字符转换函数用法&#xff1a;&#xff08;to_char,to_date&#xff0c;to_namber&#xff09; 使用to_date函数将字符转换成数字。 使用to_char函数对日期的转换&#xff0c;并也可以对数字转换。 使用to_namber函数将字符转换成日期 格式&#xff1a;必须包含在单…