I hope this is helpful. The only reason I figured it out (I think I figured it out, anyway) is due to the posts in this thread. I used them as a starting point, ran and re-ran the code, re-worked the code, and ran it again until it worked and it looked right to me.
If something looks wonky, please let me know.
Happy coding!
# Code from utils.py
from math import log, sqrt
# Calculate Log Return
def calculate_log_return(start_price, end_price):
return log(end_price / start_price)
# Calculate Variance
def calculate_variance(dataset):
mean = sum(dataset) / len(dataset)
numerator = 0
for data in dataset:
numerator += (data - mean) ** 2
return numerator / len(dataset)
# Calculate Standard Deviation
def calculate_stddev(dataset):
variance = calculate_variance(dataset)
return sqrt(variance)
# Calculate Correlation Coefficient
def calculate_correlation(set_x, set_y):
sum_x = sum(set_x)
sum_y = sum(set_y)
sum_x2 = sum([x ** 2 for x in set_x])
sum_y2 = sum([y ** 2 for y in set_y])
sum_xy = sum([x * y for x, y in zip(set_x, set_y)])
n = len(set_x)
numerator = n * sum_xy - sum_x * sum_y
denominator = sqrt((n * sum_x2 - sum_x ** 2) * (n * sum_y2 - sum_y ** 2))
return numerator / denominator
# Code from script.py begins here, sans import from utils
def display_as_percentage(val):
return "{:.1f}%".format(val * 100)
amazon_prices = [
1699.8,
1777.44,
2012.71,
2003.0,
1598.01,
1690.17,
1501.97,
1718.73,
1639.83,
1780.75,
1926.52,
1775.07,
1893.63,
]
ebay_prices = [
35.98,
33.2,
34.35,
32.77,
28.81,
29.62,
27.86,
33.39,
37.01,
37.0,
38.6,
35.93,
39.5,
]
# Step 1 does not require code.
# Step 2
def get_returns(prices):
returns = []
# Step 3
for i in range(len(prices) - 1):
start_price = prices[i]
end_price = prices[i + 1]
# Step 4
log_return = calculate_log_return(start_price, end_price)
returns.append(log_return)
return returns
# Step 5
amazon_returns = get_returns(amazon_prices)
ebay_returns = get_returns(ebay_prices)
x = [display_as_percentage(returns) for returns in amazon_returns]
y = [display_as_percentage(returns) for returns in ebay_returns]
# Step 6
print("The monthly returns for Amazon stock are: ", ", ".join(x), ".")
print("The monthly returns for eBay stock are: ", ", ".join(y), ".")
print("Amazon has more profitable months than eBay.\n")
# Step 7
print(
"The annual rate of return for Amazon stock is",
display_as_percentage(sum(amazon_returns)),
".",
)
print(
"The annual rate return for eBay stock is",
display_as_percentage(sum(ebay_returns)),
".",
)
print("Amazon’s annual return is slightly higher than eBay’s annual return.\n")
# Step 8
amazon_variance = calculate_variance(amazon_returns)
ebay_variance = calculate_variance(ebay_returns)
print(
"The variance for Amazon’s monthly returns is ",
display_as_percentage(amazon_variance),
".",
)
print(
"The variance for eBay's monthly returns is ",
display_as_percentage(ebay_variance),
".",
)
print("The variance for Amazon’s monthly returns is slightly higher than eBay’s.\n")
# Step 9
amazon_stddev = calculate_stddev(amazon_returns)
ebay_stddev = calculate_stddev(ebay_returns)
print(
"The standard deviation for Amazon's monthly returns is ",
display_as_percentage(amazon_stddev),
".",
)
print(
"The standard deviation for eBay's monthly returns is",
display_as_percentage(ebay_stddev),
".\n",
)
# Step 10
correlation = calculate_correlation(amazon_returns, ebay_returns)
print(
"The correlation between the stock returns is ",
display_as_percentage(correlation),
", so there is a moderate positive correlation.",
)