Spaces:
Sleeping
Sleeping
Commit
·
1e2adc2
1
Parent(s):
3d365ee
1st
Browse files
app.py
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
import requests
|
| 3 |
+
from autogluon.timeseries import TimeSeriesPredictor, TimeSeriesDataFrame
|
| 4 |
+
import gradio as gr
|
| 5 |
+
|
| 6 |
+
# Function to fetch stock data
|
| 7 |
+
def get_stock_data(ticker, period):
|
| 8 |
+
data = yf.download(ticker, period=period)
|
| 9 |
+
return data
|
| 10 |
+
|
| 11 |
+
# Function to prepare the data for Chronos-Bolt
|
| 12 |
+
def prepare_data_chronos(data):
|
| 13 |
+
data = data.reset_index()
|
| 14 |
+
data = data.rename(columns={"Date": "timestamp", "Close": "target"})
|
| 15 |
+
data = data[["timestamp", "target"]]
|
| 16 |
+
data["item_id"] = "stock"
|
| 17 |
+
data["timestamp"] = pd.to_datetime(data["timestamp"])
|
| 18 |
+
return TimeSeriesDataFrame(data)
|
| 19 |
+
|
| 20 |
+
# Function to fetch stock indices (you already defined these)
|
| 21 |
+
def get_tw0050_stocks():
|
| 22 |
+
response = requests.get('https://answerbook.david888.com/TW0050')
|
| 23 |
+
data = response.json()
|
| 24 |
+
return [f"{code}.TW" for code in data['stocks'].keys()]
|
| 25 |
+
|
| 26 |
+
def get_sp500_stocks(limit=50):
|
| 27 |
+
response = requests.get('https://answerbook.david888.com/SP500')
|
| 28 |
+
data = response.json()
|
| 29 |
+
return list(data['stocks'].keys())[:limit]
|
| 30 |
+
|
| 31 |
+
def get_nasdaq_stocks(limit=50):
|
| 32 |
+
response = requests.get('http://13.125.121.198:8090/stocks/NASDAQ100')
|
| 33 |
+
data = response.json()
|
| 34 |
+
return list(data['stocks'].keys())[:limit]
|
| 35 |
+
|
| 36 |
+
def get_tw0051_stocks():
|
| 37 |
+
response = requests.get('https://answerbook.david888.com/TW0051')
|
| 38 |
+
data = response.json()
|
| 39 |
+
return [f"{code}.TW" for code in data['stocks'].keys()]
|
| 40 |
+
|
| 41 |
+
def get_sox_stocks():
|
| 42 |
+
return [
|
| 43 |
+
"NVDA", "AVGO", "GFS", "CRUS", "ON", "ASML", "QCOM", "SWKS", "MPWR", "ADI",
|
| 44 |
+
"TSM", "AMD", "TXN", "QRVO", "AMKR", "MU", "ARM", "NXPI", "TER", "ENTG",
|
| 45 |
+
"LSCC", "COHR", "ONTO", "MTSI", "KLAC", "LRCX", "MRVL", "AMAT", "INTC", "MCHP"
|
| 46 |
+
]
|
| 47 |
+
|
| 48 |
+
def get_dji_stocks():
|
| 49 |
+
response = requests.get('http://13.125.121.198:8090/stocks/DOWJONES')
|
| 50 |
+
data = response.json()
|
| 51 |
+
return list(data['stocks'].keys())
|
| 52 |
+
|
| 53 |
+
# Function to get top 10 potential stocks
|
| 54 |
+
def get_top_10_potential_stocks(period, selected_indices):
|
| 55 |
+
stock_list = []
|
| 56 |
+
if "\u53f0\u706350" in selected_indices:
|
| 57 |
+
stock_list += get_tw0050_stocks()
|
| 58 |
+
if "\u53f0\u7063\u4e2d\u578b100" in selected_indices:
|
| 59 |
+
stock_list += get_tw0051_stocks()
|
| 60 |
+
if "S&P\u7cbe\u7c21\u724850" in selected_indices:
|
| 61 |
+
stock_list += get_sp500_stocks()
|
| 62 |
+
if "NASDAQ\u7cbe\u7c21\u724850" in selected_indices:
|
| 63 |
+
stock_list += get_nasdaq_stocks()
|
| 64 |
+
if "\u8cfd\u57ce\u534a\u5b57\u9ad4SOX" in selected_indices:
|
| 65 |
+
stock_list += get_sox_stocks()
|
| 66 |
+
if "\u9053\u74b0DJI" in selected_indices:
|
| 67 |
+
stock_list += get_dji_stocks()
|
| 68 |
+
|
| 69 |
+
stock_predictions = []
|
| 70 |
+
prediction_length = 10
|
| 71 |
+
|
| 72 |
+
for ticker in stock_list:
|
| 73 |
+
try:
|
| 74 |
+
data = get_stock_data(ticker, period)
|
| 75 |
+
if data.empty:
|
| 76 |
+
continue
|
| 77 |
+
|
| 78 |
+
ts_data = prepare_data_chronos(data)
|
| 79 |
+
predictor = TimeSeriesPredictor(prediction_length=prediction_length)
|
| 80 |
+
predictor.fit(ts_data, hyperparameters={"Chronos": {"model_path": "amazon/chronos-bolt-base"}})
|
| 81 |
+
|
| 82 |
+
predictions = predictor.predict(ts_data)
|
| 83 |
+
potential = (predictions.iloc[-1] - data['Close'].iloc[-1]) / data['Close'].iloc[-1]
|
| 84 |
+
stock_predictions.append((ticker, potential, data['Close'].iloc[-1], predictions.iloc[-1]))
|
| 85 |
+
|
| 86 |
+
except Exception as e:
|
| 87 |
+
print(f"Stock {ticker} error: {str(e)}")
|
| 88 |
+
continue
|
| 89 |
+
|
| 90 |
+
top_10_stocks = sorted(stock_predictions, key=lambda x: x[1], reverse=True)[:10]
|
| 91 |
+
return top_10_stocks
|
| 92 |
+
|
| 93 |
+
# Gradio interface function
|
| 94 |
+
def stock_prediction_app(period, selected_indices):
|
| 95 |
+
top_10_stocks = get_top_10_potential_stocks(period, selected_indices)
|
| 96 |
+
df = pd.DataFrame(top_10_stocks, columns=["\u80a1\u7968\u4ee3\u865f", "\u6f5b\u529b (\u767e\u5206\u6bd4)", "\u73fe\u50f9", "\u9810\u6e2c\u50f9\u683c"])
|
| 97 |
+
return df
|
| 98 |
+
|
| 99 |
+
# Define Gradio interface
|
| 100 |
+
inputs = [
|
| 101 |
+
gr.Dropdown(choices=["3mo", "6mo", "9mo", "1yr"], label="\u6642\u9593\u7bc4\u570d"),
|
| 102 |
+
gr.CheckboxGroup(choices=["\u53f0\u706350", "\u53f0\u7063\u4e2d\u578b100", "S&P\u7cbe\u7c21\u724850", "NASDAQ\u7cbe\u7c21\u724850", "\u8cfd\u57ce\u534a\u5b57\u9ad4SOX", "\u9053\u74b0DJI"], label="\u6307\u6578\u9078\u64c7", value=["\u53f0\u706350", "\u53f0\u7063\u4e2d\u578b100"])
|
| 103 |
+
]
|
| 104 |
+
outputs = gr.Dataframe(label="\u6f5b\u529b\u80a1\u63a8\u85a6\u7d50\u679c")
|
| 105 |
+
|
| 106 |
+
gr.Interface(fn=stock_prediction_app, inputs=inputs, outputs=outputs, title="\u53f0\u80a1\u7f8e\u80a1\u6f5b\u529b\u80a1\u63a8\u85a6\u7cfb\u7d71 - Chronos-Bolt\u6a21\u578b").launch()
|