how do quotas affect price volatility?

18
How do Quotas Affect Price Volatility? A Simulation 1 How do Quotas Affect Price Volatility? A Simulation for Certificates of Entitlement Auctions in Singapore Introduction Singapore has implemented a vehicle quota system since 1990 to manage traffic congestion. Car buyers have to first obtain a vehicle quota license through an open auction system managed by a government agency. This license, also known as a Certificate of Entitlement (COE), gives the car owner “a right to vehicle ownership and use of the limited road space for 10 years” and can be (Singapore Land Transport Authority, 2014). The agency sets quotas for COEs and the price for COEs has varied greatly. In the past 3 years, the price has reached a low of $50,000 1 in January 2012 to a high of $80,000 in March 2013. Chu (2014) noted that the current formula of determining quotas for COEs results in “boom and bust cycles” in the quotas, which in turn causes COE prices to be volatile. Based on his research, he proposes a different way of allocating quotas to minimize price volatility in COE prices. This paper builds on Chu (2014)’s work, comparing his proposal against the current formula of determining quotas by simulating the COE auctions and comparing the results of the simulations. The auction system The Singapore Land Transport Authority (2014a, 2014b) details the auction system for COEs and the vehicle quota system (VQS) as a whole. The pertinent points for the simulation are summarized here. The VQS has five categories for vehicles, with COEs corresponding to each category. Chu (2014)’s proposals focused on cars with engine capacity 1,600cc and below (category A), cars with engine capacity 1,601 cc and above category B) and the open category, for any kind of vehicle (category E). There are separate auctions and quotas for each category. The quotas are determined and set every three months. The current formula consists of various factors including the number of vehicles taken off the road, the allowable growth in vehicle population and certain adjustments to account for issues such as past over-projections and changes in the taxi population. This information is available to the public. 1 All dollar figures in this paper are in Singapore Dollars. 1 British Pound is approximately 2 Singapore Dollars.

Upload: thoughtful-practice

Post on 08-Nov-2015

43 views

Category:

Documents


0 download

DESCRIPTION

This paper simulates how a proposal on the allocation of vehicle quotas might affect vehicle quota prices in Singapore.

TRANSCRIPT

  • How do Quotas Affect Price Volatility? A Simulation

    1

    How do Quotas Affect Price Volatility?

    A Simulation for Certificates of Entitlement Auctions in Singapore

    Introduction

    Singapore has implemented a vehicle quota system since 1990 to manage traffic congestion. Car

    buyers have to first obtain a vehicle quota license through an open auction system managed by a

    government agency. This license, also known as a Certificate of Entitlement (COE), gives the car owner

    a right to vehicle ownership and use of the limited road space for 10 years and can be (Singapore Land

    Transport Authority, 2014). The agency sets quotas for COEs and the price for COEs has varied greatly.

    In the past 3 years, the price has reached a low of $50,0001 in January 2012 to a high of $80,000 in March

    2013.

    Chu (2014) noted that the current formula of determining quotas for COEs results in boom and

    bust cycles in the quotas, which in turn causes COE prices to be volatile. Based on his research, he

    proposes a different way of allocating quotas to minimize price volatility in COE prices. This paper builds

    on Chu (2014)s work, comparing his proposal against the current formula of determining quotas by

    simulating the COE auctions and comparing the results of the simulations.

    The auction system

    The Singapore Land Transport Authority (2014a, 2014b) details the auction system for COEs and

    the vehicle quota system (VQS) as a whole. The pertinent points for the simulation are summarized here.

    The VQS has five categories for vehicles, with COEs corresponding to each category. Chu (2014)s

    proposals focused on cars with engine capacity 1,600cc and below (category A), cars with engine

    capacity 1,601 cc and above category B) and the open category, for any kind of vehicle (category E).

    There are separate auctions and quotas for each category.

    The quotas are determined and set every three months. The current formula consists of various

    factors including the number of vehicles taken off the road, the allowable growth in vehicle population

    and certain adjustments to account for issues such as past over-projections and changes in the taxi

    population. This information is available to the public.

    1 All dollar figures in this paper are in Singapore Dollars. 1 British Pound is approximately 2 Singapore Dollars.

  • How do Quotas Affect Price Volatility? A Simulation

    2

    Auctions for COEs are held twice a month through an open bidding process. The number of

    successful COE bidders is limited by the quota. Bidders have to enter their reserve price in the system

    (minimum $1) and they will be successful as long as their reserve price is equal or higher than the current

    COE price when the auction closes. The current COE price is determined by the quota, the number of

    bidders and their reserve price. The current COE price is updated continuously and available to all bidders,

    who may revise their reserve price if they wish. When the auction closes, all successful bidders will pay

    the current COE price (not their reserve price). This price is known as the quota premium for the action.

    In auction theory, this is essentially a second-price open-bid auction (Klemperer, 1999) for multiple

    identical objects. The second-price in this case is the current COE price.

    Chu (2014)s research and proposal

    Chu (2014) modeled COE prices using a number of factors such as the previous quota premium,

    the bid intensity (which represents the ratio of the number of bidders to the quota) and the previous bid

    intensity. Through a series of regression equations, he observed that each category had a certain

    breakpoint quota, where the variables had differing effects depending on whether the quota was above or

    below the breakpoint. For example, when the quota is below the breakpoint, a change in the quota had a

    greater effect on COE prices than when the quota is above the breakpoint. This would cause greater

    volatility in COE prices.

    To lower the volatility of COE prices, Chu (2014) argued that quotas should be set minimally at

    the breakpoint values for each category till July 2014. This would increase the vehicle population beyond

    the allowable growth in vehicle population in the short term, but prices would be less volatile. From July

    2014 onwards, there would be a surge of expiring COEs, which would typically lead to a surge in quotas

    as well. Chu (2014) proposes to reduce the quota from July 2014 onwards while still keeping it above the

    breakpoint. By smoothing out the supply of COEs in this way, he believes that COE prices would

    similarly be less volatile. This would also keep the number of vehicles within allowable growth in the

    medium term. Once the excess number of vehicles has been reduced to zero (expected first half 2015), the

    current formula for determining COE quotas could be reinstated. Table 1 illustrates the quota figures for

    Chu (2014)s proposals and the current formula when applied to all COEs.

    Building on Chu (2014)s work, I ran simulated auctions from 2014 to 2015 for the three COE

    categories based on Chu (2014)s proposed quotas and the quotas determined using the current formula.

    The process and results are described in the following sections.

  • How do Quotas Affect Price Volatility? A Simulation

    3

    Table 1: Illustration for current formula vs. Chu (2014)s proposal

    2014

    first half

    2014

    second half

    2015

    first half

    2015

    second half

    Target car population 650,623 652,250 653,881 655,516

    Cars taken off the road -18,000 -25,000 -34,000 -32,000

    COE quota using Current formula 19,627 26,631 35,635 33,639

    Chu (2014)s Proposed COE quota 24,000 24,000 26,516 33,639

    Actual car population 658,000 664,000 663,000 655,516

    % above target with Chu(2014)s proposal 1.13% 1.80% 1.39% 0%

    Note: All figures from Chu (2014)

    Simulating the auctions

    Each auction round was simulated2 by creating a series of independent bidders for the auction.

    The results of each auction round depended on the quota, the bid intensity and the reserve price of each

    bidder.

    Bid intensity

    The bid intensity for each round was predicted by first running an ordinary least squares

    regression on the following equation:

    Bid Intensity = A + B*previous quota premium + C*current quota + D*previous bid intensity

    The estimates from this equation were then used to estimate the demand for each successive auction

    round using the information from the previous round and the predetermined quotas. These estimates

    differed depending on whether the quota for the auction was above or below Chu (2014)s breakpoints.

    Table 2 summarizes the results.

    Table 2: Ordinary least squares regression estimation for bid intensity

    Cat A (breakpoint: 800) Cat B (breakpoint: 700) Cat E (breakpoint: 500)

    Quota below

    800

    Quota above

    800

    Quota below

    700

    Quota above

    700

    Quota below

    500

    Quota above

    500

    A 1.6559** 0.7436** 1.6821** 0.8814** 2.2861** 1.0005**

    B -5.078e-06 -6.274e-06* -6.117e-06* -2.906e-06 -6.122e-06* -2.665e-06

    C -0.0013* 2.003e-05 -0.0016** -7.314e-05 -0.0023** -0.0002**

    D 0.5606** 0.4716** 0.5986** 0.4069** 0.2804** 0.5489**

    *: p-value

  • How do Quotas Affect Price Volatility? A Simulation

    4

    Reserve price of each bidder

    Multiplying the bid intensity by the quota in each auction provided the number of bidders in each

    auction. Each bidder was assumed to base their reserve price on the following equation:

    Reserve Price = E + F* previous quota premium + G* current quota + H* previous bid intensity

    where E, F, G and H were randomly assigned coefficients. The coefficients were assumed to be normally

    distributed, and the mean and standard deviation of the distributions were based on an ordinary least

    squares regression on 2004-2013 COE auction data using the equation:

    Quota Premium = I + J* previous quota premium + K* current quota + L* current bid intensity

    These coefficients differed depending on whether the quota for the current round was above or

    below Chu (2014)s breakpoints. Table 3 summarizes the regression results.

    Table 3: Ordinary least squares regression estimation for quota premium

    Cat A (breakpoint: 800) Cat B (breakpoint: 700) Cat E (breakpoint: 500)

    Quota below

    800

    Quota above

    800

    Quota below

    700

    Quota above

    700

    Quota below

    500

    Quota above

    500

    I 9604 -5303** 2.882e+04* -1.069e+04** 3.043e+04** -1.214e+04**

    J 0.9350** 0.9393** 0.8041** 0.9490** 0.8651** 1.0386**

    K -5.7805 -0.9421** -32.6841* -3.2453** -34.3969* 1.5995**

    L -1512 6308** -1174 1.185e+04** -6264** 6495**

    *: p-value

  • How do Quotas Affect Price Volatility? A Simulation

    5

    Figure 1: Results of simulation using historical data against historical data

    The simulation was then used to predict quota premiums for COE categories A, B and E from

    January 2014 to December 2015, or 48 rounds of auctions. The results are displayed in figure 2. Here, the

    blue lines represent the simulations predictions if quotas remain determined by the current formula,

    while the green lines represent the simulations predictions if quotas were determined according to Chu

    (2014)s proposal.

    For each category, the simulation predicted that COE prices would drop from its current levels.

    Prices in both Category A and category B would drop to about $10,000 at some point in 2015 and

    stabilize at some point. Prices in category E would drop initially, then slowly climb upwards again.

    However, the drop in prices for all 3 categories was predicted to be much faster and further using

    Chu (2014)s proposed quotas than the current formula. In categories A and B, prices eventually converge

    between the proposed quotas and the current formula. Prices in category E did not converge during the

    period set for the simulation.

    Figure 2: Results of simulation based on current formula vs. Chu (2014)s proposal for quotas

  • How do Quotas Affect Price Volatility? A Simulation

    6

    Conclusion

    My simulation suggests that Chu (2014)s proposal would cause prices to be more volatile rather

    than less. However, it also suggests that Chu (2014)s proposal would greatly lower the average COE

    price and make it more affordable to own a car in Singapore, with the COE price predicted to be $1 in

    many of the auction rounds.

    Instinctively, we should not expect the COE price to remain at $1 for long periods, as potential

    car owners should rush into the market, creating strong demand and increasing the COE price. A

    comparison between the simulations predictions with the actual 2014 data showed that the simulation

    consistently predicted a significantly lower COE price than reality, which may explain the drop in COE

    prices predicted across all scenarios. This drop in price would have been propagated and magnified in

    future auction rounds in the simulation, resulting in the results shown.

    A number of factors could have contributed to this under-prediction and could be accounted for in

    future iterations of the simulation. For example, bidders that were unsuccessful in an auction round are

    likely to bid again in future auction rounds, perhaps with higher reserve prices. This is similar to learning

    behaviors in repeated auctions (Hailu and Schilizzi, 2003). Being able to see the current COE price in real

    time may also contribute to higher reserve prices (Klemperer, 1999). Other additional factors that could

    be used to model the bidders include market sentiment and risk preferences (Byde, 2003),

    In addition, the factors used in the regression models were likely to be higher correlated with each

    other. The multi-stage least squares regression used by Chu (2014) to manage multi-collinearity issues

    could be used instead of ordinary least squares regression to obtain better estimator for the simulation.

    While the current simulation may not fare well in predicting actual COE prices, it was able to

    predict the general downward trend in 2014. Chu (2014)s proposal thus may indeed result in higher

    volatility but lower COE prices overall. Depending on the governments policy aims, Chu (2014)s

    proposal may be a viable way of setting COE quotas.

  • How do Quotas Affect Price Volatility? A Simulation

    7

    References

    BYDE, A. (2003). Applying Evolutionary Game Theory to Auction Mechanism Design. EEE

    International Conference on E-Commerce. p. 347-354.

    CHU, S. (2014). Mitigating Supply and Price Volatilities in Singapores Vehicle Quota System. Transportation. 41. p. 1119-1134.

    HAILU, A. & SCHILIZZI, S. (2005). Learning in a basket of crabs: An agent-based computational model of repeated conservation auctions. Lecture Notes in Economics and

    Mathematical Systems. (550). p. 27-39.

    KLEMPERER, P. (1999). Auction Theory: A Guide to the Literature. Oxford University

    Economics Working Paper No. 1999-WS12. [Online] Available from

    http://papers.ssrn.com/sol3/papers.cfm?abstract_id=172650 [Accessed: 8th Jan 2015].

    SINGAPORE LAND TRANSPORT AUTHORITY. (2014a). Certificate of Entitlement. [Online]

    Available from: http://www.lta.gov.sg/content/ltaweb/en/roads-and-motoring/owning-a-

    vehicle/vehicle-quota-system/certificate-of-entitlement-coe.html [Accessed: 8th Jan 2015].

    SINGAPORE LAND TRANSPORT AUTHORITY. (2014b). Overview of Vehicle Quota

    System. [Online] Available from: http://www.lta.gov.sg/content/ltaweb/en/roads-and-

    motoring/owning-a-vehicle/vehicle-quota-system/overview-of-vehicle-quota-system.html

    [Accessed: 8th Jan 2015].

  • How do Quotas Affect Price Volatility? A Simulation

    8

    Appendix: Code Used

    Main Code: The code below shows how the results for Category A were derived. Note that the

    functions after the main code must first be defined before executing the main code.

    import pandas as pd

    import numpy as np

    import matplotlib.pyplot as plt

    import statsmodels.api as sm #(referred to http://www.datarobot.com/blog/multiple-regression-

    using-statsmodels/)

    #these are the dataframes for the results by category

    #the input is a csv file with the following columns:

    #'Category', 'Year', 'Month', 'Round', 'Quota Premium', 'Prevailing Quota Premium', 'Quota',

    #'Bids Received', 'Quota Premium - 1', 'Bid Intensity', 'Bid Intensity - 1'

    df = pd.DataFrame.from_csv("C:/Users/User/Desktop/QM

    Coursework/COE_Prices.csv",index_col=False)

    df = df[df['Year']

  • How do Quotas Affect Price Volatility? A Simulation

    9

    dfProposedQuota = dfProposedQuotaA

    dfRegression.index = range(0,len(dfRegression)) #Reindex so that the index starts from 1.

    #Perform Regression on the dataset. Results will be used for testing/prediction

    regRes = Regression(dfRegression,breakpoint,'Quota Premium','Quota Premium - 1','Quota','Bid

    Intensity')

    #Simulate regression results against the actual data

    dfAuction = Comparison(dfRegression,regRes)

    dfAuction.plot(y=['Quota Premium','Actual']) #plot both simulation results and actual data

    #Estimate the bid intensity (demand) using regression

    bidRes = Regression(dfRegression,breakpoint,'Bid Intensity','Quota Premium - 1','Quota','Bid

    Intensity - 1')

    dfResults = Results(bidRes,dfRegression,dfCurrentQuota,dfProposedQuota) #Run simulation

    predicting proposed quotas vs current quotas

    dfResults.plot(y=['Quota Premium_Current','Quota Premium_Proposed']) #Plot the results of the

    simulation

    print ""

    print "Correlation for comparison: " + str(np.corrcoef(dfAuction['Quota Premium'],

    dfAuction['Actual'])[0, 1]) #correlation between actual data and simulation results

    print ""

    print "Current Mean: " + str(dfResults['Quota Premium_Current'].mean())

    print "Current sd: " + str(dfResults['Quota Premium_Current'].std())

    print ""

    print "Proposed Mean: " + str(dfResults['Quota Premium_Proposed'].mean())

    print "Proposed sd: " + str(dfResults['Quota Premium_Current'].std())

  • How do Quotas Affect Price Volatility? A Simulation

    10

    Regression function: This breaks a dataset in two based on a breakpoint and conducts separate

    multivariate regressions for each subset. It returns the results of the 2 regressions.

    def Regression(df,breakpoint,Y,x1,x2,x3):

    #This function separates the dataset to 2 groups: above and below the breakpoint based on the

    quota column.

    #It runs separate regressions on the 2 datasets and stores the results for use in the simulation

    later.

    df_below = df[df['Quota']breakpoint] #Creates dataset above the breakpoint

    #Multiple Regression on df_below

    X = df_below[[x1,x2,x3]][1:]

    y = df_below[Y][1:]

    X = sm.add_constant(X) #this adds a constant (column of 1's) to the OLS. If not, there will be

    no intercept value

    est_below = sm.OLS(y,X).fit()

    #dir(est) gives a list of attributes e.g. est.rsquared_adj for adjusted r-square and est.params for

    parameters

    print "For below breakpoint"

    print est_below.summary() #display summary of the regression results

    print ""

    #Multiple Regression on df_above

    X = df_above[[x1,x2,x3]][1:]

    y = df_above[Y][1:]

    X = sm.add_constant(X) #this adds a constant (column of 1's) to the OLS. If not, there will be

    no intercept value

    est_above = sm.OLS(y,X).fit()

    #dir(est) gives a list of attributes e.g. est.rsquared_adj for adjusted r-square and est.params for

    parameters

    print "For above breakpoint"

    print est_above.summary() #display summary of the regression results

    #Gives the parameters and the sd for the bidders using results from the regression

    return{'constParam_below': est_below.params[0],

    'quotaPremiumParam_below': est_below.params[1],

    'quotaParam_below': est_below.params[2],

    'bidIntensityParam_below': est_below.params[3],

    'constParam_above': est_above.params[0],

    'quotaPremiumParam_above': est_above.params[1],

    'quotaParam_above': est_above.params[2],

    'bidIntensityParam_above': est_above.params[3],

    'constSE_below': est_below.bse[0],

  • How do Quotas Affect Price Volatility? A Simulation

    11

    'quotaPremiumSE_below': est_below.bse[1],

    'quotaSE_below': est_below.bse[2],

    'bidIntensitySE_below': est_below.bse[3],

    'constSE_above': est_above.bse[0],

    'quotaPremiumSE_above': est_above.bse[1],

    'quotaSE_above': est_above.bse[2],

    'bidIntensitySE_above': est_above.bse[3]}

  • How do Quotas Affect Price Volatility? A Simulation

    12

    Comparison Function: This simulates auction results using the regression results and plots the

    simulated results against the actual data. It also returns the auction results.

    def Comparison(dfRegression,regRes):

    #This function uses the regression results (regRes) to simulate the rounds of auctions

    contained in dfRegression.

    #Quotas and premiums from the actual data are used.

    #Each individual bidder in the simulation is assigned coefficients randomly within the range

    of the regression results and bid

    #on the COE in each round.

    #The results of each round are captured in dfAuction and returned to the user.

    #Setting up the Auction (2004 to 2014) to test the simulation

    dfAuction = pd.DataFrame(data=dfRegression['Category'][1:])

    dfAuction['Year'] = dfRegression['Year'][1:]

    dfAuction['Month'] = dfRegression['Month'][1:]

    dfAuction['Round'] = dfRegression['Round'][1:]

    #Quota and Bids Received can be adjusted for different scenarios

    dfAuction['Quota'] = dfRegression['Quota'][1:]

    dfAuction['Bids Received'] = dfRegression['Bids Received'][1:]

    #Quota Premium is the outcome of the simulation. Actual is what happened in reality

    dfAuction['Quota Premium'] = ""

    dfAuction['Actual'] = dfRegression['Quota Premium'][1:]

    #Sets the parameters and the sd for the bidders using results from the regression

    #parameters

    constParam_below = regRes['constParam_below']

    quotaPremiumParam_below = regRes['quotaPremiumParam_below']

    quotaParam_below = regRes['quotaParam_below']

    bidIntensityParam_below = regRes['bidIntensityParam_below']

    constParam_above = regRes['constParam_above']

    quotaPremiumParam_above = regRes['quotaPremiumParam_above']

    quotaParam_above = regRes['quotaParam_above']

    bidIntensityParam_above = regRes['bidIntensityParam_above']

    #sds

    constSE_below = regRes['constSE_below']

    quotaPremiumSE_below = regRes['quotaPremiumSE_below']

    quotaSE_below = regRes['quotaSE_below']

    bidIntensitySE_below = regRes['bidIntensitySE_below']

    constSE_above = regRes['constSE_above']

  • How do Quotas Affect Price Volatility? A Simulation

    13

    quotaPremiumSE_above = regRes['quotaPremiumSE_above']

    quotaSE_above = regRes['quotaSE_above']

    bidIntensitySE_above = regRes['bidIntensitySE_above']

    #Sets a random seed at the start so that results can be replicated

    random.seed(13)

    #Sets the quota premium. Here, we use the quota premium from 2004 Jan Round 1 as the

    initial premium.

    #This figure will be updated with the new premium every round

    previousQuotaPremium = int(dfRegression.ix[0,'Quota Premium'])

    for i in range(1,len(dfAuction)+1):

    #Sets the number of bidders for this round

    n = int(dfAuction.ix[i,"Bids Received"])

    #Sets the quota for this round

    quota = int(dfAuction.ix[i,"Quota"])

    bidIntensity = n/quota

    #Create the list of bidders for this round, each with their own characteristics based on the

    parameters.

    dfBidders = pd.DataFrame()

    if quota

  • How do Quotas Affect Price Volatility? A Simulation

    14

    dfBidders['Const']=np.random.normal(loc=constParam_above,scale=constSE_above,size=n)

    #dfBidders['Const'] = constParam_above + randint(0,1*constSE_above)

    #This calculates the bids that each bidder submits for the round

    dfBidders['Bid']=((dfBidders['Const'] + dfBidders['Quota Premium

    Coef']*previousQuotaPremium +

    dfBidders['Quota Coef']*quota + dfBidders['Bid Intensity Coef']*bidIntensity))

    for j, row in dfBidders.iterrows():

    if row['Bid'] < 1:

    dfBidders.ix[j,'Bid'] = 1

    #Round off bids to nearest dollar, since bids are made in dollars.

    dfBidders['Bid'] = np.round(dfBidders['Bid'],decimals=0)

    #Sort the bidders by their bid

    dfBidders = dfBidders.sort(columns='Bid',ascending=False)

    dfBidders.index = range(1,len(dfBidders)+1) #reindex so that I can select the top rows to

    determine the new premium

    #Identify the new premium

    if n > quota:

    newPremium = dfBidders.ix[(quota-1),'Bid']

    for k in range(0, quota-1):

    if newPremium != dfBidders.ix[(quota-1-k),'Bid']:

    newPremium = dfBidders.ix[(quota-1-k),'Bid']

    break

    else:

    newPremium = dfBidders.ix[(len(dfBidders)-1),'Bid']

    for k in range(0, len(dfBidders)-1):

    if newPremium != dfBidders.ix[(len(dfBidders)-1-k),'Bid']:

    newPremium = dfBidders.ix[(len(dfBidders)-1-k),'Bid']

    break

    #Insert the result of the round to the overall Auction results

    dfAuction.ix[i,'Quota Premium'] = newPremium

    #Set the new premium as the previousQuotaPremium for the next round

    #previousQuotaPremium = newPremium

    previousQuotaPremium = int(dfAuction.ix[i,'Actual']) #this line was used to check that the

    coefficients were reasonable

    return dfAuction

  • How do Quotas Affect Price Volatility? A Simulation

    15

    Prediction function: This predicts future quota premiums by using the result of the regression

    analysis for bid intensity.

    def Prediction(bidRes,dfQuota,previousQuotaPremium,previousBidIntensity):

    #This function predicts quota premiums based on a df of quotas, an initial quota premium, and

    an initial bid intensity

    #quota is a list of quotas in each round

    #previousQuotaPremium is the initial quota premium for the simulation

    #previousBidIntensity is the initial bid intensity for the simulation

    #Setting up the Auction to predict premiums in different situations

    dfPrediction = pd.DataFrame()

    dfPrediction['Quota'] = dfQuota #Quota can be adjusted for different scenarios

    dfPrediction['Bids Received'] = "" #store number of bids received in each round

    dfPrediction['Bid Intensity'] = "" #store bid intensity in each round

    dfPrediction['Quota Premium'] = "" #Quota Premium is the outcome of the simulation.

    dfPrediction.index = range(1,len(dfPrediction)+1)

    #Sets the parameters and the sd for the bidders using results from the regression

    #parameters

    constParam_below = regRes['constParam_below']

    quotaPremiumParam_below = regRes['quotaPremiumParam_below']

    quotaParam_below = regRes['quotaParam_below']

    bidIntensityParam_below = regRes['bidIntensityParam_below']

    constParam_above = regRes['constParam_above']

    quotaPremiumParam_above = regRes['quotaPremiumParam_above']

    quotaParam_above = regRes['quotaParam_above']

    bidIntensityParam_above = regRes['bidIntensityParam_above']

    #sds

    constSE_below = regRes['constSE_below']

    quotaPremiumSE_below = regRes['quotaPremiumSE_below']

    quotaSE_below = regRes['quotaSE_below']

    bidIntensitySE_below = regRes['bidIntensitySE_below']

    constSE_above = regRes['constSE_above']

    quotaPremiumSE_above = regRes['quotaPremiumSE_above']

    quotaSE_above = regRes['quotaSE_above']

    bidIntensitySE_above = regRes['bidIntensitySE_above']

    random.seed(13) #Sets a random seed at the start so that results can be replicated

    for i in range(1,len(dfPrediction)+1):

    quota = int(dfPrediction.ix[i,"Quota"]) #Sets the quota for this round

  • How do Quotas Affect Price Volatility? A Simulation

    16

    #Predict the bid intensity for the round using the previously calculated coefficients

    if quota

  • How do Quotas Affect Price Volatility? A Simulation

    17

    dfBidders.ix[j,'Bid'] = 1

    #Round off bids to nearest dollar, since bids are made in dollars.

    dfBidders['Bid'] = np.round(dfBidders['Bid'],decimals=0)

    #Sort the bidders by their bid

    dfBidders = dfBidders.sort(columns='Bid',ascending=False)

    dfBidders.index = range(1,len(dfBidders)+1) #reindex so that I can select the top rows to

    determine the new premium

    #Identify the new premium

    if n > quota:

    newPremium = dfBidders.ix[(quota-1),'Bid']

    for k in range(0, quota-1):

    if newPremium != dfBidders.ix[(quota-1-k),'Bid']:

    newPremium = dfBidders.ix[(quota-1-k),'Bid']

    break

    else:

    newPremium = dfBidders.ix[(len(dfBidders)-1),'Bid']

    for k in range(0, len(dfBidders)-1):

    if newPremium != dfBidders.ix[(len(dfBidders)-1-k),'Bid']:

    newPremium = dfBidders.ix[(len(dfBidders)-1-k),'Bid']

    break

    #Insert the result of the round to the overall Auction results

    dfPrediction.ix[i,'Quota Premium'] = newPremium

    dfPrediction.ix[i,'Bid Intensity'] = bidIntensity

    dfPrediction.ix[i,'Bids Received'] = n

    #Set the variables for the next round

    previousQuotaPremium = newPremium

    previousBidIntensity = bidIntensity

    return dfPrediction

  • How do Quotas Affect Price Volatility? A Simulation

    18

    Results function: This runs the prediction function on the current projected quotas and

    Chu(2014)s proposed quotas and plots the results for comparison.

    def Results(bidRes,dfRegression,dfCurrentQuota,dfProposedQuota):

    #These 2 values are currently taken from the Dec 2014 Round 2 results for COE bidding

    previousQuotaPremium = dfRegression['Quota Premium'].tail(1).values

    previousBidIntensity = float(dfRegression['Bids Received'].tail(1).values) /

    float(dfRegression['Quota'].tail(1).values)

    #Run prediction for current plan

    dfProposedPrediction =

    Prediction(bidRes,dfProposedQuota,previousQuotaPremium,previousBidIntensity)

    #Run prediction for Chu's proposal

    dfCurrentPrediction =

    Prediction(bidRes,dfCurrentQuota,previousQuotaPremium,previousBidIntensity)

    dfResults = dfCurrentPrediction.join(dfProposedPrediction,how='left', lsuffix='_Current',

    rsuffix='_Proposed')

    return dfResults

    CreateQuotas function: This creates quotas that can be used for the Results function.

    def CreateQuotas(quota1,quota2,quota3,quota4):

    #This function creates the quotas that will be used to create input for Results() later

    dfQuotas = pd.DataFrame({'Quota': quota1},index=list(range(0,12)))

    df1 = pd.DataFrame({'Quota': quota2},index=list(range(12,24)))

    df2 = pd.DataFrame({'Quota': quota3},index=list(range(24,36)))

    df3 = pd.DataFrame({'Quota': quota4},index=list(range(36,48)))

    dfQuotas = ((dfQuotas.append(df1)).append(df2)).append(df3)

    return dfQuotas