CMCRC_Porject
In [1]:
#following part creates a button to hide code

from IPython.display import HTML
HTML('''<script>
function code_toggle() {
if (code_shown){
$('div.input').hide('500');
$('#toggleButton').val('Show Code')
} else {
$('div.input').show('500');
$('#toggleButton').val('Hide Code')
}
code_shown = !code_shown
}
$( document ).ready(function(){
code_shown=false;
$('div.input').hide()
});
</script>
<form action="javascript:code_toggle()"><input type="submit" id="toggleButton" value="Show Code"></form>''')
Out[1]:
In [2]:
from collections import defaultdict
from datetime import *
import numpy as np
import numpy
import os
import csv
import xlrd
import pandas as pd
from highcharts import Highchart, Highstock
import psycopg2
from scipy.stats import *

pd.set_option('display.float_format', lambda x: '%.8f' % x)
pd.set_option('display.max_columns',1000)
pd.set_option('display.max_rows',1000)
pd.options.mode.chained_assignment = None  # default='warn'

Estimating the ‘costs’ of financial innovation: the case of high frequency trading and the cost of capital

   In modern economies, how well financial markets perform their critical functions of providing liquidity to facilitate hedging, diversification and efficient price discovery affects every individual’s financial well-being. For example, a major fraction of all retirement savings is invested in global stock markets either directly or indirectly. Job growth, incomes, and therefore the standard of living depend on corporate investment, the financing of which depends critically on well-functioning financial markets. Recent technological advancements and new market regulations have substantially altered how trading occurs on financial markets and how markets perform their functions. Arguably, no period in history has witnessed changes in financial markets as substantial and rapid as the past decade and a half. Today’s financial markets are more complex than ever, with this complexity raising a plethora of poorly understood issues and concerns for policymakers. In the EU, the introduction of the Markets in Financial Instruments Directive (MiFID) and advancements in technology have combined to unleash a dramatic transformation of capital markets. New high-tech trading venues have captured significant market share at the expense of traditional, transparent trading places, raising concerns about a lack of transparency in financial markets. Algorithms, rather than humans, now execute the majority of trades in financial markets, with a subset of algorithmic traders (AT), the so-called high frequency traders (HFTs), investing considerable resources to shave microseconds off the time it takes them to access markets. This investment raises concerns about a socially costly “arms race” with negative externalities imposed on less sophisticated market participants, and a highly un-level playing field.
   The most obvious impact of technological innovations in financial markets in recent times is the speed of order execution, driven by high frequency trading (HFT), and perhaps the most significant driver of growth in the real economy is the cost of capital. Therefore, an investigation of the impact of HFT on the cost of capital holds economic significance, especially since the effects of HFT on the cost of capital are unclear (from the existing literature) because of opposing effects. This study addresses this gap in the literature. The direct impact of high frequency trading (HFT) on the cost of capital remains an unanswered question in the literature. Malceniece et al. (2018) argue that HFT has two opposing effects on the cost of capital. Specifically, on the one hand, it improves liquidity, and therefore lowers the cost of capital, while on the other it increases co-movement in returns and liquidity, implying an increase in systematic risk, thereby increasing the cost of capital. This study investigates which of these effects dominate using data from 12 European markets.

Data

   The need to deploy the staggered entry of Chi-X into European markets as an instrumental variable dictates our data period, which spans the period from February 1 2007 and February 27 2009. This period spans two months prior to the first European entry of Chi-X – in Germany and the Netherlands – and two months following the entry into Spain. During the two-year period, Chi-X started facilitating the execution of equity orders in 13 European countries. These are Austria, Belgium, Denmark, France, Finland, Germany, Italy, the Netherlands, Norway, Spain, Sweden, Switzerland, and the United Kingdom (UK). Stocks from all these countries, with the exception of Switzerland, are included in our sample; this is because of data imperfection issues.
   The sample period we employ falls on the global financial crisis period; however, the difference-in-differences estimation approach we employ (see below) excludes its effects by eliminating time series variations occurring for reasons not due to HFT activity. The final sample contains 1,311 stocks from 12 countries and 674,307 stock-day observations.
   For our analysis, we require high frequency intraday trading data and firm level data at lower frequencies. For the intraday data, we obtain transactions and quotes data from the Thomson Reuters Tick History (TRTH) database, managed by Securities Industry Research Centre of Asia-Pacific (SIRCA) and from the Market Quality Dashboard (MQD) managed by the Capital Markets Cooperative Research Centre (CMCRC), Sydney. The combined dataset is aggregated at hourly intervals to obtain values on all the best bid and ask quotes at the end of each hour during the trading day, the number of transactions for each hour, the hourly traded volume and the volume-weighted average price for all transactions recorded for each hour. We also obtain the number of all electronic messages recorded for each hour; these include order submissions, cancellations and amendments, at or within the best prevailing quotes. For each stock, the above-stated trading data are obtained for the primary/listing exchange, Chi-X (in the case of stocks traded on Chi-X), and for all the other trading venues, including multilateral trading facilities (MTFs), where the stock is traded. Using the transactions and quotes data from all the exchanges and MTFs where each stock is traded, we build a consolidated order book and a record of all trading activity occurring in a stock during the sample period. In order to avoid consolidating across inconsistent times across countries, we include data for only the period from 08:00hrs – 16:30hrs Greenwich Mean Time (GMT). We exclude weekends, national holidays and all exchanges in time zones three hours or more ahead or behind GMT. Transactions and quotes at more than 20% away from the listing exchange’s equivalent price in Euros are also excluded. Currency values are converted into Euros using the corresponding exchange rates for the relevant time period periods. Finally, we divide the stocks into quintiles by Euro trading volume by country and then aggregate across countries.

Key variables and descriptive statistics

In this section, we define the measures we employ in our regression frameworks and discuss their descriptive statistics.

High frequency trading activity and market fragmentation metrics
We estimate HFT for each stock-day by using two measures. The first is the number of messages divided by the number of transactions, while the second is the negative trading volume divided by the number of quote messages and then scaled by €’00:

$$HFTtransactions_{s,t} = \frac{messages_{s,t}}{transactions_{s,t}}\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(1)$$


$$HFTEurVol_{s,t} = \frac{-EurVol_{s,t}}{100messages_{s,t}}\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(2)$$

where $messages_{s,t}$ is the number of electronic messages (quotes, cancellations, etc.) in stock s on day t, $transactions_{s,t}$ is the number of transactions in stock s on day t and $EurVol_{s,t}$ is the Euro trading volume in stock s on day t.

We employ four metrics to proxy market fragmentation. The first, $FRAG1_{s,t}$, is the number of venues where a stock s is traded on day t. The identifying assumption here is that the number of trading venues impacts the characteristics of individual assets only through its impact on fragmentation (see Haslag and Ringgenberg, 2015). The second, $FRAG2_{s,t}$, is the proportion of the off-listing exchange trading volume for stock s on day t. The third, $FRAG3_{s,t}$, and fourth, $FRAG4_{s,t}$, are based on the Herfindahl-Hirschmann Index (HHI) and are computed as follows:

$$FRAG_{s,t} = 1- \sum_{m}(\frac{TA_{s,m,t}}{\sum_{m} TA_{s,m,t}})^2\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(3)$$

where s, m and t correspond to stock s, market m and day t respectively. $TA_{s,m,t}$ equals either volume ($FRAG3_{s,t}$) or transactions ($FRAG4_{s,t}$) of stock s, in market m on day t. The results obtained based on all the fragmentation proxies are qualitatively similar. The baseline regressions results presented are based on ($FRAG3_{s,t}$).

In [3]:
from datetime import datetime
from highcharts import Highchart
H = Highchart()

from datetime import datetime
from highcharts import Highchart
H = Highchart()

Full_Sample = [
    [datetime(2007, 2, 1), 8.7],
    [datetime(2007, 3, 1), 9.2],
    [datetime(2007, 4, 1), 9.2],
    [datetime(2007, 5, 1), 9.3],
    [datetime(2007, 6, 1), 9.4],
    [datetime(2007, 7, 1), 9.4],
    [datetime(2007, 8, 1), 9.9],
    [datetime(2007, 9, 1), 9.9],
    [datetime(2007, 10, 1), 9.7],
    [datetime(2007, 11, 1), 10.6],
    [datetime(2007, 12, 1), 10.7],
    [datetime(2008, 1, 1), 10.7],
    [datetime(2008, 2, 1), 11.4],
    [datetime(2008, 3, 1), 11.8],
    [datetime(2008, 4, 1), 12.2],
    [datetime(2008, 5, 1), 12.4],
    [datetime(2008, 6, 1), 13.6],
    [datetime(2008, 7, 1), 14.2],
    [datetime(2008, 8, 1), 13.9],
    [datetime(2008, 9, 1), 13.8],
    [datetime(2008, 10, 1), 16.1],
    [datetime(2008, 11, 1), 17.5],
    [datetime(2008, 12, 1), 16.9],
    [datetime(2009, 1, 1), 17.0],
    [datetime(2009, 2, 1), 19.5]
]

Quintile1 = [
    [datetime(2007, 2, 1), 9.236285131],
    [datetime(2007, 3, 1), 10.10784795],
    [datetime(2007, 4, 1), 9.586078902],
    [datetime(2007, 5, 1), 9.493179652],
    [datetime(2007, 6, 1), 9.865428832],
    [datetime(2007, 7, 1), 9.976872382],
    [datetime(2007, 8, 1), 10.20308561],
    [datetime(2007, 9, 1), 10.33742522],
    [datetime(2007, 10, 1), 10.31812286],
    [datetime(2007, 11, 1), 11.34034894],
    [datetime(2007, 12, 1), 11.05143735],
    [datetime(2008, 1, 1), 11.44953052],
    [datetime(2008, 2, 1), 11.9845295],
    [datetime(2008, 3, 1), 11.75776585],
    [datetime(2008, 4, 1), 10.84447939],
    [datetime(2008, 5, 1), 10.16898766],
    [datetime(2008, 6, 1), 10.8789796],
    [datetime(2008, 7, 1), 11.32857203],
    [datetime(2008, 8, 1), 10.88640924],
    [datetime(2008, 9, 1), 10.75744457],
    [datetime(2008, 10, 1), 11.56638015],
    [datetime(2008, 11, 1), 12.59725836],
    [datetime(2008, 12, 1), 11.81371656],
    [datetime(2009, 1, 1), 12.37960063],
    [datetime(2009, 2, 1), 13.19474578]
]

Quintile2 = [
    [datetime(2007, 2, 1), 8.14549913],
    [datetime(2007, 3, 1), 8.571907555],
    [datetime(2007, 4, 1), 8.775208207],
    [datetime(2007, 5, 1), 9.119393865],
    [datetime(2007, 6, 1), 9.171245199],
    [datetime(2007, 7, 1), 9.282956454],
    [datetime(2007, 8, 1), 9.817698393],
    [datetime(2007, 9, 1), 10.29608522],
    [datetime(2007, 10, 1), 10.10937134],
    [datetime(2007, 11, 1), 10.98298787],
    [datetime(2007, 12, 1), 10.61163051],
    [datetime(2008, 1, 1), 10.31328142],
    [datetime(2008, 2, 1), 10.75034123],
    [datetime(2008, 3, 1), 11.4057605],
    [datetime(2008, 4, 1), 13.70523678],
    [datetime(2008, 5, 1), 14.48934113],
    [datetime(2008, 6, 1), 16.00088858],
    [datetime(2008, 7, 1), 17.36053434],
    [datetime(2008, 8, 1), 16.78431705],
    [datetime(2008, 9, 1), 13.99146986],
    [datetime(2008, 10, 1), 14.95979855],
    [datetime(2008, 11, 1), 16.06188121],
    [datetime(2008, 12, 1), 14.74033551],
    [datetime(2009, 1, 1), 14.77632295],
    [datetime(2009, 2, 1), 17.42950704]
]

Quintile3 = [
[datetime(2007,2,1),9.399545842],
[datetime(2007,3,1),9.973154925],
[datetime(2007,4,1),10.06232739],
[datetime(2007,5,1),9.955840366],
[datetime(2007,6,1),9.949101529],
[datetime(2007,7,1),9.842139369],
[datetime(2007,8,1),10.29905774],
[datetime(2007,9,1),10.27868443],
[datetime(2007,10,1),10.21605027],
[datetime(2007,11,1),11.26677764],
[datetime(2007,12,1),11.78159815],
[datetime(2008,1,1),11.5830272],
[datetime(2008,2,1),12.86264105],
[datetime(2008,3,1),13.22407829],
[datetime(2008,4,1),13.56562926],
[datetime(2008,5,1),14.29371166],
[datetime(2008,6,1),16.00203332],
[datetime(2008,7,1),17.04362598],
[datetime(2008,8,1),16.52607733],
[datetime(2008,9,1),15.01646627],
[datetime(2008,10,1),16.9906265],
[datetime(2008,11,1),17.08138902],
[datetime(2008,12,1),16.55471777],
[datetime(2009,1,1),17.2705261],
[datetime(2009,2,1),20.96406816]

]

Quintile4 = [
[datetime(2007,2,1),8.062490785],
[datetime(2007,3,1),8.23889434],
[datetime(2007,4,1),8.285558263],
[datetime(2007,5,1),8.478205045],
[datetime(2007,6,1),8.467585534],
[datetime(2007,7,1),8.478759316],
[datetime(2007,8,1),9.125775794],
[datetime(2007,9,1),8.71898677],
[datetime(2007,10,1),8.617628942],
[datetime(2007,11,1),9.820113928],
[datetime(2007,12,1),10.07253244],
[datetime(2008,1,1),10.10306272],
[datetime(2008,2,1),10.805531],
[datetime(2008,3,1),11.04841359],
[datetime(2008,4,1),11.00997587],
[datetime(2008,5,1),11.19670207],
[datetime(2008,6,1),12.37966625],
[datetime(2008,7,1),12.37018356],
[datetime(2008,8,1),12.55758064],
[datetime(2008,9,1),13.40937251],
[datetime(2008,10,1),16.27378177],
[datetime(2008,11,1),17.92214437],
[datetime(2008,12,1),17.78328952],
[datetime(2009,1,1),17.46937877],
[datetime(2009,2,1),21.32969173]

]

Quintile5 = [
[datetime(2007,2,1),9.011353641],
[datetime(2007,3,1),9.294288317],
[datetime(2007,4,1),9.290703516],
[datetime(2007,5,1),9.709170341],
[datetime(2007,6,1),9.971633942],
[datetime(2007,7,1),9.637055058],
[datetime(2007,8,1),10.20386126],
[datetime(2007,9,1),9.649545648],
[datetime(2007,10,1),9.183622729],
[datetime(2007,11,1),9.834834895],
[datetime(2007,12,1),10.11936758],
[datetime(2008,1,1),10.08754327],
[datetime(2008,2,1),10.85456422],
[datetime(2008,3,1),11.69219307],
[datetime(2008,4,1),11.94331729],
[datetime(2008,5,1),11.77537586],
[datetime(2008,6,1),12.58703171],
[datetime(2008,7,1),12.9517435],
[datetime(2008,8,1),13.11951206],
[datetime(2008,9,1),15.73475335],
[datetime(2008,10,1),20.35922007],
[datetime(2008,11,1),23.80734459],
[datetime(2008,12,1),23.86057228],
[datetime(2009,1,1),23.38468767],
[datetime(2009,2,1),24.59301519]

]



H.add_data_set(Full_Sample, series_type="spline", name="Full_Sample")
H.add_data_set(Quintile1 , series_type="spline", name="Q1")
H.add_data_set(Quintile2 , series_type="spline", name="Q2")
H.add_data_set(Quintile3 , series_type="spline", name="Q3")
H.add_data_set(Quintile4 , series_type="spline", name="Q4")
H.add_data_set(Quintile5 , series_type="spline", name="Q5")



H.set_options('chart', {
    'type': 'spline'
})

H.set_options('chart', {
    'width': '980'
})

H.set_options('xAxis', {
    'type': 'datetime',
    'dateTimeLabelFormats': { # don't display the dummy year
        'month': ' %b. %Y',
        'year': '%b'
    },
    'title': {
        'text': 'Date'
    }
})

H.set_options('yAxis', {
    'title': {
        'text': 'HFTtransactions'
    },
    'min': 0
})

H.set_options('title', {
    'text': "Figure 1. Evolution of high frequency trading"
})



H.set_options('tooltip', {
    'headerFormat': '<b>{series.name}</b><br>',
    'pointFormat': '{point.x:%e. %b}: {point.y:.2f} m'
})

H.set_options('plotOptions', {
    'spline': {
        'marker': {
            'enabled': True
        }
    }
})

H
Out[3]:
In [4]:
import csv
def read_csv(filename, category_column):
    series = {}
    with open(filename, 'r') as fh:
        reader = csv.DictReader(fh, delimiter=',')
        for row in reader:
            for column in row:
                if column != category_column:
                    if column not in series:
                        series[column] = []
                    if row[column]:
                        series[column].append([row[category_column], float(row[column])])
    return series
In [5]:
def display_results(unit):
    with open('Table1PanelA.csv', encoding="utf8", errors='ignore') as input_file:
        reader = csv.reader(input_file)
        results = []

        count = 0
        for row in reader:
            count += 1
            if count > 100:
                break
            results.append([])
            for column in range(0,13):
                results[count - 1].append(row[column])
    html = '<table style="width:95%; margin-left:3%">'
    for row_count, row in enumerate(results):
        if row_count > 100:
            break
        # add border
        if row_count in [0]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'

        elif row_count in [1]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'
        elif row_count in [2]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'           
        for column_count, column in enumerate(row):
            if row_count in [0] and column_count in [0]:
                html +='<td colspan="' + str(unit) + '" style="text-align: left"+> '
            elif row_count in [0]:
                #html +='<b>' + str(column) + '</b>'
                pass
            elif column_count in [0]:
                html += '<td style="text-align: left">'
            else:
               html += '<td>'
            # add content and finish this column

            if row_count == 1:
                html += '<b>' +str(column)+ '</b>'
            elif row_count == 0:
                html += '<b>' +str(column)+ '</b>'
            elif row_count in [2]:
                html += '<b>' +str(column)+ '</b>'    
            else :
                html += str(column)
            html += '</td>'
        html += '</tr>'
    html += '</table>'
    display(HTML(html))

display_results(13)
Table 1. Descriptive Statistics
Panel A
VariablesMeanSt.dvMean (Q1)St.dv (Q1)Mean (Q2)St.dv (Q2)Mean (Q3)St.dv (Q3)Mean (Q4)St.dv (Q4)Mean (Q5)St.dv (Q5)
WACC (%)8.1633.9276.9417.3667.9032.1438.4922.2738.9412.2648.4382.528
ROIC (%)11.49811.50410.7919.68811.83811.77611.08812.86712.92311.83910.78210.696
CoE (%)-1.9231.178-0.5982.601-1.9230.146-1.8760.143-2.6120.133-2.4330.081
Market Cap ('000,000)11373.9833500.3863557.41527156.7961826.6153620.2163799.410387.3615587.7277386.11336899.41857415.037
HFTEurVol-10.4136.367-7.1096.612-9.4986.3-9.8836.088-12.1025.844-13.8565.199
HFTtransactions12.33312.60210.87612.10712.43413.46313.30213.49911.74910.11113.27113.439
FRAG13.5223.3941.1470.9871.8861.2193.1242.2024.0992.5387.4124.446
FRAG20.0840.2080.0560.1910.070.2050.0820.2110.0850.1990.1220.201
FRAG30.0560.0930.0080.0440.040.080.0550.0860.06790.0930.1110.114
FRAG40.0150.0180.0050.0090.0130.0180.0160.0180.0180.0180.0250.017
Volatility (bps)60.44345.19854.48652.36860.10344.77964.87643.44463.55841.88859.39941.789
Relative Spread (bps)38.85627.29568.10717.60158.87919.35435.16520.55820.76914.34511.9288.695
lnVolume13.9261.83711.2640.66913.1061.32214.6891.10515.3280.79815.5050.567
LIQ (bps)2.4325.7037.3238.8863.5565.9080.9272.9330.2671.4360.1451.189
In [6]:
def display_results(unit):
    with open('Table1PanelB.csv', encoding="utf8", errors='ignore') as input_file:
        reader = csv.reader(input_file)
        results = []

        count = 0
        for row in reader:
            count += 1
            if count > 100:
                break
            results.append([])
            for column in range(0,7):
                results[count - 1].append(row[column])
    html = '<table style="width:95%; margin-left:3%">'
    for row_count, row in enumerate(results):
        if row_count > 100:
            break
        # add border
        if row_count in [0]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'

        elif row_count in [1]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'        
        for column_count, column in enumerate(row):
            if row_count in [0] and column_count in [0]:
                html +='<td colspan="' + str(unit) + '" style="text-align: left"+> '
            elif row_count in [0]:
                #html +='<b>' + str(column) + '</b>'
                pass
            elif column_count in [0]:
                html += '<td style="text-align: left">'
            else:
               html += '<td>'
            # add content and finish this column

            if row_count == 1:
                html += '<b>' +str(column)+ '</b>'
            elif row_count == 0:
                html += '<b>' +str(column)+ '</b>'    
            else :
                html += str(column)
            html += '</td>'
        html += '</tr>'
    html += '</table>'
    display(HTML(html))

display_results(7)
Panel B
CountriesMean (CoE %)St.dev (CoE %)Mean (ROIC %)St.dev (ROIC %)Mean (WACC %)St.dev (WACC %)
Austria-0.7814.7218.6417.8437.6352.144
Belgium0.3860.88317.19321.4327.6532.312
Denmark-4.8050.87410.64810.7397.7572.301
Finland-2.7440.08814.9412.1868.1831.866
France1.0890.6569.3889.9329.1562.259
Germany-2.6230.08310.51312.0368.9572.372
Italy-2.8190.0498.4948.917.4082.164
Netherlands-1.4990.14812.33210.8588.4651.756
Norway-5.6271.0549.76910.2637.3039.147
Spain-1.5690.05310.3113.9748.7842.81
Sweden-3.1020.11214.77611.0948.5372.113
UK-1.5490.34614.40310.1179.0492.268

   The mean and standard deviation estimates for the HFT and fragmentation proxies for the aggregate market are presented in Table 1. The average $HFTtransactions_{s,t}$ estimate for all stocks in the sample is 12.30, with a standard deviation of 12.60, suggesting a wide dispersion about the mean in the level of HFT activity across stocks. The lowest volume stocks (Quintile 1) have the lowest level of HFT activity by this measure. However, Euro volume activity, on which the quintiles classification is based, is not necessarily an indicator of HFT activity. The highest average estimate of $HFTtransactions_{s,t}$ of 13.29 is for Quintile 3 stocks. It should however be noted that there is also a high level of dispersion among those stocks with a standard deviation of 13.46. Figure 1 also shows that while Quintile 3 stocks, which are generally the mid-weight stocks, have high level of HFT activity relative to the other quintiles for much of the time series, in the final months of our sample, Quintiles 4 and 5 stocks start to dominate the $HFTtransactions_{s,t}$ metric. Since, its computation is based on Euro volume, the trend for $HFTEurVol_{s,t}$ is not consistent with that of $HFTtransactions_{s,t}$ and more in line with the quintiles classification. Estimates indicate that HFT activity based on Euro volume is higher for larger stocks. The highest volume stocks’ (Quintile 5) mean value is almost twice that of the lowest trading ones.
   The fragmentation estimates indicate that the larger stocks are more likely to be traded in more venues. For example, the mean $FRAG3_{s,t}$ estimate for Quintile 5 stocks is about 11 times the value of that of the Quintile 1 stocks and almost twice the full sample’s mean estimate.

Cost of Capital Metrics
   We employ a number of cost of capital proxies, which can be divided into two broad categories. The first is a set of measures popular with practitioners; they are based on the quintessential beta metric. We employ two beta-based cost of capital metrics. The first one is computed directly from TRTH data accessed through the MQD. We estimate monthly beta by computing the following 30-minute frequency regression with a time-span of two months for each monthly beta estimate:

$$r_{s,t} = \alpha_{s} + \beta_{s}r_{mkt,t} + \epsilon_{i,s},\;\;\; \epsilon_{i,s}\sim iid(0,\sigma^2)\;\;\;\;\;\;\;\;\;\;(4)$$

where $r_{s,t}$ is the return on stock s at time t, $r_{mkt,t}$ is the market return at time t. The resultant slope coefficient, $\beta_{s}$, is the beta estimate for stock s, and is computed for each month; t equals 30 minutes. The estimated beta values, along with the risk free rate and equity risk premium are used to estimate the cost of equity for each one-month ahead, t, as follows:

$$CoE_{s,t} = RF_{t} + \beta_{s,t}ERP_{t}\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(5)$$

where $CoE_{s,t}$ is the cost of equity capital (COE) or the expected rate of return for stock s in month t, $RF_{t}$ is the average risk free rate for month t, $\beta_{s,t}$ is the monthly beta for stock s as computed in Equation (4) and $ERP_{t}$ is the equity risk premium for month t. The second beta-based cost of capital measure we use is a proprietary Bloomberg-estimated proxy, the weighted average cost of capital $(WACC)$, acquired directly from the Bloomberg Terminal database. We also use a second Bloomberg estimated metric, which is not beta-dependent; this is the return on invested capital $(ROIC)$. $ROIC$ is an ex-post measure and thus, is not a return on capital demanded by investors. However, given that it is a measure of how efficiently a firm allocates its capital for value creation, it is a measure that holds significance for investors. Thus, it is highly correlated with the cost of capital from an investor’s perspective. For example, a 2016 McKinsey report (see Jiang and Koller, 2006), analysing the $ROIC$ histories of about 7000 publicly listed non-financial US firms from 1963 to 2004 shows that the average US firm returns its cost of capital as $ROIC$ over time, with a largely stable median $ROIC$ over the sample period. The stable median $ROIC$ is consistent with firm activities driving a balance between investment and consumption.

In [7]:
from datetime import datetime
from highcharts import Highchart
H = Highchart()

from datetime import datetime
from highcharts import Highchart
H = Highchart()

WACC = [
    [datetime(2007, 3, 1), 8.745231345],
    [datetime(2007, 6, 1), 8.601621397],
    [datetime(2007, 9, 1), 8.556714429],
    [datetime(2007, 12, 1), 8.533514672],
    [datetime(2008, 3, 1), 8.314663121],
    [datetime(2008, 6, 1), 8.297210719],
    [datetime(2008, 9, 1), 8.558782353],
    [datetime(2008, 12, 1), 7.013183763],
    [datetime(2009, 2, 1), 7.081648913]
]


ROIC = [
    [datetime(2007, 3, 1), 13.36523459],
    [datetime(2007, 6, 1), 13.22366898],
    [datetime(2007, 9, 1), 13.08639438],
    [datetime(2007, 12, 1), 12.78028996],
    [datetime(2008, 3, 1), 12.53578416],
    [datetime(2008, 6, 1), 12.10339241],
    [datetime(2008, 9, 1), 11.32512465],
    [datetime(2008, 12, 1), 9.396096534],
    [datetime(2009, 2, 1), 8.255344265]
]




H.add_data_set(WACC, series_type="spline", name="WACC")
H.add_data_set(ROIC , series_type="spline", name="ROIC")



H.set_options('chart', {
    'type': 'spline'
})

H.set_options('chart', {
    'width': '980'
})


H.set_options('xAxis', {
    'type': 'datetime',
    'dateTimeLabelFormats': { # don't display the dummy year
        'month': ' %b. %Y',
        'year': '%b'
    },
    'title': {
        'text': 'Date'
    }
})

H.set_options('yAxis', {
    'title': {
        'text': '%'
    },
    'min': 0
})

H.set_options('title', {
    'text': "Figure 2. Cost of Capital"
})



H.set_options('tooltip', {
    'headerFormat': '<b>{series.name}</b><br>',
    'pointFormat': '{point.x:%e. %b}: {point.y:.2f} m'
})

H.set_options('plotOptions', {
    'spline': {
        'marker': {
            'enabled': True
        }
    }
})

H
Out[7]:

The mean and standard deviation estimates for the cost of capital proxies can be seen in Table 1. Consistent with the general downward market turn prevalent during our sample period, the expected rate of return, $CoE_{s,t}$, is generally negative for the full sample and across all quintiles and countries (see Panel B). $CoE_{s,t}$ as estimated largely accounts for only the impact of systematic risk, and may not incorporate other factors driving the cost of capital. Both $WACC_{s,t}$ and $ROIC_{s,t}$ incorporate other factors; their estimates appear robust despite the market conditions. However, we note that the mean $ROIC$ estimate (11.49%) is slightly lower than the median of 12.2% reported for US stocks over the 1995 – 2004 period by Jiang and Koller (2006). Furthermore, in line with the observation in Jiang and Koller (2006), $ROIC_{s,t}$ is generally larger than $WACC_{s,t}$ and $WACC_{s,t}$ appears to track $ROIC_{s,t}$ (See Figure 2).

Liquidity Metrics
   We also compute two liquidity proxies for interchangeable inclusion in the difference-in-differences models we estimate. Firstly, the relative spread is computed as follows:

$$RelativeSpread_{s,t} = \sum_{h=1}^{H}(\frac{1}{H}10000\frac{Ask_{s,t,h}-Bid_{s,t,h}}{Ask_{s,t,h}+Bid_{s,t,h}})\;\;\;(6)$$

where $Ask_{s,t,h}$ and $Bid_{s,t,h}$ correspond to the ask and bid quotes at the end of hour h for stock s on day t. Secondly, we compute an inverted version of the Amihud’s (2002) price impact ratio as a measure of liquidity; the inversion converts the original metric to a measure of liquidity rather than illiquidity:

$$LIQ_{s,t} = -log(1+\sum_{h=1}^{H}(\frac{1}{H}\frac{\mid r_{s,t,h} \mid}{vol_{s,t,h}}))\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(7)$$

where $r_{s,t,h}$ is the mid-quote return for stock s, during hour h on day t in bps and $vol_{s,t,h}$ is the aggregate volume in Euros scaled by 1,000 for stock s, during hour h on day t.

   Descriptive statistics for both metrics are presented in Table 1. Consistent with the literature (see as an example Barclay and Hendershott, 2003) the estimates show that the larger volume stocks are more liquid; this is linked to the fact that larger volumes are traded in larger stocks.

Assessing the impact of HFT on the cost of capital

   The possible endogenous determination of HFT, which has developed hand in hand with market fragmentation, with the cost of capital needs to be accounted for in the analysis to determine the effects of HFT on the cost of capital. Therefore, following, Malceniece et al. (2018), we exploit the staggered introduction of Chi-X in European markets as an instrument for HFT and then control for market fragmentation in our framework. Firstly, we address the relevance of the Chi-X’s introduction as an instrument by estimating the following LS panel regression at daily frequency:

$$Q_{i,t} = \alpha_{s} + \beta_{t} + \gamma ChiX_{s,t} +\epsilon_{s,t}\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;(8)$$

where $\alpha_{s}$ and $\beta_{t}$ are stock and time fixed effects, $Q_{i,t}$ corresponds to one of two HFT metrics, one of four market fragmentation metrics, $Volatility_{s,t}$ (standard deviation of intraday returns), $Relative Spread_{s,t}$, $lnvolume_{s,t}$ or the inverted Amihud (2002) price impact ratio, $LIQ_{s,t}$. $ChiX_{s,t}$ is a dummy variable taking the value of one if a stock trades on Chi-X on day t and zero otherwise.

In [8]:
def display_results(unit):
    with open('Table2.csv', encoding="utf8", errors='ignore') as input_file:
        reader = csv.reader(input_file)
        results = []

        count = 0
        for row in reader:
            count += 1
            if count > 100:
                break
            results.append([])
            for column in range(0,8):
                results[count - 1].append(row[column])
    html = '<table style="width:95%; margin-left:3%">'
    for row_count, row in enumerate(results):
        if row_count > 100:
            break
        # add border
        if row_count in [0]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'

        elif row_count in [1]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'         
        for column_count, column in enumerate(row):
            if row_count in [0] and column_count in [0]:
                html +='<td colspan="' + str(unit) + '" style="text-align: left"+> '
            elif row_count in [0]:
                #html +='<b>' + str(column) + '</b>'
                pass
            elif column_count in [0]:
                html += '<td style="text-align: left">'
            else:
               html += '<td>'
            # add content and finish this column

            if row_count == 1:
                html += '<b>' +str(column)+ '</b>' 
            elif row_count == 0:
                html += '<b>' +str(column)+ '</b>' 
            else :
                html += str(column)
            html += '</td>'
        html += '</tr>'
    html += '</table>'
    display(HTML(html))

display_results(8)
Table 2. First-stage regressions of the impact of Chi-X on HFT and other variables
HFTEurVolHFTtransactionsFRAG3VolatilityRelative SpreadlnVolumeLIQ
Full1.785***3.201***0.011***5.753***-3.044***0.232***-1.588***
[87.303][76.033][215.294][34.337][-51.058][69.512][-74.303]
Q1-1.649***10.837***0.003***7.272***-2.897***0.209***-0.185
[-8.059][29.786][11.353][4.258][-5.434][9.657][-0.632]
Q21.992***7.333***0.005***-0.947**-10.623***0.403***-1.623***
[33.2][56.028][39.483][-2.030][-54.827][32.963][-25.060]
Q32.248***4.228***0.006***0.573-3.653***0.171***-0.467***
[53.452][44.243][59.359][1.619][-24.163][20.733][-16.391]
Q41.912***0.320***0.007***1.647***-0.665***0.028***-0.024*
[57.487][4.735][75.569][5.685][-6.866][5.586][-1.886]
Q5-0.583***2.311***0.008***-1.087***0.636***-0.012***0.007
[-19.297][31.977][84.783][-4.029][10.317][-3.109][0.744]

   In Table 2, we report the estimates obtained from Equation (8). The positive and statistically significant (at 0.01 level) estimates for $HFTEurVol_{s,t}$ (1.79) and $HFTtransactions_{s,t}$ (3.20) suggest that the entrance of Chi-X in the markets included in our sample is linked with the rise of HFT activity. The estimates for the quintiles are also all statistically significant, but are not consistently positive. In the full sample, the 1.79 increase in $HFTEurVol_{s,t}$ implies a reduction of €179 being less traded per message. This estimate translates into about 17% of the average volume traded per message during the sample period, thus suggesting a significant drop in the volume of traded for each message following the entrance of Chi-X into a European market. Conversely, increases of €165 and €58 in volume traded per message are recorded for the least traded and the highest traded stocks respectively. While the increase in the Quintile 5 stocks’ per message volume is negligible, accounting for just 4.18% of the average volume per message traded during the sample period, that of the least traded stocks is quite large at 23.37%. The increase in volume sizes per message could be linked to the reduced effect of Chi-X on the least traded stocks during our sample period. In certain large European markets, lower trading stocks are more likely to be traded in the so-called upstairs market, where the impact of fast trading is virtually non-existent. For example, Armitage and Ibikunle (2015) show that the least traded FTSE 350 stocks are more likely to be traded in the (upstairs) broker-dealer market of the London Stock Exchange. Between 55.1 – 62% of the traded volume of the least traded 100 stocks in that index are shown to be traded in the broker-dealer market. Due to certain market structure arrangements aimed at encouraging institutional trading (see Ibikunle, 2015), even the highest trading stocks trade a non-negligible proportion of their trading volume in the upstairs market. The highest trading 100 stocks are shown to trade between 21.8 and 41.7% of their trading volume in the upstairs market (Armitage and Ibikunle, 2015). Chi-X’s entry into European markets is also linked to a decrease in volume for the highest trading stocks, while trading volume increases for the lower trading stocks. Similarly, liquidity is seen to improve for most stocks following the entry of Chi-X into the European markets, the only exception being the largest trading stocks. The entry of Chi-X implies market fragmentation; hence, the entry is linked to an increase in market fragmentation for the full sample and for all the stock quintiles.
   We now investigate the impact of HFT on the cost of capital using a range of cost of capital proxies. We estimate a series of stock-day panel regressions using 2SLS instrumental variable (IV) regressions in the spirit of Malceniece et al. (2018) and Hendershott et al. (2011). The first stage regressions are of the following form, estimated at daily intervals:

$$HFT_{s,t} = \alpha_{s} + \beta_{t} + \gamma ChiX_{s,t} +\sum_{k=1}^{6}\delta_{k}C_{k,s,t}+\epsilon_{s,t}\;\;\;\;\;\;\;\;(9)$$

The fitted values of $HFT_{s,t}$ are averaged across each month or quarter $\tau$, depending on the cost of capital proxy, in order to match the frequency of the proxies. The averages are then used in the second stage regressions as follows:

$$CoC_{s,\tau} = \alpha_{s} + \beta_{\tau} + \gamma\hat{HFT_{s,\tau}}+\sum_{k=1}^{6}\delta_{k}C_{k,s,\tau}+\epsilon_{s,\tau}\;\;\;\;\;\;(10)$$

$HFT_{s,\tau}$ corresponds to a proxy for HFT activity, $CoC_{s,\tau}$ is a cost of capital proxy, $\alpha_{s}$ and $\beta_{\tau}$ are stock and time fixed effects and $ChiX_{i,t}$ is a dummy variable taking the value of one if a stock trades on Chi-X day t and zero otherwise. $C_{k,s,\tau}$ is a set of k control variables, which includes a fragmentation proxy, the log of trading volume, volatility proxy, a liquidity proxy, weighted average price and market cap.

In [9]:
def display_results(unit):
    with open('Table3PanelA.csv', encoding="utf8", errors='ignore') as input_file:
        reader = csv.reader(input_file)
        results = []

        count = 0
        for row in reader:
            count += 1
            if count > 100:
                break
            results.append([])
            for column in range(0,9):
                results[count - 1].append(row[column])
    html = '<table style="width:95%; margin-left:3%">'
    for row_count, row in enumerate(results):
        if row_count > 100:
            break
        # add border
        if row_count in [0]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'

        elif row_count in [1,3]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'         
        for column_count, column in enumerate(row):
            if row_count in [0,1] and column_count in [0]:
                html +='<td colspan="' + str(unit) + '" style="text-align: left"+> '
            elif row_count in [0,1]:
                #html +='<b>' + str(column) + '</b>'
                pass
            elif column_count in [0]:
                html += '<td style="text-align: left">'
            else:
               html += '<td>'
            # add content and finish this column

            if row_count == 1:
                html += '<b>' +str(column)+ '</b>' 
            elif row_count == 0:
                html += '<b>' +str(column)+ '</b>' 
            elif row_count == 3:
                html += '<b>' +str(column)+ '</b>' 
            else :
                html += str(column)
            html += '</td>'
        html += '</tr>'
    html += '</table>'
    display(HTML(html))

display_results(9)
Table 3. Second-stage regressions of the impact of HFT on the cost of capital
Panel A. The impact of HFT on CoE
HFTfittedFRAG3VolatilityRelative SpreadPricelnVolumeMarket CapR-squared
Full Sample-0.200**-0.013***-0.000***-0.000*0.000**0-0.000***0.5
[-2.488][-2.922][-9.135][-1.709][1.993] [-0.098][-3.569]
Q 1-0.003-0.036*-0.000***000.005**-0.000***0.127
[-1.394][-1.887][-3.626][-0.407][-0.342][2.553][-2.837]
Q 20.1-0.017-0.000***00.000*-0.001-0.000**0.568
[0.802][-1.607][-2.617][-0.165][1.93][-1.205][-2.461]
Q 30.07-0.020*-0.000***-0.000***0.000**-0.001-0.000***0.707
[0.625][-1.898][-4.381][-2.809][2.293][-0.802][-3.482]
Q 40.03-0.024**-0.000***00.000**0.00400.694
[0.284][-2.385][-5.059][0.037][2.376][1.47][-0.175]
Q 5-0.500***0.021**-0.000***-0.000***0.000***-0.003-0.000**0.67
[-4.818][2.465][-4.986][-2.999][3.292][-0.964][-2.418]
In [10]:
def display_results(unit):
    with open('Table3PanelB.csv', encoding="utf8", errors='ignore') as input_file:
        reader = csv.reader(input_file)
        results = []

        count = 0
        for row in reader:
            count += 1
            if count > 100:
                break
            results.append([])
            for column in range(0,9):
                results[count - 1].append(row[column])
    html = '<table style="width:95%; margin-left:3%">'
    for row_count, row in enumerate(results):
        if row_count > 100:
            break
        # add border
        if row_count in [0]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'

        elif row_count in [1]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'         
        for column_count, column in enumerate(row):
            if row_count in [0] and column_count in [0]:
                html +='<td colspan="' + str(unit) + '" style="text-align: left"+> '
            elif row_count in [0]:
                #html +='<b>' + str(column) + '</b>'
                pass
            elif column_count in [0]:
                html += '<td style="text-align: left">'
            else:
               html += '<td>'
            # add content and finish this column

            if row_count == 1:
                html += '<b>' +str(column)+ '</b>' 
            elif row_count == 0:
                html += '<b>' +str(column)+ '</b>'  
            else :
                html += str(column)
            html += '</td>'
        html += '</tr>'
    html += '</table>'
    display(HTML(html))

display_results(9)
Panel B. The impact of HFT on WACC
HFTfittedFRAG3VolatilityRelative SpreadPricelnVolumeMarket CapR-squared
Full Sample-47.001***-5.343***0.020***00.006***0.378***0.000***0.281
[-6.577][-5.344][6.919][0.016][3.424][4.8][9.458]
Q 125.9038.310*0.0040.084***-0.007***0.837**0.000***0.389
[0.514][1.843][0.581][3.243][-4.235][2.51][3.653]
Q 2-2.004-19.899***0.035***-0.028**0.018***-0.0380.000***0.253
[-0.131][-9.445][7.032][-2.024][2.939][-0.176][4.288]
Q 3-34.205***1.6670.0090.020*0.051***0.768***0.000***0.146
[-2.767][0.67][1.066][1.857][7.182][3.375][7.415]
Q 4-97.303***3.1050.048***0.023*0.013***1.048**0.000***0.143
[-7.001][1.18][5.365][1.682][2.999][2.062][10.717]
Q 5-31.002**-2.036-0.0040.010.016***-0.1790.000***0.189
[-2.514][-0.814][-0.581][0.528][4.052][-0.257][8.708]
In [11]:
def display_results(unit):
    with open('Table3PanelC.csv', encoding="utf8", errors='ignore') as input_file:
        reader = csv.reader(input_file)
        results = []

        count = 0
        for row in reader:
            count += 1
            if count > 100:
                break
            results.append([])
            for column in range(0,9):
                results[count - 1].append(row[column])
    html = '<table style="width:95%; margin-left:3%">'
    for row_count, row in enumerate(results):
        if row_count > 100:
            break
        # add border
        if row_count in [0]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'

        elif row_count in [1]:
            html += '<tr style="border-bottom: 2px solid black; border-top: 2px solid black;">'         
        for column_count, column in enumerate(row):
            if row_count in [0] and column_count in [0]:
                html +='<td colspan="' + str(unit) + '" style="text-align: left"+> '
            elif row_count in [0]:
                #html +='<b>' + str(column) + '</b>'
                pass
            elif column_count in [0]:
                html += '<td style="text-align: left">'
            else:
               html += '<td>'
            # add content and finish this column

            if row_count == 1:
                html += '<b>' +str(column)+ '</b>' 
            elif row_count == 0:
                html += '<b>' +str(column)+ '</b>'  
            else :
                html += str(column)
            html += '</td>'
        html += '</tr>'
    html += '</table>'
    display(HTML(html))

display_results(9)
Panel C. The impact of HFT on ROIC
HFTfittedFRAG3VolatilityRelative SpreadPricelnVolumeMarket CapR-squared
Full Sample-131.301***-7.086*-0.025**-0.088***-0.009-0.37100.331
[-2.591][-1.670][-2.023][-4.446][-1.089][-1.321][1.167]
Q 1-30.302-24.2760.019-0.222***-0.027**3.315**00.442
[-0.349][-1.479][0.904][-3.430][-2.426][2.056][-0.047]
Q 2-98.70360.949***-0.035-0.168***-0.029*-1.336*00.412
[-0.820][3.701][-1.362][-2.620][-1.661][-1.875][-1.014]
Q 3-266.104**-6.321-0.066*-0.117***0-0.40900.396
[-2.027][-0.779][-1.693][-3.039][0.003][-0.380][1.214]
Q 4-29.108-11.4220.045-0.129***0.043**1.8710.000**0.402
[-0.254][-1.116][1.454][-3.287][2.114][1.629][2.514]
Q 5-124.6084.198-0.087***-0.177***-0.0020.4790.000***0.465
[-1.321][0.572][-3.654][-3.906][-0.160][0.436][3.245]

   Table 3 shows the results of the second stage regression estimation. Three panels are presented corresponding to full sample and quintile-based estimates for three cost of capital proxies – $CoE_{s,t}$ (the expected rate of equity return), $WACC_{s,t}$ and $ROIC_{s,t}$. Panels A shows the estimates for monthly estimations with $CoE_{s,t}$ as the dependent variable. Focusing on the main variable of interest, $\hat{HFT_{s,\tau}}$, the estimated coefficient is statistically significant at 0.05 level for the full sample and at 0.01 level for the highest trading sample of stocks. In both cases, the estimates are negative, implying a reduction in the expected rate of return with corresponding increases in HFT activity. The 0.2 coefficient estimate for $\hat{HFT_{s,\tau}}$ implies that a one unit increase in HFT activity leads to a monthly 2bps fall in the required rate of return. This is a meaningful figure when compared to the generally low level rate of return on offer during the sample period. For example, the year-end annual return for FTSE 100 stocks in 2007 and 2008 are 2.1% and -30.9% respectively. The estimated impact of $\hat{HFT_{s,\tau}}$ on the largest stocks is on average 2.5 times larger than for the full sample at 0.5, implying a 5bps reduction in the required rate of return for the largest European stocks for every unit increase in HFT activity.
   In Panel B, which reports the estimates for the second stage regressions based on $WACC_{s,t}$ as the cost of capital proxy, the $\hat{HFT_{s,\tau}}$ estimates are even larger, implying a stronger downward impact when the cost of debt (including yields and banks’ interest rates) is factored into the overall cost of capital, as is usually the case in practice. The $\hat{HFT_{s,\tau}}$ coefficients are statically significant at 0.01 level for the full sample, Quintile 3 and Quintile 4 stocks; Quintile 5 stocks are significant at 0.05 level. The estimated coefficients for the full sample and Quintiles 3 – 5 are -47.00, -34.20, -97.30, and -31.00 respectively. These estimates suggest that the reduction in the cost of capital for one unit increase in HFT is 470bps for the full sample and 342bps, 973bps and 310bps for Quintiles 3, 4 and 5 respectively. The results based on $WACC_{s,t}$ are thus consistent with those from Panel A concerning the estimated effects of $\hat{HFT_{s,\tau}}$ on the cost of capital. The implication here is that while commonality in stock returns due to increased HFT activity may increase systematic risk and thus increase the cost of capital, it is not the dominating effect of HFT activity on the cost of capital. The liquidity effect of HFT activity appears larger than the systematic increase effect.
   Panel C reports the estimated coefficients from the second stage regression with $ROIC_{s,t}$ as the dependent variable. Unlike $CoE_{s,t}$ and $WACC_{s,t}$, $ROIC_{s,t}$ is not a beta-based metric, instead, it is computed from balance sheet figures. Therefore, the systematic risk effect of HFT should weigh less on estimations based on it. As a result, we expect the size of the estimated $\hat{HFT_{s,\tau}}$ coefficients to be larger. The estimated influence of HFT on $ROIC_{s,t}$ on the full sample of stocks and Quintile 3 stocks are statistically significant at 0.01 and 0.05 levels respectively. As expected, the estimated effects for the full sample and quintiles are generally larger than for the two previous panels. The negative $\hat{HFT_{s,\tau}}$ coefficient (-131.30) for the full sample implies that the aggregate impact of $\hat{HFT_{s,\tau}}$ on $ROIC_{s,t}$ and by extension the cost of capital is downward bearing. Hence, HFT activity drives down the cost of capital by some 1,313bps for every unit increase in trading activity. This result is consistent with those in Panels A and B. The implication here is that when all the factors affecting the cost of firm capital are considered in aggregate, all things being equal, the overall effect of HFT activity on the cost of capital is positive from a firm’s perspective. This would also imply that the liquidity effect of the increased trading activity outstrips the systematic risk effect. This view is underscored by the consistently negative and statistically significant effect of $Relative spread_{s,t}$ on $ROIC_{s,t}$ for the full sample of stocks and for all the stock quintiles in Panel C.
   The relationship between HFT activity and the cost of capital as seen in the results presented in Table 3 could be attributed to HFT activity driving changes in liquidity and co-movement in stock return and liquidity. Our starting position is that the links between the cost of capital and HFT occurs through HFT improving liquidity (Hendershott et al., 2011; Menkveld, 2013; Brogaard et al., 2014) on the one hand and driving co-movement in stock returns and liquidity, which fuels systematic risk, on the other (Malceniece et al., 2018). Systematic risk, as encapsulated by beta, has a tendency to increase the cost of capital, while stock liquidity decreases it (see Diamond and Verrecchia, 1991). The impact of liquidity on the cost of capital may explain why firms take corporate actions, such as stock splits, that have been shown to increase trading activity, enhance liquidity and reduce information asymmetry (Guo et al., 2008). The so-called ‘trading range’ or ‘liquidity’ hypothesis is based on stock splits being driven by, among other things, the desire to increase stock liquidity and lower transaction costs (see Lamoureux and Poon, 1987; Kryzanowski and Zhang, 1996). This suggests the link between transaction costs and liquidity (see Miller, 1965) as one channel through which HFT may affect the cost of capital. Thus, as liquidity improves for a firm’s stock, information asymmetry and transaction costs fall (see Chordia et al., 2011) along with its cost of capital. Gilson (1997) also shows that transaction costs may discourage favourable capital structure changes, such as pursuing an optimal leverage ratio. This reluctance has a direct effect on the overall cost of firm capital, since capital structure influences the cost of capital. Hence, decreasing transaction costs may lead to favourable capital restructuring and reduction in the cost of capital. Thus, if, as the above set of results suggest, the aggregate effect of HFT on the cost of capital is to reduce it, then the liquidity effect of HFT dominates the systematic risk effect ceteris paribus.

Conclusion

   In this study, we investigate the effects of one of the most prevalent consequences of technological innovations in financial markets, HFT, on the cost of capital. Critically, we find that, on aggregate, HFT is linked with reductions in the cost of capital. Although HFT increases commonality in stock returns and liquidity, which in turn increases systematic risk, it also improves stock level and market liquidity. Hence, while systematic risk puts an upward pressure on the cost of capital, liquidity improvements puts a downward pressure on it. Our results show that across a large sample of stocks, the liquidity enhancement effect dominates the systematic risk effect.
A full version of the paper is available for download.

References

Amihud, Y. (2002) Illiquidity and stock returns: cross-section and time-series effects. Journal of Financial Markets, 5(1), 31-56.

Armitage, S. & Ibikunle, G. (2015) Price Discovery in London's Upstairs Equity Market. Univeristy of Edinburgh Business School Working Paper. Edinburgh.

Barclay, M. J. & Hendershott, T. (2003) Price Discovery and Trading After Hours. The Review of Financial Studies, 16(4), 1041-1073.

Brogaard, J., Hendershott, T. & Riordan, R. (2014) High-Frequency Trading and Price Discovery. Review of Financial Studies, 27(8), 2267-2306

Chordia, T., Roll, R. & Subrahmanyam, A. (2011) Recent trends in trading activity and market quality. Journal of Financial Economics, 101(2), 243-263.

Diamond, D. W. & Verrecchia, R. E. (1991) Disclosure, Liquidity, and the Cost of Capital. The Journal of Finance, 46(4), 1325-1359.

Gilson, S. C. (1997) Transactions Costs and Capital Structure Choice: Evidence from Financially Distressed Firms. The Journal of Finance, 52(1), 161-196.

Guo, F., Zhou, K. & Cai, J. (2008) Stock splits, liquidity, and information asymmetry—An empirical study on Tokyo Stock Exchange. Journal of the Japanese and International Economies, 22(3), 417-438.

Haslag, P. H. & Ringgenberg, M. (2015) The Causal Impact of Market Fragmentation on Liquidity. Fourth Annual Conference on Financial Market Regulation at the Securities and Exchange Commission.

Hendershott, T., Jones, C. M. & Menkveld, A. J. (2011) Does Algorithmic Trading Improve Liquidity? The Journal of Finance, 66(1), 1-33.

Ibikunle, G. (2015) Opening and closing price efficiency: Do financial markets need the call auction? Journal of International Financial Markets, Institutions and Money, 34(0), 208-227.

Jiang, B. & Koller, T. M. (2006) Data focus: A long-term look at ROIC. McKinsey Quarterly. McKinsey & Company.

Kryzanowski, L. & Zhang, H. (1996) Trading patterns of small and large traders around stock split ex-dates. Journal of Financial Research, 19(1), 75-90.

Lamoureux, C. G. & Poon, P. (1987) The Market Reaction to Stock Splits. The Journal of Finance, 42(5), 1347-1370.

Malceniece, L., Malcenieks, K. & Putniņš, T. J. (2018) High frequency trading and co-movement in financial markets. Journal of Financial Economics Forthcoming.

Menkveld, A. J. (2013) High frequency trading and the new market makers. Journal of Financial Markets, 16(4), 712-740.

Miller, H. L. (1965) On "Liquidity" and "Transaction Costs". Southern Economic Journal, 32(1), 43-48.

In [ ]:
 
In [ ]:
 
In [ ]: