量化交易中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 + "&nbsp;&nbsp;";
                    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=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 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM