diff --git a/.env b/.env index d2d7e3f..99f3b80 100644 --- a/.env +++ b/.env @@ -25,3 +25,15 @@ OSS_ACCESS_KEY_ID=LTAI5tKD9izrfbQNSVeu4NYd OSS_ACCESS_KEY_SECRET=Vif8FmvEat9qBA4EBbKnXhHvFQokdR OSS_BUCKET_NAME=value-investing OSS_ENDPOINT=https://oss-cn-wulanchabu.aliyuncs.com + +# ==================== SSH 隧道配置(港美股代理) ==================== +SSH_ENABLED=true +SSH_HOST=8.218.167.69 +SSH_PORT=22 +SSH_USERNAME=root +SSH_KEY_PATH=hk_ecs.pem +SSH_LOCAL_PORT=1080 + +# ==================== Flask 缓存配置 ==================== +CACHE_MAXSIZE=128 +CACHE_TTL_SECONDS=7200 diff --git a/datasource/universal_fetcher.py b/datasource/universal_fetcher.py index 0aa79d2..9550cb0 100644 --- a/datasource/universal_fetcher.py +++ b/datasource/universal_fetcher.py @@ -135,8 +135,12 @@ class UniversalDataFetcher: return self._fetch_china_etf(code, start_date, end_date) elif asset_type == AssetType.US_INDEX: return self._fetch_us_index(code, start_date, end_date) + elif asset_type == AssetType.US_STOCK: + return self._fetch_us_stock(code, start_date, end_date) elif asset_type == AssetType.HK_INDEX: return self._fetch_hk_index(code, start_date, end_date) + elif asset_type == AssetType.HK_STOCK: + return self._fetch_hk_stock(code, start_date, end_date) elif asset_type == AssetType.FUTURES: return self._fetch_futures(code, start_date, end_date) elif asset_type == AssetType.CRYPTO: @@ -262,6 +266,20 @@ class UniversalDataFetcher: self._start_tunnel() return self._yfinance.fetch(code, start_date, end_date) + def _fetch_us_stock( + self, + code: str, + start_date: str, + end_date: str + ) -> Optional[pd.DataFrame]: + """ + 获取美股股票 + + 特点:YFinance,需要SSH隧道,返回价格+股票信息 + """ + self._start_tunnel() + return self._yfinance.fetch(code, start_date, end_date) + def _fetch_hk_index( self, code: str, @@ -276,6 +294,20 @@ class UniversalDataFetcher: self._start_tunnel() return self._yfinance.fetch(code, start_date, end_date) + def _fetch_hk_stock( + self, + code: str, + start_date: str, + end_date: str + ) -> Optional[pd.DataFrame]: + """ + 获取港股股票 + + 特点:YFinance,需要SSH隧道,返回价格+股票信息 + """ + self._start_tunnel() + return self._yfinance.fetch(code, start_date, end_date) + def _fetch_futures( self, code: str,