how do quotas affect price volatility?
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