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

article/2025/9/25 22:31:26

为什么要引入TWAP和 VWAP?

为了评估策略的资金容量,我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展,支持了策略能够按更丰富的算法交易价格(WAP)进行撮合。

如果资金是10万的话,那么在开盘买入基本上没有什么问题,如果资金量是300万、或者1000万呢?开盘如果只买入几只股票的话,本身的交易行为就会改变市场状态,冲击成本巨大。因此我们支持了算法交易里TWAP和VWAP。

TWAP (Time Weighted Average Price),时间加权平均价格算法,是一种最简单的传统算法交易策略。TWAP模型设计的目的是使交易对市场影响减小的同时提供一个较低的平均成交价格,从而达到减小交易成本的目的。在分时成交量无法准确估计的情况下,该模型可以较好地实现算法交易的基本目的。

VWAP (Volume Weighted Average Price), 成交量加权平均价格。VWAP策略即是一种拆分大额委托单,在约定时间段内分批执行,以期使得最终买入或卖出成交均价尽量接近该段时间内整个市场成交均价的算法交易策略。

上述两种方式是最常用的算法交易执行方式。其实在我们实际交易的过程中也会发现,如果是一笔较大的订单,我们肯定不会直接全部下单,而是把订单进行拆分,逐渐成交。因此如果我们在回测的过程中也可以使用TWAP和VWAP的价格进行撮合,最直接的目的就是能够检验我们策略的资金容量,如果按照TWAP和VWAP进行撮合以后,收益率变动不大,那我们对策略的资金容量会有很大信心,即策略不再是只能管理几十万,管理上百万、上千万是没有问题的。

我们在stockranker模板策略的基础上,用多组WAP价格进行回测,并和默认回测价格做了一个对比,回测结果如下表所示:

img

可以看到使用WAP价格回测和使用默认的open买入close卖出回测相比,各项指标变化不大,这也一定程度上表明单一策略的资金容量其实比我们想象地要大很多。

字段查看

WAP相关的文档见:WAP算法交易字段18,截图如下:

img

设置方法

在回测模块右侧属性栏中,可以看到有买入点和卖出点的参数设置:

img

字段介绍

  • 我们支持了TWAP,VWAP 两种WAP价格

  • 每个字段对应了1-11 共11种时间规则指标,具体时间规则如下:

img

  • 每一个字段对应了买卖两个方向

  • 每一个字段又对应了两种数据:价格和成交量

综上,字段示例如下:

img

以上字段均储存在 bar1d_wap_CN_STOCK_A表 和 bar1d_wap_CN_STOCK_A_adj表 中,如果要手动核查下撮合价格的话,可以访问这两个表来获取股票的TWAP,VWAP价格以及成交量。(其中第一个表是真实的加权价格数据,后一个表是后复权的价格加权数据,两表中的字段相同)。

DataSource('bar1d_wap_CN_STOCK_A_adj').read(start_date='2017-12-28',end_date='2017-12-28',instruments=['000002.SZA'],fields=['date','instrument','wap_1_buy_volume', 'wap_1_sell_volume', 'wap_1_twap_buy','wap_1_twap_sell', 'wap_1_vwap_buy', 'wap_1_vwap_sell'])

img

也可以查询到表中所有字段如下:

DataSource('bar1d_wap_CN_STOCK_A_adj').read(start_date='2017-12-28',end_date='2017-12-28',instruments=['000002.SZA']).columns
 

img

我们选择买入点为twap_1,卖出点为twap_8,回测价格类型选择后复权,回测结果部分截图如下:

img

可以看到002801.SZA的买入价为128.17,000503.SZA的卖出价为319.99。

我们再从bar1d_wap_CN_STOCK_A_adj 表(如果回测价格类型选择的是真实价格,则用bar1d_wap_CN_STOCK_A 表)中读出这两只股票的wap_1_twap_buy和wap_8_twap_sell价格: 

DataSource('bar1d_wap_CN_STOCK_A_adj').read(start_date='2016-12-30',end_date='2016-12-30',instruments=['002801.SZA','000503.SZA'],fields=['date','instrument','wap_1_twap_buy','wap_8_twap_sell'])

img

可以看到表中的价格和回测中的成交价是一致的,回测时确实使用了我们选择的WAP价格进行撮合成交。

计算方法和成交逻辑

  • 成交量: 如果对应的是买,将涨停的分钟k线去除,不参与计算,即非涨停的量 如果对应的是卖,将跌停的分钟k线去除,不参与计算,即非跌停的量 例如: 假设000002股票在上午【2h】成交100手,涨停;下午【1h】打开涨停(非跌停),成交200手,收盘【1h】跌停,成交50手。 则,买入经调整的成交量是250 ,卖出经调整的成交量是 300

600339.SHA在2016-12-30这天盘中涨停,我们读这天的价量数据可以看到,当天的总成交量为15055283.0

DataSource('bar1d_CN_STOCK_A').read(start_date='2016-12-30',end_date='2016-12-30',instruments=['600339.SHA'])

img

而我们读取这个股票这一天的全天的buy_volume,可以看到交易量为8937100.0,去除了涨停的量:

DataSource('bar1d_wap_CN_STOCK_A_adj').read(start_date='2016-12-30',end_date='2016-12-30',instruments=['600339.SHA'],fields=['date','instrument','wap_11_buy_volume'])

img

  • 平均价格: 如果对应的是买,将涨停的分钟k线去除 如果对应的是卖,将跌停的分钟k线去除 TWAP: Time Weighted Average Price, 是时间加权平均价格。 计算公式为 mean(Pm,n) ,其中n为k线数量,Pm为典型价格(等于 (high+low+close)/3)。 VWAP: Volume Weighted Average Price, 是交易量加权平均价格。 计算公式为 (close_0 * volume_0 + close_1 * volume_1 +close_2 * volume_2 +…+close_59* volume_59) / (volume_0+volume_1+…+volume_59) 。

  • 成交逻辑: 实际成交量会受到我们选择的买点卖点的价格类型所对应的的成交量的影响,例如: 假设某天A股票成交1万手,而我们想买入2万手,假如买入点选择close,则实际可以成交1万手;假如买入点选择twap1,而当天wap_1_buy的成交量为500手,则实际只会成交500手。

更新后的WAP功能相比之前做了更进一步的细化和优化,考虑到了真实交易的涨跌和跌停情形,因此计算出来的算法交易平均价格更精准和符合实际,进一步提高了回测的准确性。

BigQuant人工智能量化投资交易平台量化投资平台BigQuant以人工智能为核心,为量化投资宽客提供机器学习AI技术、股票期货金融数据、高速精准回测和交易接口以及海量因子和策略,让Quant和量化投资者无门槛的使用AI做更好的投资。https://bigquant.com/?utm_source=csdn_article&utm_medium=article&utm_id=csdn


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

相关文章

平均价格算法:TWAP vs. VWAP

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

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

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

json对象转对象数组

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

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

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

json转数组(json数组对象)

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

将数组转换为JSON数据

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

js中json对象转换为array

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

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

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

数组转JSON json对象 json字符串

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

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对象?二、什么是json字符串?二、什么是JSON数组?三、复杂、嵌套的json字符串四、json字符串转换4.1 简单json字符串转换为java对象4.2 简单json字符串数组转换为list数组4.3 复杂嵌套json字符串数组转换为Java对象…

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

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

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

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

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

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

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

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

Oracle数据库之日期函数

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

Oracle日期函数总结

1.日期和字符转换函数用法:(to_char,to_date,to_namber) 使用to_date函数将字符转换成数字。 使用to_char函数对日期的转换,并也可以对数字转换。 使用to_namber函数将字符转换成日期 格式:必须包含在单…

ORACLE之日期函数

日期函数: 运算规律: 日期数字 日期 日期-数字 日期 日期-日期 数字(天数) -- 查询当前日期: SELECT SYSDATE FROM DUAL;-- 查询一百天前的日期时间 SELECT (SYSDATE-100) FROM DUAL; -- 在指定日期上加上指定月数…

Oracle函数--日期函数

3.日期函数 months_between,add_months,next_day,last_day,round,trunc,sysdate sysdate关键字,表示系统的当前时间 select sysdate from dual; 结果:2022/5/4 12:38:4 select sysdate1 from dual; 当前时间加1天 结果:202…

Oracle 日期时间函数详解

文章目录 1 日期函数2 日期格式3 类型转换 1 日期函数 1. 常用日期函数(1) add_months(date, n) : n 个月前,-n 个月后(2) months_between(date1, date2) : 月份差 date1 - date22. 时区(了解即可)(1) select dbtimezone from dual;…