panda-data 0.0.2__tar.gz → 0.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {panda_data-0.0.2 → panda_data-0.0.3}/PKG-INFO +1 -1
- panda_data-0.0.3/panda_data/config/__init__.py +374 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/financial_and_factors_reader.py +49 -15
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/market_reader.py +27 -124
- panda_data-0.0.3/panda_data/test.py +27 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/utils/param_check_utils.py +40 -1
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data.egg-info/PKG-INFO +1 -1
- {panda_data-0.0.2 → panda_data-0.0.3}/pyproject.toml +1 -1
- panda_data-0.0.2/panda_data/config/__init__.py +0 -177
- panda_data-0.0.2/panda_data/test.py +0 -32
- {panda_data-0.0.2 → panda_data-0.0.3}/README.md +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/__init__.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/client.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/core/__init__.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/core/service.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/exceptions.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/__init__.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/future_reader.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/init_token.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/market_reference_reader.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/trading_tools_reader.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/transport/__init__.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/transport/http.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/utils/common_utils.py +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data.egg-info/SOURCES.txt +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data.egg-info/dependency_links.txt +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data.egg-info/requires.txt +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/panda_data.egg-info/top_level.txt +0 -0
- {panda_data-0.0.2 → panda_data-0.0.3}/setup.cfg +0 -0
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"""
|
|
2
|
+
配置模块,用于加载和管理配置信息
|
|
3
|
+
支持从配置文件和环境变量导入,环境变量优先级更高
|
|
4
|
+
"""
|
|
5
|
+
import os
|
|
6
|
+
import yaml
|
|
7
|
+
import logging
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
# 获取logger
|
|
11
|
+
try:
|
|
12
|
+
from panda_data.logger.config import logger
|
|
13
|
+
except ImportError:
|
|
14
|
+
# 如果无法导入logger,创建一个基本的logger
|
|
15
|
+
logging.basicConfig(level=logging.INFO)
|
|
16
|
+
logger = logging.getLogger("config")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# 初始化配置变量config = None
|
|
20
|
+
|
|
21
|
+
def load_config():
|
|
22
|
+
"""加载配置文件,并从环境变量更新配置"""
|
|
23
|
+
global config
|
|
24
|
+
|
|
25
|
+
config = {}
|
|
26
|
+
|
|
27
|
+
# 日志配置 Logging
|
|
28
|
+
config["LOG_LEVEL"] = os.getenv("LOG_LEVEL", "DEBUG")
|
|
29
|
+
config["log_file"] = os.getenv("LOG_FILE", "logs/panda_data.log")
|
|
30
|
+
config["log_rotation"] = os.getenv("LOG_ROTATION", "1 MB")
|
|
31
|
+
config["LOG_PATH"] = os.getenv("LOG_PATH", "~/log")
|
|
32
|
+
|
|
33
|
+
# HTTP service integration
|
|
34
|
+
config["DEFAULT_USERNAME"] = os.getenv("DEFAULT_USERNAME", "")
|
|
35
|
+
config["DEFAULT_PASSWORD"] = os.getenv("DEFAULT_PASSWORD", "")
|
|
36
|
+
|
|
37
|
+
config["HTTP_SERVICE_BASE_URL"] = os.getenv("HTTP_SERVICE_BASE_URL")
|
|
38
|
+
config["HTTP_TIMEOUT"] = os.getenv("HTTP_TIMEOUT", "300")
|
|
39
|
+
config["HTTP_MAX_RETRIES"] = os.getenv("HTTP_MAX_RETRIES", "3")
|
|
40
|
+
config["HTTP_VERIFY_SSL"] = os.getenv("HTTP_VERIFY_SSL", "true")
|
|
41
|
+
config["HTTP_PROXY_TYPE"] = os.getenv("HTTP_PROXY_TYPE") # "http" or "https"
|
|
42
|
+
config["HTTP_PROXY_HOST"] = os.getenv("HTTP_PROXY_HOST")
|
|
43
|
+
config["HTTP_PROXY_PORT"] = os.getenv("HTTP_PROXY_PORT")
|
|
44
|
+
config["HTTP_PROXY_USERNAME"] = os.getenv("HTTP_PROXY_USERNAME")
|
|
45
|
+
config["HTTP_PROXY_PASSWORD"] = os.getenv("HTTP_PROXY_PASSWORD")
|
|
46
|
+
config["HTTP_USE_GZIP"] = os.getenv("HTTP_USE_GZIP", "false")
|
|
47
|
+
config["HTTP_DATA_FIELD"] = os.getenv("HTTP_DATA_FIELD", "data")
|
|
48
|
+
config["HTTP_ABNORMAL_ENDPOINT"] = os.getenv("HTTP_ABNORMAL_ENDPOINT", "/abnormal")
|
|
49
|
+
|
|
50
|
+
# Legacy HTTP service config (for backward compatibility)
|
|
51
|
+
config["JAVA_SERVICE_BASE_URL"] = os.getenv("JAVA_SERVICE_BASE_URL", "http://pandadata.pandaai.online")
|
|
52
|
+
config["JAVA_SERVICE_TIMEOUT"] = os.getenv("JAVA_SERVICE_TIMEOUT", "15")
|
|
53
|
+
config["JAVA_SERVICE_MAX_POOL_SIZE"] = os.getenv("JAVA_SERVICE_MAX_POOL_SIZE", "10")
|
|
54
|
+
config["JAVA_SERVICE_MAX_RETRIES"] = os.getenv("JAVA_SERVICE_MAX_RETRIES", "3")
|
|
55
|
+
config["JAVA_SERVICE_BACKOFF_FACTOR"] = os.getenv("JAVA_SERVICE_BACKOFF_FACTOR", "0.3")
|
|
56
|
+
config["JAVA_SERVICE_VERIFY_SSL"] = os.getenv("JAVA_SERVICE_VERIFY_SSL", "true")
|
|
57
|
+
config["JAVA_SERVICE_DATA_FIELD"] = os.getenv("JAVA_SERVICE_DATA_FIELD", "data")
|
|
58
|
+
config["JAVA_SERVICE_ABNORMAL_ENDPOINT"] = os.getenv("JAVA_SERVICE_ABNORMAL_ENDPOINT", "/abnormal")
|
|
59
|
+
|
|
60
|
+
config["JAVA_SERVICE_CALENDAR_ENDPOINT"] = os.getenv("JAVA_SERVICE_CALENDAR_ENDPOINT", "/tradeCalendar")
|
|
61
|
+
config["JAVA_SERVICE_CALENDAR_PATH_GET_TRADE_CALENDAR_DATA"] = os.getenv(
|
|
62
|
+
"JAVA_SERVICE_CALENDAR_PATH_GET_TRADE_CALENDAR_DATA", "/getTradeCalendarData")
|
|
63
|
+
config["JAVA_SERVICE_CALENDAR_PATH_GET_PREVIOUS_NTH_TRADING_DAY"] = os.getenv(
|
|
64
|
+
"JAVA_SERVICE_CALENDAR_PATH_GET_PREVIOUS_NTH_TRADING_DAY", "/getPreviousNthTradingDay")
|
|
65
|
+
config["JAVA_SERVICE_CALENDAR_PATH_GET_LATEST_TRADING_DAY"] = os.getenv(
|
|
66
|
+
"JAVA_SERVICE_CALENDAR_PATH_GET_LATEST_TRADING_DAY", "/getLatestTradingDay")
|
|
67
|
+
|
|
68
|
+
config["JAVA_SERVICE_ABNORMAL_ENDPOINT"] = os.getenv("JAVA_SERVICE_ABNORMAL_ENDPOINT", "/abnormal")
|
|
69
|
+
config["JAVA_SERVICE_ABNORMAL_PATH_GET_ABNORMAL_DATA"] = os.getenv("JAVA_SERVICE_ABNORMAL_PATH_GET_ABNORMAL_DATA",
|
|
70
|
+
"/getAbnormalData")
|
|
71
|
+
config["JAVA_SERVICE_ABNORMAL_PATH_GET_ABNORMAL_DETAIL"] = os.getenv(
|
|
72
|
+
"JAVA_SERVICE_ABNORMAL_PATH_GET_ABNORMAL_DETAIL", "/getAbnormalDetailData")
|
|
73
|
+
|
|
74
|
+
config["JAVA_SERVICE_BUY_BACK_ENDPOINT"] = os.getenv("JAVA_SERVICE_BUY_BACK_ENDPOINT", "/buyback")
|
|
75
|
+
config["JAVA_SERVICE_BUY_BACK_PATH_GET_BUY_BACK_DATA"] = os.getenv("JAVA_SERVICE_BUY_BACK_PATH_GET_BUY_BACK_DATA",
|
|
76
|
+
"/getBuyBackData")
|
|
77
|
+
|
|
78
|
+
config["JAVA_SERVICE_CONCEPT_ENDPOINT"] = os.getenv("JAVA_SERVICE_CONCEPT_ENDPOINT", "/concept")
|
|
79
|
+
config["JAVA_SERVICE_CONCEPT_PATH_GET_CONCEPT_LIST"] = os.getenv("JAVA_SERVICE_CONCEPT_PATH_GET_CONCEPT_LIST",
|
|
80
|
+
"/getConceptData")
|
|
81
|
+
config["JAVA_SERVICE_CONCEPT_PATH_GET_CONCEPT_STOCK"] = os.getenv("JAVA_SERVICE_CONCEPT_PATH_GET_CONCEPT_STOCK",
|
|
82
|
+
"/getConceptStockData")
|
|
83
|
+
|
|
84
|
+
config["JAVA_SERVICE_FINANCIAL_ENDPOINT"] = os.getenv("JAVA_SERVICE_FINANCIAL_ENDPOINT", "/financial")
|
|
85
|
+
config["JAVA_SERVICE_FINANCIAL_PATH_GET_FORECAST"] = os.getenv("JAVA_SERVICE_FINANCIAL_PATH_GET_FORECAST",
|
|
86
|
+
"/getFinancialForecastData")
|
|
87
|
+
config["JAVA_SERVICE_FINANCIAL_PATH_GET_PERFORMANCE"] = os.getenv("JAVA_SERVICE_FINANCIAL_PATH_GET_PERFORMANCE",
|
|
88
|
+
"/getFinancialPerformanceData")
|
|
89
|
+
config["JAVA_SERVICE_FINANCIAL_PATH_GET_EX"] = os.getenv("JAVA_SERVICE_FINANCIAL_PATH_GET_EX",
|
|
90
|
+
"/getFinancialExData")
|
|
91
|
+
config["JAVA_SERVICE_FINANCIAL_PATH_GET_STATEMENT"] = os.getenv("JAVA_SERVICE_FINANCIAL_PATH_GET_STATEMENT",
|
|
92
|
+
"/getFinancialStatementData")
|
|
93
|
+
|
|
94
|
+
config["JAVA_SERVICE_FUND_ENDPOINT"] = os.getenv("JAVA_SERVICE_FUND_ENDPOINT", "/fund")
|
|
95
|
+
config["JAVA_SERVICE_FUND_PATH_GET_ALL_FUNDS"] = os.getenv("JAVA_SERVICE_FUND_PATH_GET_ALL_FUNDS", "/getAllFunds")
|
|
96
|
+
config["JAVA_SERVICE_FUND_PATH_GET_FUND_PRO"] = os.getenv("JAVA_SERVICE_FUND_PATH_GET_FUND_PRO",
|
|
97
|
+
"/getFundPortfolioData")
|
|
98
|
+
config["JAVA_SERVICE_FUND_PATH_GET_FUND_NAV"] = os.getenv("JAVA_SERVICE_FUND_PATH_GET_FUND_NAV", "/getFundNavData")
|
|
99
|
+
|
|
100
|
+
config["JAVA_SERVICE_FUTURE_ENDPOINT"] = os.getenv("JAVA_SERVICE_FUTURE_ENDPOINT", "/future")
|
|
101
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_LIST"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_LIST",
|
|
102
|
+
"/getFutureList")
|
|
103
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FACTOR_POST"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_FACTOR_POST",
|
|
104
|
+
"/getFutureMarketPostData")
|
|
105
|
+
config["JAVA_SERVICE_FUTURE_PATH_FUTURE_DOMINANT"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_FUTURE_DOMINANT",
|
|
106
|
+
"/getFutureDominantData")
|
|
107
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_SYMBOL_POSI_RANK"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_SYMBOL_POSI_RANK",
|
|
108
|
+
"/getFutureSymbolPosiRankData")
|
|
109
|
+
config["JAVA_SERVICE_TICK_PATH_FUTURE_TICK"] = os.getenv("JAVA_SERVICE_TICK_PATH_FUTURE_TICK", "/getFutureTickData")
|
|
110
|
+
config["JAVA_SERVICE_FUTURE_PATH_FUTURE_NETPOSI_RANK"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_FUTURE_NETPOSI_RANK",
|
|
111
|
+
"/getFutureNetposiRankData")
|
|
112
|
+
config["JAVA_SERVICE_FUTURE_PATH_FUTURE_NET_FLOW"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_FUTURE_NET_FLOW",
|
|
113
|
+
"/getFutureNetFlowData")
|
|
114
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_BROKER_GRADE"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_BROKER_GRADE",
|
|
115
|
+
"/getBrokerGradeData")
|
|
116
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_BROKER_NET_MARGIN"] = os.getenv(
|
|
117
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_BROKER_NET_MARGIN", "/getBrokerNetMarginData")
|
|
118
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_BROKER_NET_MARGIN_CHANGE"] = os.getenv(
|
|
119
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_BROKER_NET_MARGIN_CHANGE", "/getBrokerNetMarginChangeData")
|
|
120
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_BROKER_TOTAL_MARGIN"] = os.getenv(
|
|
121
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_BROKER_TOTAL_MARGIN", "/getBrokerTotalMarginData")
|
|
122
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_BASIS"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_BASIS",
|
|
123
|
+
"/getFutureBasisData")
|
|
124
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_WR"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_WR",
|
|
125
|
+
"/getFutureWRData")
|
|
126
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_LS_RATIO"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_LS_RATIO",
|
|
127
|
+
"/getFutureLSRatioData")
|
|
128
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_CONTRACT_RANK"] = os.getenv(
|
|
129
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_CONTRACT_RANK", "/getFutureContractRankData")
|
|
130
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_NET_CAP_CHANGE"] = os.getenv(
|
|
131
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_NET_CAP_CHANGE", "/getFutureNetCapChangeData")
|
|
132
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_TERM_STRUCTURE"] = os.getenv(
|
|
133
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_TERM_STRUCTURE", "/getFutureTermStructureData")
|
|
134
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_INVENTORY"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_INVENTORY",
|
|
135
|
+
"/getFutureInventoryData")
|
|
136
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_RESEARCH_REPORT"] = os.getenv(
|
|
137
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_RESEARCH_REPORT", "/getFutureResearchReportData")
|
|
138
|
+
config["JAVA_SERVICE_FUTURE_PATH_DOWNLOAD_FUTURE_RESEARCH_REPORT"] = os.getenv(
|
|
139
|
+
"JAVA_SERVICE_FUTURE_PATH_DOWNLOAD_FUTURE_RESEARCH_REPORT", "/downloadFutureResearchReport")
|
|
140
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SYMBOL_OI_VALUE"] = os.getenv(
|
|
141
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SYMBOL_OI_VALUE", "/getFutureSymbolOiValueData")
|
|
142
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_BROKER_POSITION"] = os.getenv(
|
|
143
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_BROKER_POSITION", "/getFutureBrokerPositionData")
|
|
144
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_BROKER_PROFIT"] = os.getenv(
|
|
145
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_BROKER_PROFIT", "/getFutureBrokerProfitData")
|
|
146
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_NONBROKER_NET_OI"] = os.getenv(
|
|
147
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_NONBROKER_NET_OI", "/getFutureNonbrokerNetOiData")
|
|
148
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_CROSS_TERM_ARBITRAGE"] = os.getenv(
|
|
149
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_CROSS_TERM_ARBITRAGE", "/getFutureCrossTermArbitrageData")
|
|
150
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_FREE_SPREAD"] = os.getenv(
|
|
151
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_FREE_SPREAD", "/getFutureFreeSpreadData")
|
|
152
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_FREE_RATIO"] = os.getenv(
|
|
153
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_FREE_RATIO", "/getFutureFreeRatioData")
|
|
154
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_MARKET_MIN_DATA"] = os.getenv(
|
|
155
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_MARKET_MIN_DATA", "/getMultiMarketMinData"
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
config["JAVA_SERVICE_INDEX_ENDPOINT"] = os.getenv("JAVA_SERVICE_INDEX_ENDPOINT", "/index")
|
|
159
|
+
config["JAVA_SERVICE_INDEX_PATH_GET_SYMBOL"] = os.getenv("JAVA_SERVICE_INDEX_PATH_GET_SYMBOL",
|
|
160
|
+
"/getIndexSymbolData")
|
|
161
|
+
config["JAVA_SERVICE_INDEX_PATH_GET_INDICATOR"] = os.getenv("JAVA_SERVICE_INDEX_PATH_GET_INDICATOR",
|
|
162
|
+
"/getIndexIndicatorData")
|
|
163
|
+
config["JAVA_SERVICE_INDEX_PATH_GET_WEIGHTS"] = os.getenv("JAVA_SERVICE_INDEX_PATH_GET_WEIGHTS",
|
|
164
|
+
"/getIndexWeightsData")
|
|
165
|
+
config["JAVA_SERVICE_INDEX_PATH_GET_MARKET_MIN_DATA"] = os.getenv(
|
|
166
|
+
"JAVA_SERVICE_INDEX_PATH_GET_MARKET_MIN_DATA", "/getMultiMarketMinData"
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
config["JAVA_SERVICE_INDUSTRY_ENDPOINT"] = os.getenv("JAVA_SERVICE_INDUSTRY_ENDPOINT", "/industry")
|
|
170
|
+
config["JAVA_SERVICE_INDUSTRY_PATH_GET_STOCK"] = os.getenv("JAVA_SERVICE_INDUSTRY_PATH_GET_STOCK",
|
|
171
|
+
"/getIndustryStockData")
|
|
172
|
+
config["JAVA_SERVICE_INDUSTRY_PATH_GET_LIST"] = os.getenv("JAVA_SERVICE_INDUSTRY_PATH_GET_LIST", "/getIndustryList")
|
|
173
|
+
config["JAVA_SERVICE_INDUSTRY_PATH_GET_STOCK_INDUSTRY"] = os.getenv("JAVA_SERVICE_INDUSTRY_PATH_GET_STOCK_INDUSTRY",
|
|
174
|
+
"/getStockIndustry")
|
|
175
|
+
|
|
176
|
+
config["JAVA_SERVICE_KLINE_ENDPOINT"] = os.getenv("JAVA_SERVICE_KLINE_ENDPOINT", "/multi")
|
|
177
|
+
config["JAVA_SERVICE_KLINE_PATH_GET_STOCK_DETAIL"] = os.getenv("JAVA_SERVICE_KLINE_PATH_GET_STOCK_DETAIL",
|
|
178
|
+
"/getStockDetail")
|
|
179
|
+
config["JAVA_SERVICE_KLINE_PATH_GET_MARKET_DATA"] = os.getenv("JAVA_SERVICE_KLINE_PATH_GET_MARKET_DATA",
|
|
180
|
+
"/getMultiMarketData")
|
|
181
|
+
config["JAVA_SERVICE_KLINE_PATH_GET_MARKET_MIN_DATA"] = os.getenv("JAVA_SERVICE_KLINE_PATH_GET_MARKET_MIN_DATA",
|
|
182
|
+
"/getMultiMarketMinData")
|
|
183
|
+
config["JAVA_SERVICE_KLINE_PATH_GET_FACTOR"] = os.getenv("JAVA_SERVICE_KLINE_PATH_GET_FACTOR", "/getFactor")
|
|
184
|
+
|
|
185
|
+
config["JAVA_SERVICE_SECURITIES_MARGIN_ENDPOINT"] = os.getenv("JAVA_SERVICE_SECURITIES_MARGIN_ENDPOINT",
|
|
186
|
+
"/stock")
|
|
187
|
+
|
|
188
|
+
config["JAVA_SERVICE_SECURITIES_MARGIN_PATH_GET_MARGIN"] = os.getenv(
|
|
189
|
+
"JAVA_SERVICE_SECURITIES_MARGIN_PATH_GET_MARGIN",
|
|
190
|
+
"/getSecuritiesMarginData")
|
|
191
|
+
|
|
192
|
+
config["JAVA_SERVICE_STOCK_CONNECT_ENDPOINT"] = os.getenv("JAVA_SERVICE_STOCK_CONNECT_ENDPOINT",
|
|
193
|
+
"/stock")
|
|
194
|
+
config["JAVA_SERVICE_STOCK_CONNECT_PATH_GET_STOCK_CONNECT_DATA"] = os.getenv(
|
|
195
|
+
"JAVA_SERVICE_STOCK_CONNECT_PATH_GET_STOCK_CONNECT_DATA",
|
|
196
|
+
"/getStockConnectData")
|
|
197
|
+
|
|
198
|
+
config["JAVA_SERVICE_STOCK_ENDPOINT"] = os.getenv("JAVA_SERVICE_STOCK_ENDPOINT", "/stock")
|
|
199
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_FLOW"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_FLOW", "/getStockFlowData")
|
|
200
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_AUDIT_OPINION"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_AUDIT_OPINION",
|
|
201
|
+
"/getStockAuditData")
|
|
202
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_INVESTOR_ACTIVITIES"] = os.getenv(
|
|
203
|
+
"JAVA_SERVICE_STOCK_PATH_GET_INVESTOR_ACTIVITIES", "/getStockInvestorData")
|
|
204
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_RESTRICTED_DETAILS"] = os.getenv(
|
|
205
|
+
"JAVA_SERVICE_STOCK_PATH_GET_RESTRICTED_DETAILS", "/getStockRestrictedData")
|
|
206
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_CASH_DIVIDEND"] = os.getenv(
|
|
207
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_CASH_DIVIDEND", "/getStockCashDividendData")
|
|
208
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_DIVIDEND_INFO"] = os.getenv(
|
|
209
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_DIVIDEND_INFO", "/getStockDividendInfoData")
|
|
210
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_SPLIT_INFO"] = os.getenv(
|
|
211
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_SPLIT_INFO", "/getStockSplitInfoData")
|
|
212
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_DIVIDEND_AMOUNT"] = os.getenv(
|
|
213
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_DIVIDEND_AMOUNT", "/getStockDividendAmountData")
|
|
214
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_PRIVATE_PLACEMENT"] = os.getenv(
|
|
215
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_PRIVATE_PLACEMENT", "/getStockPrivatePlacementData")
|
|
216
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_ALLOTMENT"] = os.getenv(
|
|
217
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_ALLOTMENT", "/getStockAllotmentData")
|
|
218
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_HOLDER_NUMBER"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_HOLDER_NUMBER",
|
|
219
|
+
"/getStockHolderNumberData")
|
|
220
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_MAIN_SHAREHOLDER"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_MAIN_SHAREHOLDER",
|
|
221
|
+
"/getStockMainHolderData")
|
|
222
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_SPECIAL_TREATMENT"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_SPECIAL_TREATMENT",
|
|
223
|
+
"/getStockSpecialTreatmentData")
|
|
224
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_FLOW_1M"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_FLOW_1M",
|
|
225
|
+
"/getStockFlowMinData")
|
|
226
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_BLOCK_TRADE"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_BLOCK_TRADE",
|
|
227
|
+
"/getStockBlockTradeData")
|
|
228
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_FACTOR_RESTORED"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_FACTOR_RESTORED",
|
|
229
|
+
"/getFactorRestoredData")
|
|
230
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_SHARES"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_SHARES", "/getStockShareData")
|
|
231
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_TRADING_STOCK_LIST"] = os.getenv(
|
|
232
|
+
"JAVA_SERVICE_STOCK_PATH_GET_TRADING_STOCK_LIST", "/getTradingStockList")
|
|
233
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_CUMU_GUARANTEE"] = os.getenv(
|
|
234
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_CUMU_GUARANTEE", "/getStockCumuGuaranteeData")
|
|
235
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_EQUITY_PLEDGE"] = os.getenv(
|
|
236
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_EQUITY_PLEDGE", "/getStockEquityPledgeData")
|
|
237
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_EQUITY_PLEDGE_STAT"] = os.getenv(
|
|
238
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_EQUITY_PLEDGE_STAT", "/getStockEquityPledgeStatData")
|
|
239
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_RELA_PARTY_TRANS"] = os.getenv(
|
|
240
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_RELA_PARTY_TRANS", "/getStockRelaPartyTransData")
|
|
241
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_STOCK_SHAREHOLDER_TRADING_PLAN"] = os.getenv(
|
|
242
|
+
"JAVA_SERVICE_STOCK_PATH_GET_STOCK_SHAREHOLDER_TRADING_PLAN", "/getStockShareholderTradingPlanData")
|
|
243
|
+
|
|
244
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_EVENT_CAP_MARKET"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_EVENT_CAP_MARKET",
|
|
245
|
+
"/getEventCapMarketData")
|
|
246
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_EVENT_CORP_ACTION"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_EVENT_CORP_ACTION",
|
|
247
|
+
"/getEventCorpActionData")
|
|
248
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_EVENT_DEVIDEND"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_EVENT_DEVIDEND",
|
|
249
|
+
"/getEventDevidendData")
|
|
250
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_EVENT_INVESTOR_RA"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_EVENT_INVESTOR_RA",
|
|
251
|
+
"/getEventInvestorRAData")
|
|
252
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_EVENT_FINA_DISCLOSURE"] = os.getenv(
|
|
253
|
+
"JAVA_SERVICE_STOCK_PATH_GET_EVENT_FINA_DISCLOSURE", "/getEventFinaDisclosureData")
|
|
254
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_COMPANY_CONCEN"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_COMPANY_CONCEN",
|
|
255
|
+
"/getCompanyConcenData")
|
|
256
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_COMPANY_TOP_CONCEN"] = os.getenv(
|
|
257
|
+
"JAVA_SERVICE_STOCK_PATH_GET_COMPANY_TOP_CONCEN", "/getCompanyTopConcenData")
|
|
258
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_COMPANY_INSI_TRANS"] = os.getenv(
|
|
259
|
+
"JAVA_SERVICE_STOCK_PATH_GET_COMPANY_INSI_TRANS", "/getCompanyInsiTransData")
|
|
260
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_COMPANY_SHRHOLDER_REP"] = os.getenv(
|
|
261
|
+
"JAVA_SERVICE_STOCK_PATH_GET_COMPANY_SHRHOLDER_REP", "/getCompanyShrHolderRepData")
|
|
262
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_COMPANY_INVESTOR"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_COMPANY_INVESTOR",
|
|
263
|
+
"/getCompanyInvestorData")
|
|
264
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_COMPANY_CURRENT"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_COMPANY_CURRENT",
|
|
265
|
+
"/getCompanyCurrentData")
|
|
266
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_COMPANY_IMED"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_COMPANY_IMED",
|
|
267
|
+
"/getCompanyImedData")
|
|
268
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_COMPANY_PRICE_VOL"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_COMPANY_PRICE_VOL",
|
|
269
|
+
"/getCompanyPriceVolData")
|
|
270
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_CONSENSUS_NONPERIOD"] = os.getenv(
|
|
271
|
+
"JAVA_SERVICE_STOCK_PATH_GET_CONSENSUS_NONPERIOD", "/getConsensusNonperiodData")
|
|
272
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_CONSENSUS_RECOMMEND"] = os.getenv(
|
|
273
|
+
"JAVA_SERVICE_STOCK_PATH_GET_CONSENSUS_RECOMMEND", "/getConsensusRecommendData")
|
|
274
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_COMPANY_OPER_METRIC"] = os.getenv(
|
|
275
|
+
"JAVA_SERVICE_STOCK_PATH_GET_COMPANY_OPER_METRIC", "/getCompanyOperMetricData")
|
|
276
|
+
|
|
277
|
+
config["JAVA_SERVICE_STOCK_PATH_GET_INDEX_COMP_HKUS"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_INDEX_COMP_HKUS",
|
|
278
|
+
"/getIndexCompHKUSData")
|
|
279
|
+
|
|
280
|
+
config["JAVA_SERVICE_TICK_ENDPOINT"] = os.getenv("JAVA_SERVICE_TICK_ENDPOINT", "/tick")
|
|
281
|
+
config["JAVA_SERVICE_TICK_PATH_HK_TICK"] = os.getenv("JAVA_SERVICE_TICK_PATH_HK_TICK", "/getStockHKTickData")
|
|
282
|
+
|
|
283
|
+
config["JAVA_SERVICE_HK_ENDPOINT"] = os.getenv("JAVA_SERVICE_HK_ENDPOINT", "/hkMarket")
|
|
284
|
+
config["JAVA_SERVICE_HK_PATH_STOCK"] = os.getenv("JAVA_SERVICE_HK_PATH_STOCK", "/getStockMarketHKData")
|
|
285
|
+
config["JAVA_SERVICE_HK_PATH_STOCK_MIN"] = os.getenv("JAVA_SERVICE_HK_PATH_STOCK_MIN", "/getStockMarketHKMinData")
|
|
286
|
+
|
|
287
|
+
config["JAVA_SERVICE_US_ENDPOINT"] = os.getenv("JAVA_SERVICE_US_ENDPOINT", "/usMarket")
|
|
288
|
+
config["JAVA_SERVICE_US_PATH_STOCK"] = os.getenv("JAVA_SERVICE_US_PATH_STOCK", "/getStockMarketUSData")
|
|
289
|
+
config["JAVA_SERVICE_US_PATH_STOCK_MIN"] = os.getenv("JAVA_SERVICE_US_PATH_STOCK_MIN", "/getStockMarketUSMinData")
|
|
290
|
+
|
|
291
|
+
config["JAVA_SERVICE_MACRO_ENDPOINT"] = os.getenv("JAVA_SERVICE_MACRO_ENDPOINT", "/macro")
|
|
292
|
+
config["JAVA_SERVICE_MACRO_PATH_GET_MACRO_CAL"] = os.getenv("JAVA_SERVICE_MACRO_PATH_GET_MACRO_CAL",
|
|
293
|
+
"/getMacroCalData")
|
|
294
|
+
config["JAVA_SERVICE_MACRO_PATH_GET_MACRO_CAL_CONFIG"] = os.getenv("JAVA_SERVICE_MACRO_PATH_GET_MACRO_CAL_CONFIG",
|
|
295
|
+
"/getMacroCalConfig")
|
|
296
|
+
config["JAVA_SERVICE_MACRO_PATH_GET_MACRO_CAL_INFO"] = os.getenv("JAVA_SERVICE_MACRO_PATH_GET_MACRO_CAL_INFO",
|
|
297
|
+
"/getMacroCalInfo")
|
|
298
|
+
|
|
299
|
+
config["JAVA_SERVICE_USER_ENDPOINT"] = os.getenv("JAVA_SERVICE_USER_ENDPOINT", "/dataUser")
|
|
300
|
+
config["JAVA_SERVICE_USER_PATH_LOGIN"] = os.getenv("JAVA_SERVICE_USER_PATH_LOGIN", "/login")
|
|
301
|
+
config["JAVA_SERVICE_TICK_USER_ENDPOINT"] = os.getenv("JAVA_SERVICE_TICK_USER_ENDPOINT", "/tickUser")
|
|
302
|
+
config["JAVA_SERVICE_TICK_USER_PATH_LOGIN"] = os.getenv("JAVA_SERVICE_TICK_USER_PATH_LOGIN", "/login")
|
|
303
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SAT_PROFIT_RAMKING"] = os.getenv(
|
|
304
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SAT_PROFIT_RAMKING", "/getFutureSatProfitRankingData")
|
|
305
|
+
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SAT_LOSS_RANKING"] = os.getenv(
|
|
306
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SAT_LOSS_RANKING", "/getFutureSatLossRankingData")
|
|
307
|
+
config['JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_POSITION_BUILDING_PROCESS'] = os.getenv(
|
|
308
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_POSITION_BUILDING_PROCESS", "/getFuturePositionBuildingProcessData")
|
|
309
|
+
config['JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_CAP_VALUE'] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_CAP_VALUE",
|
|
310
|
+
"/getFutureCapValueData")
|
|
311
|
+
config['JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SEAT_MATCHING'] = os.getenv(
|
|
312
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SEAT_MATCHING", "/getFutureSeatMatchingData")
|
|
313
|
+
config['JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_RATIO_OF_VIRTUAL_TO_REAL_POSITIONS'] = os.getenv(
|
|
314
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_RATIO_OF_VIRTUAL_TO_REAL_POSITIONS",
|
|
315
|
+
"/getFutureRatioOfVitualToRealPositionsData")
|
|
316
|
+
config['JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SPOT_PROFIT'] = os.getenv(
|
|
317
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SPOT_PROFIT", "/getFutureSpotProfitData")
|
|
318
|
+
config['JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SPOT_TRADER_QUOTATION'] = os.getenv(
|
|
319
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_SPOT_TRADER_QUOTATION", "/getFutureSpotTraderQuotationData")
|
|
320
|
+
|
|
321
|
+
# Option service endpoints
|
|
322
|
+
config["JAVA_SERVICE_OPTION_PATH_GET_OPTION_DETAIL"] = os.getenv(
|
|
323
|
+
"JAVA_SERVICE_OPTION_PATH_GET_OPTION_DETAIL", "/getOptionDetailData")
|
|
324
|
+
config["JAVA_SERVICE_OPTION_PATH_GET_OPTION_UNDERLYING_DETAIL"] = os.getenv(
|
|
325
|
+
"JAVA_SERVICE_OPTION_PATH_GET_OPTION_UNDERLYING_DETAIL", "/getOptionUnderlyingDetailData")
|
|
326
|
+
config["JAVA_SERVICE_OPTION_PATH_GET_OPTION_MARKET_DATA"] = os.getenv(
|
|
327
|
+
"JAVA_SERVICE_OPTION_PATH_GET_OPTION_MARKET_DATA", "/getOptionMarketData")
|
|
328
|
+
config["JAVA_SERVICE_OPTION_PATH_GET_OPTION_IMPLIED_VOLATILITY"] = os.getenv(
|
|
329
|
+
"JAVA_SERVICE_OPTION_PATH_GET_OPTION_IMPLIED_VOLATILITY", "/getOptionImpliedVolatilityData")
|
|
330
|
+
config["JAVA_SERVICE_OPTION_PATH_GET_OPTION_UDERLYING_VOLATILITY"] = os.getenv(
|
|
331
|
+
"JAVA_SERVICE_OPTION_PATH_GET_OPTION_HISTORICAL_VOLATILITY",
|
|
332
|
+
"/getOptionUnderlyingVolatilityData")
|
|
333
|
+
|
|
334
|
+
# WebSocket 实时行情
|
|
335
|
+
# 网关需命中 /pandaData/ws/tick 才路由到 tick 服务;与 HTTP 登录端口可不同
|
|
336
|
+
config["WS_LIVE_MARKET_URL"] = os.getenv("WS_LIVE_MARKET_URL", "ws://127.0.0.1:8180/pandaData/ws/tick")
|
|
337
|
+
# 为 True 时 TickStreamClient 可不 init_token、不带头直连(与 skip_auth 参数二选一即可)
|
|
338
|
+
config["WS_LIVE_MARKET_SKIP_AUTH"] = os.getenv("WS_LIVE_MARKET_SKIP_AUTH", "").lower() in (
|
|
339
|
+
"1",
|
|
340
|
+
"true",
|
|
341
|
+
"yes",
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
# 打包前可加入 panda_data_local_config 模块覆盖配置(如 LOCAL_MODE=True),便于无鉴权本地调用
|
|
345
|
+
try:
|
|
346
|
+
import panda_data_local_config as _local
|
|
347
|
+
if getattr(_local, "JAVA_SERVICE_BASE_URL", None):
|
|
348
|
+
config["JAVA_SERVICE_BASE_URL"] = _local.JAVA_SERVICE_BASE_URL
|
|
349
|
+
except ImportError:
|
|
350
|
+
pass
|
|
351
|
+
|
|
352
|
+
return config
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def get_config():
|
|
356
|
+
"""
|
|
357
|
+
获取配置对象,如果配置未加载则先加载配置
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
dict: 配置信息字典
|
|
361
|
+
"""
|
|
362
|
+
global config
|
|
363
|
+
if config is None:
|
|
364
|
+
config = load_config()
|
|
365
|
+
return config
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
# 初始加载配置
|
|
369
|
+
try:
|
|
370
|
+
config = load_config()
|
|
371
|
+
# logger.info(f"初始化配置成功: {config}") # 已禁用初始化配置日志
|
|
372
|
+
except Exception as e:
|
|
373
|
+
logger.error(f"初始化配置失败: {str(e)}")
|
|
374
|
+
# 不在初始化时抛出异常,留到实际使用时再处理
|
|
@@ -18,7 +18,7 @@ from panda_data.utils.param_check_utils import (
|
|
|
18
18
|
validate_quarter_range,
|
|
19
19
|
validate_bool_type, validate_quarter_date_combination, validate_extra_params, validate_date_range,
|
|
20
20
|
validate_stock_info_market, validate_not_empty, validate_factor_type, validate_future_symbol_format,
|
|
21
|
-
validate_index_component, validate_date_interval, validate_indicator
|
|
21
|
+
validate_index_component, validate_date_interval, validate_indicator, validate_quarter_interval
|
|
22
22
|
)
|
|
23
23
|
|
|
24
24
|
config = get_config()
|
|
@@ -243,16 +243,36 @@ def get_fina_performance(
|
|
|
243
243
|
def get_fina_reports(
|
|
244
244
|
symbol: Optional[Union[str, List[str]]] = None,
|
|
245
245
|
fields: Optional[Union[str, List[str]]] = None,
|
|
246
|
-
start_quarter:
|
|
247
|
-
end_quarter:
|
|
246
|
+
start_quarter: str = None,
|
|
247
|
+
end_quarter: str = None,
|
|
248
248
|
date: Optional[str] = None,
|
|
249
249
|
is_latest: Optional[bool] = True,
|
|
250
250
|
**kwargs
|
|
251
251
|
) -> pd.DataFrame:
|
|
252
252
|
"""
|
|
253
253
|
获取季度财务报告
|
|
254
|
+
|
|
255
|
+
Args:
|
|
256
|
+
symbol: 股票代码列表
|
|
257
|
+
fields: 返回字段列表
|
|
258
|
+
start_quarter: 开始季度,必填,格式为YYYYqN(如2020q1)
|
|
259
|
+
end_quarter: 结束季度,必填,格式为YYYYqN(如2025q1),与start_quarter间隔不得超过5年
|
|
260
|
+
date: 日期参数,与start_quarter/end_quarter二选一
|
|
261
|
+
is_latest: 是否只返回最新数据,默认为True
|
|
262
|
+
**kwargs: 其他参数(会被验证)
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
pd.DataFrame: 季度财务报告数据
|
|
266
|
+
|
|
267
|
+
Raises:
|
|
268
|
+
ServiceError: 当参数验证失败时抛出异常
|
|
254
269
|
"""
|
|
255
270
|
validate_extra_params(kwargs)
|
|
271
|
+
|
|
272
|
+
# 验证必填参数
|
|
273
|
+
validate_not_empty(start_quarter, "start_quarter")
|
|
274
|
+
validate_not_empty(end_quarter, "end_quarter")
|
|
275
|
+
|
|
256
276
|
# 验证参数类型
|
|
257
277
|
params = {
|
|
258
278
|
'symbol': symbol,
|
|
@@ -297,6 +317,9 @@ def get_fina_reports(
|
|
|
297
317
|
# 验证季度范围
|
|
298
318
|
validate_quarter_range(validated_start_quarter, validated_end_quarter)
|
|
299
319
|
|
|
320
|
+
# 验证季度间隔不超过5年
|
|
321
|
+
validate_quarter_interval(validated_start_quarter, validated_end_quarter, max_years=5)
|
|
322
|
+
|
|
300
323
|
# 验证date格式
|
|
301
324
|
validated_date = validate_date_format(date, "date")
|
|
302
325
|
|
|
@@ -436,12 +459,16 @@ def get_financial_statement(
|
|
|
436
459
|
payload = _build_payload(
|
|
437
460
|
symbol=validated_params['symbol'],
|
|
438
461
|
fields=validated_params['fields'],
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
},
|
|
462
|
+
start_date=validated_start_date,
|
|
463
|
+
end_date=validated_end_date,
|
|
464
|
+
market=market_lower,
|
|
465
|
+
interim_type=interim_type_lower,
|
|
466
|
+
# extra={
|
|
467
|
+
# **({"startDate": validated_start_date} if validated_start_date is not None else {}),
|
|
468
|
+
# **({"endDate": validated_end_date} if validated_end_date is not None else {}),
|
|
469
|
+
# "market": market_lower,
|
|
470
|
+
# "interimType": interim_type_lower,
|
|
471
|
+
# },
|
|
445
472
|
)
|
|
446
473
|
|
|
447
474
|
# 调用接口,返回的是 Parquet 文件,fetch_dataframe 会自动处理
|
|
@@ -575,12 +602,16 @@ def get_financial_statement_daily(
|
|
|
575
602
|
payload = _build_payload(
|
|
576
603
|
symbol=validated_params['symbol'],
|
|
577
604
|
fields=validated_params['fields'],
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
},
|
|
605
|
+
start_date=validated_start_date,
|
|
606
|
+
end_date=validated_end_date,
|
|
607
|
+
market=market_lower,
|
|
608
|
+
interim_type=interim_type_lower
|
|
609
|
+
# extra={
|
|
610
|
+
# **({"startDate": validated_start_date} if validated_start_date is not None else {}),
|
|
611
|
+
# **({"endDate": validated_end_date} if validated_end_date is not None else {}),
|
|
612
|
+
# "market": market_lower,
|
|
613
|
+
# "interimType": interim_type_lower,
|
|
614
|
+
# },
|
|
584
615
|
)
|
|
585
616
|
|
|
586
617
|
# 调用接口,返回的是 Parquet 文件,fetch_dataframe 会自动处理
|
|
@@ -814,6 +845,9 @@ def get_factor(
|
|
|
814
845
|
# 验证index_component参数
|
|
815
846
|
validated_index_component = validate_indicator(index_component, "indexComponent")
|
|
816
847
|
|
|
848
|
+
if validated_index_component == "000985":
|
|
849
|
+
validated_index_component = ""
|
|
850
|
+
|
|
817
851
|
payload = {"type": validated_type}
|
|
818
852
|
symbols = _normalise_symbols(validated_params['symbol'] if validated_params['symbol'] != [""] else None)
|
|
819
853
|
if symbols is not None:
|
|
@@ -24,8 +24,18 @@ from panda_data.utils.param_check_utils import (
|
|
|
24
24
|
|
|
25
25
|
config = get_config()
|
|
26
26
|
MULTI_ENDPOINT = config.get("JAVA_SERVICE_KLINE_ENDPOINT", "/multi")
|
|
27
|
+
INDEX_ENDPOINT = config.get("JAVA_SERVICE_INDEX_ENDPOINT", "/index")
|
|
28
|
+
FUTURE_ENDPOINT = config.get("JAVA_SERVICE_FUTURE_ENDPOINT", "/future")
|
|
29
|
+
|
|
27
30
|
PATH_GET_MARKET_DATA = config.get("JAVA_SERVICE_KLINE_PATH_GET_MARKET_DATA", "/getMultiMarketData")
|
|
28
31
|
PATH_GET_MARKET_MIN_DATA = config.get("JAVA_SERVICE_KLINE_PATH_GET_MARKET_MIN_DATA", "/getMultiMarketMinData")
|
|
32
|
+
# 期货 / 指数 分钟 K 的 path 可与多行情一致,也可通过环境变量覆盖
|
|
33
|
+
PATH_GET_FUTURE_MARKET_MIN_DATA = config.get(
|
|
34
|
+
"JAVA_SERVICE_FUTURE_PATH_GET_MARKET_MIN_DATA", "/getMultiMarketMinData"
|
|
35
|
+
)
|
|
36
|
+
PATH_GET_INDEX_MARKET_MIN_DATA = config.get(
|
|
37
|
+
"JAVA_SERVICE_INDEX_PATH_GET_MARKET_MIN_DATA", "/getMultiMarketMinData"
|
|
38
|
+
)
|
|
29
39
|
|
|
30
40
|
TICK_ENDPOINT = config.get("JAVA_SERVICE_TICK_ENDPOINT", "/tick")
|
|
31
41
|
FUTURE_TICK_ENDPOINT = config.get("JAVA_SERVICE_TICK_ENDPOINT_FUTURE", "/future")
|
|
@@ -115,6 +125,9 @@ def get_market_data(
|
|
|
115
125
|
# 验证st参数
|
|
116
126
|
validated_st = validate_bool_type(st, "st") if st is not None else st
|
|
117
127
|
|
|
128
|
+
if validated_indicator == "000985":
|
|
129
|
+
validated_indicator = ""
|
|
130
|
+
|
|
118
131
|
payload = {"type": validated_type}
|
|
119
132
|
symbols = _normalise_symbols(validated_params['symbol'] if validated_params['symbol'] != [""] else None)
|
|
120
133
|
if symbols is not None:
|
|
@@ -236,137 +249,27 @@ def get_market_min_data(
|
|
|
236
249
|
if validated_frequency:
|
|
237
250
|
payload["frequency"] = validated_frequency
|
|
238
251
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
symbol: Optional[Union[str, List[str]]] = None,
|
|
252
|
-
fields: Optional[Union[str, List[str]]] = None,
|
|
253
|
-
**kwargs
|
|
254
|
-
) -> pd.DataFrame:
|
|
255
|
-
"""
|
|
256
|
-
获取港股tick数据
|
|
257
|
-
"""
|
|
258
|
-
# 1. 检查额外参数
|
|
259
|
-
validate_extra_params(kwargs)
|
|
260
|
-
|
|
261
|
-
# 2. 验证必填参数date
|
|
262
|
-
validate_not_empty(date, "date")
|
|
263
|
-
|
|
264
|
-
# 3. 验证参数类型
|
|
265
|
-
params = {
|
|
266
|
-
'symbol': symbol,
|
|
267
|
-
'fields': fields
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
type_config = {
|
|
271
|
-
'symbol': str,
|
|
272
|
-
'fields': str
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
validated_params = validate_param_types(
|
|
276
|
-
params,
|
|
277
|
-
type_config,
|
|
278
|
-
allowed_list_params=['symbol', 'fields']
|
|
279
|
-
)
|
|
280
|
-
|
|
281
|
-
# 4. 验证港股symbol格式(空值会被正确处理)
|
|
282
|
-
if validated_params['symbol'] is not None:
|
|
283
|
-
validated_params['symbol'] = validate_hk_symbol_format(validated_params['symbol'])
|
|
284
|
-
# 验证symbol列表中是否有重复值
|
|
285
|
-
validate_no_duplicates(validated_params['symbol'], 'symbol')
|
|
286
|
-
|
|
287
|
-
# 5. 验证fields列表中是否有重复值(空值会被正确处理)
|
|
288
|
-
if validated_params['fields'] is not None:
|
|
289
|
-
validate_no_duplicates(validated_params['fields'], 'fields')
|
|
290
|
-
|
|
291
|
-
# 6. 验证日期格式
|
|
292
|
-
validated_date = validate_date_format(date, "date")
|
|
293
|
-
|
|
294
|
-
payload = {}
|
|
295
|
-
if validated_date is not None:
|
|
296
|
-
payload["date"] = validated_date
|
|
297
|
-
if validated_params['symbol'] is not None:
|
|
298
|
-
payload["symbol"] = validated_params['symbol']
|
|
299
|
-
if validated_params['fields']:
|
|
300
|
-
payload["fields"] = validated_params['fields']
|
|
301
|
-
|
|
302
|
-
df = fetch_dataframe(build_endpoint(TICK_ENDPOINT, PATH_GET_STOCK_HK_TICK), payload=payload)
|
|
303
|
-
|
|
304
|
-
if not df.empty and {"symbol", "date"}.issubset(df.columns):
|
|
305
|
-
# 将 symbol 和 date 列放在最前面
|
|
306
|
-
cols = df.columns.tolist()
|
|
307
|
-
priority_cols = ["symbol", "date"]
|
|
308
|
-
other_cols = [col for col in cols if col not in priority_cols]
|
|
309
|
-
df = df[priority_cols + other_cols]
|
|
310
|
-
|
|
311
|
-
return df
|
|
312
|
-
|
|
313
|
-
def get_future_tick(
|
|
314
|
-
date: str = None,
|
|
315
|
-
symbol: Optional[Union[str, List[str]]] = None,
|
|
316
|
-
fields: Optional[Union[str, List[str]]] = None,
|
|
317
|
-
**kwargs
|
|
318
|
-
) -> pd.DataFrame:
|
|
319
|
-
"""
|
|
320
|
-
获取期货Tick数据
|
|
321
|
-
"""
|
|
322
|
-
# 1. 检查额外参数
|
|
323
|
-
validate_extra_params(kwargs)
|
|
324
|
-
|
|
325
|
-
# 2. 验证必填参数date
|
|
326
|
-
validate_not_empty(date, "date")
|
|
327
|
-
|
|
328
|
-
# 3. 验证参数类型
|
|
329
|
-
params = {
|
|
330
|
-
'symbol': symbol,
|
|
331
|
-
'fields': fields
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
type_config = {
|
|
335
|
-
'symbol': str,
|
|
336
|
-
'fields': str
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
validated_params = validate_param_types(
|
|
340
|
-
params,
|
|
341
|
-
type_config,
|
|
342
|
-
allowed_list_params=['symbol', 'fields']
|
|
343
|
-
)
|
|
344
|
-
|
|
345
|
-
# 4. 验证fields列表中是否有重复值(空值会被正确处理)
|
|
346
|
-
if validated_params['fields'] is not None:
|
|
347
|
-
validate_no_duplicates(validated_params['fields'], 'fields')
|
|
348
|
-
|
|
349
|
-
# 5. 验证日期格式
|
|
350
|
-
validated_date = validate_date_format(date, "date")
|
|
351
|
-
|
|
352
|
-
payload = {}
|
|
353
|
-
if validated_date is not None:
|
|
354
|
-
payload["date"] = validated_date
|
|
355
|
-
if validated_params['symbol'] is not None:
|
|
356
|
-
payload["symbol"] = validated_params['symbol']
|
|
357
|
-
if validated_params['fields']:
|
|
358
|
-
payload["fields"] = validated_params['fields']
|
|
359
|
-
|
|
360
|
-
# 获取数据
|
|
361
|
-
df = fetch_dataframe(build_endpoint(FUTURE_TICK_ENDPOINT, PATH_GET_FUTURE_TICK), payload=payload)
|
|
252
|
+
if validated_symbol_type == "stock":
|
|
253
|
+
min_endpoint = MULTI_ENDPOINT
|
|
254
|
+
min_path = PATH_GET_MARKET_MIN_DATA
|
|
255
|
+
elif validated_symbol_type == "future":
|
|
256
|
+
min_endpoint = FUTURE_ENDPOINT
|
|
257
|
+
min_path = PATH_GET_FUTURE_MARKET_MIN_DATA
|
|
258
|
+
elif validated_symbol_type == "index":
|
|
259
|
+
min_endpoint = INDEX_ENDPOINT
|
|
260
|
+
min_path = PATH_GET_INDEX_MARKET_MIN_DATA
|
|
261
|
+
else:
|
|
262
|
+
min_endpoint = MULTI_ENDPOINT
|
|
263
|
+
min_path = PATH_GET_MARKET_MIN_DATA
|
|
362
264
|
|
|
265
|
+
# 排序已在读取 Parquet 时通过 DuckDB ORDER BY 完成,返回的 DataFrame 索引已是 0..n-1,无需 reset_index
|
|
266
|
+
df = fetch_dataframe(build_endpoint(min_endpoint, min_path), payload=payload)
|
|
363
267
|
if not df.empty and {"symbol", "date"}.issubset(df.columns):
|
|
364
268
|
# 将 symbol 和 date 列放在最前面
|
|
365
269
|
cols = df.columns.tolist()
|
|
366
270
|
priority_cols = ["symbol", "date"]
|
|
367
271
|
other_cols = [col for col in cols if col not in priority_cols]
|
|
368
272
|
df = df[priority_cols + other_cols]
|
|
369
|
-
|
|
370
273
|
return df
|
|
371
274
|
|
|
372
275
|
def get_hk_daily(
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
|
|
2
|
+
import panda_data
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
if __name__ == "__main__":
|
|
6
|
+
# 1. pip install panda_data
|
|
7
|
+
# 2. 账号为:86+官网注册的手机号(eg:8617777777777),密码与官网同步
|
|
8
|
+
# 3. 接口文档见官方知识库
|
|
9
|
+
panda_data.init_token(username="", password="")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# 开始计时
|
|
13
|
+
start_time = time.time()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
result = panda_data.get_market_data(
|
|
17
|
+
symbol="000001.SZ",
|
|
18
|
+
start_date="20200101",
|
|
19
|
+
end_date="20250101",
|
|
20
|
+
# fields = ["open"],
|
|
21
|
+
type="stock"
|
|
22
|
+
)
|
|
23
|
+
print(result)
|
|
24
|
+
end_time = time.time()
|
|
25
|
+
print(f"耗时:{end_time - start_time}")
|
|
26
|
+
|
|
27
|
+
print(result)
|
|
@@ -1653,4 +1653,43 @@ def validate_rank_type(rank_type: str, param_name: str = "rank_type") -> str:
|
|
|
1653
1653
|
message=f"[错误码 {ServiceErrorCode.REQUEST_PARAM_INVALID}] {param_name}参数值{rank_type}无效:有效值为 ratio,line"
|
|
1654
1654
|
)
|
|
1655
1655
|
|
|
1656
|
-
return rank_type.strip().lower()
|
|
1656
|
+
return rank_type.strip().lower()
|
|
1657
|
+
|
|
1658
|
+
|
|
1659
|
+
def validate_quarter_interval(start_quarter: Optional[str], end_quarter: Optional[str], max_years: int = 5) -> None:
|
|
1660
|
+
"""
|
|
1661
|
+
验证季度间隔是否超过限制(默认最大5年)
|
|
1662
|
+
|
|
1663
|
+
Args:
|
|
1664
|
+
start_quarter: 开始季度(YYYYqN格式,如2020q1)
|
|
1665
|
+
end_quarter: 结束季度(YYYYqN格式,如2025q1)
|
|
1666
|
+
max_years: 最大年数限制,默认为5年
|
|
1667
|
+
|
|
1668
|
+
Raises:
|
|
1669
|
+
ServiceError: 当季度间隔超过限制时抛出异常
|
|
1670
|
+
"""
|
|
1671
|
+
if not start_quarter or not end_quarter:
|
|
1672
|
+
return
|
|
1673
|
+
|
|
1674
|
+
# 解析季度
|
|
1675
|
+
start_year = int(start_quarter[:4])
|
|
1676
|
+
start_q = int(start_quarter[5])
|
|
1677
|
+
|
|
1678
|
+
end_year = int(end_quarter[:4])
|
|
1679
|
+
end_q = int(end_quarter[5])
|
|
1680
|
+
|
|
1681
|
+
# 计算年份差和季度差
|
|
1682
|
+
year_diff = end_year - start_year
|
|
1683
|
+
quarter_diff = end_q - start_q
|
|
1684
|
+
|
|
1685
|
+
# 计算总季度差
|
|
1686
|
+
total_quarters = year_diff * 4 + quarter_diff
|
|
1687
|
+
|
|
1688
|
+
# 5年 = 20个季度
|
|
1689
|
+
max_quarters = max_years * 4
|
|
1690
|
+
|
|
1691
|
+
if total_quarters > max_quarters:
|
|
1692
|
+
raise ServiceError(
|
|
1693
|
+
code=ServiceErrorCode.DATE_RANGE_INVALID,
|
|
1694
|
+
message=f"[错误码 {ServiceErrorCode.DATE_RANGE_INVALID}] 季度范围无效: 开始季度({start_quarter})和结束季度({end_quarter})的间隔不能超过{max_years}年({max_quarters}个季度)"
|
|
1695
|
+
)
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
配置模块,用于加载和管理配置信息
|
|
3
|
-
支持从配置文件和环境变量导入,环境变量优先级更高
|
|
4
|
-
"""
|
|
5
|
-
import os
|
|
6
|
-
import logging
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
# 获取logger
|
|
10
|
-
try:
|
|
11
|
-
from panda_data.logger.config import logger
|
|
12
|
-
except ImportError:
|
|
13
|
-
# 如果无法导入logger,创建一个基本的logger
|
|
14
|
-
logging.basicConfig(level=logging.INFO)
|
|
15
|
-
logger = logging.getLogger("config")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# 初始化配置变量config = None
|
|
19
|
-
|
|
20
|
-
def load_config():
|
|
21
|
-
"""加载配置文件,并从环境变量更新配置"""
|
|
22
|
-
global config
|
|
23
|
-
|
|
24
|
-
config = {}
|
|
25
|
-
|
|
26
|
-
# ========== 日志配置 ==========
|
|
27
|
-
config["LOG_LEVEL"] = os.getenv("LOG_LEVEL", "DEBUG")
|
|
28
|
-
config["log_file"] = os.getenv("LOG_FILE", "logs/panda_data.log")
|
|
29
|
-
config["log_rotation"] = os.getenv("LOG_ROTATION", "1 MB")
|
|
30
|
-
config["LOG_PATH"] = os.getenv("LOG_PATH", "~/log")
|
|
31
|
-
|
|
32
|
-
# ========== HTTP 通用配置(client / init_token 等使用) ==========
|
|
33
|
-
config["DEFAULT_USERNAME"] = os.getenv("DEFAULT_USERNAME", "")
|
|
34
|
-
config["DEFAULT_PASSWORD"] = os.getenv("DEFAULT_PASSWORD", "")
|
|
35
|
-
|
|
36
|
-
config["HTTP_SERVICE_BASE_URL"] = os.getenv("HTTP_SERVICE_BASE_URL")
|
|
37
|
-
config["HTTP_TIMEOUT"] = os.getenv("HTTP_TIMEOUT", "300")
|
|
38
|
-
config["HTTP_MAX_RETRIES"] = os.getenv("HTTP_MAX_RETRIES", "3")
|
|
39
|
-
config["HTTP_VERIFY_SSL"] = os.getenv("HTTP_VERIFY_SSL", "true")
|
|
40
|
-
config["HTTP_PROXY_TYPE"] = os.getenv("HTTP_PROXY_TYPE") # "http" or "https"
|
|
41
|
-
config["HTTP_PROXY_HOST"] = os.getenv("HTTP_PROXY_HOST")
|
|
42
|
-
config["HTTP_PROXY_PORT"] = os.getenv("HTTP_PROXY_PORT")
|
|
43
|
-
config["HTTP_PROXY_USERNAME"] = os.getenv("HTTP_PROXY_USERNAME")
|
|
44
|
-
config["HTTP_PROXY_PASSWORD"] = os.getenv("HTTP_PROXY_PASSWORD")
|
|
45
|
-
config["HTTP_USE_GZIP"] = os.getenv("HTTP_USE_GZIP", "false")
|
|
46
|
-
config["HTTP_DATA_FIELD"] = os.getenv("HTTP_DATA_FIELD", "data")
|
|
47
|
-
config["HTTP_ABNORMAL_ENDPOINT"] = os.getenv("HTTP_ABNORMAL_ENDPOINT", "/abnormal")
|
|
48
|
-
|
|
49
|
-
# Legacy HTTP service config (for backward compatibility)
|
|
50
|
-
config["JAVA_SERVICE_BASE_URL"] = os.getenv("JAVA_SERVICE_BASE_URL", "http://pandadata.pandaai.online")
|
|
51
|
-
config["JAVA_SERVICE_TIMEOUT"] = os.getenv("JAVA_SERVICE_TIMEOUT", "15")
|
|
52
|
-
config["JAVA_SERVICE_MAX_POOL_SIZE"] = os.getenv("JAVA_SERVICE_MAX_POOL_SIZE", "10")
|
|
53
|
-
config["JAVA_SERVICE_MAX_RETRIES"] = os.getenv("JAVA_SERVICE_MAX_RETRIES", "3")
|
|
54
|
-
config["JAVA_SERVICE_BACKOFF_FACTOR"] = os.getenv("JAVA_SERVICE_BACKOFF_FACTOR", "0.3")
|
|
55
|
-
config["JAVA_SERVICE_VERIFY_SSL"] = os.getenv("JAVA_SERVICE_VERIFY_SSL", "true")
|
|
56
|
-
config["JAVA_SERVICE_DATA_FIELD"] = os.getenv("JAVA_SERVICE_DATA_FIELD", "data")
|
|
57
|
-
config["JAVA_SERVICE_ABNORMAL_ENDPOINT"] = os.getenv("JAVA_SERVICE_ABNORMAL_ENDPOINT", "/abnormal")
|
|
58
|
-
|
|
59
|
-
# ========== init_token(登录) ==========
|
|
60
|
-
config["JAVA_SERVICE_USER_ENDPOINT"] = os.getenv("JAVA_SERVICE_USER_ENDPOINT", "/dataUser")
|
|
61
|
-
config["JAVA_SERVICE_USER_PATH_LOGIN"] = os.getenv("JAVA_SERVICE_USER_PATH_LOGIN", "/login")
|
|
62
|
-
|
|
63
|
-
# ========== market_reader(行情数据) ==========
|
|
64
|
-
config["JAVA_SERVICE_KLINE_ENDPOINT"] = os.getenv("JAVA_SERVICE_KLINE_ENDPOINT", "/multi")
|
|
65
|
-
config["JAVA_SERVICE_KLINE_PATH_GET_MARKET_DATA"] = os.getenv("JAVA_SERVICE_KLINE_PATH_GET_MARKET_DATA", "/getMultiMarketData")
|
|
66
|
-
config["JAVA_SERVICE_KLINE_PATH_GET_MARKET_MIN_DATA"] = os.getenv("JAVA_SERVICE_KLINE_PATH_GET_MARKET_MIN_DATA", "/getMultiMarketMinData")
|
|
67
|
-
config["JAVA_SERVICE_TICK_PATH_FUTURE_TICK"] = os.getenv("JAVA_SERVICE_TICK_PATH_FUTURE_TICK", "/getFutureTickData")
|
|
68
|
-
|
|
69
|
-
# ========== market_reference_reader(市场参考) ==========
|
|
70
|
-
# KLINE - 股票详情
|
|
71
|
-
config["JAVA_SERVICE_KLINE_PATH_GET_STOCK_DETAIL"] = os.getenv("JAVA_SERVICE_KLINE_PATH_GET_STOCK_DETAIL", "/getStockDetail")
|
|
72
|
-
|
|
73
|
-
# INDEX - 指数
|
|
74
|
-
config["JAVA_SERVICE_INDEX_ENDPOINT"] = os.getenv("JAVA_SERVICE_INDEX_ENDPOINT", "/index")
|
|
75
|
-
config["JAVA_SERVICE_INDEX_PATH_GET_SYMBOL"] = os.getenv("JAVA_SERVICE_INDEX_PATH_GET_SYMBOL", "/getIndexSymbolData")
|
|
76
|
-
config["JAVA_SERVICE_INDEX_PATH_GET_INDICATOR"] = os.getenv("JAVA_SERVICE_INDEX_PATH_GET_INDICATOR", "/getIndexIndicatorData")
|
|
77
|
-
config["JAVA_SERVICE_INDEX_PATH_GET_WEIGHTS"] = os.getenv("JAVA_SERVICE_INDEX_PATH_GET_WEIGHTS", "/getIndexWeightsData")
|
|
78
|
-
|
|
79
|
-
# CONCEPT - 概念
|
|
80
|
-
config["JAVA_SERVICE_CONCEPT_ENDPOINT"] = os.getenv("JAVA_SERVICE_CONCEPT_ENDPOINT", "/concept")
|
|
81
|
-
config["JAVA_SERVICE_CONCEPT_PATH_GET_CONCEPT_LIST"] = os.getenv("JAVA_SERVICE_CONCEPT_PATH_GET_CONCEPT_LIST", "/getConceptData")
|
|
82
|
-
config["JAVA_SERVICE_CONCEPT_PATH_GET_CONCEPT_STOCK"] = os.getenv("JAVA_SERVICE_CONCEPT_PATH_GET_CONCEPT_STOCK", "/getConceptStockData")
|
|
83
|
-
|
|
84
|
-
# INDUSTRY - 行业
|
|
85
|
-
config["JAVA_SERVICE_INDUSTRY_ENDPOINT"] = os.getenv("JAVA_SERVICE_INDUSTRY_ENDPOINT", "/industry")
|
|
86
|
-
config["JAVA_SERVICE_INDUSTRY_PATH_GET_STOCK"] = os.getenv("JAVA_SERVICE_INDUSTRY_PATH_GET_STOCK", "/getIndustryStockData")
|
|
87
|
-
config["JAVA_SERVICE_INDUSTRY_PATH_GET_LIST"] = os.getenv("JAVA_SERVICE_INDUSTRY_PATH_GET_LIST", "/getIndustryList")
|
|
88
|
-
config["JAVA_SERVICE_INDUSTRY_PATH_GET_STOCK_INDUSTRY"] = os.getenv("JAVA_SERVICE_INDUSTRY_PATH_GET_STOCK_INDUSTRY", "/getStockIndustry")
|
|
89
|
-
|
|
90
|
-
# ABNORMAL - 龙虎榜
|
|
91
|
-
config["JAVA_SERVICE_ABNORMAL_PATH_GET_ABNORMAL_DATA"] = os.getenv("JAVA_SERVICE_ABNORMAL_PATH_GET_ABNORMAL_DATA", "/getAbnormalData")
|
|
92
|
-
config["JAVA_SERVICE_ABNORMAL_PATH_GET_ABNORMAL_DETAIL"] = os.getenv(
|
|
93
|
-
"JAVA_SERVICE_ABNORMAL_PATH_GET_ABNORMAL_DETAIL", "/getAbnormalDetailData")
|
|
94
|
-
|
|
95
|
-
# BUYBACK - 回购
|
|
96
|
-
config["JAVA_SERVICE_BUY_BACK_ENDPOINT"] = os.getenv("JAVA_SERVICE_BUY_BACK_ENDPOINT", "/buyback")
|
|
97
|
-
config["JAVA_SERVICE_BUY_BACK_PATH_GET_BUY_BACK_DATA"] = os.getenv(
|
|
98
|
-
"JAVA_SERVICE_BUY_BACK_PATH_GET_BUY_BACK_DATA", "/getBuyBackData")
|
|
99
|
-
|
|
100
|
-
# SECURITIES_MARGIN / STOCK_CONNECT / STOCK - 两融、北向、资金等
|
|
101
|
-
config["JAVA_SERVICE_SECURITIES_MARGIN_ENDPOINT"] = os.getenv("JAVA_SERVICE_SECURITIES_MARGIN_ENDPOINT", "/stock")
|
|
102
|
-
config["JAVA_SERVICE_SECURITIES_MARGIN_PATH_GET_MARGIN"] = os.getenv("JAVA_SERVICE_SECURITIES_MARGIN_PATH_GET_MARGIN", "/getSecuritiesMarginData")
|
|
103
|
-
|
|
104
|
-
config["JAVA_SERVICE_STOCK_CONNECT_ENDPOINT"] = os.getenv("JAVA_SERVICE_STOCK_CONNECT_ENDPOINT", "/stock")
|
|
105
|
-
config["JAVA_SERVICE_STOCK_CONNECT_PATH_GET_STOCK_CONNECT_DATA"] = os.getenv("JAVA_SERVICE_STOCK_CONNECT_PATH_GET_STOCK_CONNECT_DATA", "/getStockConnectData")
|
|
106
|
-
|
|
107
|
-
config["JAVA_SERVICE_STOCK_ENDPOINT"] = os.getenv("JAVA_SERVICE_STOCK_ENDPOINT", "/stock")
|
|
108
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_FLOW"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_FLOW", "/getStockFlowData")
|
|
109
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_INVESTOR_ACTIVITIES"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_INVESTOR_ACTIVITIES", "/getStockInvestorData")
|
|
110
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_RESTRICTED_DETAILS"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_RESTRICTED_DETAILS", "/getStockRestrictedData")
|
|
111
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_HOLDER_NUMBER"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_HOLDER_NUMBER", "/getStockHolderNumberData")
|
|
112
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_MAIN_SHAREHOLDER"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_MAIN_SHAREHOLDER", "/getStockMainHolderData")
|
|
113
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_BLOCK_TRADE"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_BLOCK_TRADE", "/getStockBlockTradeData")
|
|
114
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_SHARES"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_SHARES", "/getStockShareData")
|
|
115
|
-
|
|
116
|
-
# ========== financial_and_factors_reader(财务与因子) ==========
|
|
117
|
-
# FINANCIAL - 财务
|
|
118
|
-
config["JAVA_SERVICE_FINANCIAL_ENDPOINT"] = os.getenv("JAVA_SERVICE_FINANCIAL_ENDPOINT", "/financial")
|
|
119
|
-
config["JAVA_SERVICE_FINANCIAL_PATH_GET_FORECAST"] = os.getenv("JAVA_SERVICE_FINANCIAL_PATH_GET_FORECAST", "/getFinancialForecastData")
|
|
120
|
-
config["JAVA_SERVICE_FINANCIAL_PATH_GET_PERFORMANCE"] = os.getenv("JAVA_SERVICE_FINANCIAL_PATH_GET_PERFORMANCE", "/getFinancialPerformanceData")
|
|
121
|
-
config["JAVA_SERVICE_FINANCIAL_PATH_GET_EX"] = os.getenv("JAVA_SERVICE_FINANCIAL_PATH_GET_EX", "/getFinancialExData")
|
|
122
|
-
config["JAVA_SERVICE_FINANCIAL_PATH_GET_STATEMENT"] = os.getenv("JAVA_SERVICE_FINANCIAL_PATH_GET_STATEMENT", "/getFinancialStatementData")
|
|
123
|
-
config["JAVA_SERVICE_FINANCIAL_PATH_GET_STATEMENT_DAILY"] = os.getenv("JAVA_SERVICE_FINANCIAL_PATH_GET_STATEMENT_DAILY", "/getFinancialStatementDailyData")
|
|
124
|
-
|
|
125
|
-
# STOCK - 审计、复权因子
|
|
126
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_AUDIT_OPINION"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_AUDIT_OPINION", "/getStockAuditData")
|
|
127
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_FACTOR_RESTORED"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_FACTOR_RESTORED", "/getFactorRestoredData")
|
|
128
|
-
|
|
129
|
-
# KLINE - 因子
|
|
130
|
-
config["JAVA_SERVICE_KLINE_PATH_GET_FACTOR"] = os.getenv("JAVA_SERVICE_KLINE_PATH_GET_FACTOR", "/getFactor")
|
|
131
|
-
|
|
132
|
-
# ========== future_reader(期货) ==========
|
|
133
|
-
config["JAVA_SERVICE_FUTURE_ENDPOINT"] = os.getenv("JAVA_SERVICE_FUTURE_ENDPOINT", "/future")
|
|
134
|
-
config["JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_LIST"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_FUTURE_LIST", "/getFutureList")
|
|
135
|
-
config["JAVA_SERVICE_FUTURE_PATH_GET_FACTOR_POST"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_GET_FACTOR_POST", "/getFutureMarketPostData")
|
|
136
|
-
config["JAVA_SERVICE_FUTURE_PATH_FUTURE_DOMINANT"] = os.getenv("JAVA_SERVICE_FUTURE_PATH_FUTURE_DOMINANT", "/getFutureDominantData")
|
|
137
|
-
|
|
138
|
-
# ========== trading_tools_reader(交易工具) ==========
|
|
139
|
-
config["JAVA_SERVICE_CALENDAR_ENDPOINT"] = os.getenv("JAVA_SERVICE_CALENDAR_ENDPOINT", "/tradeCalendar")
|
|
140
|
-
config["JAVA_SERVICE_CALENDAR_PATH_GET_TRADE_CALENDAR_DATA"] = os.getenv("JAVA_SERVICE_CALENDAR_PATH_GET_TRADE_CALENDAR_DATA", "/getTradeCalendarData")
|
|
141
|
-
config["JAVA_SERVICE_CALENDAR_PATH_GET_PREVIOUS_NTH_TRADING_DAY"] = os.getenv("JAVA_SERVICE_CALENDAR_PATH_GET_PREVIOUS_NTH_TRADING_DAY", "/getPreviousNthTradingDay")
|
|
142
|
-
config["JAVA_SERVICE_CALENDAR_PATH_GET_LATEST_TRADING_DAY"] = os.getenv("JAVA_SERVICE_CALENDAR_PATH_GET_LATEST_TRADING_DAY", "/getLatestTradingDay")
|
|
143
|
-
|
|
144
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_SPECIAL_TREATMENT"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_SPECIAL_TREATMENT", "/getStockSpecialTreatmentData")
|
|
145
|
-
config["JAVA_SERVICE_STOCK_PATH_GET_TRADING_STOCK_LIST"] = os.getenv("JAVA_SERVICE_STOCK_PATH_GET_TRADING_STOCK_LIST", "/getTradingStockList")
|
|
146
|
-
|
|
147
|
-
# 打包前可加入 panda_data_local_config 模块覆盖配置
|
|
148
|
-
try:
|
|
149
|
-
import panda_data_local_config as _local
|
|
150
|
-
if getattr(_local, "JAVA_SERVICE_BASE_URL", None):
|
|
151
|
-
config["JAVA_SERVICE_BASE_URL"] = _local.JAVA_SERVICE_BASE_URL
|
|
152
|
-
except ImportError:
|
|
153
|
-
pass
|
|
154
|
-
|
|
155
|
-
return config
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
def get_config():
|
|
159
|
-
"""
|
|
160
|
-
获取配置对象,如果配置未加载则先加载配置
|
|
161
|
-
|
|
162
|
-
Returns:
|
|
163
|
-
dict: 配置信息字典
|
|
164
|
-
"""
|
|
165
|
-
global config
|
|
166
|
-
if config is None:
|
|
167
|
-
config = load_config()
|
|
168
|
-
return config
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
# 初始加载配置
|
|
172
|
-
try:
|
|
173
|
-
config = load_config()
|
|
174
|
-
# logger.info(f"初始化配置成功: {config}") # 已禁用初始化配置日志
|
|
175
|
-
except Exception as e:
|
|
176
|
-
logger.error(f"初始化配置失败: {str(e)}")
|
|
177
|
-
# 不在初始化时抛出异常,留到实际使用时再处理
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import panda_data
|
|
3
|
-
import time
|
|
4
|
-
|
|
5
|
-
if __name__ == "__main__":
|
|
6
|
-
panda_data.init_token(username="", password="")
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
# 开始计时
|
|
10
|
-
start_time = time.time()
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
# result = panda_data.get_market_data(
|
|
14
|
-
# symbol="000001.SZ",
|
|
15
|
-
# start_date="20200101",
|
|
16
|
-
# end_date="20250101",
|
|
17
|
-
# # fields = ["open"],
|
|
18
|
-
# type="stock"
|
|
19
|
-
# )
|
|
20
|
-
# print(result)
|
|
21
|
-
# end_time = time.time()
|
|
22
|
-
# print(f"耗时:{end_time - start_time}")
|
|
23
|
-
|
|
24
|
-
fac = panda_data.get_factor(
|
|
25
|
-
symbol=["000001.SZ"],
|
|
26
|
-
start_date="20250101",
|
|
27
|
-
end_date="20250131",
|
|
28
|
-
factors=["market_cap", "ratio_pe_ttm","MA20"],
|
|
29
|
-
# factors=["open", "high", "low", "close", "volume"],
|
|
30
|
-
type="stock"
|
|
31
|
-
)
|
|
32
|
-
print(fac)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|