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.
Files changed (29) hide show
  1. {panda_data-0.0.2 → panda_data-0.0.3}/PKG-INFO +1 -1
  2. panda_data-0.0.3/panda_data/config/__init__.py +374 -0
  3. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/financial_and_factors_reader.py +49 -15
  4. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/market_reader.py +27 -124
  5. panda_data-0.0.3/panda_data/test.py +27 -0
  6. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/utils/param_check_utils.py +40 -1
  7. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data.egg-info/PKG-INFO +1 -1
  8. {panda_data-0.0.2 → panda_data-0.0.3}/pyproject.toml +1 -1
  9. panda_data-0.0.2/panda_data/config/__init__.py +0 -177
  10. panda_data-0.0.2/panda_data/test.py +0 -32
  11. {panda_data-0.0.2 → panda_data-0.0.3}/README.md +0 -0
  12. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/__init__.py +0 -0
  13. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/client.py +0 -0
  14. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/core/__init__.py +0 -0
  15. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/core/service.py +0 -0
  16. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/exceptions.py +0 -0
  17. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/__init__.py +0 -0
  18. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/future_reader.py +0 -0
  19. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/init_token.py +0 -0
  20. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/market_reference_reader.py +0 -0
  21. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/readers/trading_tools_reader.py +0 -0
  22. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/transport/__init__.py +0 -0
  23. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/transport/http.py +0 -0
  24. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data/utils/common_utils.py +0 -0
  25. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data.egg-info/SOURCES.txt +0 -0
  26. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data.egg-info/dependency_links.txt +0 -0
  27. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data.egg-info/requires.txt +0 -0
  28. {panda_data-0.0.2 → panda_data-0.0.3}/panda_data.egg-info/top_level.txt +0 -0
  29. {panda_data-0.0.2 → panda_data-0.0.3}/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.3
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:
@@ -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
- # 排序已在读取 Parquet 时通过 DuckDB ORDER BY 完成,返回的 DataFrame 索引已是 0..n-1,无需 reset_index
240
- df = fetch_dataframe(build_endpoint(MULTI_ENDPOINT, PATH_GET_MARKET_MIN_DATA), payload=payload)
241
- if not df.empty and {"symbol", "date"}.issubset(df.columns):
242
- # symbol 和 date 列放在最前面
243
- cols = df.columns.tolist()
244
- priority_cols = ["symbol", "date"]
245
- other_cols = [col for col in cols if col not in priority_cols]
246
- df = df[priority_cols + other_cols]
247
- return df
248
-
249
- def get_hk_transaction(
250
- date: str = None,
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: panda_data
3
- Version: 0.0.2
3
+ Version: 0.0.3
4
4
  Summary: PandaAI DataQuant
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "panda_data"
3
- version = "0.0.2"
3
+ version = "0.0.3"
4
4
  description = "PandaAI DataQuant"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -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