def test_add_future(self): try: self.load_data() tickers = self.data.columns futures = [GenericFuture(ticker=t, number=int(t.split("_B")[1]), data=self.data[t]) for t in tickers] brent_curve = CommodityCurve(num_instruments=len(futures)) for f in futures: brent_curve.add_future(f, f.contract_number()) except Exception as e: self.fail(e)
def test_clean_data(self): self.load_data() try: future = GenericFuture(ticker="B", number=1) tickers = self.data.columns[1:] data = self.data.iloc[:, 0] ticker = tickers[1] number = 1 future = GenericFuture(ticker=ticker, number=number, data=data) future.clean_data() if future.missing_count() == 0: self.fail() print("Missing Data: " + str(future.missing_count())) future.plot() plt.show() except Exception as e: self.fail()
def test_append_future(self): try: self.load_data() tickers = self.data.columns futures = [GenericFuture(ticker=t, number=int(t.split("_B")[1]), data=self.data[t]) for t in tickers] brent_curve = CommodityCurve() for f in futures: brent_curve.append_future(f) brent_curve.create_curve() except Exception as e: self.fail(e)
def test_plot_latest(self): try: self.load_data() tickers = self.data.columns futures = [GenericFuture(ticker=t, number=int(t.split("_B")[1]), data=self.data[t]) for t in tickers] futures.sort() brent_curve = CommodityCurve(num_instruments=len(futures)) for f in futures: brent_curve.add_future(f, f.contract_number()) brent_curve.create_curve() brent_curve.plot_latest() plt.show() except Exception as e: raise e
def test_fill_data(self): self.load_data() try: future = GenericFuture(ticker="B", number=1) tickers = self.data.columns[1:] data = self.data.iloc[:, 0] ticker = tickers[1] number = 1 future = GenericFuture(ticker=ticker, number=number) future.fill_data(data=data) future.plot() plt.show() except Exception as e: self.fail()
def test_generate_contract_expiries(self): quandl.ApiConfig.api_key = 'Z2WYzGME3qmxnqQgBcdX' try: # Contains Tickers for all contracts, name + description and as of dates co_meta_data = pd.read_csv(TestGenericFuture.co_meta_data_path) # Contains number of available contracts, delivery months (FGHJKMNQUVXZ) + other meta data co_contract_data = pd.read_csv( TestGenericFuture.co_contract_data_path).rename( columns={"Quandl Code": "QuandlCode"}) # Test Commodity, should be in co_tickers dictionary for co in TestGenericFuture.co_tickers.keys(): print(co) commodity = co root_ticker = TestGenericFuture.co_tickers[commodity] mask = co_meta_data["code"].str.contains(root_ticker + "1$") quandl_codes = "CHRIS/" + co_meta_data[mask]["code"] near_ticker = quandl_codes.iloc[0] raw_data = quandl.get(near_ticker, start_date="2000-01-01").reset_index() raw_data = raw_data.rename( columns={ "Prev. Day Open Interest": "Previous Day Open Interest" }) expiries = GenericFuture.generate_contract_expiries( raw_data[["Date", "Previous Day Open Interest"]].copy(), root_ticker=root_ticker, co_contract_data=co_contract_data, generic_contract_months=GenericFuture.contract_months, n_contracts=3) expiries.to_excel("../data/" + commodity + "ContractExpiries.xlsx", index=False) except Exception as e: self.fail(e)
#f2 = quandl.get(second_future, start_date='2000-01-01', end_date='2020-12-31') #f3 = quandl.get(third_future, start_date='2000-01-01', end_date='2020-12-31') if "Settle" in f1.columns: price_col = "Settle" else: price_col = "Close" try: header = ticker.split(sep="_")[1] except IndexError: header = ticker.split(sep="_")[0] #first_f = pd.concat([first_f, f1[price_col].rename(header)], axis=1) #second_f = pd.concat([second_f, f2[price_col].rename(header)], axis=1) futures[header] = GenericFuture(ticker=header, number="1", data=f1[price_col].rename(header)) print(futures) from statsmodels.tsa.stattools import adfuller from numpy import log from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from pmdarima.arima.utils import ndiffs from statsmodels.tsa.arima.model import ARIMA gasoline = futures['RB'] gasoline.clean_data() gasoline_monthly = gasoline.series().resample('M').last() adfuller(gasoline_monthly.diff().dropna(), regression="ct")
def test_calculate_return(self): self.load_data() try: future = GenericFuture(ticker="B", number=1) tickers = self.data.columns[1:] data = self.data.iloc[:, 0] ticker = tickers[1] number = 1 future = GenericFuture(ticker=ticker, number=number, data=data) future.clean_data() future.to_monthly() future.calculate_return() future.returns().plot() plt.show() except Exception as e: self.fail()
def test_famafrench_test(self): self.load_data(start_date="2000-01-01") try: quandl.ApiConfig.api_key = 'Z2WYzGME3qmxnqQgBcdX' ust = quandl.get("USTREASURY/YIELD", start_date="2000-01-01") f = open('../writeup/tables/FFRegressionTables.tex', 'a') for co in TestGenericFuture.co_tickers.keys( ): #["Corn", "Brent", "Lumber", "Copper", "Gold", "Wheat"]: try: commodity = co expiries = pd.read_excel("../data/" + commodity + "ContractExpiries.xlsx") root_ticker = TestGenericFuture.co_tickers[commodity] generic_futures = [1, 2] tickers = [root_ticker + str(i) for i in generic_futures] near_future_data = self.data.loc[:, tickers[0]] far_future_data = self.data.loc[:, tickers[1]] near_future_ticker = tickers[0] far_future_ticker = tickers[1] near_future = generic_futures[0] far_future = generic_futures[1] near_future_expiries = expiries[[ "Date", str(near_future) + "C_Expiry" ]].set_index("Date") far_future_expiries = expiries[[ "Date", str(far_future) + "C_Expiry" ]].set_index("Date") near_future = GenericFuture(ticker=near_future_ticker, number=near_future, data=near_future_data) far_future = GenericFuture(ticker=far_future_ticker, number=far_future, data=far_future_data) near_future.clean_data() far_future.clean_data() near_future.set_expiries(near_future_expiries) far_future.set_expiries(far_future_expiries) fit = near_future.famafrench_test(far_future, ust["3 MO"] / 100, log=False, frequency='M') print(commodity) print(fit.summary()) f.write(fit.summary().as_latex()) f.write('''\newline''') except KeyError: print("Error in " + co) pass f.close() except Exception as e: self.fail(e)
def test_calculate_basis(self): self.load_data(start_date="2000-01-01") try: all_basis = [] for co in TestGenericFuture.co_tickers.keys(): try: commodity = co expiries = pd.read_excel("../data/" + commodity + "ContractExpiries.xlsx") root_ticker = TestGenericFuture.co_tickers[commodity] generic_futures = [1, 2] tickers = [root_ticker + str(i) for i in generic_futures] near_future_data = self.data.loc[:, tickers[0]] far_future_data = self.data.loc[:, tickers[1]] near_future_ticker = tickers[0] far_future_ticker = tickers[1] near_future = generic_futures[0] far_future = generic_futures[1] near_future_expiries = expiries[[ "Date", str(near_future) + "C_Expiry" ]].set_index("Date") far_future_expiries = expiries[[ "Date", str(far_future) + "C_Expiry" ]].set_index("Date") near_future = GenericFuture(ticker=near_future_ticker, number=near_future, data=near_future_data) far_future = GenericFuture(ticker=far_future_ticker, number=far_future, data=far_future_data) near_future.clean_data() far_future.clean_data() near_future.set_expiries(near_future_expiries) far_future.set_expiries(far_future_expiries) basis = near_future.calculate_basis(far_future, log=True, ffill=True) all_basis.append(basis) except KeyError: pass all_basis = pd.concat(all_basis, axis=1) all_basis.to_excel("../data/AllBasisLog.xlsx") all_basis = all_basis.resample('M', convention='end').last() summary_description = all_basis.describe().round(2).to_latex() f = open('../writeup/tables/SummaryStatistics.tex', 'w') f.write(summary_description) f.close() sns.set(rc={"grid.linewidth": 0.6, "figure.figsize": (11.7, 8.27)}) sns.set_style(style='whitegrid') ax = sns.boxplot(data=all_basis) ax.set_xticklabels(ax.get_xticklabels(), rotation=45) ax.get_figure().savefig("../writeup/img/BasisBoxPlot.png") #from statsmodels.graphics.tsaplots import plot_acf, plot_pacf #plot_acf(nb.values.squeeze(), lags=40) # basis.plot() #lt.show() #plot_pacf(near_future.series().values.squeeze(), lags=40) #plt.show() except Exception as e: self.fail(e)
def main(**kwargs): data = load_data(start_date="2000-01-01") quandl.ApiConfig.api_key = 'Z2WYzGME3qmxnqQgBcdX' ust = quandl.get("USTREASURY/YIELD", start_date="2000-01-01") all_basis = list() f = open('../tex/FFRegressionTables.tex', 'a') for co in co_tickers.keys(): try: commodity = co expiries = pd.read_excel("../data/" + commodity + "ContractExpiries.xlsx") root_ticker = co_tickers[commodity] generic_futures = [1, 2] tickers = [root_ticker + str(i) for i in generic_futures] near_future_data = data.loc[:, tickers[0]] far_future_data = data.loc[:, tickers[1]] near_future_ticker = tickers[0] far_future_ticker = tickers[1] near_future = generic_futures[0] far_future = generic_futures[1] near_future_expiries = expiries[[ "Date", str(near_future) + "C_Expiry" ]].set_index("Date") far_future_expiries = expiries[[ "Date", str(far_future) + "C_Expiry" ]].set_index("Date") near_future = GenericFuture(ticker=near_future_ticker, number=near_future, data=near_future_data) far_future = GenericFuture(ticker=far_future_ticker, number=far_future, data=far_future_data) near_future.clean_data() far_future.clean_data() near_future.set_expiries(near_future_expiries) far_future.set_expiries(far_future_expiries) basis = near_future.calculate_basis(far_future) all_basis.append(basis) fit = near_future.famafrench_test(far_future, ust["3 MO"] / 100, log=False, frequency='M') print(commodity) print(fit.summary()) f.write(fit.summary().as_latex()) f.write(co) except KeyError: print("Error in " + co) pass f.close() all_basis = pd.concat(all_basis, axis=1) all_basis = all_basis.resample('M', convention='end').last() all_basis.describe().round(2).drop( index="count").to_latex("../tex/SummaryStatistics.tex") ax = sns.boxplot(data=all_basis.drop(columns=["CME_RB1", "CME_PL1"])) ax.get_figure().savefig("../tex/CYDistribution.png") return
"Gas": "CME_NG", "Hogs": "CME_LN", "Coffee": "ICE_KC", "Cotton": "ICE_CT", "Cocoa": "ICE_CC", "Sugar": "ICE_SB", "HeatOil": "CME_HO", "Gasoline": "CME_RB" } filename = "../data/TestData_Brent.xlsx" data = pd.read_excel(filename, index_col="Date") tickers = data.columns futures = [ GenericFuture(ticker=t, number=int(t.split("_B")[1]), data=data[t]) for t in tickers ] futures.sort() brent_curve = CommodityCurve(num_instruments=len(futures)) for f in futures: brent_curve.add_future(f, f.contract_number()) brent_curve.create_curve() brent_curve.to_monthly() brent_curve.plot_latest() plt.show() from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler