kaganseyda commited on
Commit
80ec238
·
verified ·
1 Parent(s): 741903a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +50 -85
app.py CHANGED
@@ -2,9 +2,10 @@ import yfinance as yf
2
  import pandas as pd
3
  import numpy as np
4
  import mplfinance as mpf
5
- import talib # pip install ta-lib
6
  import gradio as gr
7
  from datetime import date
 
8
 
9
  # TALib formasyon fonksiyonlarını bir dictionary'de tutalım
10
  TALIB_PATTERNS = {
@@ -17,164 +18,128 @@ TALIB_PATTERNS = {
17
  "CDLMORNINGSTAR": talib.CDLMORNINGSTAR,
18
  "CDLEVENINGSTAR": talib.CDLEVENINGSTAR,
19
  "CDL3WHITESOLDIERS": talib.CDL3WHITESOLDIERS,
20
- "CDL3BLACKCROWS": talib.CDL3BLACKCROWS,
21
- # İstediğiniz diğer formasyonları ekleyebilirsiniz
22
  }
23
 
24
  def find_candlestick_patterns(df, pattern_name):
25
  """
26
- Verilen DataFrame'de TALib kullanarak mum çubuğu formasyonlarını bulur ve
27
- mplfinance için addplot listesi döndürür.
28
-
29
- Args:
30
- df (pd.DataFrame): Hisse senedi verisi (Open, High, Low, Close sütunları ile).
31
- pattern_name (str): TALib'deki formasyon fonksiyonunun adı (örn. "CDLSHOOTINGSTAR").
32
-
33
- Returns:
34
- list: mpf.make_addplot objelerinin listesi veya boş liste.
35
  """
36
  if pattern_name not in TALIB_PATTERNS:
37
- return [] # Boş liste döndür
38
 
39
  pattern_func = TALIB_PATTERNS[pattern_name]
40
 
41
- # TALib'e özel olarak sütun isimleri küçük harf olmalı
42
- df_talib = df.rename(columns={
43
- 'Open': 'open',
44
- 'High': 'high',
45
- 'Low': 'low',
46
- 'Close': 'close',
47
- 'Volume': 'volume'
48
- })
49
-
50
- pattern_result = pattern_func(df_talib['open'], df_talib['high'],
51
- df_talib['low'], df_talib['close'])
 
52
 
53
  apds = []
54
 
55
- # Boğa (bullish) formasyonları için
56
  bullish_signals = pattern_result[pattern_result == 100]
57
  if not bullish_signals.empty:
58
  bullish_plot_data = pd.Series(np.nan, index=df.index)
59
  for idx in bullish_signals.index:
60
- bullish_plot_data[idx] = df.loc[idx, 'Low'] * 0.98 # Mumun biraz altına
61
  apds.append(
62
- mpf.make_addplot(bullish_plot_data,
63
- type='scatter',
64
- marker='^', # Yukarı üçgen
65
- markersize=100,
66
- color='green',
67
- panel=0,
68
- alpha=0.7)
69
  )
70
 
71
- # Ayı (bearish) formasyonları için
72
  bearish_signals = pattern_result[pattern_result == -100]
73
  if not bearish_signals.empty:
74
  bearish_plot_data = pd.Series(np.nan, index=df.index)
75
  for idx in bearish_signals.index:
76
- bearish_plot_data[idx] = df.loc[idx, 'High'] * 1.02 # Mumun biraz üstüne
77
  apds.append(
78
- mpf.make_addplot(bearish_plot_data,
79
- type='scatter',
80
- marker='v', # Aşağı üçgen
81
- markersize=100,
82
- color='red',
83
- panel=0,
84
- alpha=0.7)
85
  )
86
 
87
  return apds
88
 
89
  def plot_stock_with_patterns(ticker_symbol, start_date, end_date, selected_patterns):
90
  """
91
- Belirtilen hisse senedi için grafik çizer ve seçilen formasyonları işaretler.
92
-
93
- Args:
94
- ticker_symbol (str): Hisse senedi kodu (örn. "MSFT").
95
- start_date (str): Başlangıç tarihi (YYYY-MM-DD).
96
- end_date (str): Bitiş tarihi (YYYY-MM-DD).
97
- selected_patterns (list): Kullanıcının seçtiği formasyonların listesi.
98
-
99
- Returns:
100
- tuple: (str: Oluşturulan grafiğin dosya yolu, str: Durum mesajı)
101
  """
102
-
103
- # Tarih formatlarını kontrol edelim
 
104
  try:
105
  start = pd.to_datetime(start_date)
106
  end = pd.to_datetime(end_date)
107
  if start >= end:
108
- return None, "Start date must be before end date."
109
- except ValueError:
110
- return None, "Invalid date format. Please use YYYY-MM-DD."
111
 
112
  try:
113
- # yfinance'tan veri çek
114
- df = yf.download(ticker_symbol, start=start_date, end=end_date)
115
  if df.empty:
116
- return None, f"Could not download data for {ticker_symbol}. Please check the ticker symbol and date range."
117
  except Exception as e:
118
  return None, f"An error occurred while downloading data: {e}"
119
 
120
- # mplfinance'ın beklediği sütun isimlerini kontrol edelim
121
- # yfinance zaten 'Open', 'High', 'Low', 'Close', 'Volume' döndürüyor.
122
- # Eğer küçük harf olsaydı df.columns = [col.capitalize() for col in df.columns] kullanırdık.
123
-
124
- # Addplot listesini oluştur
125
  all_apds = []
126
- if selected_patterns: # Eğer hiç formasyon seçilmemişse boş kalır
127
  for pattern_name in selected_patterns:
128
  pattern_apds = find_candlestick_patterns(df, pattern_name)
129
  all_apds.extend(pattern_apds)
130
 
131
- # Grafiği oluştur ve bir dosyaya kaydet
132
- # Geçici bir dosya adı kullanalım
133
- fig_path = f"/tmp/stock_chart_{ticker_symbol}_{date.today().strftime('%Y%m%d%H%M%S')}.png"
 
134
 
135
- # mplfinance style ayarları
136
- s = mpf.make_mpf_style(base_mpf_style='yahoo', mavcolors=['#1f77b4', '#ff7f0e', '#2ca02c']) # Moving Average renkleri
137
 
138
  try:
139
- fig, axlist = mpf.plot(
140
  df,
141
  type='candle',
142
  volume=True,
143
- addplot=all_apds if all_apds else None, # Eğer addplot boşsa None geç
144
  style=s,
145
- title=f"{ticker_symbol} Candlestick Chart with Selected Patterns",
146
- ylabel='Price',
147
  ylabel_lower='Volume',
148
  returnfig=True,
149
- figscale=1.5 # Grafik boyutunu ayarla
150
  )
151
  fig.savefig(fig_path)
152
  return fig_path, "Chart generated successfully!"
153
  except Exception as e:
154
  return None, f"An error occurred while plotting the chart: {e}"
155
 
156
- # Gradio arayüzü
157
  iface = gr.Interface(
158
  fn=plot_stock_with_patterns,
159
  inputs=[
160
- gr.Textbox(label="Ticker Symbol (e.g., MSFT, AAPL, ^GSPC for S&P 500)", value="MSFT"),
161
- gr.Textbox(label="Start Date (YYYY-MM-DD)", value="2023-01-01"),
162
  gr.Textbox(label="End Date (YYYY-MM-DD)", value=date.today().strftime("%Y-%m-%d")),
163
  gr.CheckboxGroup(
164
  label="Select Candlestick Patterns",
165
  choices=list(TALIB_PATTERNS.keys()),
166
- value=["CDLSHOOTINGSTAR", "CDLHAMMER"] # Varsayılan olarak seçili gelenler
167
  )
168
  ],
169
  outputs=[
170
  gr.Image(type="filepath", label="Stock Chart"),
171
  gr.Textbox(label="Status")
172
  ],
173
- title="Interactive Stock Candlestick Chart with Technical Patterns",
174
- description="Enter a stock ticker, date range, and select candlestick patterns to visualize them on the chart. "
175
- "Patterns are marked with green (bullish) or red (bearish) triangles on the chart."
176
- "\n\n**Note:** Some TALib patterns are for specific market conditions or require more data points to detect. "
177
- "If a pattern is not found, no marker will appear for that pattern."
178
  )
179
 
180
  if __name__ == "__main__":
 
2
  import pandas as pd
3
  import numpy as np
4
  import mplfinance as mpf
5
+ import talib
6
  import gradio as gr
7
  from datetime import date
8
+ import os
9
 
10
  # TALib formasyon fonksiyonlarını bir dictionary'de tutalım
11
  TALIB_PATTERNS = {
 
18
  "CDLMORNINGSTAR": talib.CDLMORNINGSTAR,
19
  "CDLEVENINGSTAR": talib.CDLEVENINGSTAR,
20
  "CDL3WHITESOLDIERS": talib.CDL3WHITESOLDIERS,
21
+ "CDL3BLACKCROwS": talib.CDL3BLACKCROWS,
 
22
  }
23
 
24
  def find_candlestick_patterns(df, pattern_name):
25
  """
26
+ Finds candlestick patterns using TALib and returns a list of addplots for mplfinance.
 
 
 
 
 
 
 
 
27
  """
28
  if pattern_name not in TALIB_PATTERNS:
29
+ return []
30
 
31
  pattern_func = TALIB_PATTERNS[pattern_name]
32
 
33
+ # --- FIX IS HERE ---
34
+ # Convert pandas Series to NumPy arrays using .values for TALib compatibility
35
+ pattern_result = pattern_func(
36
+ df['Open'].values,
37
+ df['High'].values,
38
+ df['Low'].values,
39
+ df['Close'].values
40
+ )
41
+
42
+ # Convert result back to a pandas Series with the correct index
43
+ pattern_result = pd.Series(pattern_result, index=df.index)
44
+ # --- END OF FIX ---
45
 
46
  apds = []
47
 
48
+ # Bullish patterns
49
  bullish_signals = pattern_result[pattern_result == 100]
50
  if not bullish_signals.empty:
51
  bullish_plot_data = pd.Series(np.nan, index=df.index)
52
  for idx in bullish_signals.index:
53
+ bullish_plot_data.loc[idx] = df.loc[idx, 'Low'] * 0.98
54
  apds.append(
55
+ mpf.make_addplot(bullish_plot_data, type='scatter', marker='^', markersize=100, color='green', panel=0, alpha=0.7)
 
 
 
 
 
 
56
  )
57
 
58
+ # Bearish patterns
59
  bearish_signals = pattern_result[pattern_result == -100]
60
  if not bearish_signals.empty:
61
  bearish_plot_data = pd.Series(np.nan, index=df.index)
62
  for idx in bearish_signals.index:
63
+ bearish_plot_data.loc[idx] = df.loc[idx, 'High'] * 1.02
64
  apds.append(
65
+ mpf.make_addplot(bearish_plot_data, type='scatter', marker='v', markersize=100, color='red', panel=0, alpha=0.7)
 
 
 
 
 
 
66
  )
67
 
68
  return apds
69
 
70
  def plot_stock_with_patterns(ticker_symbol, start_date, end_date, selected_patterns):
71
  """
72
+ Plots the stock chart with selected patterns marked.
 
 
 
 
 
 
 
 
 
73
  """
74
+ if not ticker_symbol:
75
+ return None, "Error: Ticker symbol cannot be empty."
76
+
77
  try:
78
  start = pd.to_datetime(start_date)
79
  end = pd.to_datetime(end_date)
80
  if start >= end:
81
+ return None, "Error: Start date must be before end date."
82
+ except (ValueError, TypeError):
83
+ return None, "Error: Invalid date format. Please use YYYY-MM-DD."
84
 
85
  try:
86
+ # yfinance data download (auto_adjust=True is the default and recommended)
87
+ df = yf.download(ticker_symbol, start=start_date, end=end_date, progress=False)
88
  if df.empty:
89
+ return None, f"Error: No data found for '{ticker_symbol}'. Check the symbol and date range."
90
  except Exception as e:
91
  return None, f"An error occurred while downloading data: {e}"
92
 
 
 
 
 
 
93
  all_apds = []
94
+ if selected_patterns:
95
  for pattern_name in selected_patterns:
96
  pattern_apds = find_candlestick_patterns(df, pattern_name)
97
  all_apds.extend(pattern_apds)
98
 
99
+ # Use a temporary directory for saving the plot
100
+ if not os.path.exists('/tmp'):
101
+ os.makedirs('/tmp')
102
+ fig_path = f"/tmp/stock_chart_{ticker_symbol}_{pd.Timestamp.now().strftime('%Y%m%d%H%M%S')}.png"
103
 
104
+ s = mpf.make_mpf_style(base_mpf_style='yahoo', mavcolors=['#1f77b4', '#ff7f0e', '#2ca02c'])
 
105
 
106
  try:
107
+ fig, _ = mpf.plot(
108
  df,
109
  type='candle',
110
  volume=True,
111
+ addplot=all_apds if all_apds else None,
112
  style=s,
113
+ title=f"\n{ticker_symbol} Candlestick Chart",
114
+ ylabel='Price ($)',
115
  ylabel_lower='Volume',
116
  returnfig=True,
117
+ figscale=1.5
118
  )
119
  fig.savefig(fig_path)
120
  return fig_path, "Chart generated successfully!"
121
  except Exception as e:
122
  return None, f"An error occurred while plotting the chart: {e}"
123
 
124
+ # Gradio Interface
125
  iface = gr.Interface(
126
  fn=plot_stock_with_patterns,
127
  inputs=[
128
+ gr.Textbox(label="Ticker Symbol (e.g., MSFT, AAPL, ^GSPC)", value="MSFT"),
129
+ gr.Textbox(label="Start Date (YYYY-MM-DD)", value="2024-01-01"),
130
  gr.Textbox(label="End Date (YYYY-MM-DD)", value=date.today().strftime("%Y-%m-%d")),
131
  gr.CheckboxGroup(
132
  label="Select Candlestick Patterns",
133
  choices=list(TALIB_PATTERNS.keys()),
134
+ value=["CDLSHOOTINGSTAR", "CDLHAMMER"]
135
  )
136
  ],
137
  outputs=[
138
  gr.Image(type="filepath", label="Stock Chart"),
139
  gr.Textbox(label="Status")
140
  ],
141
+ title="Stock Chart Pattern Finder",
142
+ description="Enter a stock ticker and select candlestick patterns to visualize them on the chart. Bullish patterns are marked with a green '▲' and bearish patterns with a red '▼'."
 
 
 
143
  )
144
 
145
  if __name__ == "__main__":