参考文献:
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是Volume Weighted Average Price的缩写,译为成交量加权平均价,VWAP策略是一种拆分大额委托单,在约定时间段内分批执行,以期使得最终买入或卖出成交均价尽量接近这段时间内整个市场成交均价的交易策略。它是量化交易系统中常用的一个基准。作为一个基准量,VWAP就是一个计算公式:
TWAP交易时间加权平均价格Time Weighted Average Price 模型是把一个母单的数量平均地分配到一个交易时段上。该模型将交易时间进行均匀分割,并在每个分割节点上将拆分的订单进行提交。例如,可以将某个交易日的交易时间平均分为N 段,TWAP 策略会将该交易日需要执行的订单均匀分配在这N 个时间段上去执行,从而使得交易均价跟踪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