# Coco's Programming Test
###### tags: `Coco`
#### Instructions
1. The test is 60 minutes long.
2. You can use Python or R to complete this test.
3. To access the programming environment, log onto the Sloan Remote Lab using your MIT ID: https://sloan-remote.mit.edu/.
4. Save all your code as a single file in the folder PLT. Name the file in the following format: `MITID_LastName_FirstName.txt`
5. Do not communicate with other students during the test.
6. No materials outside the programming environment are allowed. You are allowed to use the help files within the programming environment.
#### Problem 1 (Simulating a random walk)
Consider the following model:
$$x_t = x_{t-1} + \sigma\epsilon_t$$
In this model $\sigma$ is a constant, and $\epsilon_t$ (for $t = 1,2,...,T$) are independent and identically distributed, taking the value 1 and −1 with probability 0.5.
1. Write a function that simulates a path of $x_t$ for $T$ periods.
* The function should take the following parameter values as input: $T, \sigma, x_0$
* The function should produce the following output: the time series of simulated values of $x_t$
2. Use the function you have written above to do the following:
* Simulate a time series of $x$ using the following parameter values: $T = 60, \sigma = 0.1, x_0 =1$
* Plot the time series, add proper labels and title, and save it as a PDF file under the name "MITID path.pdf".
```python=
import random
# 1. write function that simulate a path of x_t for T periods
def simulate(T, sigma, x0):
"""
input:
T: number of periods
sigma: a constant
x0: initial condition
output:
t: timestamp
x: simulated x values
"""
x = [x0]
t = [0]
for i in range(T):
x.append(x[-1] + sigma * simulateHelper())
t.append(t[-1] + 1)
return t, x
def simulateHelper():
"""
return 1 or -1 with equal probability 0.5
"""
if random.random() < 0.5:
return 1
else:
return -1
# 2.1 Simulate a time series of 𝑥 using the given parameter values
t, x = simulate(60, 0.1, 1)
# 2.2 Plot the time series, add proper labels and title
import matplotlib.pyplot as plt
f = plt.figure()
f.suptitle('Random Walk Simulation')
plt.plot(t, x)
plt.xlabel('time')
plt.ylabel('value')
plt.show() # needed if not interactive mode
# save it as a PDF file under the name MITID_path.pdf
f.savefig("MITID_path.pdf", bbox_inches='tight')
```
R Solution
```R
randomwalk <- function(T,sigma,x0) {
x=c(x0)
t=c(0)
for (i in 1:T) {
x<-append(x,x[length(x)]+sigma*random1(),after=length(x))
t<-append(t,t[length(t)]+1,after=length(t))
}
a=list(x,t)
return(a)
}
random1 <- function() {
if (runif(1,0,1)>=0.5) {
return(1)
}
else {
return(-1)
}
}
b<-randomwalk(60,0.1,1)
pdf("MITID_path.pdf")
plot(unlist(b[2]),unlist(b[1]), type="l", xlab="time", ylab="value", main="Random Walk")
dev.off()
```
#### Problem 2 (Working with market data)
Copy the data file CPIAUCSL.csv for Consumer Price Index from the common working directory and perform the following tasks.
```python=
# First compute the monthly inflation, defined using the formula
import pandas
df = pandas.read_csv("CPIAUCSL.csv")
size = len(df)
for i in range(size):
if i != 0:
df.loc[i, 'inflation'] = df.loc[i, 'CPIAUCSL']
df.loc[i, 'inflation'] -= df.loc[i-1, 'CPIAUCSL']
df.loc[i, 'inflation'] /= df.loc[i-1, 'CPIAUCSL']
# Split the sample into halves
half_index = size / 2
df1, df2 = df.loc[:half_index], df.loc[half_index+1:]
# Compute mean and standard deviation in both samples
mean1, std1 = df1['inflation'].mean(), df1['inflation'].std()
mean2, std2 = df2['inflation'].mean(), df2['inflation'].std()
# Plot the monthly inflation time series
import matplotlib.pyplot as plt
f = plt.figure()
f.suptitle('Monthly Inflation Time Series')
plt.plot(df["DATE"], df["inflation"], label='monthly')
# Add to the plot two horizontal lines to mark the average inflation computed above
plt.plot(df["DATE"], [mean1] * size, label='average 1')
plt.plot(df["DATE"], [mean2] * size, label='average 2')
# Label the axes properly
plt.xlabel('Date')
plt.ylabel('Monthly Inflation Rates')
# Save the plot as a PDF under the name "MITID_inflation.pdf"
plt.legend(loc='upper right')
f.savefig("MITID_inflation.pdf", bbox_inches='tight')
```
<div style="text-align: center">
<img src="https://i.imgur.com/3iJY4RS.png">
</div>
R solution:
```r
mydata<-read.csv("/Users/cocoz/Downloads/CPIAUCSL.csv",header = TRUE)
x<-diff(mydata$CPIAUCSL,lag = 1,differences = 1)
x<-c(0,x)
mydata$diff<-x
mydata$diff<-mydata$diff/mydata$CPIAUCSL
print(nrow(mydata))
half<-nrow(mydata)/2
mydata1<-mydata[1:half, ]
mydata2<-mydata[(half+1):nrow(mydata), ]
summary(mydata1$diff)
summary(mydata2$diff)
mean1<-mean(mydata1$diff)
mean2<-mean(mydata2$diff)
pdf("MITID_path.pdf")
plot(mydata$DATE, mydata$diff,type="l",xlab="Date",ylab="monthly inflation rate")
lines(mydata$DATE, mydata$diff,xlab="Date",ylab="monthly inflation rate")
lines(mydata$DATE, rep(mean(mydata1$diff),856),col="blue")
lines(mydata$DATE, rep(mean(mydata2$diff),856),col="red")
dev.off()
```
```python=
for i in stocks:
nb = nbbo[nbbo.symbol == i]
trade = trades[trades.symbol == i]
l = max(nb.time[nb.time < morning])
u = min(nb.time[nb.time > end])
nb = nb[(nb.time >= l) & (nb.time <= u)]
nb.time = nb.time * (10 ** 6)
trade = trade[(trade.time >= morning * (10 ** 6)) & (trade.time <= stop * (10 ** 6))]
addrows = pd.DataFrame({'time': trade.time.values})
nb = nb.append(addrows, ignore_index=True, sort=True)
nb = nb.sort_values(by=['time'])
nb.set_index('time', inplace=True)
trade.set_index('time', inplace=True)
df = pd.merge_asof(trade, nb, on='time', by='symbol')
df0 = pd.concat([df0, df])
df0.set_index('symbol', inplace=True)
df0['mid'] = (df0.bid + df0.ask) / 2
df0['PerShareTC'] = abs(df0.Price - df0.mid) / df0.mid * (10 ** 4)
df0['TotalTC'] = df0.PerShareTC * df0.Shares
vwac = pd.DataFrame(index=stocks, columns=['Buyer', 'Seller'])
for j in stocks:
df = df0.loc[j]
vwac_B = sum(df[df.BuySell == 'B'].TotalTC) / sum(df[df.BuySell == 'B'].Shares)
vwac_S = sum(df[df.BuySell == 'S'].TotalTC) / sum(df[df.BuySell == 'S'].Shares)
vwac.loc[j] = [vwac_B, vwac_S]
mktcap['ln_mktcap'] = np.log(mktcap.mktcap)
buy_regression = sm.OLS(vwac.Buyer.astype(float), sm.add_constant(mktcap.ln_mktcap)).fit()
buy_regression.summary()
sell_regression = sm.OLS(vwac.Seller.astype(float), sm.add_constant(mktcap.ln_mktcap)).fit()
sell_regression.summary()
```