Spaces:
Paused
Paused
Tonic commited on
Commit ·
7a5abd6
1
Parent(s): b7e9276
adds advanced trading signals
Browse files
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 |
-
#
|
| 1142 |
-
|
| 1143 |
-
|
| 1144 |
-
|
| 1145 |
-
|
| 1146 |
-
|
| 1147 |
-
|
| 1148 |
-
|
| 1149 |
-
|
| 1150 |
-
|
| 1151 |
-
|
| 1152 |
-
|
| 1153 |
-
|
| 1154 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|