Update app.py
Browse files
app.py
CHANGED
|
@@ -321,8 +321,8 @@ def calculate_cci(df, window=20):
|
|
| 321 |
cci = (typical_price - sma) / (0.015 * mean_deviation)
|
| 322 |
return cci
|
| 323 |
|
|
|
|
| 324 |
import numpy as np
|
| 325 |
-
import pandas as pd
|
| 326 |
|
| 327 |
def generate_trading_signals(df):
|
| 328 |
# Calculate various indicators
|
|
@@ -336,44 +336,42 @@ def generate_trading_signals(df):
|
|
| 336 |
df['CMF'] = calculate_cmf(df)
|
| 337 |
df['CCI'] = calculate_cci(df)
|
| 338 |
|
| 339 |
-
#
|
| 340 |
df['SMA_Signal'] = np.where((df['SMA_30'] > df['SMA_100']) &
|
| 341 |
-
((df['SMA_30'] - df['SMA_100']) / df['SMA_100'] > 0.
|
| 342 |
-
|
| 343 |
macd, signal = calculate_macd(df)
|
| 344 |
-
|
| 345 |
|
| 346 |
-
#
|
| 347 |
df['MACD_Signal'] = np.select([
|
| 348 |
-
(macd > signal) & (macd.shift(1) <= signal.shift(1)) & ((macd - signal) >
|
| 349 |
-
(macd < signal) & (macd.shift(1) >= signal.shift(1)) & ((signal - macd) >
|
| 350 |
], [-1, 1], default=0)
|
| 351 |
-
|
| 352 |
-
#
|
| 353 |
-
df['RSI_Signal'] = np.where(df['RSI'] <
|
| 354 |
-
df['RSI_Signal'] = np.where(df['RSI'] >
|
| 355 |
-
|
| 356 |
-
#
|
| 357 |
-
df['BB_Signal'] = np.where(df['Close']
|
| 358 |
-
df['BB_Signal'] = np.where(df['Close']
|
| 359 |
-
|
| 360 |
-
#
|
| 361 |
-
df['Stochastic_Signal'] = np.where((df['SlowK'] <
|
| 362 |
-
df['Stochastic_Signal'] = np.where((df['SlowK'] >
|
| 363 |
-
|
| 364 |
-
#
|
| 365 |
-
df['CMF_Signal'] = np.where(df['CMF'] > 0.
|
| 366 |
-
|
| 367 |
-
#
|
| 368 |
-
df['CCI_Signal'] = np.where(df['CCI'] < -
|
| 369 |
-
df['CCI_Signal'] = np.where(df['CCI'] >
|
| 370 |
-
|
| 371 |
-
# Combined signal
|
| 372 |
-
df['Combined_Signal'] = df[['MACD_Signal','RSI_Signal', 'BB_Signal',
|
| 373 |
'Stochastic_Signal', 'CMF_Signal', 'CCI_Signal']].sum(axis=1)
|
| 374 |
-
|
| 375 |
-
return df
|
| 376 |
|
|
|
|
| 377 |
|
| 378 |
def plot_combined_signals(df, ticker):
|
| 379 |
# Create a figure
|
|
@@ -563,18 +561,6 @@ with gr.Blocks(theme=gr.themes.Monochrome()) as demo:
|
|
| 563 |
# Create tabs for different analysis types
|
| 564 |
with gr.Tabs() as tabs:
|
| 565 |
|
| 566 |
-
with gr.TabItem("Technical Analysis"):
|
| 567 |
-
analysis_button = gr.Button("Generate Technical Analysis")
|
| 568 |
-
|
| 569 |
-
individual_signals = gr.Plot(label="Individual Trading Signals")
|
| 570 |
-
combined_signals = gr.Plot(label="Combined Trading Signals")
|
| 571 |
-
|
| 572 |
-
# Connect button to function
|
| 573 |
-
analysis_button.click(
|
| 574 |
-
technical_analysis,
|
| 575 |
-
inputs=[ticker_input, start_date_input, end_date_input],
|
| 576 |
-
outputs=[combined_signals, individual_signals]
|
| 577 |
-
)
|
| 578 |
|
| 579 |
with gr.TabItem("TimesFM Forecast"):
|
| 580 |
timesfm_button = gr.Button("Generate TimesFM Forecast")
|
|
@@ -592,6 +578,19 @@ with gr.Blocks(theme=gr.themes.Monochrome()) as demo:
|
|
| 592 |
prophet_recent_plot = gr.Plot(label="Recent Stock Prices")
|
| 593 |
prophet_forecast_plot = gr.Plot(label="Prophet 30-Day Forecast")
|
| 594 |
prophet_components = gr.Plot(label="Forecast Components") # Changed from gr.Image to gr.Plot
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 595 |
|
| 596 |
# Connect button to function
|
| 597 |
prophet_button.click(
|
|
|
|
| 321 |
cci = (typical_price - sma) / (0.015 * mean_deviation)
|
| 322 |
return cci
|
| 323 |
|
| 324 |
+
|
| 325 |
import numpy as np
|
|
|
|
| 326 |
|
| 327 |
def generate_trading_signals(df):
|
| 328 |
# Calculate various indicators
|
|
|
|
| 336 |
df['CMF'] = calculate_cmf(df)
|
| 337 |
df['CCI'] = calculate_cci(df)
|
| 338 |
|
| 339 |
+
# Less strict SMA Signal - Require only 1% difference (was 3%)
|
| 340 |
df['SMA_Signal'] = np.where((df['SMA_30'] > df['SMA_100']) &
|
| 341 |
+
((df['SMA_30'] - df['SMA_100']) / df['SMA_100'] > 0.01), 1, 0)
|
| 342 |
+
|
| 343 |
macd, signal = calculate_macd(df)
|
|
|
|
| 344 |
|
| 345 |
+
# Less strict MACD Signal - Reduce required MACD-signal gap from 1.0 to 0.3
|
| 346 |
df['MACD_Signal'] = np.select([
|
| 347 |
+
(macd > signal) & (macd.shift(1) <= signal.shift(1)) & ((macd - signal) > 0.3), # Bullish crossover → Sell (inverted logic)
|
| 348 |
+
(macd < signal) & (macd.shift(1) >= signal.shift(1)) & ((signal - macd) > 0.3) # Bearish crossover → Buy
|
| 349 |
], [-1, 1], default=0)
|
| 350 |
+
|
| 351 |
+
# Less strict RSI Signal - Use common thresholds (30/70 instead of 15/90)
|
| 352 |
+
df['RSI_Signal'] = np.where(df['RSI'] < 30, 1, 0)
|
| 353 |
+
df['RSI_Signal'] = np.where(df['RSI'] > 70, -1, df['RSI_Signal'])
|
| 354 |
+
|
| 355 |
+
# Less strict Bollinger Bands Signal - Touch or slight breach (no 3% buffer)
|
| 356 |
+
df['BB_Signal'] = np.where(df['Close'] <= df['LowerBB'], 1, 0)
|
| 357 |
+
df['BB_Signal'] = np.where(df['Close'] >= df['UpperBB'], -1, df['BB_Signal'])
|
| 358 |
+
|
| 359 |
+
# Less strict Stochastic Signal - Standard overbought/oversold (20/80 instead of 10/95)
|
| 360 |
+
df['Stochastic_Signal'] = np.where((df['SlowK'] < 20) & (df['SlowD'] < 20), 1, 0)
|
| 361 |
+
df['Stochastic_Signal'] = np.where((df['SlowK'] > 80) & (df['SlowD'] > 80), -1, df['Stochastic_Signal'])
|
| 362 |
+
|
| 363 |
+
# Less strict CMF Signal - Use ±0.1 instead of ±0.4
|
| 364 |
+
df['CMF_Signal'] = np.where(df['CMF'] > 0.1, -1, np.where(df['CMF'] < -0.1, 1, 0))
|
| 365 |
+
|
| 366 |
+
# Less strict CCI Signal - Standard thresholds (±100 instead of ±220)
|
| 367 |
+
df['CCI_Signal'] = np.where(df['CCI'] < -100, 1, 0)
|
| 368 |
+
df['CCI_Signal'] = np.where(df['CCI'] > 100, -1, df['CCI_Signal'])
|
| 369 |
+
|
| 370 |
+
# Combined signal (still sums all component signals)
|
| 371 |
+
df['Combined_Signal'] = df[['MACD_Signal', 'RSI_Signal', 'BB_Signal',
|
| 372 |
'Stochastic_Signal', 'CMF_Signal', 'CCI_Signal']].sum(axis=1)
|
|
|
|
|
|
|
| 373 |
|
| 374 |
+
return df
|
| 375 |
|
| 376 |
def plot_combined_signals(df, ticker):
|
| 377 |
# Create a figure
|
|
|
|
| 561 |
# Create tabs for different analysis types
|
| 562 |
with gr.Tabs() as tabs:
|
| 563 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 564 |
|
| 565 |
with gr.TabItem("TimesFM Forecast"):
|
| 566 |
timesfm_button = gr.Button("Generate TimesFM Forecast")
|
|
|
|
| 578 |
prophet_recent_plot = gr.Plot(label="Recent Stock Prices")
|
| 579 |
prophet_forecast_plot = gr.Plot(label="Prophet 30-Day Forecast")
|
| 580 |
prophet_components = gr.Plot(label="Forecast Components") # Changed from gr.Image to gr.Plot
|
| 581 |
+
|
| 582 |
+
with gr.TabItem("Technical Analysis"):
|
| 583 |
+
analysis_button = gr.Button("Generate Technical Analysis")
|
| 584 |
+
|
| 585 |
+
individual_signals = gr.Plot(label="Individual Trading Signals")
|
| 586 |
+
combined_signals = gr.Plot(label="Combined Trading Signals")
|
| 587 |
+
|
| 588 |
+
# Connect button to function
|
| 589 |
+
analysis_button.click(
|
| 590 |
+
technical_analysis,
|
| 591 |
+
inputs=[ticker_input, start_date_input, end_date_input],
|
| 592 |
+
outputs=[combined_signals, individual_signals]
|
| 593 |
+
)
|
| 594 |
|
| 595 |
# Connect button to function
|
| 596 |
prophet_button.click(
|