''' Created on Dec 16, 2014 @author: Brett Paufler Copyright Brett Paufler ''' import pandas as pd import numpy as np import trades from trades import report from trades import tdays import matplotlib.pyplot as plt def linear_graph(d1,d2): dF = trades.get_trades("corn") dF = dF[dF["Issue"] == "CZ2014"] dF = dF[dF["Date"] > d1] dF = dF[dF["Date"] < d2] #ADDS WEEKDAY COLUMNS (MON-FRI) for w in range(5): dF[tdays[w]] = dF["Settle"].where(dF["Date"].apply(lambda x: x.weekday()==w)) gF = dF[["Date"] + list(tdays.values())] report(gF) plt.figure(figsize=(10,5)) ax = gF.interpolate().plot(x="Date") fig = ax.get_figure() #fig.show() sN = "linear_graph_CZ-%s-%s.png" % (d1,d2) fig.savefig(sN) def linear_graph_soybeans(d1=0,d2=0): dF = trades.get_trades("soybeans") if d1: dF = dF[dF["Issue"] == "SX2014"] dF = dF[dF["Date"] > d1] dF = dF[dF["Date"] < d2] #ADDS WEEKDAY COLUMNS (MON-FRI) for w in range(5): dF[tdays[w]] = dF["Settle"].where(dF["Date"].apply(lambda x: x.weekday()==w)) gF = dF[["Date"] + list(tdays.values())] report(gF) plt.figure(figsize=(10,5)) ax = gF.interpolate().plot(x="Date") fig = ax.get_figure() #fig.show() sN = "linear_graph_SX-%s-%s.png" % (d1,d2) fig.savefig(sN) #linear_graph("2014-10-1","2014-10-31") #linear_graph_soybeans("2014-10-1","2014-10-31") ''' for d1,d2 in [("2014-10-1","2014-12-31"), ("2014-11-1","2014-11-30"), ("2014-1-1","2014-12-31"), ]: linear_graph_soybeans(d1,d2) ''' #COMING ALONG NICELY def simple_weekday_average_bar_graph(commodity, years): ''' sell price averaged over length of issue, per day ''' dF = trades.by_issue_year(commodity, years) #ADDS WEEKLY COLUMNS for w in range(5): dF[tdays[w]] = dF["Settle"].where(dF["Date"].apply(lambda x: x.weekday()==w)) #num non NaN, so can get an average numObs = [] for w in range(5): numObs.append(dF[trades.tdays[w]].count() ) dF = dF.fillna(0) wkDay = {} for w in range(5): wkDay[trades.tdays[w]] = sum(dF[trades.tdays[w]])/numObs[w] minV = min(wkDay.values()) ave = dF["Settle"].mean() colors = [] for w in range(5): wkDay[trades.tdays[w]] = wkDay[trades.tdays[w]] - ave if wkDay[trades.tdays[w]] > 0: colors.append("g") else: colors.append("r") print wkDay print minV print "wkDay %s" % str(wkDay) print "obsCount %s" % str(numObs) gF = pd.DataFrame(wkDay, index=[""]) gF = gF[trades.weekdayList] trades.report(gF) if isinstance(years,int): graphTitle = "%s %s" % (commodity, str(years)) else: graphTitle = "%s %s-%s"% (commodity, str(years[0]), str(years[-1])) (commodity,str(years)) #Graphing Logic for 5 series data plt.figure() ax = gF.ix[0].plot(kind='bar', figsize=(10,5), legend=False, rot=0,#set_xticks=trades.weekdayList, color = colors, title = "Daily Sum Method\n%s" % graphTitle ) plt.ylabel("Difference in Average Trade") sN = "simple_weekday_average_%s.png" % graphTitle.replace(" ","_") plt.savefig(sN) ''' for a in trades.graphList: simple_weekday_average_bar_graph(a[0],a[1]) ''' def top_five_percent_bar_graph(commodity, years=0, top=0.05, best=True): ''' sell price averaged over length of issue, per day if years not specified, uses all trades if year is full range, only uses issue years ''' if years == 0: dF = trades.get_trades("corn") else: dF = trades.by_issue_year(commodity, years) dF = dF.sort("Settle") if isinstance(years,int): graphTitle = "%s %s" % (commodity, str(years)) else: graphTitle = "%s %s-%s"% (commodity, str(years[0]), str(years[-1])) if best: dF = dF.tail(round(dF.shape[0] * top)) sN = "best_trades_%d_%s.png" % (100*top, graphTitle.replace(" ","_")) titleText = "Best %d%% of Trades\n%s" % (100*top,graphTitle) else: dF = dF.head(round(dF.shape[0] * top)) sN = "worst_trades_%d_%s.png" % (100*top, graphTitle.replace(" ","_")) titleText = "Worst %d%% of Trades\n%s" % (100*top,graphTitle) #FROM HERE< CUT AND PASTE OF ABOVE FUNCTION #ADDS WEEKLY COLUMNS for w in range(5): dF[tdays[w]] = dF["Settle"].where(dF["Date"].apply(lambda x: x.weekday()==w)) #num non NaN, so can get an average numObs = [] for w in range(5): numObs.append(dF[trades.tdays[w]].count() ) dF = dF.fillna(0) wkDay = {} for w in range(5): wkDay[trades.tdays[w]] = sum(dF[trades.tdays[w]])/numObs[w] minV = min(wkDay.values()) ave = dF["Settle"].mean() colors = [] for w in range(5): wkDay[trades.tdays[w]] = wkDay[trades.tdays[w]] - ave if wkDay[trades.tdays[w]] > 0: colors.append("g") else: colors.append("r") print wkDay print minV print "wkDay %s" % str(wkDay) print "obsCount %s" % str(numObs) gF = pd.DataFrame(wkDay, index=[""]) gF = gF[trades.weekdayList] trades.report(gF) #(commodity,str(years)) #Graphing Logic for 5 series data plt.figure() ax = gF.ix[0].plot(kind='bar', figsize=(10,5), legend=False, rot=0,#set_xticks=trades.weekdayList, color = colors, title = titleText ) plt.ylabel("Overall Difference") plt.savefig(sN) ''' for t in [0.01,0.05,0.10,0.25]: for c in trades.graphList: for b in [True,False]: top_five_percent_bar_graph(c[0], c[1], t, b) ''' #top_five_percent_bar_graph("corn",range(1960,2014)) #top_five_percent_bar_graph("corn",2014) #top_five_percent_bar_graph("corn") def best_of_month(commodity, best=True): if commodity == "corn": dF = trades.by_issue_year("corn",range(1960,2015)) start = 1960 m = 13 elif commodity == "soybeans": dF = trades.by_issue_year("soybeans",range(1970,2015)) start = 1970 m = 12 else: raise Exception("Not a valid commodity type") #print dF.shape #print dF.shape trades.report(dF) day = [0,0,0,0,0] for year in range(start,2015): for month in range(1,m): tF = dF[dF.index.year == year] tF = tF[tF.index.month == month] tF = tF.sort("Settle") if best: #print "HERE" #print tF day[tF.tail(1).index.weekday] += 1 else: day[tF.head(1).index.weekday] += 1 ave = sum(day)/5.0 aveDay = [] colors = [] for d in day: a = d - ave aveDay.append(a) if a > 0: colors.append("g") else: colors.append("r") gD = {"Monday":aveDay[0], "Tuesday":aveDay[1], "Wednesday":aveDay[2], "Thursday":aveDay[3], "Friday":aveDay[4] } print gD gF = pd.DataFrame(gD, index=['']) gF = gF[trades.weekdayList] print gF if best: titleText = "%s Best Days" %(commodity.capitalize()) sN = "%s_Best_Days.png"%(commodity.capitalize()) else: titleText = "%s Worst Days" %(commodity.capitalize()) sN = "%s_Worst_Days.png"%(commodity.capitalize()) #(commodity,str(years)) #Graphing Logic for 5 series data plt.figure() ax = gF.ix[0].plot(kind='bar', figsize=(10,5), legend=False, rot=0,#set_xticks=trades.weekdayList, color = colors, title = titleText ) plt.ylabel("Relative Rankings") #plt.ylabel("Overall Difference") plt.savefig(sN) best_of_month("corn", True) best_of_month("corn", False) best_of_month("soybeans", True) best_of_month("soybeans", False) print "This Run Finished"