James McCool commited on
Commit
4d1ad75
·
1 Parent(s): 232eb2a

Add trim slack parameter to portfolio trimming functionality in app.py and trim_portfolio.py, allowing for more flexible threshold adjustments during portfolio management.

Browse files
Files changed (2) hide show
  1. app.py +2 -1
  2. global_func/trim_portfolio.py +3 -3
app.py CHANGED
@@ -912,6 +912,7 @@ with tab2:
912
  with st.form(key='trim_form'):
913
  performance_type = st.selectbox("Select Sorting variable", ['median', 'Finish_percentile'])
914
  own_type = st.selectbox("Select trimming variable", ['Own', 'Geomean', 'Weighted Own'])
 
915
  performance_threshold_high = st.number_input("Select performance threshold (will only trim if sorting variable is lower than this)", value=st.session_state['portfolio'][performance_type].max(), min_value=0.0, step=1.0)
916
  performance_threshold_low = st.number_input("Select performance threshold (will only trim if sorting variable is higher than this)", value=0.0, min_value=0.0, step=1.0)
917
  own_threshold_high = st.number_input("Select own threshold (will only trim if trimming variable is lower than this)", value=st.session_state['portfolio'][own_type].max(), min_value=0.0, step=1.0)
@@ -949,7 +950,7 @@ with tab2:
949
  )
950
  st.session_state['portfolio'] = st.session_state['portfolio'][lock_mask]
951
 
952
- st.session_state['portfolio'] = trim_portfolio(st.session_state['portfolio'], performance_type, own_type, performance_threshold_high, performance_threshold_low, own_threshold_high, own_threshold_low)
953
  st.session_state['portfolio'] = st.session_state['portfolio'].sort_values(by='median', ascending=False)
954
 
955
  with col2:
 
912
  with st.form(key='trim_form'):
913
  performance_type = st.selectbox("Select Sorting variable", ['median', 'Finish_percentile'])
914
  own_type = st.selectbox("Select trimming variable", ['Own', 'Geomean', 'Weighted Own'])
915
+ trim_slack_var = st.number_input("Select trim slack (percentile addition to trimming variable ceiling)", value=0.0, min_value=0.0, max_value=1.0, step=0.1)
916
  performance_threshold_high = st.number_input("Select performance threshold (will only trim if sorting variable is lower than this)", value=st.session_state['portfolio'][performance_type].max(), min_value=0.0, step=1.0)
917
  performance_threshold_low = st.number_input("Select performance threshold (will only trim if sorting variable is higher than this)", value=0.0, min_value=0.0, step=1.0)
918
  own_threshold_high = st.number_input("Select own threshold (will only trim if trimming variable is lower than this)", value=st.session_state['portfolio'][own_type].max(), min_value=0.0, step=1.0)
 
950
  )
951
  st.session_state['portfolio'] = st.session_state['portfolio'][lock_mask]
952
 
953
+ st.session_state['portfolio'] = trim_portfolio(st.session_state['portfolio'], trim_slack_var, performance_type, own_type, performance_threshold_high, performance_threshold_low, own_threshold_high, own_threshold_low)
954
  st.session_state['portfolio'] = st.session_state['portfolio'].sort_values(by='median', ascending=False)
955
 
956
  with col2:
global_func/trim_portfolio.py CHANGED
@@ -1,12 +1,12 @@
1
  import pandas as pd
2
 
3
- def trim_portfolio(portfolio: pd.DataFrame, performance_type: str, own_type: str, performance_threshold_high: float, performance_threshold_low: float, own_threshold_high: float, own_threshold_low: float):
4
  if performance_type == 'Finish_percentile':
5
  working_portfolio = portfolio.sort_values(by=performance_type, ascending = True).reset_index(drop=True)
6
  else:
7
  working_portfolio = portfolio.sort_values(by=performance_type, ascending = False).reset_index(drop=True)
8
  rows_to_drop = []
9
- curr_own_type_max = working_portfolio.loc[0, own_type]
10
 
11
  for i in range(1, len(working_portfolio)):
12
  if working_portfolio.loc[i, own_type] > curr_own_type_max and \
@@ -16,7 +16,7 @@ def trim_portfolio(portfolio: pd.DataFrame, performance_type: str, own_type: str
16
  working_portfolio.loc[i, own_type] <= own_threshold_high:
17
  rows_to_drop.append(i)
18
  else:
19
- curr_own_type_max = working_portfolio.loc[i, own_type]
20
 
21
  working_portfolio = working_portfolio.drop(rows_to_drop).reset_index(drop=True)
22
  return working_portfolio
 
1
  import pandas as pd
2
 
3
+ def trim_portfolio(portfolio: pd.DataFrame, trim_slack: float, performance_type: str, own_type: str, performance_threshold_high: float, performance_threshold_low: float, own_threshold_high: float, own_threshold_low: float):
4
  if performance_type == 'Finish_percentile':
5
  working_portfolio = portfolio.sort_values(by=performance_type, ascending = True).reset_index(drop=True)
6
  else:
7
  working_portfolio = portfolio.sort_values(by=performance_type, ascending = False).reset_index(drop=True)
8
  rows_to_drop = []
9
+ curr_own_type_max = working_portfolio.loc[0, own_type] + (trim_slack * working_portfolio.loc[0, own_type])
10
 
11
  for i in range(1, len(working_portfolio)):
12
  if working_portfolio.loc[i, own_type] > curr_own_type_max and \
 
16
  working_portfolio.loc[i, own_type] <= own_threshold_high:
17
  rows_to_drop.append(i)
18
  else:
19
+ curr_own_type_max = working_portfolio.loc[i, own_type] + (trim_slack * working_portfolio.loc[0, own_type])
20
 
21
  working_portfolio = working_portfolio.drop(rows_to_drop).reset_index(drop=True)
22
  return working_portfolio