Spaces:
Sleeping
Sleeping
anaucoin commited on
Commit ·
c2af8dc
1
Parent(s): a93e034
2 DCA update
Browse files
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 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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['
|
| 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':
|
| 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':
|
| 332 |
grouped_df.index = range(1, len(grouped_df)+1)
|
| 333 |
grouped_df.rename(columns={'DCA' : '# of DCAs', 'Buy Price':'Avg. Buy Price',
|
| 334 |
-
'
|
| 335 |
-
'
|
| 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}%'})\
|