Spaces:
Running
on
Zero
Running
on
Zero
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
|