JayLacoma commited on
Commit
85a8d31
·
verified ·
1 Parent(s): a151f3e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +43 -44
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
- # Ultra-strict SMA Signal - Require at least 3% difference
340
  df['SMA_Signal'] = np.where((df['SMA_30'] > df['SMA_100']) &
341
- ((df['SMA_30'] - df['SMA_100']) / df['SMA_100'] > 0.03), 1, 0)
342
-
343
  macd, signal = calculate_macd(df)
344
-
345
 
346
- # Inverted: Bullish = Sell, Bearish = Buy
347
  df['MACD_Signal'] = np.select([
348
- (macd > signal) & (macd.shift(1) <= signal.shift(1)) & ((macd - signal) > 1.0), # Was buy, now sell
349
- (macd < signal) & (macd.shift(1) >= signal.shift(1)) & ((signal - macd) > 1.0) # Was sell, now buy
350
  ], [-1, 1], default=0)
351
-
352
- # Ultra-strict RSI Signal - Extreme thresholds
353
- df['RSI_Signal'] = np.where(df['RSI'] < 15, 1, 0)
354
- df['RSI_Signal'] = np.where(df['RSI'] > 90, -1, df['RSI_Signal'])
355
-
356
- # Ultra-strict Bollinger Bands Signal - Require extreme deviations
357
- df['BB_Signal'] = np.where(df['Close'] < df['LowerBB'] * 0.97, 1, 0)
358
- df['BB_Signal'] = np.where(df['Close'] > df['UpperBB'] * 1.03, -1, df['BB_Signal'])
359
-
360
- # Ultra-strict Stochastic Signal - Extreme overbought/oversold conditions
361
- df['Stochastic_Signal'] = np.where((df['SlowK'] < 10) & (df['SlowD'] < 10), 1, 0)
362
- df['Stochastic_Signal'] = np.where((df['SlowK'] > 95) & (df['SlowD'] > 95), -1, df['Stochastic_Signal'])
363
-
364
- # Ultra-strict CMF Signal - Require stronger money flow confirmation
365
- df['CMF_Signal'] = np.where(df['CMF'] > 0.4, -1, np.where(df['CMF'] < -0.4, 1, 0))
366
-
367
- # Ultra-strict CCI Signal - Require extreme deviations
368
- df['CCI_Signal'] = np.where(df['CCI'] < -220, 1, 0)
369
- df['CCI_Signal'] = np.where(df['CCI'] > 220, -1, df['CCI_Signal'])
370
-
371
- # Combined signal for ultra-strict confirmations
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(