chemouda commited on
Commit
b3c2aa4
·
verified ·
1 Parent(s): 5bf0204

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +123 -31
app.py CHANGED
@@ -10,20 +10,33 @@ import logging
10
  logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
11
  logger = logging.getLogger(__name__)
12
 
 
 
 
 
13
  def run_crypto_analysis(symbols, interval):
14
  end_date = datetime.today().strftime("%Y-%m-%d")
15
  start_date = (datetime.today() - timedelta(days=365*5)).strftime("%Y-%m-%d")
16
  if symbols:
17
  symbols_list = [symbol.strip().upper() for symbol in symbols.split(",")]
18
  else:
19
- symbols_list = get_top_crypto_symbols()[:10] # Limit to top 10 for faster processing
 
 
20
 
21
  all_data = []
22
  for symbol in symbols_list:
23
- data = analyze_crypto(symbol, start_date, end_date, interval)
24
- if data is not None and not data.empty:
25
- data['Symbol'] = symbol
26
- all_data.append(data)
 
 
 
 
 
 
 
27
 
28
  if all_data:
29
  combined_data = pd.concat(all_data)
@@ -37,10 +50,10 @@ def run_crypto_analysis(symbols, interval):
37
  os.makedirs("output", exist_ok=True)
38
  combined_data.to_csv(output_file, index=False)
39
  logger.info(f"Crypto analysis complete. Output saved to {output_file}")
40
- return combined_data.head(15), output_file
41
  else:
42
- logger.warning("No data available for the selected crypto parameters.")
43
- return "No data available for the selected parameters.", None
44
 
45
  def run_asset_analysis(symbols, interval):
46
  end_date = datetime.today().strftime("%Y-%m-%d")
@@ -48,14 +61,23 @@ def run_asset_analysis(symbols, interval):
48
  if symbols:
49
  symbols_list = [symbol.strip().upper() for symbol in symbols.split(",")]
50
  else:
51
- symbols_list = get_sp500_tickers()[:10] # Limit to top 10 for faster processing
 
 
52
 
53
  all_data = []
54
  for symbol in symbols_list:
55
- data = analyze_asset(symbol, start_date, end_date, interval, asset_type='stock')
56
- if data is not None and not data.empty:
57
- data['Symbol'] = symbol
58
- all_data.append(data)
 
 
 
 
 
 
 
59
 
60
  if all_data:
61
  combined_data = pd.concat(all_data)
@@ -69,47 +91,117 @@ def run_asset_analysis(symbols, interval):
69
  os.makedirs("output", exist_ok=True)
70
  combined_data.to_csv(output_file, index=False)
71
  logger.info(f"Asset analysis complete. Output saved to {output_file}")
72
- return combined_data.head(15), output_file
73
  else:
74
- logger.warning("No data available for the selected asset parameters.")
75
- return "No data available for the selected parameters.", None
76
 
77
- def main_interface(analysis_type, symbols, interval):
78
- logger.info(f"Main interface called with: analysis_type={analysis_type}, symbols={symbols}, interval={interval}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  try:
80
  if analysis_type == "Cryptocurrency":
81
- result, file = run_crypto_analysis(symbols, interval)
82
  else:
83
- result, file = run_asset_analysis(symbols, interval)
84
 
85
- if isinstance(result, pd.DataFrame):
86
- return result, file
 
 
 
87
  else:
88
- return result, None
 
89
  except Exception as e:
90
- logger.error(f"An error occurred in main_interface: {e}")
91
  return f"An error occurred: {str(e)}", None
92
 
 
 
 
 
 
 
 
 
93
  with gr.Blocks() as iface:
94
  gr.Markdown("# VuManchu Trading Signals Analysis")
95
- gr.Markdown("Perform technical analysis on cryptocurrencies or stocks using the VuManchu swing trading strategy and SuperTrend indicators. Select the analysis type, input desired symbols or use the defaults, choose the time interval, and view or download the generated trading signals. The sample shows the 15 most recent entries.")
96
- gr.Markdown("Research Project & Not Financial Advice")
97
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  with gr.Row():
99
  analysis_type = gr.Radio(["Cryptocurrency", "Asset"], label="Select Analysis Type")
100
  symbols = gr.Textbox(label="Enter symbols (comma-separated) or leave blank for default", placeholder="e.g., BTC,ETH,ADA or AAPL,MSFT,GOOGL")
101
  interval = gr.Radio(["1d", "1wk"], label="Select Time Interval")
102
 
103
- submit_button = gr.Button("Generate Signals")
 
 
 
104
 
105
- output_dataframe = gr.Dataframe(label="Sample of Latest Trading Signals: High to Low Risk ordered")
106
  output_file = gr.File(label="Download Full Signals CSV")
107
 
108
- submit_button.click(
109
- main_interface,
110
  inputs=[analysis_type, symbols, interval],
111
  outputs=[output_dataframe, output_file]
112
  )
 
 
 
 
 
 
113
 
114
  if __name__ == "__main__":
115
  logger.info("Starting Gradio interface")
 
10
  logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
11
  logger = logging.getLogger(__name__)
12
 
13
+ # Global variable to store the full results
14
+ full_results = None
15
+ output_file_path = None
16
+
17
  def run_crypto_analysis(symbols, interval):
18
  end_date = datetime.today().strftime("%Y-%m-%d")
19
  start_date = (datetime.today() - timedelta(days=365*5)).strftime("%Y-%m-%d")
20
  if symbols:
21
  symbols_list = [symbol.strip().upper() for symbol in symbols.split(",")]
22
  else:
23
+ symbols_list = get_top_crypto_symbols()[:100] # Analyze top 100 cryptocurrencies
24
+
25
+ logger.info(f"Analyzing {len(symbols_list)} cryptocurrencies")
26
 
27
  all_data = []
28
  for symbol in symbols_list:
29
+ try:
30
+ data = analyze_crypto(symbol, start_date, end_date, interval)
31
+ if data is not None and not data.empty:
32
+ data['Symbol'] = symbol
33
+ all_data.append(data)
34
+ else:
35
+ logger.warning(f"No data returned for cryptocurrency: {symbol}")
36
+ except Exception as e:
37
+ logger.error(f"Error analyzing cryptocurrency {symbol}: {str(e)}")
38
+
39
+ logger.info(f"Crypto analysis complete. Data available for {len(all_data)} cryptocurrencies")
40
 
41
  if all_data:
42
  combined_data = pd.concat(all_data)
 
50
  os.makedirs("output", exist_ok=True)
51
  combined_data.to_csv(output_file, index=False)
52
  logger.info(f"Crypto analysis complete. Output saved to {output_file}")
53
+ return combined_data, output_file
54
  else:
55
+ logger.warning("No data available for any of the selected crypto parameters.")
56
+ return pd.DataFrame(), None
57
 
58
  def run_asset_analysis(symbols, interval):
59
  end_date = datetime.today().strftime("%Y-%m-%d")
 
61
  if symbols:
62
  symbols_list = [symbol.strip().upper() for symbol in symbols.split(",")]
63
  else:
64
+ symbols_list = get_sp500_tickers()
65
+
66
+ logger.info(f"Analyzing {len(symbols_list)} symbols")
67
 
68
  all_data = []
69
  for symbol in symbols_list:
70
+ try:
71
+ data = analyze_asset(symbol, start_date, end_date, interval, asset_type='stock')
72
+ if data is not None and not data.empty:
73
+ data['Symbol'] = symbol
74
+ all_data.append(data)
75
+ else:
76
+ logger.warning(f"No data returned for symbol: {symbol}")
77
+ except Exception as e:
78
+ logger.error(f"Error analyzing symbol {symbol}: {str(e)}")
79
+
80
+ logger.info(f"Analysis complete. Data available for {len(all_data)} symbols")
81
 
82
  if all_data:
83
  combined_data = pd.concat(all_data)
 
91
  os.makedirs("output", exist_ok=True)
92
  combined_data.to_csv(output_file, index=False)
93
  logger.info(f"Asset analysis complete. Output saved to {output_file}")
94
+ return combined_data, output_file
95
  else:
96
+ logger.warning("No data available for any of the selected asset parameters.")
97
+ return pd.DataFrame(), None
98
 
99
+ def filter_latest_signals(df, signal_column):
100
+ if df.empty:
101
+ logger.warning("Empty dataframe passed to filter_latest_signals")
102
+ return df
103
+
104
+ logger.info(f"Filtering signals. Input shape: {df.shape}")
105
+
106
+ # Group by Symbol and get the latest date for each
107
+ latest_dates = df.groupby('Symbol')['Date'].max().reset_index()
108
+
109
+ # Merge with the original dataframe to get the latest signals
110
+ latest_signals = pd.merge(df, latest_dates, on=['Symbol', 'Date'])
111
+
112
+ logger.info(f"Latest signals shape after merge: {latest_signals.shape}")
113
+
114
+ # Filter for the chosen signal
115
+ if signal_column != 'All':
116
+ latest_signals = latest_signals[latest_signals[signal_column] != '']
117
+ logger.info(f"Filtered for {signal_column}. Shape: {latest_signals.shape}")
118
+ else:
119
+ # Remove rows where all signal columns are empty
120
+ signal_columns = ['Signal_1x', 'Signal_2x', 'Signal_3x', 'VuManchu_Signal']
121
+ latest_signals = latest_signals[latest_signals[signal_columns].ne('').any(axis=1)]
122
+ logger.info(f"Removed rows with all empty signals. Shape: {latest_signals.shape}")
123
+
124
+ result = latest_signals.sort_values('Date', ascending=False)
125
+ logger.info(f"Final filtered result shape: {result.shape}")
126
+ return result
127
+
128
+ def generate_signals(analysis_type, symbols, interval):
129
+ global full_results, output_file_path
130
+ logger.info(f"Generating signals: analysis_type={analysis_type}, symbols={symbols}, interval={interval}")
131
  try:
132
  if analysis_type == "Cryptocurrency":
133
+ full_results, output_file_path = run_crypto_analysis(symbols, interval)
134
  else:
135
+ full_results, output_file_path = run_asset_analysis(symbols, interval)
136
 
137
+ if isinstance(full_results, pd.DataFrame) and not full_results.empty:
138
+ logger.info(f"Analysis result shape: {full_results.shape}")
139
+ filtered_result = filter_latest_signals(full_results, 'All')
140
+ logger.info(f"Filtered result shape: {filtered_result.shape}")
141
+ return filtered_result, output_file_path
142
  else:
143
+ logger.warning("No data available from analysis")
144
+ return "No data available for the selected parameters.", None
145
  except Exception as e:
146
+ logger.error(f"An error occurred in generate_signals: {e}")
147
  return f"An error occurred: {str(e)}", None
148
 
149
+ def apply_filter(signal_filter):
150
+ global full_results
151
+ if full_results is None or full_results.empty:
152
+ return "No data available. Please generate signals first.", None
153
+
154
+ filtered_result = filter_latest_signals(full_results, signal_filter)
155
+ return filtered_result, output_file_path
156
+
157
  with gr.Blocks() as iface:
158
  gr.Markdown("# VuManchu Trading Signals Analysis")
159
+
160
+ gr.Markdown("""
161
+ ## Legal Disclaimer
162
+
163
+ **IMPORTANT: Please read this disclaimer carefully before using this tool.**
164
+
165
+ This VuManchu Trading Signals Analysis tool is provided for educational and informational purposes only. It does not constitute financial advice, trading advice, or any other type of professional advice. The creators and distributors of this tool are not financial advisors and do not purport to provide any financial or investment guidance.
166
+
167
+ The information and signals generated by this tool are based on historical data and technical analysis techniques. Past performance is not indicative of future results. The financial markets are inherently risky, and all trading and investment decisions carry the risk of loss.
168
+
169
+ By using this tool, you acknowledge and agree that:
170
+
171
+ 1. You are solely responsible for any trading or investment decisions you make.
172
+ 2. The creators and distributors of this tool are not liable for any losses or damages resulting from your use of, or reliance on, the information provided.
173
+ 3. You should always conduct your own research and due diligence before making any financial decisions.
174
+ 4. You should consult with a qualified financial advisor before making any investment or trading decisions.
175
+
176
+ Use of this tool constitutes acceptance of this disclaimer and an acknowledgment of the inherent risks associated with trading and investing.
177
+ """)
178
+
179
+ gr.Markdown("Perform technical analysis on cryptocurrencies or stocks using the VuManchu swing trading strategy and SuperTrend indicators. Select the analysis type, input desired symbols or use the defaults, choose the time interval, and view or download the generated trading signals. The table shows the latest trading signals for each symbol, excluding rows with no signals.")
180
+
181
  with gr.Row():
182
  analysis_type = gr.Radio(["Cryptocurrency", "Asset"], label="Select Analysis Type")
183
  symbols = gr.Textbox(label="Enter symbols (comma-separated) or leave blank for default", placeholder="e.g., BTC,ETH,ADA or AAPL,MSFT,GOOGL")
184
  interval = gr.Radio(["1d", "1wk"], label="Select Time Interval")
185
 
186
+ with gr.Row():
187
+ signal_filter = gr.Dropdown(["All", "Signal_1x", "Signal_2x", "Signal_3x", "VuManchu_Signal"], label="Filter by Latest Signal", value="All")
188
+
189
+ generate_button = gr.Button("Generate Signals")
190
 
191
+ output_dataframe = gr.Dataframe(label="Latest Trading Signals")
192
  output_file = gr.File(label="Download Full Signals CSV")
193
 
194
+ generate_button.click(
195
+ generate_signals,
196
  inputs=[analysis_type, symbols, interval],
197
  outputs=[output_dataframe, output_file]
198
  )
199
+
200
+ signal_filter.change(
201
+ apply_filter,
202
+ inputs=[signal_filter],
203
+ outputs=[output_dataframe, output_file]
204
+ )
205
 
206
  if __name__ == "__main__":
207
  logger.info("Starting Gradio interface")