chinadata 0.4.0__py3-none-any.whl → 0.4.2__py3-none-any.whl
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.
- chinadata/ca_data.py +112 -83
- chinadata/example.py +3 -11
- {chinadata-0.4.0.dist-info → chinadata-0.4.2.dist-info}/METADATA +1 -1
- chinadata-0.4.2.dist-info/RECORD +7 -0
- chinadata-0.4.0.dist-info/RECORD +0 -7
- {chinadata-0.4.0.dist-info → chinadata-0.4.2.dist-info}/WHEEL +0 -0
- {chinadata-0.4.0.dist-info → chinadata-0.4.2.dist-info}/top_level.txt +0 -0
chinadata/ca_data.py
CHANGED
|
@@ -41,7 +41,7 @@ class pro_api:
|
|
|
41
41
|
pd.DataFrame: A DataFrame containing the fetched stock data.
|
|
42
42
|
"""
|
|
43
43
|
# url="http://127.0.0.1:9002/tq"
|
|
44
|
-
url = "http://
|
|
44
|
+
url = "http://120.53.122.167:9002/tq"
|
|
45
45
|
|
|
46
46
|
params = {
|
|
47
47
|
'token': get_token(),
|
|
@@ -52,8 +52,8 @@ class pro_api:
|
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
response = requests.post(url, json=params)
|
|
56
55
|
|
|
56
|
+
response = requests.post(url, json=params)
|
|
57
57
|
|
|
58
58
|
if response.status_code == 200:
|
|
59
59
|
try:
|
|
@@ -69,6 +69,8 @@ class pro_api:
|
|
|
69
69
|
raise ValueError("数据获取错误",e)
|
|
70
70
|
|
|
71
71
|
else:
|
|
72
|
+
# print(f"Failed to fetch data. Status code: {response.status_code}")
|
|
73
|
+
# print(response.text)
|
|
72
74
|
raise ValueError("数据获取错误",response.status_code,response.text)
|
|
73
75
|
|
|
74
76
|
|
|
@@ -441,13 +443,12 @@ class pro_api:
|
|
|
441
443
|
|
|
442
444
|
def index_global(self, api_name='index_global', **kwargs):
|
|
443
445
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
446
|
+
|
|
444
447
|
def idx_factor_pro(self, api_name='idx_factor_pro', **kwargs):
|
|
445
448
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
446
449
|
def fund_factor_pro(self, api_name='fund_factor_pro', **kwargs):
|
|
447
450
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
448
451
|
|
|
449
|
-
|
|
450
|
-
|
|
451
452
|
def ncov_global(self, api_name='ncov_global', **kwargs):
|
|
452
453
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
453
454
|
|
|
@@ -531,6 +532,36 @@ class pro_api:
|
|
|
531
532
|
def dc_member(self, api_name='dc_member', **kwargs):
|
|
532
533
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
533
534
|
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
def dc_daily(self, api_name='dc_daily', **kwargs):
|
|
538
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
539
|
+
|
|
540
|
+
def cb_factor_pro(self, api_name='cb_factor_pro', **kwargs):
|
|
541
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
542
|
+
|
|
543
|
+
def stk_ah_comparison(self, api_name='stk_ah_comparison', **kwargs):
|
|
544
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
545
|
+
|
|
546
|
+
def stock_hsgt(self, api_name='stock_hsgt', **kwargs):
|
|
547
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
548
|
+
|
|
549
|
+
def stock_st(self, api_name='stock_st', **kwargs):
|
|
550
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
551
|
+
|
|
552
|
+
def bse_mapping(self, api_name='bse_mapping', **kwargs):
|
|
553
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
554
|
+
#6000
|
|
555
|
+
def tdx_index(self, api_name='tdx_index', **kwargs):
|
|
556
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
557
|
+
def tdx_member(self, api_name='tdx_member', **kwargs):
|
|
558
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
559
|
+
def tdx_daily(self, api_name='tdx_daily', **kwargs):
|
|
560
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
|
|
534
565
|
def ths_member(self, api_name='ths_member', **kwargs):
|
|
535
566
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
536
567
|
|
|
@@ -615,6 +646,7 @@ class pro_api:
|
|
|
615
646
|
def ft_mins(self, api_name='ft_mins', **kwargs):
|
|
616
647
|
return '此接口为单独权限,和积分没有关系,需要单独购买'
|
|
617
648
|
|
|
649
|
+
|
|
618
650
|
def realtime_quote(self, api_name='realtime_quote', **kwargs):
|
|
619
651
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
620
652
|
|
|
@@ -701,6 +733,7 @@ class pro_api:
|
|
|
701
733
|
|
|
702
734
|
def moneyflow_dc(self, api_name='moneyflow_dc', **kwargs):
|
|
703
735
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
736
|
+
|
|
704
737
|
def moneyflow_cnt_ths(self, api_name='moneyflow_cnt_ths', **kwargs):
|
|
705
738
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
706
739
|
|
|
@@ -709,11 +742,26 @@ class pro_api:
|
|
|
709
742
|
|
|
710
743
|
def kpl_concept_cons(self, api_name='kpl_concept_cons', **kwargs):
|
|
711
744
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
712
|
-
|
|
745
|
+
|
|
746
|
+
def stk_auction_o(self, api_name='stk_auction_o', **kwargs):
|
|
747
|
+
|
|
748
|
+
return '此接口为单独权限,和积分没有关系,需要单独购买'
|
|
749
|
+
|
|
750
|
+
def stk_auction_c(self, api_name='stk_auction_c', **kwargs):
|
|
751
|
+
return '此接口为单独权限,和积分没有关系,需要单独购买'
|
|
752
|
+
def stk_auction(self, api_name='stk_auction', **kwargs):
|
|
753
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
754
|
+
def ft_limit(self, api_name='ft_limit', **kwargs):
|
|
755
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
756
|
+
|
|
757
|
+
def request_with_retry(self, url, max_retries, ):
|
|
713
758
|
for attempt in range(max_retries):
|
|
714
759
|
try:
|
|
715
760
|
response = requests.get(url=url, timeout=100, )
|
|
716
761
|
response.raise_for_status()
|
|
762
|
+
json_data = response.json()
|
|
763
|
+
if json_data == []:
|
|
764
|
+
raise ValueError("响应为空列表")
|
|
717
765
|
return response
|
|
718
766
|
except Exception as e:
|
|
719
767
|
# print(f"尝试 {attempt + 1} 失败: {e}")
|
|
@@ -724,92 +772,64 @@ class pro_api:
|
|
|
724
772
|
# print(f"请求失败,已重试 {max_retries} 次")
|
|
725
773
|
return None
|
|
726
774
|
|
|
727
|
-
def rt_min(self,ts_code,freq,max_retries=3):
|
|
775
|
+
def rt_min(self, ts_code, freq, max_retries=3):
|
|
728
776
|
url = f"http://39.105.209.102:9002/csi/stock/min/rt_min/{ts_code}/{freq}/{self.token}"
|
|
729
|
-
r=self.request_with_retry(url, max_retries=max_retries)
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
'13:01-14:00': ('13:01:00', '14:00:00'),
|
|
737
|
-
'14:01-15:00': ('14:01:00', '15:00:00')
|
|
738
|
-
}
|
|
739
|
-
result = []
|
|
740
|
-
for name, (start, end) in periods.items():
|
|
741
|
-
mask = (df['time'].dt.strftime('%H:%M:%S') >= start) & \
|
|
742
|
-
(df['time'].dt.strftime('%H:%M:%S') <= end)
|
|
743
|
-
data = df[mask]
|
|
744
|
-
if len(data) > 0:
|
|
745
|
-
result.append({
|
|
746
|
-
'ts_code': df.iloc[0]['ts_code'],
|
|
747
|
-
'time': end,
|
|
748
|
-
'open': data.iloc[0]['open'],
|
|
749
|
-
'high': data['high'].max(),
|
|
750
|
-
'low': data['low'].min(),
|
|
751
|
-
'close': data.iloc[-1]['close'],
|
|
752
|
-
'vol': data['vol'].sum(),
|
|
753
|
-
'amount': data['amount'].sum()
|
|
754
|
-
})
|
|
755
|
-
df = pd.DataFrame(result)
|
|
756
|
-
|
|
777
|
+
r = self.request_with_retry(url, max_retries=max_retries)
|
|
778
|
+
try:
|
|
779
|
+
df = pd.DataFrame(r.json())
|
|
780
|
+
except Exception as e:
|
|
781
|
+
return pd.DataFrame()
|
|
782
|
+
if df.empty:
|
|
783
|
+
return df
|
|
757
784
|
else:
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
784
|
-
|
|
785
|
-
def stk_ah_comparison(self, api_name='stk_ah_comparison', **kwargs):
|
|
786
|
-
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
787
|
-
|
|
788
|
-
def stock_hsgt(self, api_name='stock_hsgt', **kwargs):
|
|
789
|
-
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
790
|
-
|
|
791
|
-
def stock_st(self, api_name='stock_st', **kwargs):
|
|
792
|
-
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
793
|
-
|
|
794
|
-
def bse_mapping(self, api_name='bse_mapping', **kwargs):
|
|
795
|
-
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
def stk_auction(self, api_name='stk_auction', **kwargs):
|
|
799
|
-
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
800
|
-
|
|
801
|
-
def ft_limit(self, api_name='ft_limit', **kwargs):
|
|
802
|
-
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
785
|
+
df['time'] = pd.to_datetime(df['time'])
|
|
786
|
+
if freq == '60min':
|
|
787
|
+
periods = {
|
|
788
|
+
'09:15-10:30': ('09:15:00', '10:30:00'),
|
|
789
|
+
'10:31-11:30': ('10:31:00', '11:30:00'),
|
|
790
|
+
'13:01-14:00': ('13:01:00', '14:00:00'),
|
|
791
|
+
'14:01-15:00': ('14:01:00', '15:00:00')
|
|
792
|
+
}
|
|
793
|
+
result = []
|
|
794
|
+
for name, (start, end) in periods.items():
|
|
795
|
+
mask = (df['time'].dt.strftime('%H:%M:%S') >= start) & \
|
|
796
|
+
(df['time'].dt.strftime('%H:%M:%S') <= end)
|
|
797
|
+
data = df[mask]
|
|
798
|
+
if len(data) > 0:
|
|
799
|
+
result.append({
|
|
800
|
+
'ts_code': df.iloc[0]['ts_code'],
|
|
801
|
+
'time': end,
|
|
802
|
+
'open': data.iloc[0]['open'],
|
|
803
|
+
'high': data['high'].max(),
|
|
804
|
+
'low': data['low'].min(),
|
|
805
|
+
'close': data.iloc[-1]['close'],
|
|
806
|
+
'vol': data['vol'].sum(),
|
|
807
|
+
'amount': data['amount'].sum()
|
|
808
|
+
})
|
|
809
|
+
df = pd.DataFrame(result)
|
|
803
810
|
|
|
811
|
+
else:
|
|
812
|
+
# 设置为索引
|
|
813
|
+
df.set_index('time', inplace=True)
|
|
814
|
+
df = df.resample(freq, label='right', closed='right').agg({
|
|
815
|
+
'ts_code': 'first',
|
|
816
|
+
'open': 'first',
|
|
817
|
+
'high': 'max',
|
|
818
|
+
'low': 'min',
|
|
819
|
+
'close': 'last',
|
|
820
|
+
'vol': 'sum',
|
|
821
|
+
'amount': 'sum',
|
|
822
|
+
}).dropna().reset_index()[['ts_code', 'time', 'open', 'high', 'low', 'close', 'vol', 'amount']]
|
|
823
|
+
|
|
824
|
+
return df
|
|
804
825
|
def irm_qa_sh(self, api_name='irm_qa_sh', **kwargs):
|
|
805
826
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
806
|
-
|
|
807
827
|
def irm_qa_sz(self, api_name='irm_qa_sz', **kwargs):
|
|
808
828
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
809
|
-
|
|
829
|
+
def stk_nineturn(self, api_name='stk_nineturn', **kwargs):
|
|
830
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
810
831
|
def stk_week_month_adj(self, api_name='stk_week_month_adj', **kwargs):
|
|
811
832
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
812
|
-
|
|
813
833
|
def limit_list_ths(self, api_name='limit_list_ths', **kwargs):
|
|
814
834
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
815
835
|
|
|
@@ -818,11 +838,20 @@ class pro_api:
|
|
|
818
838
|
|
|
819
839
|
def limit_cpt_list(self, api_name='limit_cpt_list', **kwargs):
|
|
820
840
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
841
|
+
def etf_basic(self, api_name='etf_basic', **kwargs):
|
|
842
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
843
|
+
|
|
844
|
+
def etf_index(self, api_name='etf_index', **kwargs):
|
|
845
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
846
|
+
def etf_share_size(self, api_name='etf_share_size', **kwargs):
|
|
847
|
+
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
848
|
+
|
|
821
849
|
|
|
822
850
|
def ci_index_member(self, api_name='ci_index_member', **kwargs):
|
|
823
851
|
return self.query(token=self.token, api_name=api_name, **kwargs)
|
|
824
852
|
|
|
825
853
|
|
|
854
|
+
|
|
826
855
|
import pandas as pd
|
|
827
856
|
import os
|
|
828
857
|
|
|
@@ -875,7 +904,7 @@ def pro_bar(ts_code='', api=None, start_date='', end_date='', freq='D', asset='E
|
|
|
875
904
|
|
|
876
905
|
"""
|
|
877
906
|
# url = "http://127.0.0.1:9002/tp"
|
|
878
|
-
url = "http://
|
|
907
|
+
url = "http://120.53.122.167:9002/tp"
|
|
879
908
|
|
|
880
909
|
params = {
|
|
881
910
|
'token':get_token(),
|
chinadata/example.py
CHANGED
|
@@ -4,30 +4,22 @@
|
|
|
4
4
|
pip install chinadata
|
|
5
5
|
|
|
6
6
|
"""
|
|
7
|
-
|
|
8
|
-
|
|
9
7
|
#2、
|
|
10
8
|
import chinadata.ca_data as ts
|
|
11
9
|
|
|
12
10
|
|
|
13
|
-
ts.set_token('
|
|
14
|
-
pro=ts.pro_api('
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# 你要测量的代码块
|
|
11
|
+
ts.set_token('5821074c7482c04e8d39da5c8313')
|
|
12
|
+
pro=ts.pro_api('d55821074c7482c04e8d39da5c8313')
|
|
19
13
|
|
|
20
14
|
# #查询当前所有正常上市交易的股票列表
|
|
21
15
|
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
|
|
22
16
|
print(data)
|
|
23
|
-
|
|
17
|
+
#
|
|
24
18
|
#
|
|
25
19
|
df = ts.pro_bar(ts_code='000007.SZ', start_date='20240817', end_date='20241215')
|
|
26
20
|
print(df)
|
|
27
21
|
|
|
28
|
-
|
|
29
22
|
df = pro.daily(ts_code='000001.SZ', start_date='20000701', end_date='20180718')
|
|
30
23
|
print(df)
|
|
31
24
|
|
|
32
25
|
|
|
33
|
-
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
chinadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
chinadata/ca_data.py,sha256=3nMojEVaCfJDs368_IyLwDZo_Ys7XAfMSpWwVrC7Q0Y,40572
|
|
3
|
+
chinadata/example.py,sha256=eKj2Hl5KVq9EJGWVY2ZoRJOqZ-p4yiSoFI-xVzdf8LA,575
|
|
4
|
+
chinadata-0.4.2.dist-info/METADATA,sha256=_6yZk5wlbmB9qB90za50SK-WwI7UvJwzDHB2FLw5dzc,161
|
|
5
|
+
chinadata-0.4.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
6
|
+
chinadata-0.4.2.dist-info/top_level.txt,sha256=Ptxvu9uzRHP4kVGRf413KuwSvsY2mk_KgQJ6ssWwisU,10
|
|
7
|
+
chinadata-0.4.2.dist-info/RECORD,,
|
chinadata-0.4.0.dist-info/RECORD
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
chinadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
chinadata/ca_data.py,sha256=INTsbrcsyQjfp051erJE_gauQdmxeVyTY697auQwAZQ,39038
|
|
3
|
-
chinadata/example.py,sha256=x2veHR97H3ym1ekSc7Kfi1v4RrH7M-d1mm2oqXWEM08,613
|
|
4
|
-
chinadata-0.4.0.dist-info/METADATA,sha256=rjdTdZFEyYcoKk9ohLbDF_bPIXktXmeuUTzxcnybqnw,161
|
|
5
|
-
chinadata-0.4.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
6
|
-
chinadata-0.4.0.dist-info/top_level.txt,sha256=Ptxvu9uzRHP4kVGRf413KuwSvsY2mk_KgQJ6ssWwisU,10
|
|
7
|
-
chinadata-0.4.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|