import pandas as pd import requests,json from datetime import datetime, time,timedelta from json_loader import json_load from returnsDf import agg_df import warnings warnings.filterwarnings('ignore') pd.options.display.float_format = '${:,.2f}'.format one_day=timedelta(days=1) pnl_url=r'http://performance.squareoffbots.com/assets/json/sqbots_allData_21052021.json' cap_url=r'http://performance.squareoffbots.com/assets/json/newCAp21052021.json' charges_url=r'http://performance.squareoffbots.com/assets/json/charges.json' def getResources1(): charges_dic=requests.get(charges_url).json() pnl_data=requests.get(pnl_url).json() cap_data=requests.get(cap_url).json() pnl_df_t=pd.DataFrame.from_dict(pnl_data) cap_df_t=pd.DataFrame.from_dict(cap_data) pnl_df=pnl_df_t.T cap_df=cap_df_t.T return charges_dic,pnl_data,cap_data,pnl_df,cap_df,query_params botNameDic={"orb":"ORB","rsi":"RSI","it":"Intraday Trend","sh":"StopHunt","grb":"GRB","orb2pm":"ORB2pm","pcr":"NiftyOptionSelling","lapp":"Learnapp","bss":"BNF Straddle","nss":"Nifty Straddle","bos":"BNFOptionSelling","grbo":"GRB Options","bssr":"BNF Strangle","mlb":"ML Bot","bnfmon":"BNF ORB","mss":"1% Short Straddle (BNF)","mssn":"1% Short Straddle(NF)","dts":"Double Top"} botCapitalDic={"orb":50000,"rsi":50000,"it":50000,"sh":50000,"grb":300000,"orb2pm":300000,"pcr":300000,"lapp":300000,"bss":300000,"nss":300000,"bos":300000,"grbo":150000,"bssr":300000,"bnfmon":150000,"mlb":400000,"mss":300000,"mssn":300000,"dts":150000} curBots=['orb','rsi','it','grb','bss','grbo','bssr','bnfmon','mlb','mss','mssn','dts'] def strategy_statistics(): charges_dic,pnl_data,cap_data,pnl_df,cap_df,query_params=getResources1() ret_dic={} for botName in curBots: eq_bots=["orb","rsi","sh","it"] botFullName=botNameDic[botName] botCapital=botCapitalDic[botName] strat_pnl_Df=pnl_df[[botFullName]] strat_pnl_Df.dropna(inplace=True) strat_cap_df=cap_df[[botFullName]] #returns calculation strat_df=agg_df(strat_pnl_Df,strat_cap_df) ##PNL plot strat_df['pdTime']=pd.to_datetime(strat_df.index,format="%Y-%m-%d") strat_df.sort_values('pdTime',inplace=True) strat_df[botFullName+'_adj_PnL']=(botCapital/100)*strat_df[botFullName+' Returns'].astype(float) strat_df[botFullName+'_gross_PnL']=strat_df[botFullName+'_adj_PnL'] charges_types=['Brokerage','TransactionCharges','ClearingCharges','STT','GST','SEBI','StampDuty','TotalCharges'] def getCharges(x): notGotCharges=True original_date=x cDayObj=datetime.strptime(x,'%Y-%m-%d') direction=-1 direction_counter=0 while notGotCharges: try: return charges_dic[cDayObj.strftime('%Y%m%d')][botName.upper()+'_'+ct] except Exception as e: direction_counter+=1 if direction_counter==10: direction*=-1 cDayObj+=direction*one_day continue for ct in charges_types: strat_df[ct]=strat_df.index.to_series().apply(lambda x:getCharges(x)) i_fields=['PNL','Brokerage','TransactionCharges','ClearingCharges','STT','GST','SEBI','StampDuty','TotalCharges','net_PNL'] ##xxx if botName in eq_bots: i_fields=["PNL"] strat_df['net_PNL']=strat_df[botFullName+'_gross_PnL'] else: strat_df['net_PNL']=strat_df[botFullName+'_gross_PnL']-strat_df['TotalCharges'] strat_df['net_rets']=100*strat_df['net_PNL']/botCapital strat_df["Time"]=strat_df.index strat_df['PNL']=strat_df[botFullName+'_adj_PnL'] strat_df['cum_pnl']=strat_df[botFullName+'_adj_PnL'].cumsum() ##DRAWDOWN drawdown_df=strat_df.copy() drawdown_df.reset_index(drop=True,inplace=True) drawdown_df['max_value_so_far']=drawdown_df['cum_pnl'].cummax() drawdown_df['drawdown']=drawdown_df['cum_pnl']-drawdown_df['max_value_so_far'] max_drawdown=drawdown_df['drawdown'].min() ##Strategy statistics . stats_Df=pd.DataFrame(columns=["Total Days","Winning Days","Losing Days","Winning Accuracy(%)","Max Profit","Max Loss","Max Drawdown","Average Profit on Win Days","Average Profit on loss days","Average Profit Per day","Gross Profit","Charges","Net profit","Returns (%)","net Returns (%)"]) total_days=len(strat_df) win_df=strat_df[strat_df[botFullName+'_adj_PnL'].astype('float')>0] lose_df=strat_df[strat_df[botFullName+'_adj_PnL'].astype('float')<0] noTrade_df=strat_df[strat_df[botFullName+'_adj_PnL'].astype('float')==0] win_days=len(win_df) lose_days=len(lose_df) win_ratio=win_days*100.0/(lose_days+win_days) max_profit=strat_df[botFullName+'_adj_PnL'].max() max_loss=strat_df[botFullName+'_adj_PnL'].min() # max_drawdown=0 win_average_profit=win_df[botFullName+'_adj_PnL'].sum()/win_days loss_average_profit=lose_df[botFullName+'_adj_PnL'].sum()/lose_days total_profit=strat_df[botFullName+'_adj_PnL'].sum() if botName not in eq_bots: total_charges=strat_df['TotalCharges'].sum() else: total_charges=0 net_profit=total_profit-total_charges average_profit=total_profit/total_days gross_returns=strat_df[botFullName+' Returns'].sum() net_returns=strat_df['net_rets'].sum() results_row=[total_days,win_days,lose_days,win_ratio,max_profit,max_loss,max_drawdown,win_average_profit,loss_average_profit,average_profit,total_profit,total_charges,net_profit,gross_returns,net_returns] results_row=[results_row[i] if i<3 else round(results_row[i],2) for i in range(len(results_row)) ] stats_Df.loc[0,:]=results_row t_stats_Df=stats_Df.T t_stats_Df.rename(columns={0:''},inplace=True) strat_df['month']=strat_df['pdTime'].apply(lambda x:x.strftime('%b,%Y')) month_groups=strat_df.groupby('month',sort=False)[i_fields].sum() ##last 30 days pnl strat_df=strat_df.reindex(strat_df.index[::-1]) if botName in eq_bots: capital_used_appendum='' else: capital_used_appendum=' per Lot' ret_dic[botName]=[botCapital,capital_used_appendum,results_row,t_stats_Df,month_groups,strat_df,i_fields,botFullName] return ret_dic def lambda_handler(event,context): ret_dic=strategy_statistics() ret_dic_js=json.dumps(ret_dic) print(ret_dic_js)