Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -854,7 +854,7 @@ def simple_statistical_predict(data, predict_days=5):
|
|
| 854 |
|
| 855 |
def calculate_new_features(df):
|
| 856 |
"""
|
| 857 |
-
計算新的技術指標特徵 - 針對新特徵需求
|
| 858 |
"""
|
| 859 |
if df.empty:
|
| 860 |
return df
|
|
@@ -868,49 +868,26 @@ def calculate_new_features(df):
|
|
| 868 |
# 3. MA5_close – 5 日移動平均價
|
| 869 |
df['MA5_close'] = df['Close'].rolling(window=5).mean()
|
| 870 |
|
| 871 |
-
|
| 872 |
-
# 5. volatility_5d – 5 日報酬標準差(短期波動)
|
| 873 |
df['volatility_5d'] = df['return_t-1'].rolling(window=5).std()
|
| 874 |
|
| 875 |
-
#
|
|
|
|
| 876 |
df['volume_5d_avg'] = df['Volume'].rolling(window=5).mean()
|
| 877 |
df['volume_ratio_5d'] = df['Volume'] / df['volume_5d_avg']
|
| 878 |
|
| 879 |
-
#
|
| 880 |
-
|
| 881 |
-
|
| 882 |
-
|
| 883 |
-
rs = gain / loss
|
| 884 |
-
df['RSI_14'] = 100 - (100 / (1 + rs))
|
| 885 |
-
|
| 886 |
-
# 8. MACD_diff – MACD - signal(趨勢強弱)
|
| 887 |
-
exp1 = df['Close'].ewm(span=12).mean()
|
| 888 |
-
exp2 = df['Close'].ewm(span=26).mean()
|
| 889 |
macd_line = exp1 - exp2
|
| 890 |
-
signal_line = macd_line.ewm(span=9).mean()
|
| 891 |
df['MACD_diff'] = macd_line - signal_line
|
| 892 |
|
| 893 |
-
#
|
| 894 |
-
|
| 895 |
-
|
| 896 |
-
# 10. RSI_14 – 14 日 RSI 指標 (如果原資料沒有RSI,需要計算)
|
| 897 |
-
if 'RSI' in df.columns:
|
| 898 |
-
df['RSI_14'] = df['RSI'] # 使用現有的RSI
|
| 899 |
-
else:
|
| 900 |
-
# 計算 RSI
|
| 901 |
-
delta = df['close'].diff()
|
| 902 |
-
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
|
| 903 |
-
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
|
| 904 |
-
rs = gain / loss
|
| 905 |
-
df['RSI_14'] = 100 - (100 / (1 + rs))
|
| 906 |
-
|
| 907 |
-
# 14. ADX
|
| 908 |
-
df['ADX'] = df['ADX']
|
| 909 |
|
| 910 |
-
|
| 911 |
-
# 15. 當日報酬率絕對值 × 當日成交量 (成交量加權報酬率)
|
| 912 |
-
df['volume_weighted_return'] = abs(df['return_t-1']) * df['volume']
|
| 913 |
-
|
| 914 |
# 移除輔助欄位
|
| 915 |
if 'volume_5d_avg' in df.columns:
|
| 916 |
df = df.drop('volume_5d_avg', axis=1)
|
|
@@ -937,10 +914,10 @@ def advanced_xgboost_predict(predict_days=5):
|
|
| 937 |
|
| 938 |
|
| 939 |
# 新增 volume_weighted_return 計算
|
| 940 |
-
if 'return_t-1' in taiex_data.columns and 'Volume' in taiex_data.columns:
|
| 941 |
-
|
| 942 |
-
else:
|
| 943 |
-
|
| 944 |
|
| 945 |
print("正在獲取美股數據...")
|
| 946 |
us_market_data = get_us_market_data()
|
|
|
|
| 854 |
|
| 855 |
def calculate_new_features(df):
|
| 856 |
"""
|
| 857 |
+
計算新的技術指標特徵 - 針對新特徵需求 (已修正)
|
| 858 |
"""
|
| 859 |
if df.empty:
|
| 860 |
return df
|
|
|
|
| 868 |
# 3. MA5_close – 5 日移動平均價
|
| 869 |
df['MA5_close'] = df['Close'].rolling(window=5).mean()
|
| 870 |
|
| 871 |
+
# 4. volatility_5d – 5 日報酬標準差(短期波動)
|
|
|
|
| 872 |
df['volatility_5d'] = df['return_t-1'].rolling(window=5).std()
|
| 873 |
|
| 874 |
+
# 5. volume_ratio_5d – 今日成交量 ÷ 5 日均量
|
| 875 |
+
# Note: Use 'Volume' with a capital V
|
| 876 |
df['volume_5d_avg'] = df['Volume'].rolling(window=5).mean()
|
| 877 |
df['volume_ratio_5d'] = df['Volume'] / df['volume_5d_avg']
|
| 878 |
|
| 879 |
+
# 6. MACD_diff – MACD - signal(趨勢強弱)
|
| 880 |
+
# This is already calculated as 'MACD_Histogram' in calculate_technical_indicators, but we'll recalculate to be safe.
|
| 881 |
+
exp1 = df['Close'].ewm(span=12, adjust=False).mean()
|
| 882 |
+
exp2 = df['Close'].ewm(span=26, adjust=False).mean()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 883 |
macd_line = exp1 - exp2
|
| 884 |
+
signal_line = macd_line.ewm(span=9, adjust=False).mean()
|
| 885 |
df['MACD_diff'] = macd_line - signal_line
|
| 886 |
|
| 887 |
+
# 7. volume_weighted_return - 成交量加權報酬率
|
| 888 |
+
# 【【ERROR FIX】】 Use 'Volume' with a capital V instead of 'volume'
|
| 889 |
+
df['volume_weighted_return'] = abs(df['return_t-1']) * df['Volume']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 890 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 891 |
# 移除輔助欄位
|
| 892 |
if 'volume_5d_avg' in df.columns:
|
| 893 |
df = df.drop('volume_5d_avg', axis=1)
|
|
|
|
| 914 |
|
| 915 |
|
| 916 |
# 新增 volume_weighted_return 計算
|
| 917 |
+
# if 'return_t-1' in taiex_data.columns and 'Volume' in taiex_data.columns:
|
| 918 |
+
# taiex_data['volume_weighted_return'] = abs(taiex_data['return_t-1']) * taiex_data['Volume']
|
| 919 |
+
# else:
|
| 920 |
+
# taiex_data['volume_weighted_return'] = 0
|
| 921 |
|
| 922 |
print("正在獲取美股數據...")
|
| 923 |
us_market_data = get_us_market_data()
|