anaucoin commited on
Commit
c2af8dc
·
1 Parent(s): a93e034

2 DCA update

Browse files
Files changed (1) hide show
  1. app.py +42 -30
app.py CHANGED
@@ -114,13 +114,19 @@ def load_data(filename, otimeheader, fmat):
114
  df['Trade'] = df.index + 1 #reindex
115
 
116
  df['DCA'] = np.nan
117
-
118
  for exit in pd.unique(df['Exit Date']):
119
  df_exit = df[df['Exit Date']==exit]
120
- for i in range(len(df_exit)):
121
- ind = df_exit.index[i]
122
- df.loc[ind,'DCA'] = i+1
123
- return df
 
 
 
 
 
 
124
 
125
  def runapp():
126
  bot_selections = "Cinnamon Toast"
@@ -171,16 +177,25 @@ def runapp():
171
  lev = st.number_input('Leverage', min_value=1, value=1, max_value= 5, step=1)
172
  with col1:
173
  principal_balance = st.number_input('Starting Balance', min_value=0.00, value=1000.00, max_value= dollar_cap, step=.01)
174
- with st.container():
175
- col1, col2, col3, col4 = st.columns(4)
176
- with col1:
177
- dca1 = st.number_input('DCA 1 Allocation', min_value=0, value=25, max_value= 100, step=1)
178
- with col2:
179
- dca2 = st.number_input('DCA 2 Allocation', min_value=0, value=25, max_value= 100, step=1)
180
- with col3:
181
- dca3 = st.number_input('DCA 3 Allocation', min_value=0, value=25, max_value= 100, step=1)
182
- with col4:
183
- dca4 = st.number_input('DCA 4 Allocation', min_value=0, value=25, max_value= 100, step=1)
 
 
 
 
 
 
 
 
 
184
 
185
  #hack way to get button centered
186
  c = st.columns(9)
@@ -188,10 +203,10 @@ def runapp():
188
  submitted = st.form_submit_button("Get Cookin'!")
189
 
190
  signal_map = {'Long': 1, 'Short':-1} # 1 for long #-1 for short
191
-
192
- df['Calculated Return %'] = .25*(1-fees)*(df['Signal'].map(signal_map)*(df['Sell Price']-df['Buy Price'])/df['Buy Price'] - fees) #accounts for fees on open and close of trade
193
-
194
-
195
  if submitted and principal_balance * lev > dollar_cap:
196
  lev = np.floor(dollar_cap/principal_balance)
197
  st.error(f"WARNING: (Starting Balance)*(Leverage) exceeds the ${dollar_cap} limit. Using maximum available leverage of {lev}")
@@ -204,13 +219,10 @@ def runapp():
204
  no_errors = False
205
  if no_errors:
206
 
207
- dca_map = {1: dca1/100, 2: dca2/100, 3: dca3/100, 4: dca4/100}
208
-
209
  df['DCA %'] = df['DCA'].map(dca_map)
210
-
211
- signal_map = {'Long': 1, 'Short':-1} # 1 for long #-1 for short
212
-
213
  df['Calculated Return %'] = df['Signal'].map(signal_map)*(df['DCA %'])*(1-fees)*((df['Sell Price']-df['Buy Price'])/df['Buy Price'] - fees) #accounts for fees on open and close of trade
 
214
 
215
  df['Return Per Trade'] = np.nan
216
  df['Balance used in Trade'] = np.nan
@@ -313,26 +325,26 @@ def runapp():
313
  "",#f"{(1+get_rolling_stats(df,otimeheader, 30))*principal_balance:.2f}",
314
  f"{get_rolling_stats(df,lev, otimeheader, 180):.2f}%",
315
  )
316
- if submitted:
317
  grouped_df = df.groupby('Exit Date').agg({'Signal':'min','Entry Date': 'min','Exit Date': 'max','Buy Price': 'mean',
318
  'Sell Price' : 'max',
319
  'Net P/L Per Trade': 'mean',
320
  'Calculated Return %' : lambda x: np.round(100*lev*x.sum(),2),
321
- 'DCA': 'max'})
322
  grouped_df.index = range(1, len(grouped_df)+1)
323
  grouped_df.rename(columns={'DCA' : '# of DCAs', 'Buy Price':'Avg. Buy Price',
324
  'Net P/L Per Trade':'Net P/L',
325
  'Calculated Return %':'P/L %'}, inplace=True)
326
- else:
327
  grouped_df = df.groupby('Exit Date').agg({'Signal':'min','Entry Date': 'min','Exit Date': 'max','Buy Price': 'mean',
328
  'Sell Price' : 'max',
329
  'P/L per token': 'mean',
330
  'Calculated Return %' : lambda x: np.round(100*x.sum(),2),
331
- 'DCA': 'max'})
332
  grouped_df.index = range(1, len(grouped_df)+1)
333
  grouped_df.rename(columns={'DCA' : '# of DCAs', 'Buy Price':'Avg. Buy Price',
334
- 'P/L per token':'Net P/L',
335
- 'Calculated Return %':'P/L %'}, inplace=True)
336
 
337
  st.subheader("Trade Logs")
338
  st.dataframe(grouped_df.style.format({'Avg. Buy Price': '${:.2f}', 'Sell Price': '${:.2f}','# of DCAs':'{:.0f}', 'Net P/L':'${:.2f}', 'P/L %' :'{:.2f}%'})\
 
114
  df['Trade'] = df.index + 1 #reindex
115
 
116
  df['DCA'] = np.nan
117
+
118
  for exit in pd.unique(df['Exit Date']):
119
  df_exit = df[df['Exit Date']==exit]
120
+ if dateutil.parser.parse(str(exit)) < dateutil.parser.parse('2023-02-07 00:13:00'):
121
+ for i in range(len(df_exit)):
122
+ ind = df_exit.index[i]
123
+ df.loc[ind,'DCA'] = i+1
124
+
125
+ else:
126
+ for i in range(len(df_exit)):
127
+ ind = df_exit.index[i]
128
+ df.loc[ind,'DCA'] = i+1.1
129
+ return df
130
 
131
  def runapp():
132
  bot_selections = "Cinnamon Toast"
 
177
  lev = st.number_input('Leverage', min_value=1, value=1, max_value= 5, step=1)
178
  with col1:
179
  principal_balance = st.number_input('Starting Balance', min_value=0.00, value=1000.00, max_value= dollar_cap, step=.01)
180
+ st.write("Choose your DCA setup (for trades before 02/07/2023)")
181
+ with st.container():
182
+ col1, col2, col3, col4 = st.columns(4)
183
+ with col1:
184
+ dca1 = st.number_input('DCA 1 Allocation', min_value=0, value=25, max_value= 100, step=1)
185
+ with col2:
186
+ dca2 = st.number_input('DCA 2 Allocation', min_value=0, value=25, max_value= 100, step=1)
187
+ with col3:
188
+ dca3 = st.number_input('DCA 3 Allocation', min_value=0, value=25, max_value= 100, step=1)
189
+ with col4:
190
+ dca4 = st.number_input('DCA 4 Allocation', min_value=0, value=25, max_value= 100, step=1)
191
+ st.write("Choose your DCA setup (for trades on or after 02/07/2023)")
192
+ with st.container():
193
+ col1, col2 = st.columns(2)
194
+ with col1:
195
+ dca5 = st.number_input('DCA 1 Allocation', min_value=0, value=50, max_value= 100, step=1)
196
+ with col2:
197
+ dca6 = st.number_input('DCA 2 Allocation', min_value=0, value=50, max_value= 100, step=1)
198
+
199
 
200
  #hack way to get button centered
201
  c = st.columns(9)
 
203
  submitted = st.form_submit_button("Get Cookin'!")
204
 
205
  signal_map = {'Long': 1, 'Short':-1} # 1 for long #-1 for short
206
+ dca_map = {1: 25/100, 2: 25/100, 3: 25/100, 4: 25/100, 1.1: 50/100, 2.1: 50/100}
207
+ df['DCA %'] = df['DCA'].map(dca_map)
208
+ df['Calculated Return %'] = (df['DCA %'])*(1-fees)*((df['Sell Price']-df['Buy Price'])/df['Buy Price'] - fees) #accounts for fees on open and close of trade
209
+
210
  if submitted and principal_balance * lev > dollar_cap:
211
  lev = np.floor(dollar_cap/principal_balance)
212
  st.error(f"WARNING: (Starting Balance)*(Leverage) exceeds the ${dollar_cap} limit. Using maximum available leverage of {lev}")
 
219
  no_errors = False
220
  if no_errors:
221
 
222
+ dca_map = {1: dca1/100, 2: dca2/100, 3: dca3/100, 4: dca4/100, 1.1: dca5/100, 2.1: dca6/100}
 
223
  df['DCA %'] = df['DCA'].map(dca_map)
 
 
 
224
  df['Calculated Return %'] = df['Signal'].map(signal_map)*(df['DCA %'])*(1-fees)*((df['Sell Price']-df['Buy Price'])/df['Buy Price'] - fees) #accounts for fees on open and close of trade
225
+ df['DCA'] = np.floor(df['DCA'].values)
226
 
227
  df['Return Per Trade'] = np.nan
228
  df['Balance used in Trade'] = np.nan
 
325
  "",#f"{(1+get_rolling_stats(df,otimeheader, 30))*principal_balance:.2f}",
326
  f"{get_rolling_stats(df,lev, otimeheader, 180):.2f}%",
327
  )
328
+ if submitted:
329
  grouped_df = df.groupby('Exit Date').agg({'Signal':'min','Entry Date': 'min','Exit Date': 'max','Buy Price': 'mean',
330
  'Sell Price' : 'max',
331
  'Net P/L Per Trade': 'mean',
332
  'Calculated Return %' : lambda x: np.round(100*lev*x.sum(),2),
333
+ 'DCA': lambda x: int(np.floor(x.max()))})
334
  grouped_df.index = range(1, len(grouped_df)+1)
335
  grouped_df.rename(columns={'DCA' : '# of DCAs', 'Buy Price':'Avg. Buy Price',
336
  'Net P/L Per Trade':'Net P/L',
337
  'Calculated Return %':'P/L %'}, inplace=True)
338
+ else:
339
  grouped_df = df.groupby('Exit Date').agg({'Signal':'min','Entry Date': 'min','Exit Date': 'max','Buy Price': 'mean',
340
  'Sell Price' : 'max',
341
  'P/L per token': 'mean',
342
  'Calculated Return %' : lambda x: np.round(100*x.sum(),2),
343
+ 'DCA': lambda x: int(np.floor(x.max()))})
344
  grouped_df.index = range(1, len(grouped_df)+1)
345
  grouped_df.rename(columns={'DCA' : '# of DCAs', 'Buy Price':'Avg. Buy Price',
346
+ 'Calculated Return %':'P/L %',
347
+ 'P/L per token':'Net P/L'}, inplace=True)
348
 
349
  st.subheader("Trade Logs")
350
  st.dataframe(grouped_df.style.format({'Avg. Buy Price': '${:.2f}', 'Sell Price': '${:.2f}','# of DCAs':'{:.0f}', 'Net P/L':'${:.2f}', 'P/L %' :'{:.2f}%'})\