tbdavid2019's picture
美股清單更新
ea4fe6a
raw
history blame
7.8 kB
import numpy as np
import pandas as pd
import yfinance as yf
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout
import gradio as gr
import datetime
# Function to fetch stock data
def get_stock_data(ticker, period):
data = yf.download(ticker, period=period)
return data
# Function to prepare the data for LSTM
def prepare_data(data, time_step=60):
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data['Close'].values.reshape(-1, 1))
X, y = [], []
for i in range(time_step, len(scaled_data)):
X.append(scaled_data[i-time_step:i, 0])
y.append(scaled_data[i, 0])
X, y = np.array(X), np.array(y)
X = np.reshape(X, (X.shape[0], X.shape[1], 1))
return X, y, scaler
# Function to build and train LSTM model
def train_lstm_model(X_train, y_train):
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(units=1))
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X_train, y_train, epochs=10, batch_size=32)
return model
# Function to predict stock prices
def predict_stock(model, data, scaler, time_step=60):
inputs = scaler.transform(data['Close'].values.reshape(-1, 1))
X_test = []
for i in range(time_step, len(inputs)):
X_test.append(inputs[i-time_step:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
predicted_prices = model.predict(X_test)
predicted_prices = scaler.inverse_transform(predicted_prices)
return predicted_prices
# Function to fetch Taiwan 50 and Small 100 stocks
def get_tw0050_stocks():
return [
"2330.TW", "2317.TW", "2454.TW", "2308.TW", "2881.TW", "2382.TW", "2303.TW", "2882.TW", "2891.TW", "3711.TW",
"2412.TW", "2886.TW", "2884.TW", "1216.TW", "2357.TW", "2885.TW", "2892.TW", "3034.TW", "2890.TW", "2327.TW",
"5880.TW", "2345.TW", "3231.TW", "2002.TW", "2880.TW", "3008.TW", "2883.TW", "1303.TW", "4938.TW", "2207.TW",
"2887.TW", "2379.TW", "1101.TW", "2603.TW", "2301.TW", "1301.TW", "5871.TW", "3037.TW", "3045.TW", "2912.TW",
"3017.TW", "6446.TW", "4904.TW", "3661.TW", "6669.TW", "1326.TW", "5876.TW", "2395.TW", "1590.TW", "6505.TW"
]
def get_tw0051_stocks():
return [
"2371.TW", "3533.TW", "2618.TW", "3443.TW", "2347.TW", "3044.TW", "2834.TW", "2385.TW", "1605.TW", "2105.TW",
"6239.TW", "6176.TW", "9904.TW", "1519.TW", "9910.TW", "1513.TW", "1229.TW", "9945.TW", "2313.TW", "1477.TW",
"3665.TW", "2354.TW", "4958.TW", "8464.TW", "9921.TW", "2812.TW", "2059.TW", "1504.TW", "2542.TW", "6770.TW",
"5269.TW", "2344.TW", "3023.TW", "1503.TW", "2049.TW", "2610.TW", "2633.TW", "3036.TW", "2368.TW", "3035.TW",
"2027.TW", "9914.TW", "2408.TW", "2809.TW", "1319.TW", "2352.TW", "2337.TW", "2006.TW", "2206.TW", "4763.TW",
"3005.TW", "1907.TW", "2915.TW", "1722.TW", "6285.TW", "6472.TW", "6531.TW", "3406.TW", "9958.TW", "9941.TW",
"1795.TW", "2201.TW", "9917.TW", "2492.TW", "6890.TW", "2845.TW", "8454.TW", "8046.TW", "6789.TW", "2388.TW",
"6526.TW", "1802.TW", "5522.TW", "6592.TW", "2204.TW", "2540.TW", "2539.TW", "3532.TW"
]
# Function to fetch S&P 500 component stocks
def get_sp500_stocks():
return [
"AAPL", "MSFT", "GOOGL", "AMZN", "FB", "TSLA", "BRK-B", "JNJ", "V", "WMT",
"JPM", "MA", "PG", "NVDA", "UNH", "DIS", "HD", "PYPL", "VZ", "ADBE",
"NFLX", "CMCSA", "PEP", "KO", "MRK", "INTC", "T", "CRM", "CSCO", "PFE",
"XOM", "COST", "NKE", "CVX", "WFC", "MCD", "AMGN", "MDT", "IBM", "DHR",
"LLY", "HON", "BA", "MMM", "NEE", "ACN", "UPS", "TMO", "AVGO", "PM"
]
# Function to fetch NASDAQ component stocks
def get_nasdaq_stocks():
return [
"AAPL", "MSFT", "AMZN", "TSLA", "GOOGL", "GOOG", "FB", "NVDA", "PYPL", "ADBE",
"CMCSA", "NFLX", "COST", "PEP", "CSCO", "INTC", "TXN", "AVGO", "AMGN", "QCOM",
"CHTR", "TMUS", "SBUX", "MDLZ", "ISRG", "BKNG", "MRNA", "FISV", "CSX", "ADI",
"VRTX", "ATVI", "GILD", "ILMN", "ADP", "MU", "KLAC", "LRCX", "EA", "KHC",
"JD", "MAR", "BIDU", "MELI", "ROST", "NXPI", "SPLK", "ALGN", "DOCU", "PDD"
]
# Function to fetch Philadelphia Semiconductor Index component stocks
def get_sox_stocks():
return [
"AMD", "AVGO", "TXN", "INTC", "MU", "NVDA", "QCOM", "ASML", "LRCX", "TSM",
"AMAT", "ON", "NXPI", "ADI", "KLAC", "SWKS", "QRVO", "MCHP", "SLAB", "ENTG",
"TER", "COHU", "UCTT", "ACLS", "LSCC", "MRVL", "SYNA", "MPWR", "FORM", "UCTT"
]
# Function to fetch Dow Jones Industrial Average component stocks
def get_dji_stocks():
return [
"AAPL", "MSFT", "JPM", "V", "UNH", "PG", "JNJ", "WMT", "DIS", "VZ",
"INTC", "KO", "MRK", "GS", "TRV", "IBM", "MMM", "CAT", "RTX", "CVX",
"MCD", "HON", "AXP", "WBA", "NKE", "DOW", "BA", "HD", "CRM", "AMGN"
]
# Function to get top 10 potential stocks
def get_top_10_potential_stocks(period, selected_indices):
stock_list = []
if "台灣50" in selected_indices:
stock_list += get_tw0050_stocks()
if "台灣中型100" in selected_indices:
stock_list += get_tw0051_stocks()
if "S&P" in selected_indices:
stock_list += get_sp500_stocks()
if "NASDAQ" in selected_indices:
stock_list += get_nasdaq_stocks()
if "費城半導體" in selected_indices:
stock_list += get_sox_stocks()
if "道瓊" in selected_indices:
stock_list += get_dji_stocks()
stock_predictions = []
time_step = 60
for ticker in stock_list:
data = get_stock_data(ticker, period)
if data.empty or len(data) < time_step:
# 如果數據為空或不足以生成訓練樣本,則跳過該股票
continue
try:
# Prepare data
X_train, y_train, scaler = prepare_data(data, time_step=time_step)
# Train model
model = train_lstm_model(X_train, y_train)
# Predict future prices
predicted_prices = predict_stock(model, data, scaler, time_step=time_step)
# Calculate the potential (e.g., last predicted price vs last actual price)
potential = (predicted_prices[-1] - data['Close'].values[-1]) / data['Close'].values[-1]
stock_predictions.append((ticker, potential, data['Close'].values[-1], predicted_prices[-1][0]))
except Exception as e:
print(f"股票 {ticker} 發生錯誤: {str(e)}")
continue
# Sort by potential and get top 10
top_10_stocks = sorted(stock_predictions, key=lambda x: x[1], reverse=True)[:10]
return top_10_stocks
# Gradio interface function
def stock_prediction_app(period, selected_indices):
# Get top 10 potential stocks
top_10_stocks = get_top_10_potential_stocks(period, selected_indices)
# Create a dataframe for display
df = pd.DataFrame(top_10_stocks, columns=["股票代號", "潛力 (百分比)", "現價", "預測價格"])
return df
# Define Gradio interface
inputs = [
gr.Dropdown(choices=["3mo", "6mo", "9mo", "1yr"], label="時間範圍"),
gr.CheckboxGroup(choices=["台灣50", "台灣中型100", "S&P", "NASDAQ", "費城半導體", "道瓊"], label="指數選擇", value=["台灣50", "台灣中型100"])
]
outputs = gr.Dataframe(label="潛力股推薦結果")
gr.Interface(fn=stock_prediction_app, inputs=inputs, outputs=outputs, title="台股美股潛力股推薦系統 - LSTM模型")\
.launch()