panda-data 0.0.2__tar.gz → 0.0.4__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.
Files changed (29) hide show
  1. {panda_data-0.0.2 → panda_data-0.0.4}/PKG-INFO +1 -1
  2. panda_data-0.0.4/panda_data/config/__init__.py +374 -0
  3. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/readers/financial_and_factors_reader.py +49 -15
  4. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/readers/market_reader.py +27 -124
  5. panda_data-0.0.4/panda_data/test.py +30 -0
  6. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/transport/http.py +290 -224
  7. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/utils/param_check_utils.py +40 -1
  8. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data.egg-info/PKG-INFO +1 -1
  9. {panda_data-0.0.2 → panda_data-0.0.4}/pyproject.toml +1 -1
  10. panda_data-0.0.2/panda_data/config/__init__.py +0 -177
  11. panda_data-0.0.2/panda_data/test.py +0 -32
  12. {panda_data-0.0.2 → panda_data-0.0.4}/README.md +0 -0
  13. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/__init__.py +0 -0
  14. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/client.py +0 -0
  15. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/core/__init__.py +0 -0
  16. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/core/service.py +0 -0
  17. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/exceptions.py +0 -0
  18. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/readers/__init__.py +0 -0
  19. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/readers/future_reader.py +0 -0
  20. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/readers/init_token.py +0 -0
  21. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/readers/market_reference_reader.py +0 -0
  22. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/readers/trading_tools_reader.py +0 -0
  23. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/transport/__init__.py +0 -0
  24. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data/utils/common_utils.py +0 -0
  25. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data.egg-info/SOURCES.txt +0 -0
  26. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data.egg-info/dependency_links.txt +0 -0
  27. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data.egg-info/requires.txt +0 -0
  28. {panda_data-0.0.2 → panda_data-0.0.4}/panda_data.egg-info/top_level.txt +0 -0
  29. {panda_data-0.0.2 → panda_data-0.0.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: panda_data
3
- Version: 0.0.2
3
+ Version: 0.0.4
4
4
  Summary: PandaAI DataQuant
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -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: Optional[str] = None,
247
- end_quarter: Optional[str] = None,
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
- extra={
440
- **({"startDate": validated_start_date} if validated_start_date is not None else {}),
441
- **({"endDate": validated_end_date} if validated_end_date is not None else {}),
442
- "market": market_lower,
443
- "interimType": interim_type_lower,
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
- extra={
579
- **({"startDate": validated_start_date} if validated_start_date is not None else {}),
580
- **({"endDate": validated_end_date} if validated_end_date is not None else {}),
581
- "market": market_lower,
582
- "interimType": interim_type_lower,
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: