Tonic commited on
Commit
7a5abd6
·
1 Parent(s): b7e9276

adds advanced trading signals

Browse files
Files changed (1) hide show
  1. app.py +56 -24
app.py CHANGED
@@ -1135,24 +1135,39 @@ def detect_market_regime(returns: pd.Series, n_regimes: int = 3) -> Dict:
1135
  # Use HMM for regime detection
1136
  # Convert pandas Series to numpy array for reshape
1137
  returns_array = returns.dropna().values
1138
- model = hmm.GaussianHMM(n_components=n_regimes, random_state=42, covariance_type="full")
1139
- model.fit(returns_array.reshape(-1, 1))
1140
 
1141
- # Get regime probabilities for the last observation
1142
- regime_probs = model.predict_proba(returns_array.reshape(-1, 1))
1143
- current_regime = model.predict(returns_array.reshape(-1, 1))[-1]
1144
-
1145
- # Calculate regime characteristics
1146
- regime_means = model.means_.flatten()
1147
- regime_vols = np.sqrt(model.covars_.diagonal(axis1=1, axis2=2))
1148
-
1149
- return {
1150
- "regime": int(current_regime),
1151
- "probabilities": regime_probs[-1].tolist(),
1152
- "means": regime_means.tolist(),
1153
- "volatilities": regime_vols.tolist(),
1154
- "method": "HMM"
1155
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1156
  else:
1157
  # Simplified regime detection using volatility clustering
1158
  volatility = returns.rolling(window=20).std().dropna()
@@ -1809,6 +1824,9 @@ def create_interface():
1809
 
1810
  gr.Markdown("### Trading Signals")
1811
  daily_signals = gr.JSON(label="Trading Signals")
 
 
 
1812
 
1813
  with gr.Column():
1814
  gr.Markdown("### Sector & Financial Analysis")
@@ -2030,7 +2048,21 @@ def create_interface():
2030
  "ensemble_weights": ensemble_weights
2031
  }
2032
 
2033
- return signals, fig, product_metrics, risk_metrics, sector_metrics, regime_metrics, stress_results, ensemble_metrics
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2034
  except Exception as e:
2035
  error_message = str(e)
2036
  if "Market is currently closed" in error_message:
@@ -2043,7 +2075,7 @@ def create_interface():
2043
 
2044
  # Daily analysis button click
2045
  def daily_analysis(s: str, pd: int, ld: int, st: str, ue: bool, urd: bool, ust: bool,
2046
- rfr: float, mi: str, cw: float, tw: float, sw: float) -> Tuple[Dict, go.Figure, Dict, Dict, Dict, Dict, Dict, Dict]:
2047
  """
2048
  Process daily timeframe stock analysis with advanced features.
2049
 
@@ -2072,12 +2104,12 @@ def create_interface():
2072
  use_ensemble, use_regime_detection, use_stress_testing, risk_free_rate, market_index,
2073
  chronos_weight, technical_weight, statistical_weight],
2074
  outputs=[daily_signals, daily_plot, daily_metrics, daily_risk_metrics, daily_sector_metrics,
2075
- daily_regime_metrics, daily_stress_results, daily_ensemble_metrics]
2076
  )
2077
 
2078
  # Hourly analysis button click
2079
  def hourly_analysis(s: str, pd: int, ld: int, st: str, ue: bool, urd: bool, ust: bool,
2080
- rfr: float, mi: str, cw: float, tw: float, sw: float) -> Tuple[Dict, go.Figure, Dict, Dict, Dict, Dict, Dict, Dict]:
2081
  """
2082
  Process hourly timeframe stock analysis with advanced features.
2083
 
@@ -2106,12 +2138,12 @@ def create_interface():
2106
  use_ensemble, use_regime_detection, use_stress_testing, risk_free_rate, market_index,
2107
  chronos_weight, technical_weight, statistical_weight],
2108
  outputs=[hourly_signals, hourly_plot, hourly_metrics, hourly_risk_metrics, hourly_sector_metrics,
2109
- hourly_regime_metrics, hourly_stress_results, hourly_ensemble_metrics]
2110
  )
2111
 
2112
  # 15-minute analysis button click
2113
  def min15_analysis(s: str, pd: int, ld: int, st: str, ue: bool, urd: bool, ust: bool,
2114
- rfr: float, mi: str, cw: float, tw: float, sw: float) -> Tuple[Dict, go.Figure, Dict, Dict, Dict, Dict, Dict, Dict]:
2115
  """
2116
  Process 15-minute timeframe stock analysis with advanced features.
2117
 
@@ -2140,7 +2172,7 @@ def create_interface():
2140
  use_ensemble, use_regime_detection, use_stress_testing, risk_free_rate, market_index,
2141
  chronos_weight, technical_weight, statistical_weight],
2142
  outputs=[min15_signals, min15_plot, min15_metrics, min15_risk_metrics, min15_sector_metrics,
2143
- min15_regime_metrics, min15_stress_results, min15_ensemble_metrics]
2144
  )
2145
 
2146
  return demo
 
1135
  # Use HMM for regime detection
1136
  # Convert pandas Series to numpy array for reshape
1137
  returns_array = returns.dropna().values
 
 
1138
 
1139
+ # Try different HMM configurations if convergence fails
1140
+ for attempt in range(3):
1141
+ try:
1142
+ if attempt == 0:
1143
+ model = hmm.GaussianHMM(n_components=n_regimes, random_state=42, covariance_type="full", n_iter=100)
1144
+ elif attempt == 1:
1145
+ model = hmm.GaussianHMM(n_components=n_regimes, random_state=42, covariance_type="diag", n_iter=200)
1146
+ else:
1147
+ model = hmm.GaussianHMM(n_components=n_regimes, random_state=42, covariance_type="spherical", n_iter=300)
1148
+
1149
+ model.fit(returns_array.reshape(-1, 1))
1150
+
1151
+ # Get regime probabilities for the last observation
1152
+ regime_probs = model.predict_proba(returns_array.reshape(-1, 1))
1153
+ current_regime = model.predict(returns_array.reshape(-1, 1))[-1]
1154
+
1155
+ # Calculate regime characteristics
1156
+ regime_means = model.means_.flatten()
1157
+ regime_vols = np.sqrt(model.covars_.diagonal(axis1=1, axis2=2)) if model.covariance_type == "full" else np.sqrt(model.covars_)
1158
+
1159
+ return {
1160
+ "regime": int(current_regime),
1161
+ "probabilities": regime_probs[-1].tolist(),
1162
+ "means": regime_means.tolist(),
1163
+ "volatilities": regime_vols.tolist(),
1164
+ "method": f"HMM-{model.covariance_type}"
1165
+ }
1166
+ except Exception as e:
1167
+ if attempt == 2: # Last attempt failed
1168
+ print(f"HMM failed after {attempt + 1} attempts: {str(e)}")
1169
+ break
1170
+ continue
1171
  else:
1172
  # Simplified regime detection using volatility clustering
1173
  volatility = returns.rolling(window=20).std().dropna()
 
1824
 
1825
  gr.Markdown("### Trading Signals")
1826
  daily_signals = gr.JSON(label="Trading Signals")
1827
+
1828
+ gr.Markdown("### Advanced Trading Signals")
1829
+ daily_signals_advanced = gr.JSON(label="Advanced Trading Signals")
1830
 
1831
  with gr.Column():
1832
  gr.Markdown("### Sector & Financial Analysis")
 
2048
  "ensemble_weights": ensemble_weights
2049
  }
2050
 
2051
+ # Separate basic and advanced signals
2052
+ basic_signals = {
2053
+ "RSI": signals.get("RSI", "Neutral"),
2054
+ "MACD": signals.get("MACD", "Hold"),
2055
+ "Bollinger": signals.get("Bollinger", "Hold"),
2056
+ "SMA": signals.get("SMA", "Hold"),
2057
+ "Overall": signals.get("Overall", "Hold"),
2058
+ "symbol": signals.get("symbol", symbol),
2059
+ "timeframe": signals.get("timeframe", timeframe),
2060
+ "strategy_used": signals.get("strategy_used", strategy)
2061
+ }
2062
+
2063
+ advanced_signals = signals.get("advanced_signals", {})
2064
+
2065
+ return basic_signals, fig, product_metrics, risk_metrics, sector_metrics, regime_metrics, stress_results, ensemble_metrics, advanced_signals
2066
  except Exception as e:
2067
  error_message = str(e)
2068
  if "Market is currently closed" in error_message:
 
2075
 
2076
  # Daily analysis button click
2077
  def daily_analysis(s: str, pd: int, ld: int, st: str, ue: bool, urd: bool, ust: bool,
2078
+ rfr: float, mi: str, cw: float, tw: float, sw: float) -> Tuple[Dict, go.Figure, Dict, Dict, Dict, Dict, Dict, Dict, Dict]:
2079
  """
2080
  Process daily timeframe stock analysis with advanced features.
2081
 
 
2104
  use_ensemble, use_regime_detection, use_stress_testing, risk_free_rate, market_index,
2105
  chronos_weight, technical_weight, statistical_weight],
2106
  outputs=[daily_signals, daily_plot, daily_metrics, daily_risk_metrics, daily_sector_metrics,
2107
+ daily_regime_metrics, daily_stress_results, daily_ensemble_metrics, daily_signals_advanced]
2108
  )
2109
 
2110
  # Hourly analysis button click
2111
  def hourly_analysis(s: str, pd: int, ld: int, st: str, ue: bool, urd: bool, ust: bool,
2112
+ rfr: float, mi: str, cw: float, tw: float, sw: float) -> Tuple[Dict, go.Figure, Dict, Dict, Dict, Dict, Dict, Dict, Dict]:
2113
  """
2114
  Process hourly timeframe stock analysis with advanced features.
2115
 
 
2138
  use_ensemble, use_regime_detection, use_stress_testing, risk_free_rate, market_index,
2139
  chronos_weight, technical_weight, statistical_weight],
2140
  outputs=[hourly_signals, hourly_plot, hourly_metrics, hourly_risk_metrics, hourly_sector_metrics,
2141
+ hourly_regime_metrics, hourly_stress_results, hourly_ensemble_metrics, hourly_signals_advanced]
2142
  )
2143
 
2144
  # 15-minute analysis button click
2145
  def min15_analysis(s: str, pd: int, ld: int, st: str, ue: bool, urd: bool, ust: bool,
2146
+ rfr: float, mi: str, cw: float, tw: float, sw: float) -> Tuple[Dict, go.Figure, Dict, Dict, Dict, Dict, Dict, Dict, Dict]:
2147
  """
2148
  Process 15-minute timeframe stock analysis with advanced features.
2149
 
 
2172
  use_ensemble, use_regime_detection, use_stress_testing, risk_free_rate, market_index,
2173
  chronos_weight, technical_weight, statistical_weight],
2174
  outputs=[min15_signals, min15_plot, min15_metrics, min15_risk_metrics, min15_sector_metrics,
2175
+ min15_regime_metrics, min15_stress_results, min15_ensemble_metrics, min15_signals_advanced]
2176
  )
2177
 
2178
  return demo