def print_monthly_ks(fund_ts, years, ostream): """ @summary prints monthly returns for given fund and years to the given stream @param fund_ts: pandas fund time series @param years: list of years to print out @param ostream: stream to print to """ ostream.write(" ") month_names = du.getMonthNames() for name in month_names: ostream.write(" " + str(name)) ostream.write("\n") # mrets = tsu.monthly(fund_ts) m_str = [] for i, year in enumerate(years): months = du.getMonths(fund_ts, year) for j, month in enumerate(months): if i == 0 and j < 3: m_str.append(' ') else: # dt_st = max(fund_ts.index[0], dt.datetime(year, month, 1)-relativedelta(months=6)) dt_st = fund_ts.index[0] dt_today = dt.datetime(year, month, 1) - relativedelta(months=2) dt_end = min( dt.datetime(year, month, 1) + relativedelta(months=1) + dt.timedelta(hours=-5), fund_ts.index[-1]) fund_ts_past = fund_ts.ix[dt_st:dt_today] fund_ts_month = fund_ts.ix[dt_today:dt_end] ks, p = ks_statistic_calc(fund_ts_past, fund_ts_month) if not (ks == -1 or p == -1): if ks < p: m_str.append('PASS') else: m_str.append('FAIL') else: m_str.append(' ') i = 0 for year in years: ostream.write(str(year)) months = du.getMonths(fund_ts, year) for k in range(1, months[0]): ostream.write(" ") for month in months: ostream.write("%7s" % (m_str[i])) i = i + 1 ostream.write("\n")
def print_monthly_ks(fund_ts, years, ostream): """ @summary prints monthly returns for given fund and years to the given stream @param fund_ts: pandas fund time series @param years: list of years to print out @param ostream: stream to print to """ ostream.write(" ") month_names = du.getMonthNames() for name in month_names: ostream.write(" " + str(name)) ostream.write("\n") # mrets = tsu.monthly(fund_ts) m_str = [] for i, year in enumerate(years): months = du.getMonths(fund_ts, year) for j, month in enumerate(months): if i == 0 and j < 3: m_str.append(' ') else: # dt_st = max(fund_ts.index[0], dt.datetime(year, month, 1)-relativedelta(months=6)) dt_st = fund_ts.index[0] dt_today = dt.datetime(year, month, 1) - relativedelta(months=2) dt_end = min(dt.datetime(year, month, 1) + relativedelta(months=1) + dt.timedelta(hours=-5), fund_ts.index[-1]) fund_ts_past = fund_ts.ix[dt_st: dt_today] fund_ts_month = fund_ts.ix[dt_today: dt_end] ks, p = ks_statistic_calc(fund_ts_past, fund_ts_month) if not(ks == -1 or p == -1): if ks < p: m_str.append('PASS') else: m_str.append('FAIL') else: m_str.append(' ') i = 0 for year in years: ostream.write(str(year)) months = du.getMonths(fund_ts, year) for k in range(1, months[0]): ostream.write(" ") for month in months: ostream.write("%7s" % (m_str[i])) i = i + 1 ostream.write("\n")
def monthly(funds): """ @summary Computes monthly returns centered around 0 @param funds: A time series containing daily fund values @return an array of monthly returns """ funds2 = [] last_last_month = -1 years = qsdateutil.getYears(funds) for year in years: months = qsdateutil.getMonths(funds, year) for month in months: last_this_month = qsdateutil.getLastDay(funds, year, month) if last_last_month == -1 : last_last_month=qsdateutil.getFirstDay(funds, year, month) if type(funds).__name__=='TimeSeries': funds2.append(funds[last_this_month]/funds[last_last_month]-1) else: funds2.append(funds.xs(last_this_month)/funds.xs(last_last_month)-1) last_last_month = last_this_month return(funds2)
def average_monthly(funds): """ @summary Computes average monthly returns centered around 0 @param funds: A time series containing daily fund values @return an array of average monthly returns """ rets = daily(funds) ret_i = 0 years = qsdateutil.getYears(funds) averages = [] for year in years: months = qsdateutil.getMonths(funds, year) for month in months: avg = 0 count = 0 days = qsdateutil.getDays(funds, year, month) for day in days: avg += rets[ret_i] ret_i += 1 count += 1 averages.append(float(avg) / count) return (averages)
def average_monthly(funds): """ @summary Computes average monthly returns centered around 0 @param funds: A time series containing daily fund values @return an array of average monthly returns """ rets = daily(funds) ret_i = 0 years = qsdateutil.getYears(funds) averages = [] for year in years: months = qsdateutil.getMonths(funds, year) for month in months: avg = 0 count = 0 days = qsdateutil.getDays(funds, year, month) for day in days: avg += rets[ret_i] ret_i += 1 count += 1 averages.append(float(avg) / count) return(averages)
def print_monthly_returns(fund_ts, years, ostream): """ @summary prints monthly returns for given fund and years to the given stream @param fund_ts: pandas fund time series @param years: list of years to print out @param ostream: stream to print to """ ostream.write(" ") month_names = du.getMonthNames() for name in month_names: ostream.write(" " + str(name)) ostream.write("\n") i = 0 mrets = tsu.monthly(fund_ts) for year in years: ostream.write(str(year)) months = du.getMonths(fund_ts, year) for k in range(1, months[0]): ostream.write(" ") for month in months: ostream.write(" % + 6.2f" % (mrets[i] * 100)) i += 1 ostream.write("\n")
def monthly(funds): """ @summary Computes monthly returns centered around 0 @param funds: A time series containing daily fund values @return an array of monthly returns """ funds2 = [] last_last_month = -1 years = qsdateutil.getYears(funds) for year in years: months = qsdateutil.getMonths(funds, year) for month in months: last_this_month = qsdateutil.getLastDay(funds, year, month) if last_last_month == -1: last_last_month = qsdateutil.getFirstDay(funds, year, month) if type(funds).__name__ == 'TimeSeries': funds2.append(funds[last_this_month] / funds[last_last_month] - 1) else: funds2.append( funds.xs(last_this_month) / funds.xs(last_last_month) - 1) last_last_month = last_this_month return (funds2)
def print_monthly_returns(fund_ts, years, ostream): """ @summary prints monthly returns for given fund and years to the given stream @param fund_ts: pandas fund time series @param years: list of years to print out @param ostream: stream to print to """ ostream.write(" ") month_names = du.getMonthNames() for name in month_names: ostream.write(" " + str(name)) ostream.write("\n") i = 0 mrets = tsu.monthly(fund_ts) for year in years: ostream.write(str(year)) months = du.getMonths(fund_ts, year) for k in range(1, months[0]): ostream.write(" ") for month in months: ostream.write(" % + 6.2f" % (mrets[i]*100)) i += 1 ostream.write("\n")
def reportFunctionality(funds, symbols, filename=sys.stdout): if (len(symbols) != 0): funds2 = runOther(funds, symbols) arg2 = 1 else: arg2 = 0 if (filename == sys.stdout): html_file = sys.stdout else: html_file = open(filename, "w") #top html_file.write("<HTML>\n") html_file.write("<HEAD>\n") html_file.write("<TITLE>QSTK Generated Report from " + readableDate(funds.index[0]) + " to " + readableDate(funds.index[-1]) + "</TITLE>\n") html_file.write("</HEAD>\n\n") html_file.write("<BODY><CENTER>\n\n") years = du.getYears(funds) html_file.write("<H2>Performance Summary for " + sys.argv[1] + "</H2>\n") html_file.write("For the dates " + readableDate(funds.index[0]) + " to " + readableDate(funds.index[-1]) + "\n") html_file.write("<H3>Yearly Performance Metrics</H3>\n") html_file.write("<TABLE CELLPADDING=10>\n") html_file.write("<TR><TH></TH>\n") for year in years: html_file.write("<TH>" + str(year) + "</TH>\n") html_file.write("</TR>\n") #yearly return html_file.write("<TR>\n") html_file.write("<TH>Annualized Return:</TH>\n") for year in years: retur = getYearReturn(funds, year) html_file.write("<TD>\n") print >> html_file, "%.2f\n" % (retur * 100) html_file.write("%</TD>\n") html_file.write("</TR>\n") #yearly winning days html_file.write("<TR>\n") html_file.write("<TH>Winning Days:</TH>\n") for year in years: # change to compare to inputs - ratio=tsu.getYearRatio(funds,year) if (arg2 != 0): win = getWinningDays(funds, funds2, year) html_file.write("<TD>\n") print >> html_file, "%.2f\n" % (win * 100) html_file.write("%</TD>\n") else: html_file.write("<TD>No comparison.</TD>\n") html_file.write("</TR>\n") #max draw down html_file.write("<TR>\n") html_file.write("<TH>Max Draw Down:</TH>\n") for year in years: drop = getYearMaxDrop(funds, year) html_file.write("<TD>\n") print >> html_file, "%.2f" % (drop * 100) html_file.write("%</TD>\n") html_file.write("</TR>\n") #yearly sharpe ratio using daily rets html_file.write("<TR>\n") html_file.write("<TH>Daily Sharpe Ratio:</TH>\n") for year in years: ratio = tsu.getYearRatio(funds, year) html_file.write("<TD>\n") print >> html_file, "%.2f\n" % ratio html_file.write("</TD>\n") html_file.write("</TR>\n") #yearly sharpe ratio using monthly rets html_file.write("<TR>\n") html_file.write("<TH>Monthly Sharpe Ratio:</TH>\n") for year in years: ratio = getYearRatioUsingMonth(funds, year) html_file.write("<TD>\n") print >> html_file, "%.2f\n" % ratio html_file.write("</TD>\n") html_file.write("</TR>\n") html_file.write("</TABLE>\n") html_file.write("<BR/>\n\n") vals = funds.values vals2 = np.append(vals, funds2.values, 2) df = DataMatrix(index=funds.index, data=funds.values, columns=['fund']) df2 = DataMatrix(index=funds2.index, data=funds2.values, columns=['other']) df['other'] = df2['other'] corrcoef = numpy.corrcoef(funds.values[0:-1], funds2.values) html_file.write("<H3>Correlation=") print >> html_file, "%.2f\n" % corrcoef[0][1] html_file.write("<H3>\n") html_file.write("<BR/>\n\n") #montly returns mrets = tsu.monthly(funds) html_file.write("<H2>Monthly Returns</H2>\n") html_file.write("<TABLE CELLPADDING=10>\n") html_file.write("<TR>\n") html_file.write("<TH></TH>\n") month_names = du.getMonthNames() for name in month_names: html_file.write("<TH>" + str(name) + "</TH>\n") html_file.write("</TR>\n") i = 0 for year in years: html_file.write("<TR>\n") html_file.write("<TH>" + str(year) + "</TH>\n") months = du.getMonths(funds, year) for month in months: html_file.write("<TD>\n") print >> html_file, "%.2f\n" % (mrets[i] * 100) html_file.write("%</TD>\n") i += 1 html_file.write("</TR>\n") html_file.write("</TABLE>\n") html_file.write("<BR/>\n\n") #fund value graph fundlist = [] fundlist.append(funds) fundlist.append(funds2) converter.fundsToPNG(fundlist, 'funds.png') html_file.write("<IMG SRC=\'./funds.png\'/>\n") html_file.write("<BR/>\n\n") #end html_file.write("</CENTER></BODY>\n\n") html_file.write("</HTML>")
def reportFunctionality(funds, symbols,filename=sys.stdout): if(len(symbols)!=0): funds2=runOther(funds,symbols) arg2=1 else: arg2=0 if(filename==sys.stdout): html_file=sys.stdout else: html_file = open(filename,"w") #top html_file.write("<HTML>\n") html_file.write("<HEAD>\n") html_file.write("<TITLE>QSTK Generated Report from "+readableDate(funds.index[0])+" to "+readableDate(funds.index[-1])+"</TITLE>\n") html_file.write("</HEAD>\n\n") html_file.write("<BODY><CENTER>\n\n") years=du.getYears(funds) html_file.write("<H2>Performance Summary for "+sys.argv[1]+"</H2>\n") html_file.write("For the dates "+readableDate(funds.index[0])+" to "+readableDate(funds.index[-1])+"\n") html_file.write("<H3>Yearly Performance Metrics</H3>\n") html_file.write("<TABLE CELLPADDING=10>\n") html_file.write("<TR><TH></TH>\n") for year in years: html_file.write("<TH>"+str(year)+"</TH>\n") html_file.write("</TR>\n") #yearly return html_file.write("<TR>\n") html_file.write("<TH>Annualized Return:</TH>\n") for year in years: retur=getYearReturn(funds,year) html_file.write("<TD>\n") print >>html_file, "%.2f\n" % (retur*100) html_file.write("%</TD>\n") html_file.write("</TR>\n") #yearly winning days html_file.write("<TR>\n") html_file.write("<TH>Winning Days:</TH>\n") for year in years: # change to compare to inputs - ratio=tsu.getYearRatio(funds,year) if(arg2!=0): win=getWinningDays(funds,funds2,year) html_file.write("<TD>\n") print >>html_file, "%.2f\n" % (win*100) html_file.write("%</TD>\n") else: html_file.write("<TD>No comparison.</TD>\n") html_file.write("</TR>\n") #max draw down html_file.write("<TR>\n") html_file.write("<TH>Max Draw Down:</TH>\n") for year in years: drop=getYearMaxDrop(funds,year) html_file.write("<TD>\n") print >>html_file, "%.2f" % (drop*100) html_file.write("%</TD>\n") html_file.write("</TR>\n") #yearly sharpe ratio using daily rets html_file.write("<TR>\n") html_file.write("<TH>Daily Sharpe Ratio:</TH>\n") for year in years: ratio=tsu.getYearRatio(funds,year) html_file.write("<TD>\n") print >>html_file, "%.2f\n" % ratio html_file.write("</TD>\n") html_file.write("</TR>\n") #yearly sharpe ratio using monthly rets html_file.write("<TR>\n") html_file.write("<TH>Monthly Sharpe Ratio:</TH>\n") for year in years: ratio=getYearRatioUsingMonth(funds,year) html_file.write("<TD>\n") print >>html_file, "%.2f\n" % ratio html_file.write("</TD>\n") html_file.write("</TR>\n") html_file.write("</TABLE>\n") html_file.write("<BR/>\n\n") vals=funds.values; vals2=np.append(vals,funds2.values,2) df=DataMatrix(index=funds.index,data=funds.values, columns=['fund']) df2=DataMatrix(index=funds2.index,data=funds2.values,columns=['other']) df['other']=df2['other'] corrcoef=numpy.corrcoef(funds.values[0:-1],funds2.values) html_file.write("<H3>Correlation=") print >>html_file, "%.2f\n" % corrcoef[0][1] html_file.write("<H3>\n") html_file.write("<BR/>\n\n") #montly returns mrets=tsu.monthly(funds) html_file.write("<H2>Monthly Returns</H2>\n") html_file.write("<TABLE CELLPADDING=10>\n") html_file.write("<TR>\n") html_file.write("<TH></TH>\n") month_names=du.getMonthNames() for name in month_names: html_file.write("<TH>"+str(name)+"</TH>\n") html_file.write("</TR>\n") i=0 for year in years: html_file.write("<TR>\n") html_file.write("<TH>"+str(year)+"</TH>\n") months=du.getMonths(funds,year) for month in months: html_file.write("<TD>\n") print >>html_file, "%.2f\n" % (mrets[i]*100) html_file.write("%</TD>\n") i+=1 html_file.write("</TR>\n") html_file.write("</TABLE>\n") html_file.write("<BR/>\n\n") #fund value graph fundlist=[]; fundlist.append(funds) fundlist.append(funds2) converter.fundsToPNG(fundlist,'funds.png') html_file.write("<IMG SRC=\'./funds.png\'/>\n") html_file.write("<BR/>\n\n") #end html_file.write("</CENTER></BODY>\n\n") html_file.write("</HTML>")