-
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