From bcdcf165d22dafcee609003748f27fa8d286679f Mon Sep 17 00:00:00 2001 From: Lxy Date: Wed, 11 Mar 2026 14:33:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../amazingdata_adapter.cpython-311.pyc | Bin 31646 -> 54105 bytes app/adapters/__pycache__/base.cpython-311.pyc | Bin 5104 -> 5217 bytes app/adapters/amazingdata_adapter.py | 554 ++++++- app/adapters/base.py | 16 +- app/models/__pycache__/types.cpython-311.pyc | Bin 21957 -> 22082 bytes app/models/types.py | 1 + .../futures_repository.cpython-311.pyc | Bin 12023 -> 12057 bytes .../stock_repository.cpython-311.pyc | Bin 12191 -> 12225 bytes app/repositories/futures_repository.py | 3 +- app/repositories/stock_repository.py | 3 +- .../futures_service.cpython-311.pyc | Bin 12450 -> 12522 bytes .../__pycache__/stock_service.cpython-311.pyc | Bin 12650 -> 13378 bytes app/services/futures_service.py | 4 +- app/services/stock_service.py | 11 +- xysz/AmazingDataAdapter_接口文档.md | 790 ++++++++++ xysz/AmazingData开发手册.md | 1383 +++++++++++++++++ 16 files changed, 2752 insertions(+), 13 deletions(-) create mode 100644 xysz/AmazingDataAdapter_接口文档.md create mode 100644 xysz/AmazingData开发手册.md diff --git a/app/adapters/__pycache__/amazingdata_adapter.cpython-311.pyc b/app/adapters/__pycache__/amazingdata_adapter.cpython-311.pyc index e44baea000b312913f9192484faa878d4fe03dc9..b5be73826fff147944b5dfb497d1f6e690a68e47 100644 GIT binary patch delta 13457 zcmcgS2~<>9mi3EGHkVLzL`Az|L^RszIg^=lI^A8^q(jr^OzaH5z&@v^%T8uGGd-tg?)|@h?WpOT36}T2 z_x@epyYIgH-o5Xi`U~~jO95jqM@EK;;BR;MZT+bWx5sV{5eJ5nH$$qZg_gdMXo^}y zl0tJrQ+5TdP6`!iu{MuuOCdW#XHbhtPPm4Ig}ug?BGUkGdZ-BhX}Nci>Clqq*3t-= zr^7d`*3H~B3kBof21=Wuo2d=bC2o>(4cHc_%>>d6UFN1NXB(x>(q#hPINg{yp%F2& z0W;f8ND&DOjTjfE&4KnDKkd2Dp6jPQ58Ctmw9kh2*?!vRK>HkLyDU79lRHNHDzv}q zYzGxZ=0i)qTZ_=cxzIk>yM1Pub{@3P(`e@pfW89Y|JPH(Ef;5gO$7upTgdT@Uk3!P3$|>@{8TK_ z#%~YX6e6hgbrF+n$|9PaspLjhLVOdY6}=Uuo#YoKg_?v&(>NrFHo*(2)D$gn6^S-Y zBw4vhR00x+nPfuer1BM>I$AsVC8#I6Q*#xbIz~I?h1ALJv{PLDj@2fD%8QE%+&9KF&!t0cnkkjERm2A#7irVU^1Mlb zGZZcJ$)VXZ$(MP-c1^fv%AFRaJ`Xk&^PK$bW8JKq_d(mY;77GZ!(xP4RoW1 z*{n0sb(-eE@f#Wp8k2j=EBYp*iLN&^X!T7SX+~qx8wMjxjE1XfHQS7Xfre&X6C;Ms z4F=ZhH`WgZG#IurZ(%+7b@J0!$EwFMJGr+eeWQ-~5Q@wl1Ro(lJmxNf9sq-3$XZ8h zH6|T%6I;6x+(K|0!A}ra0Fc1^8PsHwm49YBQwa6JpeBQJ&jCv-@ zwOlFaq|9NW#bwmLFrT$r7uCS;r1nhS<@|H`R~GiA%TlV-^IW)s>{{qs;|&}sSEp47xqaP^-C97;iuDgMGlm%vC^7;T5m1I-{(!u z{Y|f1x3+$lP-?8<1E?;}xf0bKdo9+QQ`DDU z+@D_Dmm=>^ky}&bz+kobM`G)E=}QS3MUMG92`blEbsPJ225UL~J~zGIZ`uz1*g?s} zf5C@b{Ad0FjZ4L=#UOMCwFZZS52&?JYq5q8U~sYOiaD=4|60B^Z&}~WlKz<`eW|7W zsioG`Qed!Nya7g+Jg~UjxhZ+@(Awr)WUZh{T~TYNxG zLlt5TA3$)@=$O$(eJKU~DFuCr^ZOI$TNCGlh!Sx~nYb(B$@o|@d%?y00qM+v zt6cwfVe4)LN(z^Aou&cSx`tss!?s@__!R)hI@dRun9reV3SCH3(oDP<|kQ+S*#j`_)g)r= z3~DXuqhm<<+IiHMq+@MC+&ZNH5dbfG4H;ZJllrwKc-=`Py+F_6NGqxTB2#M%f_XBc ztyNPt%e~rS?AqVzvO&XH+IT3xrd0>UfiZne&TDJMSI3aP`sne_zB1Qve4EJ(okA=U zTUvFu#NnJ?IeYnxJSmSQ2h${^wtfngL(KIJ!Q9)=$g}z)D%mnezmOFt zb_@ArQ#v)5L^Mny!J9vw{5lTq4L^vj&_<+YcUWG1oK4X4-G4* z3d@4VB_)tyxzf<*|lu-)B$l{nLYePwyWaxp_gVQY(v=(=utA z?I+i4cW=u^-aea7#;-~@v-@_lT_3PFj@oYC`O|~AvXh9U$+?;ooHik9Rx~iaIo`81#Nbd{p!fMRL?q@~gy%S=XscFb5yNfBsJ;Vyd8$9>6bA z@Z}=r9DsB&^Ch^~Of;ybIs=?B^i3NKnG3)pY8s4-prC17uhlI2F{}yWWFYvqP1IF< zSowt{=dmQ`r;+_jR8~n&pG4g+QMZYhEac0%u>jt*&?NX}j%RG=Do6Q(9Va-&zKKE@ zc=heKBcc&eo5((u{9ch6skTPAeq_naT=0=F7&NsQJfZNWHq?8;c8u7LUStpa0~%Qh ze}F5HvORCJCwkrNszjPL)U(HS=PsI4;v5%Y=h2a~R{#+;{ovqGPp@=MZg%eM?40b} zSyD$SZ9MbLENMp#CSi94NwwjZ>ym-oUO_Rt>NiPO?F_R`zD z?&jrXOF_TG7kW{Z?7a_%dfs7goCnl&kCg{MLxKGcW^g`rV zIuUuMe&x$6RCJ+CRa#^Qew;V8bsq$W2;zs2@A2YVsg%>z^3r7`YI!j?Bwh(T?(l(* z40g{M+sU0?R5i*PdRZmy&<*sQu8>vA6*z#deYWny?734tLJ)nzdCxDEoD*TBFBUqRz+W(*r3?9#mfF4bscmg3r2 zh+q>%DzvdwKH93;6U)~h{Ss|A*L~Hz`dISnKz!oBq{I{R`zPfL#3c<(N*#zxwTFwM z^Ph==qsM-OKv+w-|1nJfjAMWcI3{VWbjcEaJKjr?9dl#RB~JD1#|J3&cPJJA96o9` zIiTyetko1#G1Xp6qj77L?*PBC4&6UL ze5Tz)ScbHME-H~JmdWXI*{T95kM5jBZnwF@-rLRgUIK^t^gVOesN|)J7m)9L`kptn zo2mH|&xz~;SKYzx-pRR$I_FOBT*GLmu!4Pr5A~oxcVai%3RuK4l@h3UH8}=);52*u zj9|L6JWO|jo9RMC4ZE|qAx(zV=RG>Rzn#5snP11YBe!h(Z=%u8_hYn2FM?C|umT^8zwc?yfw!VcrcjrvYrw7VYe(02#QRw1K&&VNpM^MPKe3`NmSUXhEc6sE(D``0eLp|4qdV68-FW^0$H=CtpN|~Bo z!FB3R`_s1f`F=g^IEX4Db*rKXc)^(-rZgT+$yl#}6D8)4bd0wp#gbuq;s%qUIVYRP z|$xIiTzLaiG{cgPhqEa{a_P|M=eze96k8+8?50I*U^u|toUDk z0O=ZN^` zS;45XJdBDvyz92KU|f;e zlVBx$U=iotl}ZrI9D(;lsf>x-3FoD+r$Vhm)Db|;8}fnz+Qsh#kpEp77Z9+WBGmdx zv0l+C+#OJRg0_qC9r=SMn&hlc4G7#GNLFOTL};nbpw8gVfKIsJBAV)yU*~!7#W2D(pSnW zWHse*sHc@n{c>R2AB{XZ=8uCJQY*+pB`>1OEH<`=l`^f#lji6WokqQ@!aM>>|=Y`2IkN5?$3LEuJw6UcT zO50qHACUMY8CW{Q(JL_@=!j=LseIS!NnESAi953ZTs-3w%!G2mOb`Y$0NUI({`3$& zG}3%i6FVz*caxBoXu;>w96V`b>fXF+3P z!oCp!u#3iwe=e}7HDy$CqTiM3ST4s74ByAZ&G$WaD#>^{(9B0Wv!s~2Udm`1b?e}) z|Gdn>i&v%Bso}Y6(F|z^VKI8qz5E*VB7EV>bHks3nNZbBtvF#X@)Phl3_`0jY4i;) zQ)jqPJ!`qgYhRoGC)@@O;&OP=>6AGS3Gjp%4}KSs8aENkO3iCj+Yk#J!hE2 z<(;1Hyy7=fDy*uZW#!5$Oxifiuj7zEXO6}pFM~uGk6bDh{O@Sk5a_^;C97P{Gv5C$ zpU6wg;l)6N#B)IRJ4(pYV1S$Q`WAYyg{*s$l0a{d(v1d9^zIU8}y%D8RUg*2F;Go}aIu)TYa&uV&`>@1!t zLkd#B5}h<)M!q!9aZ&5xred>@@%A>WtmPiBeN8F>w*QxOQP;plO^$b$_E)sWF2TRy zZA6?a0Vr259X@OsxpTnjrBcR08^0~F+(iRkKA6*VrVZSk%Pc9D>J0E*iQd$rYcd%< zqa6?bArOt02Crju_(@6=&FHkc#%8YA(xf-Rq<6!;#u$?L7>UG1s$? zp{pKJGNg@~H{b&pxMt+OZ~k8md<+`t< z-XYEEn8b97xeD!YA%~afgW>4GaE#4$8=x%$F6rW_Z1iIAQ4-hcYt2Pq&Bk~Yi;vMp)BX^J6xlHc5Xo)q# z^>bbqC43GH9LdGgaIilF8i$?8wHj8#H3rv=S!sSjc+Btj%RT;`hrp#(3J6R1P+#aD zb{jn;48U_mW=J8}hkG6me26yrkphX%9}S-}bkNwi9E6j=AHHx<5E9m$8vP}#{UoS1 zfbsJd?Clw2NoLK&a@TubW745(d{6Lh%yV*!%q_GP{AMFo>f*Q*&Bc3zorN1Lxw>v3 zagl3(J=i_+@pZPXmpyoB$%5cMd_nz%+=g6bua6{r@y>P%QlU1qYaI08K z7bz7hg)N%xJPFsMFksvMbNrpY7aewmE>)?jy28Ztg4uxRM3@NiUTew;UX|C z70!EGXE3Y50E8f!OK)#(ZKd@_V~eKA7BtHg&Me(UH6!CA$k=&>hh~{d7OmSvKHU-pUvUp^X*Q$jGWeYr zgP(A5Ut2NDaXH|pQQWtc%t|a_u7UX(fWc5_tjXY4OpFEr#@mbzO9li+1T6^gQy%6m z1o%M>6N`AM2)J)Ea?7!phoBQ*??nKYJR;^Wg7*<%297y{;5>rM2(AGb3^KJeH|Q92 z;oRC}EaVQ8BpwK}3@|gO6>2Id_R07tdk_}v!J_Di_7JW(Midoe59NwsqS$zQI9H4i zg^lgh?@P2ta#fKJY_O-NRjLxfk{dmiM9Qqu>Lrwyb`w};O_${9iCuqWf9 zx{CH~vj<@d3~TZ+)!}k`2-aX^laA#b&aj7KEevb34`=eUFh1;Dq=OH~%mLv0GMAh* zlmoyi1{+*r%vg2F!J11B)&x0NMm}!9L(X)31;8l>8(ea*<`RQ7UW^&XgH=HemXVJe zSmi#RsrU+jQw}z` zz(bB;g-$ux;F5zimmI9QrUq+*7%Yo8`*+#(Dr&M@|Dg~?5C>yX2E)NHw(A(9!bta{?MCGsGb^Y|mK3X3Jw4R>tN)v3{O@+Ms4# zv0eyLuS(ITK~7E~9MEU6xiHTtfx)mUZJB1GZ>e6OPf!^%xloz;FQpqj4;wqQLEUP> zRUz-p+2b&pu?Q9Z?w`w$?G^W#O62Dud;SfhxS_d46oh_ber*ueptUx!|Gtjv(J2+rpH4OoK9YW4gV3c_uF8Tra)3G}gNK1OwEe++Z6hTt2Jb*V zj0X(tgnTF{ip&c~+sfE#xYFifV^G+>*xrPGd<`O|#u-{$TPF|F2R-fOY(zfT{yK$K zbDVxY0?<+ zw!~mjPb*xRt#gnYKTa4XxT%;fvXmqeeA43(VOf z2)rDtWqI=DSTD0ul9&dQIO$1W%P>Sw6lQIdx}-<|U!F~&P`nI|zEA)Mw_J2|D6>8y zDuP?x&G3ur^9RUNqUbajg>wQ*aeke-JF-nw4SpMiqRi3orn{^H8ts#bmF<#U{At=8{WJ9r#zR)*Pxr5Z$r9N zZnxW24z-^}JHNs{zfPdHK)I=WIpwFT#+Q-y99dej&LWcf^{UhK!U}u-Z}?im4MUQ&M`xGzj@q zQ%1$i6bxCr!+RYmlhPIb#|F9R^N?CE6lfNv2+(&e#?C_O+79-T92+~vmc?}phaSyq Q_Oc0O=)q$g_*`7zKe0CRZU6uP diff --git a/app/adapters/__pycache__/base.cpython-311.pyc b/app/adapters/__pycache__/base.cpython-311.pyc index 70cbbda1f2c76cc21ae28618f093873e0d1d8947..89a7203c2f34afb5b275132e6d1accd04cad4664 100644 GIT binary patch delta 667 zcmeyM{!oK=IWI340}xz#y&?13M&5L0CKJZV%h_Zn_j7Pgp2O@|&zZ_52~q$CsjMm7 zHb7PiR}@z&XDSPd3=dR>8z{qrBEt)n;l+^QgUav$W!O>l@Iz#RqWCeS1fZG(Fk}Rw zGJ-%ERA&o8WP%wqg(v&5c*^+Q;>|Be&5O^>D@iR%EiSpmRZ^6gk{X|qSduz<7mLi~ z`z&runnII1+2tp@v+`?k0)1Vi3?fv3#4VPj{QR6ERS;hdM5u!Z4G^I@xtdjxiIs8k zJl5EHW%UN%2^KS)r`TR#Q3s-nEb1TF7!*|-ye4qW5T3$&fkg#~F0!cHP*Q8~o**$p zWs2Md7BwKc$f9;bMFXtcWs2Pe77ZY}$f9vWL+1jE$b^g;rBm`RumIUQ7g=<$3u@_I z&}I>v!LdMe4*vxfJs`Tsq6f0aXM)BI<0-mudmxO-t!yV4Z%qzluVT{y`9o*&MfO%k zoyk3Hl9LNK)-q~smgC&P!lnT|1n&F(PH>*{GPf0OZEmadi|mL$XjN*^f^zN9vPWCdMFuu1279UqRcmxRk{Hxb zG1Mlt`e-96GpM6ts88$$PF!NpK*i9QEIJIz5n+JYiNX25aIVQ<;g!q)b2EnKq-Kpa zBLs`-V8xhH(O=4E2%31@r|e^;%YWOYH*(L!?ormFr@0fcGk&gq0A&qZ4}ccU77g-C z;@bFS{;OC?2e$asWo~!5b;eH$PDbp~H}l^+_Eac||JoU^{p5Bg2^syVHO=6gzAe4~ E14YK3i~s-t diff --git a/app/adapters/amazingdata_adapter.py b/app/adapters/amazingdata_adapter.py index 8823e22..4830580 100644 --- a/app/adapters/amazingdata_adapter.py +++ b/app/adapters/amazingdata_adapter.py @@ -252,6 +252,14 @@ class AmazingDataAdapter(DataSourceAdapter): print(f"[amazingdata_adapter _fetch_klines_sync]日期解析错误 '{kline_time}' (type: {type(kline_time)}): {e}") continue + # 从 DataFrame 提取扩展字段(如果存在) + is_limit_up = bool(row.get('is_limit_up')) if 'is_limit_up' in df.columns else None + is_limit_down = bool(row.get('is_limit_down')) if 'is_limit_down' in df.columns else None + total_market_cap = float(row.get('total_market_cap')) if 'total_market_cap' in df.columns and pd.notna(row.get('total_market_cap')) else None + float_market_cap = float(row.get('float_market_cap')) if 'float_market_cap' in df.columns and pd.notna(row.get('float_market_cap')) else None + inst_holding_ratio = float(row.get('inst_holding_ratio')) if 'inst_holding_ratio' in df.columns and pd.notna(row.get('inst_holding_ratio')) else None + trading_days = int(row.get('trading_days')) if 'trading_days' in df.columns and pd.notna(row.get('trading_days')) else None + results.append(KLineData( symbol=symbol, time=ts, @@ -261,7 +269,13 @@ class AmazingDataAdapter(DataSourceAdapter): close=float(row.get('close', 0)), volume=int(row.get('volume', 0)), amount=float(row.get('amount', 0)), - trade_date=trade_date + trade_date=trade_date, + is_limit_up=is_limit_up, + is_limit_down=is_limit_down, + total_market_cap=total_market_cap, + float_market_cap=float_market_cap, + inst_holding_ratio=inst_holding_ratio, + trading_days=trading_days )) info(f"Fetched {len(results)} klines from AmazingData for {symbol}") @@ -615,3 +629,541 @@ class AmazingDataAdapter(DataSourceAdapter): ) return await loop.run_in_executor(None, fetch) + + # ==================== 基础数据接口 ==================== + + async def get_code_info( + self, + security_type: SecurityType = SecurityType.STOCK_A + ) -> pd.DataFrame: + """获取证券基本信息 + + Args: + security_type: 证券类型,默认 STOCK_A (沪深A股) + + Returns: + DataFrame 包含字段: + - symbol: 证券简称 + - security_status: 产品状态标志 + - pre_close: 昨收价 + - high_limited: 涨停价 + - low_limited: 跌停价 + - price_tick: 最小价格变动单位 + """ + self._check_login() + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._base_data.get_code_info(security_type=security_type.value) + ) + + async def get_trading_calendar( + self, + market: Market = Market.SH + ) -> List[int]: + """获取交易日历 + + Args: + market: 市场,默认 SH (上海) + + Returns: + 交易日列表,格式为 [20240102, 20240103, ...] + """ + self._check_login() + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._base_data.get_calendar(market=market.value) + ) + + # ==================== 业绩数据接口 ==================== + + async def get_profit_express( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None + ) -> pd.DataFrame: + """获取业绩快报 + + Args: + codes: 股票代码列表 + start_date: 开始报告期 (如 20240930 表示2024年三季报) + end_date: 结束报告期 + is_local: 是否使用本地缓存 + + Returns: + DataFrame 主要字段: + - TOTAL_ASSETS: 总资产 + - NET_PRO_EXCL_MIN_INT_INC: 净利润 + - TOT_OPERA_REV: 营业总收入 + - TOTAL_PROFIT: 利润总额 + - OPERA_PROFIT: 营业利润 + - EPS_BASIC: 基本每股收益 + - ROE_WEIGHTED: 净资产收益率-加权 + - YOY_GR_NET_PROFIT_PARENT: 同比增长率:归属母公司股东的净利润 + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + begin_date = self._format_date(start_date) if start_date else None + end_date_int = self._format_date(end_date) if end_date else None + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_profit_express( + code_list=codes, + local_path=self.config.local_path, + is_local=is_local, + begin_date=begin_date, + end_date=end_date_int + ) + ) + + async def get_profit_notice( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None + ) -> pd.DataFrame: + """获取业绩预告 + + Args: + codes: 股票代码列表 + start_date: 开始报告期 + end_date: 结束报告期 + is_local: 是否使用本地缓存 + + Returns: + DataFrame 主要字段: + - P_TYPECODE: 业绩预告类型代码 + - P_CHANGE_MAX: 预告净利润变动幅度上限 + - P_CHANGE_MIN: 预告净利润变动幅度下限 + - NET_PROFIT_MAX: 预告净利润上限(万元) + - NET_PROFIT_MIN: 预告净利润下限(万元) + - P_REASON: 业绩变动原因 + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + begin_date = self._format_date(start_date) if start_date else None + end_date_int = self._format_date(end_date) if end_date else None + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_profit_notice( + code_list=codes, + local_path=self.config.local_path, + is_local=is_local, + begin_date=begin_date, + end_date=end_date_int + ) + ) + + # ==================== 股东股本数据接口 ==================== + + async def get_top10_shareholders( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None + ) -> pd.DataFrame: + """获取十大股东数据 + + Args: + codes: 股票代码列表 + start_date: 开始日期 + end_date: 结束日期 + is_local: 是否使用本地缓存 + + Returns: + DataFrame 主要字段: + - HOLDER_NAME: 股东名称 + - HOLDER_QUANTITY: 持股数 + - HOLDER_PCT: 持股比例(%) + - HOLDER_HOLDER_CATEGORY: 股东性质(1:个人, 2:公司) + - FLOAT_QTY: 流通股数量 + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + begin_date = self._format_date(start_date) if start_date else None + end_date_int = self._format_date(end_date) if end_date else None + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_share_holder( + code_list=codes, + local_path=self.config.local_path, + is_local=is_local, + begin_date=begin_date, + end_date=end_date_int + ) + ) + + async def get_shareholder_count( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None + ) -> pd.DataFrame: + """获取股东户数数据 + + Args: + codes: 股票代码列表 + start_date: 开始日期 + end_date: 结束日期 + is_local: 是否使用本地缓存 + + Returns: + DataFrame 主要字段: + - HOLDER_TOTAL_NUM: A股、B股、H股、境外股的总户数 + - HOLDER_NUM: A股股东户数 + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + begin_date = self._format_date(start_date) if start_date else None + end_date_int = self._format_date(end_date) if end_date else None + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_holder_num( + code_list=codes, + local_path=self.config.local_path, + is_local=is_local, + begin_date=begin_date, + end_date=end_date_int + ) + ) + + async def get_equity_structure( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None + ) -> pd.DataFrame: + """获取股本结构数据 + + Args: + codes: 股票代码列表 + start_date: 开始日期 + end_date: 结束日期 + is_local: 是否使用本地缓存 + + Returns: + DataFrame 主要字段: + - TOT_SHARE: 总股本(万股) + - FLOAT_SHARE: 流通股(万股) + - FLOAT_A_SHARE: 流通A股(万股) + - RESTRICTED_A_SHARE: 限售A股(万股) + - TOT_RESTRICTED_SHARE: 限售股合计 + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + begin_date = self._format_date(start_date) if start_date else None + end_date_int = self._format_date(end_date) if end_date else None + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_equity_structure( + code_list=codes, + local_path=self.config.local_path, + is_local=is_local, + begin_date=begin_date, + end_date=end_date_int + ) + ) + + # ==================== 融资融券数据接口 ==================== + + async def get_margin_summary( + self, + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None + ) -> pd.DataFrame: + """获取融资融券成交汇总 + + Args: + start_date: 开始日期 + end_date: 结束日期 + is_local: 是否使用本地缓存 + + Returns: + DataFrame 主要字段: + - TRADE_DATE: 交易日期 + - SUM_BORROW_MONEY_BALANCE: 融资余额(元) + - SUM_PURCH_WITH_BORROW_MONEY: 融资买入额(元) + - SUM_REPAYMENT_OF_BORROW_MONEY: 融资偿还额(元) + - SUM_SEC_LENDING_BALANCE: 融券余额(元) + - SUM_SALES_OF_BORROWED_SEC: 融券卖出量 + - SUM_MARGIN_TRADE_BALANCE: 融资融券余额(元) + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + begin_date = self._format_date(start_date) if start_date else None + end_date_int = self._format_date(end_date) if end_date else None + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_margin_summary( + local_path=self.config.local_path, + is_local=is_local, + begin_date=begin_date, + end_date=end_date_int + ) + ) + + async def get_margin_detail( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None + ) -> Dict[str, pd.DataFrame]: + """获取融资融券交易明细 + + Args: + codes: 股票代码列表 + start_date: 开始日期 + end_date: 结束日期 + is_local: 是否使用本地缓存 + + Returns: + Dict[代码, DataFrame] 主要字段: + - BORROW_MONEY_BALANCE: 融资余额 + - PURCH_WITH_BORROW_MONEY: 融资买入额 + - REPAYMENT_OF_BORROW_MONEY: 融资偿还额 + - SEC_LENDING_BALANCE: 融券余额 + - SALES_OF_BORROWED_SEC: 融券卖出量 + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + begin_date = self._format_date(start_date) if start_date else None + end_date_int = self._format_date(end_date) if end_date else None + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_margin_detail( + code_list=codes, + local_path=self.config.local_path, + is_local=is_local, + begin_date=begin_date, + end_date=end_date_int + ) + ) + + # ==================== 交易异动数据接口 ==================== + + async def get_longhu_bang( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None + ) -> pd.DataFrame: + """获取龙虎榜数据 + + Args: + codes: 股票代码列表 + start_date: 开始日期 + end_date: 结束日期 + is_local: 是否使用本地缓存 + + Returns: + DataFrame 主要字段: + - TRADE_DATE: 交易日期 + - REASON_TYPE_NAME: 上榜原因 + - CHANGE_RANGE: 涨跌幅(%) + - TRADER_NAME: 营业部名称 + - BUY_AMOUNT: 买入金额(元) + - SELL_AMOUNT: 卖出金额(元) + - FLOW_MARK: 买卖表示(1买入, 2卖出) + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + begin_date = self._format_date(start_date) if start_date else None + end_date_int = self._format_date(end_date) if end_date else None + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_long_hu_bang( + code_list=codes, + local_path=self.config.local_path, + is_local=is_local, + begin_date=begin_date, + end_date=end_date_int + ) + ) + + async def get_block_trading( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None + ) -> pd.DataFrame: + """获取大宗交易数据 + + Args: + codes: 股票代码列表 + start_date: 开始日期 + end_date: 结束日期 + is_local: 是否使用本地缓存 + + Returns: + DataFrame 主要字段: + - TRADE_DATE: 交易日期 + - B_SHARE_PRICE: 成交价(元) + - B_SHARE_VOLUME: 成交量(万股) + - B_SHARE_AMOUNT: 成交金额(万元) + - B_BUYER_NAME: 买方营业部名称 + - B_SELLER_NAME: 卖方营业部名称 + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + begin_date = self._format_date(start_date) if start_date else None + end_date_int = self._format_date(end_date) if end_date else None + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_block_trading( + code_list=codes, + local_path=self.config.local_path, + is_local=is_local, + begin_date=begin_date, + end_date=end_date_int + ) + ) + + # ==================== ETF数据接口 ==================== + + async def get_etf_pcf( + self, + codes: List[str] + ) -> tuple: + """获取ETF申赎数据 + + Args: + codes: ETF代码列表 + + Returns: + (etf_info, etf_constituents) + + etf_info字段: + - creation_redemption_unit: 每个篮子对应的ETF份数 + - max_cash_ratio: 最大现金替代比例 + - creation: 是否允许申购 + - redemption: 是否允许赎回 + + etf_constituents字段: + - underlying_symbol: 成份证券简称 + - component_share: 成份证券数量 + - substitute_flag: 现金替代标志 + """ + self._check_login() + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._base_data.get_etf_pcf(code_list=codes) + ) + + async def get_fund_share( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None + ) -> Dict[str, pd.DataFrame]: + """获取基金份额数据 + + Args: + codes: 基金代码列表 + start_date: 开始日期 + end_date: 结束日期 + is_local: 是否使用本地缓存 + + Returns: + Dict[代码, DataFrame] 主要字段: + - FUND_SHARE: 基金份额(万份) + - TOTAL_SHARE: 基金总份额(万份) + - FLOAT_SHARE: 流通份额(万份) + - CHANGE_REASON: 份额变动原因 + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + begin_date = self._format_date(start_date) if start_date else None + end_date_int = self._format_date(end_date) if end_date else None + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_fund_share( + code_list=codes, + local_path=self.config.local_path, + is_local=is_local, + begin_date=begin_date, + end_date=end_date_int + ) + ) + + # ==================== 可转债数据接口 ==================== + + async def get_kzz_issuance( + self, + codes: List[str], + is_local: Optional[bool] = None + ) -> Dict[str, pd.DataFrame]: + """获取可转债发行数据 + + Args: + codes: 可转债代码列表 + is_local: 是否使用本地缓存 + + Returns: + Dict[代码, DataFrame] 主要字段: + - STOCK_CODE: 正股代码 + - LISTED_DATE: 上市日期 + - PLAN_SCHEDULE: 方案进度 + - CLAUSE_INI_CONV_PRICE: 初始转换价格 + - LIST_ISSUE_SIZE: 发行规模(万元) + - LIST_ISSUE_QUANTITY: 发行数量(万张) + - TERM_YEAR: 借款期限(年) + - COUPON_RATE: 利率(%) + """ + self._check_login() + is_local = is_local if is_local is not None else self.config.use_local_cache + + loop = asyncio.get_event_loop() + return await loop.run_in_executor( + None, + lambda: self._info_data.get_kzz_issuance( + code_list=codes, + local_path=self.config.local_path, + is_local=is_local + ) + ) diff --git a/app/adapters/base.py b/app/adapters/base.py index 750595d..26a132b 100644 --- a/app/adapters/base.py +++ b/app/adapters/base.py @@ -25,16 +25,16 @@ class KLineData: close: float volume: int amount: float - open_interest: int = 0 + open_interest: Optional[int] = None # 股票特有字段 - trade_date: str = "" # 交易日 (YYYY-MM-DD) - is_limit_up: bool = False # 是否涨停 - is_limit_down: bool = False # 是否跌停 - total_market_cap: float = 0.0 # 总市值(元) - float_market_cap: float = 0.0 # 流通市值(元) - inst_holding_ratio: float = 0.0 # 机构持仓占比(%) - trading_days: int = 0 # 可交易日数(从上市至今) + trade_date: Optional[str] = None # 交易日 (YYYY-MM-DD) + is_limit_up: Optional[bool] = None # 是否涨停 + is_limit_down: Optional[bool] = None # 是否跌停 + total_market_cap: Optional[float] = None # 总市值(元) + float_market_cap: Optional[float] = None # 流通市值(元) + inst_holding_ratio: Optional[float] = None # 机构持仓占比(%) + trading_days: Optional[int] = None # 可交易日数(从上市至今) @dataclass diff --git a/app/models/__pycache__/types.cpython-311.pyc b/app/models/__pycache__/types.cpython-311.pyc index 83e9ab06f44826366f3572785eef5f6e7397292e..b53821cdb0dff3b874f67bcbb7e84943d9465ff2 100644 GIT binary patch delta 2812 zcmbVOdr*{B6yLinD=n@9wz;6ZLE8lu4NOHuNX-Yjj8x|1k3x4d6ovVC_`<{o;Und7 zR2ZL_f)b|Cr`f2Zp=D~RsARS|IF7MMrbCm>luk2!zq9B%IR4Yl?r(ng-gD16_ndpq z-EZr~=>wwIKD}P2Qa&s1HDr1WYV7q`r=IIUgChpXBfLA+R=dWgwwVrSYSk)Lz4CK? zW(3)_cAfu|p~~)MGbbt|wQ8Ko7PVSsi|!^LY*W9bGR4RfdQDM>=ldz5&dm+Z4F}uS zY->Ay%vt$mN9AFMZnk94$g|tt%gCdxK9@x%&Gnt`xj+$~L+5;>wRs9Ng;1!MfqMIu zYqON0lt;V$Ld6yNjNdYK2k7Rv^pstn+pJi08hY2fS!OzfElm?unMq90f#0lGdE8vp{Blpx}}%}%%{73fAa*J zUG8g;e>awhe#@}99Kc!!fI*kl+{%^|)b!tLrd$Swx#0C0MDf>m)Cw}JvnDJ-mBY-LsLVI`uNvcpXV zHo6-!908Ut;EmOo1XR+6@KjNajdE;6g<2HKrw16t)V&aJ`%#18P(Upp8Ne5A9~iq; z2j&5&2OI!=4mbp805r1gJ)nSUdGf2LgxDkN%~OS_C0kUI6+1eF0{L37-ACH1SC~Ac zB4yxE&#_C>Kr}fSbL<^2D^%L7z+bp*&O@b&v{H>7C8Z_}Z;*~sXOzXl9Fdz`rc)TQ5;noo zCot#AJs78951TlNG2kS1T582f&Ok$Kgivz# z*m(hNb}inZ>GA1WR#-rd@kZTQNC2+VwfK$Vtm1tZT^e#rET@C7&y2W)Web2qaT$!A zZwBN0e1&3$8g&;j2DDPz&^k{r?md3PrU`M0<_(Vt-U5*qHv&33JV6Tsrl&<8*Uda@ z;5e}l+(o#7v_Lg?s>|%nHH-mH`XJ%4Cm6h;r6YC+zSsjrih{h1N-y{HVcqUDRUn4F zuR|^1q4LX}MZu$jD4}19zF9Lv`AT8D%=y=kG>bs!a6K)%YVIETwEZ|ackFUj);PEC zk}Bx!q*UdGR42t+y4!-9p8eRT|n4zNiALbQsGh z7nANu1NFhmGZ(Lx19cOVfF3j;Wv;j>m#174Blco;umW7W?TyFVcCL559W_`<0YG~` zLf%%kru|rLTiJ&8eGO6}?HX-JU{ePng_dEJ_JeX;`3wwgWl67$*?E}-_E`I(oJ`4X zlekR!Jn{AocEKHgwhNO|GJrc4Tj8F>s@+us{jL_}(+UdE3ngO-g0iCx^2#wWLbP(o z&X4^r^cG~e|3l+5XL9u*X%#iT`CO0a7R^=A!Rg{mp_jM{x|J`^ZHxf{aAPS&rSvDw zSbxeImnLp^IWm$i8;oQgzqTh{X@_QZw#_bWqf_IDXm=_Tb^0f<3HTM-*jNEr8-PQ# zlPnVgd*8tr5D8;TXhHNVlrv$zxYK3meflNDpK>Nzy;;$A){oV&noUux9SaR}By$1@2qwgmbihJxt#^f4rBwU&SC?;QPQ~;0N z8Atzfcr3_XC_Ug1-iIV00jHYAr`l*u75B+uoh0&UVA{at_{YP4M)sj)$>sH(jS<8=w2Elub47M^B)zU;3)tA delta 2863 zcmbuBc}&z-5Xbi|N9zg{uquaKN{h=4LeSO4vsgt})EKR{i3jUZLEyLGfmNhM(OLnW zTH--L5s*U5;?K0Hlm=~xAwj&Nwit}pvS=W&SE4m(`uomWmu%&)?q)xk-EQ)uth<)bH)Z!uC#|11P5sHF$!dm(dV(q zm(zT!g#Skv-3hR}w;}CPV9^*`Y)AQbP4xau}A*!2b@K z-~}k4je*^QXw|eObS%giTnNQdfDic-NJYRN1qQ7f0vY-8{B0R4WlMrKs2`WS*<1oRER(_Q;RIbSrQi;EY#5Vjm8Nd;|)hgeu22h$HMbeO$39qW*E( zB#xj8Hhes6&Bf&4rV=K=7s}71r|iH{v^q3aRKlO!7W}#B;Qoi!d@v;ynQA=`lxL$}F zx)+fw8Ywt(lwW~j*{xn@l$Jqo&R(_7_~=bVls>1l$kDD)OW#svWb{G~mZO`7K|YeR zka%Yt-FJB00<-`Q(Vf8Dnj+cJ_ppbfJiJ4_ zRmIk$MV7tgeJ4&2t|AXqQOb|7<&`-up3gDZ>IquTCZCW)T&>Uot&|y4D_S{!QL&*y zDTqaJ$-+zr<7uK zcaqwuYeIm?q5cVD#dUfkAzJLFJKG9fNe z-=wIZ!_W`icql=q6J3<03!31tBv0fF@VfT)cpV;*U#W{DxCRlh&;#9bag96R)5#}- zhh9}NHfV>T45HYtJxSaN9ggq@765)fq|X*N5rBDl-U@mvYx$;2s|JXZzQ<`&DB`)zmCDa@G; zz&pQ8ma@IpbG4ST1J*h-_ntqI0t*#d>kd3@skT-X+S<+6n1!BWkm?|EU#f?MzLf8= zYEABj&Bhqx)@)ii%f%ICtsQ~r(_hu|u>7EQ#~b8^#%^7pwfDSN^|v0F0B%C*AUe7{ zevIt$PM8oqI0s5exj5qvOqK$0KWMYPhs}?QOZg@mG&)p2aX9>s;gEC8>BaqJOD{*{ zkmI}10>0EVd!M-bA~rphzI(!Lr!wB{ye2E%C>^CKa}r%El!1D8oSEMPMI6+`9^#RU zxq=$z1bE)ZGZ2d1=iB<{z?@8R|HTR`X<3Lb4a_wRXHUmq|BzBrCk^enkE_ZGOCW+; zQj3L^n&W-x{ds5g-2T}a->`_tAR%JO0yu2^F~)#+1h|RXQvGP%{13!qj_=O=n&F(( zKQ`Qz~05%Tp`!NPgq9=y6qMw#7m?v`S)Pk@A{8O|2dE!4K z<#^7qUC922#&HxptB1tkr#9 z$yWoml+Ql8J4)WnD7zB0y_(PSRpR&toNBeFSuN^(Lh4wrHlGC9Ijw~RtykI;hq9QT zfi|!a-SF4J^aJ(4BH)+%wca@;i2ZV4C9Cyxkyh)ZXSqxkv!`COU1a#++yo#uD-T4H z{V^JX?MlRk22<3e5KL6f%JF185u=+$Xf)N|m!XX;;R}S8A|xN^1hxQMfi9pMXyPzb zIurIfK=j|vt*o3$WgD zS1lCT(@{rUdJl3v@pL#tBWAp>H*7|RXd~Q9fTb+tZy+n!X@3PtvQd8rAK4H8cLf)v zo2>B}qYkdh*zC%~IIEE-6reruLPNv*m&igg(NtuM%LxTVJ8|_~Ph@)mF%gLNmnM*d z76FvQaOZ>x1@J^v6BiVcsL>P`Iugx5lxV;t53T2cYNG7su~7%>bowm4;=ZGDBj2w# zrcQcPafCK@dsbO}ZX9Ax+kSUzhqao+kaH(NaT*2Iu-ZB6$Xn~coMuAO*5kPeM^OTf z4G4EqNKaF&v8rjyBtxNX!VMhb$hrn&u>^*59FP9ARdQ|9h#_XyZSqejoX$|*{#jKI z8Mn%fJ*2Y*N#dnn3rhzS0PkKlFV1x`u`K`w02d&1J_zdwPzam>dfD3r9jhzk;;}-n zE%Sd{kqSy|7c93_SYoTNG|4l~o&qah(mbc)X9Kp5o%Ao-tiI|VLPprjnn(U#lrINn laZI>_`%-3qGPaUlurAlmBrON>NU1GN&adM6xBqxW)t?*w8XEur delta 1167 zcmZ{iUr19?9LMjOyMMN|rEZqaav6o*H2jlE{*SVh%0DYjBg<~vw6*EzI4z?Hg}@*o zJctDay;KhdB{zZ|dg!6Y>Zyo5MbJY*a3!gz9y;GMp#r&`^-suDIs(0fo!e0Pwr}xG|zwO=c4n1b~~Fr zQ;NuS_EA|!G^VHxHr>mD>N)mOtsvzy+6j`)3~g3%IRcjCV!yODua)KSc@`y(C19%A z@|lLCh>$XN#aTq^*n+c()R~LUCpM*$kD}YyL$~fPgY*OCKn1WI{^Ab0>aeZ>8d!&? zhwL`*d1_@+$=-XzEuzAQU=ToUN**)fqY-)tT8%}<&n9S?!VA$gB}e1YScD!FsiDN^ zaFSNBXw-!Th4KQzemF$Cfx`gopxM9~4qZzdBRb{>u`O;WEOCSq+*Ko#)3RFyftrbY9NG~sm(E4_Gtv#k#47Ooer~};+pOi-Urc?Kc1g96z-Bp+tBz9%-br=F_d~Nz-@+$+M)DxhVFR{u32l Fe*;8f3nl;n diff --git a/app/repositories/__pycache__/stock_repository.cpython-311.pyc b/app/repositories/__pycache__/stock_repository.cpython-311.pyc index f4d06c699679c34d9362eb0bff52c5ab7d8b7148..0754396527b6fe00194c916d52147e993ad6c96a 100644 GIT binary patch delta 1301 zcmZ{iO>7%g5XaxxS?{i$b?rJaCeDXL>qJ|qwa}2JgbyiAp(<*tdgI1Rx`|VV z=S@>rp;8Zs9#9U95E4{s4k!pwmBOk>s1gWq;s__S9N>VU5|@qIN(c_{=9Lg5!Akz^ z|IN&s=lSouYJF)L?;A#xiRb38HyrcRV@uu*sXPfhWoTaHaf%YvTIkYvg^m3x>a=+9M@V}oHV=e zyyijyZ)^Q9fC+sS2JxzH!DslV{#GQd_iV5f zi+&9-f?u>2p@>0i9wsntOu)ETGWwLrJ{oEOr&ABa`KZvQ#`jQYFMhOrXH#}qWkAWAZ`5qlCZP^rs3x9y6+9(=argy}#%GD*?SLf}hf zH(Xw>IA>=?$hGTcyvffD?UJTacRwyH+bVAGAxb|+7{)8Py>Jk}$@Ri{ypww#ZsCF6 z-(b;u{Grc7{gYHv5|}iTP3@(@Ti@&mCbC^cX^6CImUc}OUL+h95R*ug7Af!w;TX>4 zpM!6`oB2V2i{3AN6QS+Pl#qjmr7ipdj+%W_($s&C#E($v1p!}Ow(WW03V)qKTPH^D zpLmgKpyF%fl2sSi?ihY*o`Aqh?m7iy6SPTQ(Bq`y1eHKv-w!+DN^n{x2$u-25t4*e z!ePAe@X?ocEA0Uj_%V?R6k0^swoIUs(pVxB=%k`7o(^K9T3Iq17^LDX8o%tk(GzT= z6}4zW$vgQ-E5Mt0X7{ZQx-L9N=oa{0+rLn&ELH6%`Mcf|g&lB!hvC71{Wmvc{O!l#e_|u15|vt;IIi7oI@yh@ zcPEC0UC4uoh>CJhQ4oEKEmlxQ5Nr|JheF??2+Gih7W&=^^`W#cy=T&xRN8_0@!fO2 zd+ywG?|i4<)z$l|8erl{efiLM^jO`zO8Lpl*iBYu_wZV4)Y4Za0rue)->;Kj!<@v} z1Mx0Cm0;Opwl0kro2*^ZIS(m5XSOdz7%K-do;eYJ;O5-?jdEZzy5uMa^>-TQ{oC;i zsRrtCV09f{l_U&HcdCV@@ts|{7pD)zs2qb~?2wy4!XY^s4jM&0Z%i4cK7D#bYr?Ct ziHfoglDI*+0xA4f(cuX;1+M#JO7jAX;nTprh!d8hp#>)JmT+OWQ)kr&e+1~mU#e2D z5o^^p*o%GY5bUyM)%CvMR`DS`N!W&!NWG%TyoW}c@I~zh?`M0yVp^PUqX%u@4@*<0Y0(@q8)zd!Cd2~ zgKj-)DAx&8+4h}H=clu_l*^W83OvJul%eHppOH6mS$@LRpB1K0nY~CAsJs_l}@HG_qgy60-A(ZVi3uZdc2T4oC($vX9zQ}juY;WA+aUv?h;xXTxFn844~5ywXZKMOZF5-FKg zH#iEZ01MSQK~hz$Chn-DLM#xvU|ec;!Ze~1D==nNx~c%K;l&N#G}67`3Bp=|KjrOH gh0Jt5yMy1h^yE6|KjVef4*PE|xbe6DlXa{94Pnk7!TN>O>wi8OSiUKMMYUe>BHI>sI(K50T9D8O zQQ1pHU`XFZ{U~n#B8mts`cu${jI4fCL_y4&1pSE4dnJOX1NV8~bIv{Qz2|ESiip)<<#Fv;v%1 zW=i9%vFQOhZpSPA88iFL$!PRgiscWg_vEA_4MrUd&_zLO?FVRLv?=>60E zyV32=1qJ=?APlKn+#f+t=izII9qXq2fHsVHHrnWF+TE9n6PN77yB<3v@rB0=kJO(Y zmk9f@#Os((i&-`?g9s4i#9Tt#p-h>Hs33eqEp~Waj)Roa_mYy7)_8M!te(YoumgDB zyB40R8SfMw96?9LH28v*70-*cN1{EUqkN6RzaPG(i5D_}0bdZlVx6xK4&kV;aCHsU z4iPy7?VmA1A(BKcVI&R{W`ceUc7(7JHevvm`q|<+2KyCHTHxVEgBI?IT6nlX3r`|j zpVT!!i?nFHziC&;{7WJ01eL48`GJ|R7h3}t;3S%Yg)pdkgNtBEvj|dJ__t%)c;-K| Itdtl21->5jm;e9( delta 993 zcmZ|NUr19?7y$5lcDK3Bt^IROm%6F5IZfxk7ik&Q+!E2G^ufTyayn^l?%Yk$z!b87 zOpLxFkbEe_ih59Py+=?MNcm6{BZ#0NvS5-u)KllXLxQLS`+eUz_nhyZdv?C`-Rjfb z*6B1HYtKI|4<%Q0eVS|?>+$UO{RIyjJB!76jZa1f;JtPiWa-YT?#q`{9CuFzv4T8P zaxh+nt23=%5%<6c-5yc{g*)yN6|C*p3l@EV1zy7gwOqz=Q(RhJBmOj$5wk{T zPIHXQdoJR7HdZdlv*3cr%+mXXa2P35w#)nTt!$R*+ zWFSialo#+J5oiO80{*S|Ar7r%=6hlgcX-Hxxajyyh#=0Emj9%Wgf7 zGs_t%jW84$38BriPNG;NW)FEmF&w`F1F@z%7h!(ko=n(^wM2v_DnS+bFX;Ymd z_fBb=V`2HE6dv(Xc-AO|_3obaPI8cn> lW&5S_4oCYF;b0S;7o#38*%#!ACe8iZO=*1VKToBqzX3(8?PdS~ diff --git a/app/services/__pycache__/stock_service.cpython-311.pyc b/app/services/__pycache__/stock_service.cpython-311.pyc index 1dbce12f49a6188c62492be5a243eba33be977fb..2114082d16fee3ccd07748f8d807013b6029ee23 100644 GIT binary patch delta 1905 zcmaKtZERCj7{||9+r9MtWiPZ{x87}CDGWNMZj&(P9FR0)8{05g-YbT z{QI19PfySN>EP92 zE+~YibiAH7EU@KWh9xGI44c%r#$;S&DtJt5Jf?L#<~1JkIv&f4ht1DcWLd{#T`?&h z>pC9W8jo!qPr2Y+dHSQ3h5iETTxQ$5Pgl}N@#}a2GtEBB4WrlY3;u#ah_4W~(GjBy zSJJbLE%cJnrK+0J({F2?cEhxOMn8mjB~IW8bX*lg6WC{`e;Efg#LLRi0n^r`q!mb* zkA(QJ5b2Y2(L^W~9f=B|@ne$VAHl~bMkTWl7s9d7NSHhy5kiN;$0YONSUfDO99^<2GgUo>^8FCm|UUNe1VluC|7 zgs>nGNi`auplS2RWjb~sP9Ry`E*`LWaMEh9$%x@ieA8TUL4RI97nG5u#=3%=PA=6d ztJv80b}n!CFXB&%bN05py)A2RlQrNiMh<7XGF2&;fGRDhGEiD%cce8bjjRKuN6zZB zH|3QLpo}P4?Mk<&+GP_+GkTybOx>{}w|9Ol)3l_{)pq1-JF>MMvJDdDh})RKnU1A~ zoVzpc?##M7qdRKE^>hSrx)(#c!$}!W+n5cKUp3;$lHL zi3IKfGC?_e3%(%kw{I^ho`#Vb`j&IJe2R4wY6drJqy`d6YOb!q?}`5EqiWnkFS>gg zdSSeeK~j%td!wTV*Nr z5>z4{D1u4#(jSVjei8%`;Y0S8fsqV?dINrf#;&1) zgJxPuLugA@WpwcZtzV$63v@|N-_~3cIk)t)#I4C z9@km|Qqb$bQ{NGblz1ili4vRH+(h_X3+D`6(ftfh6L z`HJ>ZTe3|^@jbQ);B4tG*XGr1+P_H>=E>^(7Dbw2))rZsu>xsX+oGtQwwC~H=yB9S zR1G?Q0t7Kw)&r;1J7p`N^d|Fac!lU3_YkPNJcK`-ei&7KGxF+o_a^cO1X2=@g?TGYZG_E)7Qz;MQ|<0QM)EkJgD@nJ z(r(+{+1$=gl4F=KLa-B75rP8V{Oo}{$o?*J0Gv0PRk)j9zNFy(2|ou(>h&|c@V(+-*Q=K7Mz#yacl5XZi{8hEXq zuM0@>*<51K3n@MCjl@FHh}X;$_;G0!bYP*+AzJP6Ew-PhOlof`KQa*R3-$K!-oyMH z?(_xWy?Wc{$%Ap6tFHzmuOt`<^c;DNaD)&i6cFfL@-adY zfgT?pCxr2N!{H6fwYD48X(r6%zKnS+Wz5sH88h3xb9PtXTz7wF_BRfwBaJ&icY(?U q@YV80IE{t=%Mivpeg`Dg8NVM|;}QfQ&HimZXJcRglfo;-7QX->Y83nc diff --git a/app/services/futures_service.py b/app/services/futures_service.py index a49ac1a..dd9e218 100644 --- a/app/services/futures_service.py +++ b/app/services/futures_service.py @@ -87,6 +87,7 @@ class FuturesService: items = [] for k in klines: items.append(KLineItem( + symbol=symbol, time=datetime.fromtimestamp(k.time), open=k.open, high=k.high, @@ -94,7 +95,8 @@ class FuturesService: close=k.close, volume=k.volume, amount=k.amount, - open_interest=k.open_interest + open_interest=k.open_interest, + created_at=datetime.now() )) info(f"Fetched {len(items)} klines from adapter for {symbol}") diff --git a/app/services/stock_service.py b/app/services/stock_service.py index aa0b9f2..3db2885 100644 --- a/app/services/stock_service.py +++ b/app/services/stock_service.py @@ -97,13 +97,22 @@ class StockService: items = [] for k in klines: items.append(KLineItem( + symbol=symbol, time=datetime.fromtimestamp(k.time), open=k.open, high=k.high, low=k.low, close=k.close, volume=k.volume, - amount=k.amount + amount=k.amount, + trade_date=getattr(k, 'trade_date', None), + is_limit_up=getattr(k, 'is_limit_up', None), + is_limit_down=getattr(k, 'is_limit_down', None), + total_market_cap=getattr(k, 'total_market_cap', None), + float_market_cap=getattr(k, 'float_market_cap', None), + inst_holding_ratio=getattr(k, 'inst_holding_ratio', None), + trading_days=getattr(k, 'trading_days', None), + created_at=datetime.now() )) info(f"Fetched {len(items)} klines from adapter for {symbol}") diff --git a/xysz/AmazingDataAdapter_接口文档.md b/xysz/AmazingDataAdapter_接口文档.md new file mode 100644 index 0000000..c6aa3da --- /dev/null +++ b/xysz/AmazingDataAdapter_接口文档.md @@ -0,0 +1,790 @@ +# AmazingDataAdapter 接口文档 + +基于银河证券星耀数智量化平台 SDK 的 Python 适配器接口文档 + +--- + +## 目录 + +1. [快速开始](#快速开始) +2. [枚举类型](#枚举类型) +3. [接口列表](#接口列表) + - [基础数据接口](#基础数据接口) + - [历史行情接口](#历史行情接口) + - [财务数据接口](#财务数据接口) + - [股东股本接口](#股东股本接口) + - [融资融券接口](#融资融券接口) + - [交易异动接口](#交易异动接口) + - [指数数据接口](#指数数据接口) + - [ETF数据接口](#etf数据接口) + - [可转债数据接口](#可转债数据接口) + +--- + +## 快速开始 + +```python +import asyncio +from app.adapters.amazingdata_adapter import AmazingDataAdapter, SecurityType, Market + +async def main(): + # 1. 创建适配器 + adapter = AmazingDataAdapter() + + # 2. 连接数据源 + await adapter.connect({ + "username": "your_username", + "password": "your_password", + "host": "your_host", + "port": 8600, + "local_path": "./amazing_data_cache/", + "use_local_cache": True + }) + + # 3. 获取数据 + klines = await adapter.fetch_klines( + symbol="000001.SZ", + start="20240101", + end="20241231", + freq="1d" + ) + print(f"获取到 {len(klines)} 条K线数据") + + # 4. 断开连接 + await adapter.close() + +asyncio.run(main()) +``` + +--- + +## 枚举类型 + +### SecurityType - 证券类型 + +| 枚举值 | 说明 | +|--------|------| +| `SecurityType.STOCK_A` | 沪深A股 | +| `SecurityType.STOCK_A_SH_SZ` | 沪深A股(沪深) | +| `SecurityType.INDEX_A` | 沪深指数 | +| `SecurityType.ETF` | ETF | +| `SecurityType.FUTURE` | 期货 | +| `SecurityType.KZZ` | 可转债 | +| `SecurityType.GLRA` | 逆回购 | +| `SecurityType.HKT` | 港股通 | +| `SecurityType.ETF_OP` | ETF期权 | + +### Market - 市场 + +| 枚举值 | 说明 | +|--------|------| +| `Market.SH` | 上海 | +| `Market.SZ` | 深圳 | +| `Market.BJ` | 北京 | + +--- + +## 接口列表 + +### 基础数据接口 + +#### 1. fetch_klines - 获取历史K线 + +```python +async def fetch_klines( + self, + symbol: str, + start: str, + end: str, + freq: str +) -> List[KLineData] +``` + +**参数说明:** + +| 参数 | 类型 | 说明 | +|------|------|------| +| symbol | str | 标的代码,如 "000001.SZ" | +| start | str | 开始日期,格式 YYYYMMDD | +| end | str | 结束日期,格式 YYYYMMDD | +| freq | str | 周期:1m/5m/15m/30m/60m/1d/1w/1M | + +**返回数据 (KLineData):** + +| 字段 | 类型 | 说明 | +|------|------|------| +| symbol | str | 标的代码 | +| time | int | Unix时间戳 | +| open | float | 开盘价 | +| high | float | 最高价 | +| low | float | 最低价 | +| close | float | 收盘价 | +| volume | int | 成交量 | +| amount | float | 成交金额 | +| trade_date | str | 交易日 (YYYY-MM-DD) | +| is_limit_up | bool | 是否涨停 | +| is_limit_down | bool | 是否跌停 | +| total_market_cap | float | 总市值(元) | +| float_market_cap | float | 流通市值(元) | +| inst_holding_ratio | float | 机构持仓占比(%) | +| trading_days | int | 可交易日数 | + +--- + +#### 2. fetch_symbols - 获取标的列表 + +```python +async def fetch_symbols( + self, + asset_type: str +) -> List[SymbolInfo] +``` + +**参数说明:** + +| 参数 | 类型 | 说明 | +|------|------|------| +| asset_type | str | 资产类型:stock/futures | + +**返回数据 (SymbolInfo):** + +| 字段 | 类型 | 说明 | +|------|------|------| +| symbol_id | str | 标的代码 | +| name | str | 标的名称 | +| exchange | str | 交易所 | +| underlying | str | 期货品种代码 | +| contract_month | str | 合约月份 | + +--- + +#### 3. fetch_trading_calendar - 获取交易日历 + +```python +async def fetch_trading_calendar( + self, + exchange: str, + start: str, + end: str +) -> List[TradeCalData] +``` + +**参数说明:** + +| 参数 | 类型 | 说明 | +|------|------|------| +| exchange | str | 交易所代码:SH/SZ | +| start | str | 开始日期 YYYYMMDD | +| end | str | 结束日期 YYYYMMDD | + +--- + +#### 4. get_code_info - 获取证券基本信息 + +```python +async def get_code_info( + self, + security_type: SecurityType = SecurityType.STOCK_A +) -> pd.DataFrame +``` + +**返回字段:** + +| 字段 | 说明 | +|------|------| +| symbol | 证券简称 | +| security_status | 产品状态标志 | +| pre_close | 昨收价 | +| high_limited | 涨停价 | +| low_limited | 跌停价 | +| price_tick | 最小价格变动单位 | + +--- + +#### 5. get_trading_calendar - 获取交易日历(列表) + +```python +async def get_trading_calendar( + self, + market: Market = Market.SH +) -> List[int] +``` + +**返回:** 交易日列表,格式 [20240102, 20240103, ...] + +--- + +#### 6. get_adj_factor - 获取单次复权因子 + +```python +async def get_adj_factor( + self, + codes: List[str], + is_local: Optional[bool] = None +) -> pd.DataFrame +``` + +**参数说明:** + +| 参数 | 类型 | 说明 | +|------|------|------| +| codes | List[str] | 股票代码列表 | +| is_local | bool | 是否使用本地缓存 | + +**返回:** DataFrame (index: 日期, columns: 股票代码) + +--- + +#### 7. get_backward_factor - 获取后复权因子 + +```python +async def get_backward_factor( + self, + codes: List[str], + is_local: Optional[bool] = None +) -> pd.DataFrame +``` + +--- + +### 历史行情接口 + +#### 8. get_snapshot - 获取历史快照 + +```python +async def get_snapshot( + self, + codes: List[str], + start_date: str, + end_date: str +) -> Dict[str, pd.DataFrame] +``` + +**说明:** 获取Level-1行情快照数据 + +--- + +### 财务数据接口 + +#### 9. get_balance_sheet - 资产负债表 + +```python +async def get_balance_sheet( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> Dict[str, pd.DataFrame] +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| TOTAL_ASSETS | 资产总计 | +| TOTAL_CUR_ASSETS | 流动资产合计 | +| TOTAL_NONCUR_ASSETS | 非流动资产合计 | +| TOTAL_LIAB | 负债合计 | +| TOT_SHARE_EQUITY_INCL_MIN_INT | 股东权益合计 | +| CURRENCY_CAP | 货币资金 | +| NOTES_RECEIVABLE | 应收票据 | +| ACCT_RECEIVABLE | 应收账款 | +| INV | 存货 | + +--- + +#### 10. get_cash_flow - 现金流量表 + +```python +async def get_cash_flow( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> Dict[str, pd.DataFrame] +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| NET_CASH_FLOWS_OPERA_ACT | 经营活动现金流净额 | +| NET_CASH_FLOWS_INV_ACT | 投资活动现金流净额 | +| NET_CASH_FLOWS_FIN_ACT | 筹资活动现金流净额 | +| NET_INCR_CASH_AND_CASH_EQU | 现金及现金等价物净增加额 | + +--- + +#### 11. get_income_statement - 利润表 + +```python +async def get_income_statement( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> Dict[str, pd.DataFrame] +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| TOT_OPERA_REV | 营业总收入 | +| OPERA_REV | 营业收入 | +| TOT_OPERA_COST | 营业总成本 | +| OPERA_PROFIT | 营业利润 | +| TOTAL_PROFIT | 利润总额 | +| NET_PRO_INCL_MIN_INT_INC | 净利润 | +| BASIC_EPS | 基本每股收益 | +| DILUTED_EPS | 稀释每股收益 | +| RD_EXP | 研发费用 | + +--- + +#### 12. get_profit_express - 业绩快报 + +```python +async def get_profit_express( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> pd.DataFrame +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| TOTAL_ASSETS | 总资产 | +| NET_PRO_EXCL_MIN_INT_INC | 净利润 | +| TOT_OPERA_REV | 营业总收入 | +| TOTAL_PROFIT | 利润总额 | +| OPERA_PROFIT | 营业利润 | +| EPS_BASIC | 基本每股收益 | +| ROE_WEIGHTED | 净资产收益率-加权 | +| YOY_GR_NET_PROFIT_PARENT | 同比增长率 | + +--- + +#### 13. get_profit_notice - 业绩预告 + +```python +async def get_profit_notice( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> pd.DataFrame +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| P_TYPECODE | 业绩预告类型代码 | +| P_CHANGE_MAX | 预告净利润变动幅度上限 | +| P_CHANGE_MIN | 预告净利润变动幅度下限 | +| NET_PROFIT_MAX | 预告净利润上限(万元) | +| NET_PROFIT_MIN | 预告净利润下限(万元) | +| P_REASON | 业绩变动原因 | + +--- + +### 股东股本接口 + +#### 14. get_top10_shareholders - 十大股东 + +```python +async def get_top10_shareholders( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> pd.DataFrame +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| HOLDER_NAME | 股东名称 | +| HOLDER_QUANTITY | 持股数 | +| HOLDER_PCT | 持股比例(%) | +| HOLDER_HOLDER_CATEGORY | 股东性质(1:个人, 2:公司) | +| FLOAT_QTY | 流通股数量 | + +--- + +#### 15. get_shareholder_count - 股东户数 + +```python +async def get_shareholder_count( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> pd.DataFrame +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| HOLDER_TOTAL_NUM | A股、B股、H股、境外股的总户数 | +| HOLDER_NUM | A股股东户数 | + +--- + +#### 16. get_equity_structure - 股本结构 + +```python +async def get_equity_structure( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> pd.DataFrame +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| TOT_SHARE | 总股本(万股) | +| FLOAT_SHARE | 流通股(万股) | +| FLOAT_A_SHARE | 流通A股(万股) | +| RESTRICTED_A_SHARE | 限售A股(万股) | +| TOT_RESTRICTED_SHARE | 限售股合计 | + +--- + +### 融资融券接口 + +#### 17. get_margin_summary - 融资融券汇总 + +```python +async def get_margin_summary( + self, + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> pd.DataFrame +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| TRADE_DATE | 交易日期 | +| SUM_BORROW_MONEY_BALANCE | 融资余额(元) | +| SUM_PURCH_WITH_BORROW_MONEY | 融资买入额(元) | +| SUM_REPAYMENT_OF_BORROW_MONEY | 融资偿还额(元) | +| SUM_SEC_LENDING_BALANCE | 融券余额(元) | +| SUM_SALES_OF_BORROWED_SEC | 融券卖出量 | +| SUM_MARGIN_TRADE_BALANCE | 融资融券余额(元) | + +--- + +#### 18. get_margin_detail - 个股融资融券明细 + +```python +async def get_margin_detail( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> Dict[str, pd.DataFrame] +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| BORROW_MONEY_BALANCE | 融资余额 | +| PURCH_WITH_BORROW_MONEY | 融资买入额 | +| REPAYMENT_OF_BORROW_MONEY | 融资偿还额 | +| SEC_LENDING_BALANCE | 融券余额 | +| SALES_OF_BORROWED_SEC | 融券卖出量 | + +--- + +### 交易异动接口 + +#### 19. get_longhu_bang - 龙虎榜数据 + +```python +async def get_longhu_bang( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> pd.DataFrame +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| TRADE_DATE | 交易日期 | +| REASON_TYPE_NAME | 上榜原因 | +| CHANGE_RANGE | 涨跌幅(%) | +| TRADER_NAME | 营业部名称 | +| BUY_AMOUNT | 买入金额(元) | +| SELL_AMOUNT | 卖出金额(元) | +| FLOW_MARK | 买卖表示(1买入, 2卖出) | + +--- + +#### 20. get_block_trading - 大宗交易 + +```python +async def get_block_trading( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> pd.DataFrame +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| TRADE_DATE | 交易日期 | +| B_SHARE_PRICE | 成交价(元) | +| B_SHARE_VOLUME | 成交量(万股) | +| B_SHARE_AMOUNT | 成交金额(万元) | +| B_BUYER_NAME | 买方营业部名称 | +| B_SELLER_NAME | 卖方营业部名称 | + +--- + +### 指数数据接口 + +#### 21. get_index_constituents - 指数成分股 + +```python +async def get_index_constituents( + self, + codes: List[str], + is_local: Optional[bool] = None +) -> Dict[str, pd.DataFrame] +``` + +**支持指数:** + +| 代码 | 名称 | +|------|------| +| 000016.SH | 上证50 | +| 000300.SH | 沪深300 | +| 000905.SH | 中证500 | +| 000906.SH | 中证800 | +| 000852.SH | 中证1000 | + +**返回字段:** + +| 字段 | 说明 | +|------|------| +| INDEX_CODE | 指数代码 | +| CON_CODE | 成分股代码 | +| INDATE | 纳入日期 | +| OUTDATE | 剔除日期 | +| INDEX_NAME | 指数名称 | + +--- + +#### 22. get_index_weights - 成分股权重 + +```python +async def get_index_weights( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> Dict[str, pd.DataFrame] +``` + +**返回字段:** + +| 字段 | 说明 | +|------|------| +| INDEX_CODE | 指数代码 | +| CON_CODE | 标的代码 | +| TRADE_DATE | 生效日期 | +| WEIGHT | 权重(%) | +| CLOSE | 收盘价 | + +--- + +### ETF数据接口 + +#### 23. get_etf_pcf - ETF申赎数据 + +```python +async def get_etf_pcf( + self, + codes: List[str] +) -> Tuple[pd.DataFrame, Dict[str, pd.DataFrame]] +``` + +**返回:** (etf_info, etf_constituents) + +**etf_info字段:** + +| 字段 | 说明 | +|------|------| +| creation_redemption_unit | 每个篮子对应的ETF份数 | +| max_cash_ratio | 最大现金替代比例 | +| creation | 是否允许申购 | +| redemption | 是否允许赎回 | + +**etf_constituents字段:** + +| 字段 | 说明 | +|------|------| +| underlying_symbol | 成份证券简称 | +| component_share | 成份证券数量 | +| substitute_flag | 现金替代标志 | + +--- + +#### 24. get_fund_share - 基金份额 + +```python +async def get_fund_share( + self, + codes: List[str], + start_date: Optional[str] = None, + end_date: Optional[str] = None, + is_local: Optional[bool] = None +) -> Dict[str, pd.DataFrame] +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| FUND_SHARE | 基金份额(万份) | +| TOTAL_SHARE | 基金总份额(万份) | +| FLOAT_SHARE | 流通份额(万份) | +| CHANGE_REASON | 份额变动原因 | + +--- + +### 可转债数据接口 + +#### 25. get_kzz_issuance - 可转债发行数据 + +```python +async def get_kzz_issuance( + self, + codes: List[str], + is_local: Optional[bool] = None +) -> Dict[str, pd.DataFrame] +``` + +**主要字段:** + +| 字段 | 说明 | +|------|------| +| STOCK_CODE | 正股代码 | +| LISTED_DATE | 上市日期 | +| PLAN_SCHEDULE | 方案进度 | +| CLAUSE_INI_CONV_PRICE | 初始转换价格 | +| LIST_ISSUE_SIZE | 发行规模(万元) | +| LIST_ISSUE_QUANTITY | 发行数量(万张) | +| TERM_YEAR | 借款期限(年) | +| COUPON_RATE | 利率(%) | + +--- + +## 使用示例 + +### 示例1:获取股票K线并判断是否涨停 + +```python +import asyncio +from app.adapters.amazingdata_adapter import AmazingDataAdapter + +async def main(): + adapter = AmazingDataAdapter() + await adapter.connect({ + "username": "xxx", "password": "xxx", + "host": "xxx", "port": 8600 + }) + + # 获取K线 + klines = await adapter.fetch_klines("000001.SZ", "20240101", "20241231", "1d") + + for k in klines: + print(f"日期: {k.trade_date}, 收盘: {k.close}, " + f"涨停: {k.is_limit_up}, 跌停: {k.is_limit_down}") + + await adapter.close() + +asyncio.run(main()) +``` + +### 示例2:获取财务报表 + +```python +# 获取资产负债表 +balance = await adapter.get_balance_sheet( + codes=["000001.SZ", "600000.SH"], + start_date="20240930", + end_date="20240930" +) + +for code, df in balance.items(): + print(f"{code} 总资产: {df['TOTAL_ASSETS'].values[0]}") +``` + +### 示例3:获取指数成分股 + +```python +# 沪深300成分股 +constituents = await adapter.get_index_constituents(["000300.SH"]) +df = constituents["000300.SH"] +print(f"成分股数量: {len(df)}") +print(df[["CON_CODE", "INDATE"]].head()) +``` + +### 示例4:获取龙虎榜数据 + +```python +longhu = await adapter.get_longhu_bang( + codes=["000001.SZ"], + start_date="20240101", + end_date="20241231" +) +print(longhu[["TRADE_DATE", "REASON_TYPE_NAME", "BUY_AMOUNT", "SELL_AMOUNT"]]) +``` + +--- + +## 注意事项 + +1. **连接管理**: 使用前先调用 `connect()`,使用后调用 `close()` +2. **日期格式**: 支持 `YYYYMMDD`、`"YYYY-MM-DD"` 或 `date` 对象 +3. **本地缓存**: 默认启用,可设置 `is_local=False` 强制从服务器获取 +4. **批量处理**: 大量数据建议分批获取,每批 50-100 个代码 +5. **错误处理**: 连接断开会抛出 `RuntimeError`,需做好异常处理 + +--- + +**文档版本**: 1.0 +**更新日期**: 2024-03-11 diff --git a/xysz/AmazingData开发手册.md b/xysz/AmazingData开发手册.md new file mode 100644 index 0000000..0392b7e --- /dev/null +++ b/xysz/AmazingData开发手册.md @@ -0,0 +1,1383 @@ +# 中国银河证券星耀数智AmazingData 开发手册 + +**文档版本**: V1.0.24 +**Python SDK 版本**: V1.0.24 +**创建时间**: 2025年7月10日 +**最新发布日期**: 2025年12月16日 + +--- + +## 目录 + +1. [版本说明](#1版本说明) +2. [功能介绍](#2功能介绍) +3. [Python开发指南](#3python开发指南) +4. [附录](#4附录) +5. [免责声明](#5免责声明) + +--- + +## 1.版本说明 + +### 1.1 文档管理信息表 + +| 主题 | 中国银河证券星耀数智AmazingData 开发手册 | +|------|----------------------------------------| +| 文档版本 | V1.0.24 | +| Python SDK 版本 | V1.0.24 | +| 创建时间 | 2025年7月10日 | +| 最新发布日期 | 2025年12月16日 | + +--- + +## 2.功能介绍 + +本文档是tgw的SDK开发指南,包含了对API接口的说明以及示例,用于指引开发人员通过tgw金融数据功能接口进行数据接收和查询的开发。如需参考或使用本项目,需要提前联系官方获取权限。 + +### 2.1 金融数据服务 + +金融数据功能,是指用户使用C++、Python以及其他本功能可支持的程序设计语言或用户端页面,获取公司通过对证券交易所等渠道的公开信息加工而成的行情数据、金融资讯数据等金融数据的功能。 + +### 2.2 数据详情 + +#### 1) 行情数据 + +| 行情数据 | 品种 | 数据类型 | 数据起点 | 说明 | 是否支持实时订阅 | +|---------|------|---------|---------|------|----------------| +| 股票 | Level-1快照、K线数据 | 上交所、深交所、北交所 | 2013年至今 | - | 是 | +| 指数 | Level-1快照、K线数据 | 上交所、深交所、北交所 | - | - | 是 | +| 债券 | Level-1快照、K线数据 | 上交所、深交所 | - | - | 是 | +| 场内基金 | Level-1快照、K线数据 | 上交所、深交所 | - | - | 是 | +| 期权 | Level-1快照、K线数据 | 深交所ETF期权、上交所ETF期权 | 2015年至今 | - | 是 | +| 港股通 | 港股通行情快照 | 上交所、深交所 | 2023年至今 | - | 是 | +| 期货 | Level-1快照、K线数据 | 中金所 | 2010年4月至今 | - | 是 | + +#### 2) 基础数据 +- 每日最新证券信息(交易日早上9点前更新) +- 复权因子 +- 每日最新代码表(交易日早上9点前更新) +- 历史代码表 +- 交易日历 + +#### 3) 财务数据 +- 资产负债表 +- 现金流量表 +- 利润表 +- 业绩快报 +- 业绩预告 + +#### 4) 股东股本数据 +- 十大股东数据 +- 股东户数 +- 股本结构 +- 股权冻结/质押 +- 限售股解禁 + +#### 5) 股东权益数据 +- 分红数据 +- 配股数据 + +#### 6) 融资融券数据 +- 融资融券成交汇总 +- 融资融券交易明细 + +#### 7) 交易异动数据 +- 龙虎榜 +- 大宗交易 + +--- + +## 3.Python开发指南 + +### 3.1 SDK版本与下载 + +#### 3.1.1 wheel文件版本 + +| wheel文件名 | 操作系统 | Python版本 | +|------------|---------|-----------| +| tgw-1.*.*-py3-none-any.whl | Linux/Windows | Python 3.8/3.9/3.10/3.11/3.12/3.13 | +| AmazingData-1.*.*-cp38-none-any.whl | Linux/Windows | Python 3.8/3.9/3.10/3.11/3.12/3.13 | + +#### 3.1.2 wheel文件下载路径 + +1. 银河网盘 +2. 公众号"中国银河证券星耀数智"路径:"业务介绍"——"安装包下载" + +### 3.2 SDK运行环境 + +#### 3.2.1 Linux推荐运行环境配置 + +| 类型 | 最低配置 | 推荐配置 | +|------|---------|---------| +| 处理器 | 2.10GHz, 4核 | 2.10GHz, 8核 | +| 内存 | DDR4 4GB | DDR4 4GB | +| 硬盘 | 200G机械硬盘/SSD | 480G机械硬盘/SSD | +| 网卡 | 普通网卡 | 普通万兆网卡 | +| 操作系统 | REDHAT 7.2/7.4/7.6 | REDHAT 7.2/7.4/7.6 | + +#### 3.2.2 Windows推荐运行环境配置 + +| 类型 | 最低配置 | 推荐配置 | +|------|---------|---------| +| 处理器 | 2.60GHz, 4核 | 2.60GHz, 8核 | +| 内存 | DDR4 4GB | DDR4 4GB | +| 硬盘 | 200G机械硬盘/SSD | 480G机械硬盘/SSD | +| 网卡 | 普通网卡 | 普通万兆网卡 | +| 操作系统 | Windows 10(64位) | Windows 10(64位) | + +### 3.3 SDK安装 + +#### 3.3.1 tgw安装 +```bash +pip install +``` + +#### 3.3.2 AmazingData安装 +选择对应的Python版本: +```bash +pip install +``` + +### 3.4 Python开发步骤 + +登录AmazingData之后,实现数据获取。 + +#### 3.4.1 登录AmazingData + +**注意**: +1. 所有数据接口调用前,必须登录 +2. import AmazingData库,填写账号、密码、ip/port等信息,调用登录API + +```python +import AmazingData as ad +``` + +#### 3.4.2 调用数据接口 + +##### 3.4.2.1 查询接口调用 + +步骤: +1. 登录API +2. 实例化对应的数据查询类 +3. 调用查询数据接口,获取数据 + +```python +# 第一步:登录API +import AmazingData as ad +ad.login(username='username', password='password', host='***.***.***.***', port=****) + +# 第二步:实例化对应的数据查询类 +base_data_object = ad.BaseData() + +# 第三步:调用查询数据接口,获取数据 +code_list = base_data_object.get_code_list(security_type='EXTRA_STOCK_A') +``` + +##### 3.4.2.2 订阅接口调用 + +步骤: +1. 登录API +2. 实例化对应的数据查询类 +3. 实例化数据订阅类 +4. 用装饰器装饰回调函数,接收订阅数据 +5. 订阅数据执行 + +```python +# 第一步:登录API +import AmazingData as ad +ad.login(username='username', password='password', host='***.***.***.***', port=****) + +# 第二步:输入标的代码列表 +base_data_object = ad.BaseData() +etf_code_list = base_data_object.get_code_list(security_type='EXTRA_ETF') + +# 第三步:实例化数据订阅类 +sub_data = ad.SubscribeData() + +# 第四步:用装饰器装饰回调函数,接收订阅数据 +@sub_data.register(code_list=etf_code_list, period=ad.constant.Period.snapshot.value) +def onSnapshot(data: Union[ad.constant.Snapshot, ad.constant.SnapshotIndex], period): + print(period, data) + +# 第五步:订阅数据执行 +sub_data.run() +``` + +### 3.5 数据接口详细 + +#### 3.5.1 基础接口 + +##### 3.5.1.1 登录 + +**函数接口**: `login` + +**功能描述**: API登录 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| username | str | 是 | 账号 | +| password | str | 是 | 密码 | +| host | str | 是 | 服务器IP | +| port | int | 是 | 服务器端口号 | + +**示例代码**: +```python +import AmazingData as ad +ad.login(username='username', password='password', host='***.***.***.***', port=****) +``` + +**注意**:SDK的账号、密码、ip和端口号需联系您的开户营业部申请开通权限之后获取。 + +##### 3.5.1.2 登出 + +**函数接口**: `logout` + +**功能描述**: API退出登录链接,必须在登录状态下才可使用;正常使用情况下,无需使用此接口 + +| 名称 | 类型 | 说明 | +|------|------|------| +| username | str | 用户名 | + +##### 3.5.1.3 更新密码 + +**函数接口**: `update_password` + +**功能描述**: 更新密码接口,必须先登录才能修改密码 + +| 名称 | 类型 | 说明 | +|------|------|------| +| username | str | 用户名 | +| old_password | str | 旧密码 | +| new_password | str | 新密码 | + +#### 3.5.2 基础数据 + +##### 3.5.2.1 每日最新证券信息 + +**函数接口**: `get_code_info` + +**功能描述**: 获取每日最新证券信息,交易日早上9点前更新当日最新 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| security_type | str | 否 | 代码类型security_type(见附录),默认为EXTRA_STOCK_A | + +**输出参数**: + +| 参数 | 数据类型 | 解释 | +|------|---------|------| +| code_info | DataFrame | index为股票代码,column包含:symbol(证券简称)、security_status、pre_close、high_limited、low_limited、price_tick | + +**示例代码**: +```python +import AmazingData as ad +ad.login(username='username', password='password', host='***.***.***.***', port=****) +base_data_object = ad.BaseData() +code_info = base_data_object.get_code_info(security_type='EXTRA_ETF') +``` + +##### 3.5.2.2 每日最新代码表(沪深北) + +**函数接口**: `get_code_list` + +**功能描述**: 获取代码表(每日最新),此接口无法获取历史代码表。交易日早上9点前更新。 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| security_type | str | 否 | 代码类型,默认为EXTRA_STOCK_A | + +**输出参数**: + +| 返回值 | 数据类型 | 解释 | +|--------|---------|------| +| code_list | list | 证券代码 | + +**示例代码**: +```python +import AmazingData as ad +ad.login(username='username', password='password', host='***.***.***.***', port=****) +base_data_object = ad.BaseData() +code_list = base_data_object.get_code_list(security_type='EXTRA_STOCK_A') +``` + +##### 3.5.2.3 每日最新代码表(期货交易所) + +**函数接口**: `get_future_code_list` + +**功能描述**: 获取代码表(每日最新),此接口无法获取历史代码表。交易日早上9点前更新。 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| security_type | str | 是 | 代码类型,默认为ZJ_FUTURE(期货,中金所) | + +**输出参数**: + +| 返回值 | 数据类型 | 解释 | +|--------|---------|------| +| code_list | list | 证券代码 | + +##### 3.5.2.4 每日最新代码表(期权) + +**函数接口**: `get_option_code_list` + +**功能描述**: 获取代码表(每日最新),此接口无法获取历史代码表。交易日早上9点前更新。 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| security_type | str | 是 | 代码类型,默认为EXTRA_ETF_OP(ETF期权) | + +**输出参数**: + +| 返回值 | 数据类型 | 解释 | +|--------|---------|------| +| code_list | list | 证券代码 | + +##### 3.5.2.5 复权因子(后复权因子) + +**函数接口**: `get_backward_factor` + +**功能描述**: 获取复权因子数据并本地存储 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list[str] | 是 | 代码列表,支持股票、ETF | +| local_path | str | 是 | 本地存储复权因子数据的文件夹地址 | +| is_local | bool | 是 | 是否使用本地存储的数据,默认为True | + +**输出参数**: + +| 参数 | 数据类型 | 解释 | +|------|---------|------| +| backward_factor | DataFrame | index为交易日期,column为股票代码 | + +**示例代码**: +```python +import AmazingData as ad +ad.login(username='username', password='password', host='***.***.***.***', port=****) +base_data_object = ad.BaseData() +code_list = base_data_object.get_code_list(security_type='EXTRA_STOCK_A') +backward_factor = base_data_object.get_backward_factor( + code_list, + local_path='D://AmazingData_local_data//', + is_local=False +) +``` + +##### 3.5.2.6 复权因子(单次复权因子) + +**函数接口**: `get_adj_factor` + +**功能描述**: 获取单次复权因子数据并本地存储 + +**输入参数**: 同后复权因子 + +**输出参数**: + +| 参数 | 数据类型 | 解释 | +|------|---------|------| +| adj_factor | DataFrame | index为交易日期,column为股票代码 | + +##### 3.5.2.7 历史代码表 + +**函数接口**: `get_hist_code_list` + +**功能描述**: 获取历史代码表,先检查本地数据,再从服务端补充 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| security_type | str | 是 | 默认为"EXTRA_STOCK_A_SH_SZ" | +| start_date | int | 是 | 开始时间,闭区间 | +| end_date | int | 是 | 结束时间,闭区间 | +| local_path | str | 是 | 本地存储数据的路径 | + +**输出参数**: + +| 返回值 | 数据类型 | 解释 | +|--------|---------|------| +| code_list | List[str] | 证券代码 | + +##### 3.5.2.8 交易日历 + +**函数接口**: `get_calendar` + +**功能描述**: 获取交易所的交易日历 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| data_type | str | 否 | 选择返回数据的类型,默认为str | +| market | str | 否 | 选择市场,默认为SH(上海) | + +**输出参数**: + +| 返回值 | 数据类型 | 解释 | +|--------|---------|------| +| calendar | List[int] | 日期 | + +##### 3.5.2.9 证券基础信息 + +**函数接口**: `get_stock_basic` + +**功能描述**: 获取指定股票列表的证券基础数据 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list[str] | 是 | 支持沪深北三个交易所的代码列表 | + +**输出参数**: + +| 返回值 | 数据类型 | 解释 | +|--------|---------|------| +| stock_basic | DataFrame | 包含中英文名称、上市日期、退市日期、上市板块等信息 | + +##### 3.5.2.10 历史证券信息 + +**函数接口**: `get_history_stock_status` + +**功能描述**: 获取历史证券数据,包含涨跌停、st、除权除息等信息 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list[str] | 是 | 支持沪深A的代码列表 | +| local_path | str | 是 | 本地存储数据的路径 | +| is_local | bool | 否 | 默认为True | +| begin_date | int | 否 | 交易日 | +| end_date | int | 否 | 交易日 | + +##### 3.5.2.11 北交所新旧代码对照表 + +**函数接口**: `get_bj_code_mapping` + +**功能描述**: 获取北交所的存量上市公司股票新旧代码对照表 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| local_path | str | 是 | 本地存储数据的路径 | +| is_local | bool | 否 | 默认为True | + +--- + +#### 3.5.3 实时行情数据 + +实时行情订阅接口使用步骤: +1. 实例化AmazingData的SubscribeData +2. 回调函数的装饰器传入code_list和period两个参数 +3. 回调函数中获取数据 + +##### 3.5.3.1 指数实时快照 + +**函数接口**: `onSnapshotIndex` + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持北交所、上交所、深交所的指数 | +| period | Period | 是 | Period.snapshot.value | + +##### 3.5.3.2 股票实时快照 + +**函数接口**: `onSnapshot` + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持北交所、上交所、深交所的股票 | +| period | Period | 是 | Period.snapshot.value | + +##### 3.5.3.3 逆回购实时快照 + +**函数接口**: `onSnapshotGlra` + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持上交所、深交所的逆回购代码 | +| period | Period | 是 | Period.snapshot.value | + +##### 3.5.3.4 期货实时快照 + +**函数接口**: `onSnapshotFuture` + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持中金所 | +| period | Period | 是 | Period.snapshotfuture.value | + +##### 3.5.3.5 ETF实时快照 + +**函数接口**: `onSnapshotEtf` + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持上交所、深交所的ETF | +| period | Period | 是 | Period.snapshot.value | + +##### 3.5.3.6 可转债实时快照 + +**函数接口**: `onSnapshotKzz` + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持上交所、深交所的可转债 | +| period | Period | 是 | Period.snapshot.value | + +##### 3.5.3.7 港股通实时快照 + +**函数接口**: `onSnapshotHkt` + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持上交所、深交所的港股通 | +| period | Period | 是 | Period.snapshotHKT.value | + +##### 3.5.3.8 ETF期权实时快照 + +**函数接口**: `onSnapshotOption` + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持上交所、深交所的ETF期权 | +| period | Period | 是 | Period.snapshotoption.value | + +##### 3.5.3.9 实时K线 + +**函数接口**: `OnKLine` + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持多品种 | +| period | Period | 是 | Period | + +--- + +#### 3.5.4 历史行情数据 + +##### 3.5.4.1 历史快照 + +**函数接口**: `query_snapshot` + +**功能描述**: 快照数据的历史数据查询接口 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持多品种 | +| begin_date | int | 是 | 开始日期 | +| end_date | int | 是 | 结束日期 | +| begin_time | int | 否 | 开始时间 | +| end_time | int | 否 | 结束时间 | + +##### 3.5.4.2 历史K线 + +**函数接口**: `query_kline` + +**功能描述**: K线数据的历史数据查询接口 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| code_list | list:[str] | 是 | 支持多品种 | +| begin_date | int | 是 | 开始日期 | +| end_date | int | 是 | 结束日期 | +| period | Period | 是 | 数据周期 | +| begin_time | int | 否 | 开始时间 | +| end_time | int | 否 | 结束时间 | + +--- + +#### 3.5.5 财务数据 + +##### 3.5.5.1 资产负债表 + +**函数接口**: `get_balance_sheet` + +**功能描述**: 获取上市公司的资产负债表数据 + +##### 3.5.5.2 现金流量表 + +**函数接口**: `get_cash_flow` + +**功能描述**: 获取上市公司的现金流量表数据 + +##### 3.5.5.3 利润表 + +**函数接口**: `get_income` + +**功能描述**: 获取上市公司的利润表数据 + +##### 3.5.5.4 业绩快报 + +**函数接口**: `get_profit_express` + +**功能描述**: 获取上市公司的业绩快报数据 + +##### 3.5.5.5 业绩预告 + +**函数接口**: `get_profit_notice` + +**功能描述**: 获取上市公司的业绩预告数据 + +--- + +#### 3.5.6 股东股本数据 + +##### 3.5.6.1 十大股东数据 + +**函数接口**: `get_share_holder` + +##### 3.5.6.2 股东户数 + +**函数接口**: `get_holder_num` + +##### 3.5.6.3 股本结构 + +**函数接口**: `get_equity_structure` + +##### 3.5.6.4 股权冻结/质押 + +**函数接口**: `get_equity_pledge_freeze` + +##### 3.5.6.5 限售股解禁 + +**函数接口**: `get_equity_restricted` + +--- + +#### 3.5.7 股东权益数据 + +##### 3.5.7.1 分红数据 + +**函数接口**: `get_dividend` + +##### 3.5.7.2 配股数据 + +**函数接口**: `get_right_issue` + +--- + +#### 3.5.8 融资融券数据 + +##### 3.5.8.1 融资融券成交汇总 + +**函数接口**: `get_margin_summary` + +##### 3.5.8.2 融资融券交易明细 + +**函数接口**: `get_margin_detail` + +--- + +#### 3.5.9 交易异动数据 + +##### 3.5.9.1 龙虎榜 + +**函数接口**: `get_long_hu_bang` + +##### 3.5.9.2 大宗交易 + +**函数接口**: `get_block_trading` + +--- + +#### 3.5.10 期权数据 + +##### 3.5.10.1 期权基本资料 + +**函数接口**: `get_option_basic_info` + +##### 3.5.10.2 期权标准合约属性 + +**函数接口**: `get_option_std_ctr_specs` + +##### 3.5.10.3 期权月合约属性变动 + +**函数接口**: `get_option_mon_ctr_specs` + +--- + +#### 3.5.11 ETF数据 + +##### 3.5.11.1 ETF每日最新申赎数据 + +**函数接口**: `get_etf_pcf` + +##### 3.5.11.2 ETF基金份额 + +**函数接口**: `get_fund_share` + +##### 3.5.11.3 ETF每日收盘IOPV + +**函数接口**: `get_fund_iopv` + +--- + +#### 3.5.12 交易所指数数据 + +##### 3.5.12.1 交易所指数成分股 + +**函数接口**: `get_index_constituent` + +##### 3.5.12.2 交易所指数成分股日权重 + +**函数接口**: `get_index_weight` + +--- + +#### 3.5.13 行业指数数据 + +##### 3.5.13.1 行业指数基本信息 + +**函数接口**: `get_industry_base_info` + +##### 3.5.13.2 行业指数成分股 + +**函数接口**: `get_industry_constituent` + +##### 3.5.13.3 行业指数成分股日权重 + +**函数接口**: `get_industry_weight` + +##### 3.5.13.4 行业指数日行情 + +**函数接口**: `get_industry_daily` + +--- + +#### 3.5.14 可转债数据 + +##### 3.5.14.1 可转债发行 + +**函数接口**: `get_kzz_issuance` + +##### 3.5.14.2 可转债份额 + +**函数接口**: `get_kzz_share` + +##### 3.5.14.3 可转债转股数据 + +**函数接口**: `get_kzz_conv` + +##### 3.5.14.4 可转债转股变动数据 + +**函数接口**: `get_kzz_conv_change` + +##### 3.5.14.5 可转债修正数据 + +**函数接口**: `get_kzz_corr` + +##### 3.5.14.6 可转债赎回数据 + +**函数接口**: `get_kzz_call` + +##### 3.5.14.7 可转债回售数据 + +**函数接口**: `get_kzz_put` + +##### 3.5.14.8 可转债回售赎回条款 + +**函数接口**: `get_kzz_put_call_item` + +##### 3.5.14.9 可转债回售条款执行说明 + +**函数接口**: `get_kzz_put_explanation` + +##### 3.5.14.10 可转债赎回条款执行说明 + +**函数接口**: `get_kzz_call_explanation` + +##### 3.5.14.11 可转债停复牌信息 + +**函数接口**: `get_kzz_suspend` + +--- + +#### 3.5.15 国债收益率数据 + +##### 3.5.15.1 国债收益率 + +**函数接口**: `get_treasury_yield` + +**功能描述**: 获取指定期限的国债收益率数据 + +**输入参数**: + +| 参数 | 数据类型 | 必选 | 解释 | +|------|---------|------|------| +| term_list | list[str] | 是 | 支持:'m3','m6','y1','y2','y3','y5','y7','y10','y30' | +| local_path | str | 是 | 本地存储路径 | +| is_local | bool | 否 | 默认为True | +| begin_date | int | 否 | 开始日期 | +| end_date | int | 否 | 结束日期 | + +--- + +### 3.6 金融算子详细 + +#### 3.6.1 数学函数 + +数学函数用于基本的数学运算,包括三角函数、对数、取整等操作。所有函数返回pd.Series类型。 + +**函数列表**: + +| 序号 | 函数名称 | 函数用法 | +|------|---------|---------| +| 1 | ABS | ABS(X)为X的绝对值 | +| 2 | ACOS | ACOS(X)返回X的反余弦值 | +| 3 | ASIN | ASIN(X)返回X的反正弦值 | +| 4 | ATAN | ATAN(X)返回X的反正切值 | +| 5 | BETWEEN | BETWEEN(A,B,C)表示A处于B和C之间时返回1 | +| 6 | CEILING | CEILING(x)沿数值增大方向最接近的整数 | +| 7 | COS | COS(X)返回X的余弦值 | +| 8 | EXP | EXP(X)返回e的X次幂 | +| 9 | FLOOR | FLOOR(x)沿数值减小方向最接近的整数 | +| 10 | FRACPART | FRACPART(X)返回X的小数部分 | +| 11 | IF | IF(X,A,B)若X不为0则返回A,否则返回B | +| 12 | INTPART | INTPART(x)沿绝对值减小方向最接近的整数 | +| 13 | LN | LN(X)以e为底的对数 | +| 14 | LOG | LOG(X)以10为底的对数 | +| 15 | MAX | MAX(A,B,C...)返回较大值 | +| 16 | MIN | MIN(A,B,C...)返回较小值 | +| 17 | MOD | MOD(M,N)返回M关于N的模 | +| 18 | POW | POW(A,B)返回A的B次幂 | +| 19 | RAND | RAND(a,b)返回范围在[a,b]的随机整数 | +| 20 | ROUND | ROUND(X,N)返回X四舍五入到N位小数 | +| 21 | SIGN | SIGN(X)返回X的符号 | +| 22 | SIN | SIN(X)返回X的正弦值 | +| 23 | SQRT | SQRT(X)为X的平方根 | +| 24 | TAN | TAN(X)返回X的正切值 | + +#### 3.6.2 统计函数 + +统计函数用于计算时序数据的统计指标。 + +**函数列表**: + +| 序号 | 函数名称 | 函数用法 | +|------|---------|---------| +| 1 | AVEDEV | AVEDEV(X,N)返回X在N周期内的平均绝对偏差 | +| 2 | BETA | BETA(X,BENCHMARK,N)返回贝塔系数 | +| 3 | BETAEX | BETAEX(X,Y,N)返回相关放大系数 | +| 4 | COVAR | COVAR(X,Y,N)返回协方差 | +| 5 | DEVSQ | DEVSQ(X,N)返回数据偏差平方和 | +| 6 | FORCAST | FORCAST(X,N)返回线性回归预测值 | +| 7 | KURTOSIS | KURTOSIS(X,N)计算峰度 | +| 8 | MEAN | MEAN(X,N)计算平均值 | +| 9 | MEDIAN | MEDIAN(X,N)计算中位数 | +| 10 | QUANTILE | QUANTILE(X,N,M)计算分位数 | +| 11 | RELATE | RELATE(X,Y,N)返回相关系数 | +| 12 | SKEW | SKEW(X,N)计算偏度 | +| 13 | SLOPE | SLOPE(X,N)返回线性回归斜率 | +| 14 | STD | STD(X,N)返回估算标准差 | +| 15 | STDDEV | STDDEV(X,N)返回标准偏差 | +| 16 | STDP | STDP(X,N)返回总体标准差 | +| 17 | VAR | VAR(X,N)返回估算样本方差 | +| 18 | VARP | VARP(X,N)返回总体样本方差 | + +#### 3.6.3 时序函数 + +时序函数用于时间序列数据的处理。 + +**函数列表**: + +| 序号 | 函数名称 | 函数用法 | +|------|---------|---------| +| 1 | AMA | AMA(X,A)自适应系数A必须小于1 | +| 2 | BARSLAST | BARSLAST(X)上一次X不为False到现在的周期数 | +| 3 | BARSLASTCOUNT | BARSLASTCOUNT(X)统计连续满足X条件的周期数 | +| 4 | BARSLASTS | BARSLASTS(X,N)X倒数第N满足到现在的周期数 | +| 5 | BARSNEXT | BARSNEXT(X)下一次X不为0到现在的周期数 | +| 6 | BARSSINCE | BARSSINCE(X)第一次X不为0到现在的周期数 | +| 7 | BARSSINCEN | BARSSINCEN(X,N)N周期内第一次X不为0到现在的周期数 | +| 8 | BARSTATUS | BARSTATUS(X)返回数据位置信息 | +| 9 | COUNT | COUNT(X,N)统计N周期中满足X条件的周期数 | +| 10 | CROSS | CROSS(A,B)当A从下方向上穿过B时返回1 | +| 11 | CUMSUM | CUMSUM(X)从第一个有效值开始累计求和 | +| 12 | CURRBARSCOUNT | CURRBARSCOUNT(X)从最新一根K线倒数编号 | +| 13 | DMA | DMA(X,A)求X的动态移动平均 | +| 14 | DOWNNDAY | DOWNNDAY(CLOSE,M)表示连跌M个周期 | +| 15 | EMA | EMA(X,N)X的N日指数移动平均 | +| 16 | EVERY | EVERY(X,N)表示N日内一直满足条件X | +| 17 | EXIST | EXIST(X,N)表示N日内是否存在满足条件X | +| 18 | EXISTR | EXISTR(X,A,B)表示从前A日内到前B日内是否存在满足条件X | +| 19 | EXPMEMA | EXPMEMA(X,N)X的N日指数平滑移动平均 | +| 20 | FILTER | FILTER(X,N)X满足条件后,将其后N周期内的数据置为0 | +| 21 | FILTERX | FILTERX(X,N)X满足条件后,将其前N周期内的数据置为0 | +| 22 | HHV | HHV(X,N)求N周期内X最高值 | +| 23 | HHVBARS | HHVBARS(X,N)求N周期内X最高值到当前周期数 | +| 24 | HHVLLV | HHVLLV(X,T,N1,N2)阶段最高最低值 | +| 25 | HOD | HOD(X,N)求当前X数据是N周期内的第几个高值 | +| 26 | LAST | LAST(X,A,B)表示从前A日到前B日内一直满足条件X | +| 27 | LLV | LLV(X,N)求N周期内X最低值 | +| 28 | LLVBARS | LLVBARS(X,N)求N周期内X最低值到当前周期数 | +| 29 | LOD | LOD(X,N)求当前X数据是N周期内的第几个低值 | +| 30 | LONGCROSS | LONGCROSS(A,B,N)A在N周期内都小于B,本周期从下方向上穿过B时返回1 | +| 31 | MA | MA(X,N)X的N日简单移动平均 | +| 32 | MEMA | MEMA(X,N)X的N日平滑移动平均 | +| 33 | MULAR | MULAR(X,N)统计N周期中X的乘积 | +| 34 | NDAY | NDAY(CLOSE,OPEN,3)表示连续3日收阳线 | +| 35 | RANGE | RANGE(A,B,C)A在B和C范围之间 | +| 36 | REF | REF(X,A)引用A周期前的X值 | +| 37 | REFV | REFV(X,A)引用A周期前的X值(平滑处理) | +| 38 | REFX | REFX(X,A)引用A周期后的X值 | +| 39 | REFXV | REFXV(X,A)引用A周期后的X值(平滑处理) | +| 40 | REVERSE | REVERSE(X)返回-X | +| 41 | SAR | SAR(HIGH,LOW,CLOSE,N,STEP,MAXAF)抛物线转向指标 | +| 42 | SHIFT | SHIFT(A,N)获取A的N个交易日前的值 | +| 43 | SMA | SMA(X,N,M)X的N日移动平均,M为权重 | +| 44 | SUM | SUM(X,N)统计N周期中X的总和 | +| 45 | SUMBARS | SUMBARS(X,A)将X向前累加直到大于等于A | +| 46 | SUMBARSX | SUMBARSX(X,A)将X向前累加直到大于等于A | +| 47 | TMA | TMA(X,A,B)A和B必须小于1 | +| 48 | TOTALBARSCOUNT | TOTALBARSCOUNT(X)从第一根K线开始编号 | +| 49 | TR | TR(HIGH,LOW,CLOSE)求真实波幅 | +| 50 | UPNDAY | UPNDAY(CLOSE,M)表示连涨M个周期 | +| 51 | WMA | WMA(X,N)X的N日加权移动平均 | + +#### 3.6.4 截面函数 + +截面函数用于计算同一交易日内多个标的之间的统计指标。 + +**函数列表**: + +| 序号 | 函数名称 | 函数用法 | +|------|---------|---------| +| 1 | CSCORR | CSCORR(X,Y)返回每交易日两个指标的当日相关度 | +| 2 | CSCOUNT | CSCOUNT(X)统计交易日截面的标的个数 | +| 3 | CSCOV | CSCOV(X,Y)返回每交易日两个指标的当日协方差 | +| 4 | CSDEMEAN | CSDEMEAN(X)对每个交易日的截面数据减去均值 | +| 5 | CSMAX | CSMAX(X)计算交易日截面指标的最大值 | +| 6 | CSMEAN | CSMEAN(X)计算交易日截面指标的平均值 | +| 7 | CSMEDIAN | CSMEDIAN(X)计算交易日截面指标的中位数 | +| 8 | CSMIN | CSMIN(X)计算交易日截面指标的最小值 | +| 9 | CSNORMALIZE | CSNORMALIZE(X)对每个交易日的截面数据进行归一化到[0,1] | +| 10 | CSPCTRANK | CSPCTRANK(X)计算交易日截面指标的百分位排名 | +| 11 | CSQUANTILE | CSQUANTILE(X,N)计算交易日截面指标的分位数N | +| 12 | CSRANK | CSRANK(X,B)计算交易日截面指标的排名 | +| 13 | CSSTD | CSSTD(X)计算交易日截面指标的标准差 | +| 14 | CSSUM | CSSUM(X)计算交易日截面指标的求和 | +| 15 | CSVAR | CSVAR(X)计算交易日截面指标的方差 | +| 16 | CSZSCORE | CSZSCORE(X)对每个交易日的截面数据进行Z-score标准化 | + +--- + +## 4.附录 + +### 4.1 字段取值说明 + +#### 4.1.1 代码类型security_type(沪深北) + +| 数据类型 | 枚举值 | 说明 | +|---------|--------|------| +| str | EXTRA_STOCK_A | 上交所A股、深交所A股和北交所的股票列表 | +| str | SH_A | 上交所A股的股票列表 | +| str | SZ_A | 深交所A股的股票列表 | +| str | BJ_A | 北交所的股票列表 | +| str | EXTRA_STOCK_A_SH_SZ | 上交所A股和深交所A股的股票列表 | +| str | EXTRA_INDEX_A_SH_SZ | 上交所和深交所指数列表 | +| str | EXTRA_INDEX_A | 上交所、深交所和北交所的指数列表 | +| str | SH_INDEX | 上交所指数列表 | +| str | SZ_INDEX | 深交所指数列表 | +| str | BJ_INDEX | 北交所的指数列表 | +| str | SH_ETF | 上交所的ETF列表 | +| str | SZ_ETF | 深交所的ETF列表 | +| str | EXTRA_ETF | 上交所、深交所的ETF列表 | +| str | SH_KZZ | 上交所的可转债列表 | +| str | SZ_KZZ | 深交所的可转债列表 | +| str | EXTRA_KZZ | 上交所、深交所的可转债列表 | +| str | SH_HKT | 沪港通 | +| str | SZ_HKT | 深港通 | +| str | EXTRA_HKT | 沪深港通 | +| str | SH_GLRA | 上交所逆回购 | +| str | SZ_GLRA | 深交所逆回购 | +| str | EXTRA_GLRA | 沪深逆回购 | + +#### 4.1.2 代码类型security_type(期货交易所) + +| 数据类型 | 枚举值 | 说明 | +|---------|--------|------| +| str | ZJ_FUTURE | 期货,包含中金所 | + +#### 4.1.3 代码类型security_type(期权) + +| 数据类型 | 枚举值 | 说明 | +|---------|--------|------| +| str | EXTRA_ETF_OP | ETF期权,上交所/深交所 | +| str | SH_OPTION | ETF期权,包含上交所 | +| str | SZ_OPTION | ETF期权,包含深交所 | + +#### 4.1.4 市场类型market + +| 数据类型 | 枚举值 | 说明 | +|---------|--------|------| +| str | SH | 上交所 | +| str | SZ | 深交所 | +| str | BJ | 北交所 | +| str | CFE | 中金所 | +| str | SHN | 沪港通 | +| str | SZN | 深港通 | +| str | HK | 港交所 | + +#### 4.1.5 交易阶段代码trading_phase_code + +**上海现货快照交易状态**: +- 第0位:'S'表示启动(开市前)时段,'C'表示开盘集合竞价时段,'T'表示连续交易时段,'E'表示闭市时段,'P'表示产品停牌 +- 第1位:'0'表示此产品不可正常交易,'1'表示此产品可正常交易 +- 第2位:'0'表示未上市,'1'表示已上市 +- 第3位:'0'表示此产品在当前时段不接受进行新订单申报,'1'表示可接受 + +**深圳现货快照交易状态**: +- 第0位:'S'=启动,'O'=开盘集合竞价,'T'=连续竞价,'B'=休市,'C'=收盘集合竞价,'E'=已闭市,'H'=临时停牌,'A'=盘后交易,'V'=波动性中断 +- 第1位:'0'=正常状态,'1'=全天停牌 + +**港股股票行情交易状态**: +- '1'表示正常交易,'2'表示停牌,'3'表示复牌 + +#### 4.1.6 产品状态标志security_status + +| 状态 | 标志 | 说明 | +|------|------|------| +| 停牌 | 1 | 深交所、北交所 | +| 除权 | 2 | 上交所、深交所、北交所 | +| 除息 | 3 | 上交所、深交所、北交所 | +| 风险警示 | 4 | 上交所、深交所、北交所 | +| 退市整理期 | 5 | 上交所、深交所、北交所 | +| 上市首日 | 6 | 上交所、深交所、北交所 | +| 公司再融资 | 7 | 深交所 | +| 恢复上市首日 | 8 | 深交所、北交所 | +| 网络投票 | 9 | 深交所 | +| 增发股份上市 | 10 | 深交所 | +| 合约调整 | 11 | 深交所 | +| 暂停上市后协议转让 | 12 | 深交所 | +| 实施双转单调整 | 13 | 深交所 | +| 特定债券转让 | 14 | 深交所、北交所 | +| 上市初期 | 15 | 深圳有效 | +| 退市整理期首日 | 16 | 深交所、北交所 | + +#### 4.1.7 数据周期Period + +| 数据类型 | 枚举值 | 说明 | +|---------|--------|------| +| int | Period.min1.value | 1分钟线 | +| int | Period.min3.value | 3分钟线 | +| int | Period.min5.value | 5分钟线 | +| int | Period.min10.value | 10分钟线 | +| int | Period.min15.value | 15分钟线 | +| int | Period.min30.value | 30分钟线 | +| int | Period.min60.value | 60分钟线 | +| int | Period.min120.value | 120分钟线 | +| int | Period.day.value | 日线 | +| int | Period.week.value | 周线 | +| int | Period.month.value | 月线 | +| int | Period.season.value | 季度线 | +| int | Period.year.value | 年线 | + +#### 4.1.8 报告期名称REPORT_TYPE + +| 报告期类型代码 | 报告期月份 | +|---------------|-----------| +| 1 | 3月 | +| 2 | 6月 | +| 3 | 9月 | +| 4 | 12月 | + +#### 4.1.9 报表类型代码表STATEMENT_TYPE + +| 报表类型代码 | 报表类型 | 备注 | +|-------------|---------|------| +| 1 | 合并报表 | 涵盖母公司的财务报表数据,为最新报表 | +| 2 | 合并报表(单季度) | 合并报表(单季度)=合并报表(本期)-合并报表(上一季) | +| 3 | 合并报表(单季度调整) | 合并报表(单季度调整)=合并报表(本期调整)-合并报表(上一季调整) | +| 4 | 合并报表(调整) | 本年度公布上年同期的财务报表数据 | +| 5 | 合并报表(更正前) | 出更正公告后,把合并报表的记录修改为合并报表(更正前) | +| 6 | 母公司报表 | 该公司母公司的财务报表数据 | +| 7 | 母公司报表(单季度) | 母公司报表(单季度)=母公司报表(本期)-母公司报表(上一季) | +| 8 | 母公司报表(单季度调整) | 母公司报表(单季度调整)=母公司报表(本期调整)-母公司报表(上一季调整) | +| 9 | 母公司报表(调整) | 该公司母公司的本年度公布上年同期的财务报表数据 | +| 10 | 母公司报表(更正前) | 未调整之前的原始财务报表数据 | + +#### 4.1.10 股票分红进度代码表DIV_PROGRESS + +| 分红进度描述 | 进度代码 | +|-------------|---------| +| 董事会预案 | 1 | +| 股东大会通过 | 2 | +| 实施 | 3 | +| 未通过 | 4 | +| 停止实施 | 12 | +| 股东提议 | 17 | +| 董事会预案预披露 | 19 | + +分红实施进程:股东提议 → 董事会预案 → 股东大会 → 实施 + +#### 4.1.11 股票配股进度代码表PROGRESS + +| 配股进度描述 | 进度代码 | +|-------------|---------| +| 董事会预案 | 1 | +| 股东大会通过 | 2 | +| 实施 | 3 | +| 未通过 | 4 | +| 证监会核准 | 5 | +| 达成转让意向 | 6 | +| 签署转让协议 | 7 | +| 国资委批准 | 8 | +| 商务部批准 | 9 | +| 过户 | 10 | +| 延期实施 | 11 | +| 停止实施 | 12 | +| 分红方案待定 | 13 | +| 传闻 | 14 | +| 证监会受理 | 15 | +| 传闻被否认 | 16 | +| 股东提议 | 17 | +| 保监会批复 | 18 | +| 董事会预案预披露 | 19 | +| 发审委通过 | 20 | +| 发审委未通过 | 21 | +| 股东大会未通过 | 22 | +| 银监会批准 | 23 | +| 证监会恢复审核 | 24 | +| 预发行 | 25 | +| 提交注册 | 26 | + +### 4.2 数据结构说明 + +#### 4.2.1 Level-1快照Snapshot + +| 数据类型 | 字段名称 | 说明 | +|---------|---------|------| +| str | code | 证券代码+市场 | +| datetime | trade_time | 交易所行情数据时间 | +| float | pre_close | 昨收价 | +| float | last | 最新价 | +| float | open | 开盘价 | +| float | high | 最高价 | +| float | low | 最低价 | +| float | close | 收盘价 | +| float | volume | 成交总量 | +| float | amount | 成交总金额 | +| float | num_trades | 成交笔数 | +| float | high_limited | 涨停价 | +| float | low_limited | 跌停价 | +| float | ask_price1-5 | 卖1-5档价格 | +| int | ask_volume1-5 | 卖1-5档量 | +| float | bid_price1-5 | 买1-5档价格 | +| int | bid_volume1-5 | 买1-5档量 | +| float | iopv | 净值估产(仅基金品种有效) | +| str | trading_phase_code | 交易阶段代码 | + +#### 4.2.2 ETF期权快照SnapshotOption + +| 数据类型 | 字段名称 | 说明 | +|---------|---------|------| +| str | code | 证券代码+市场 | +| datetime | trade_time | 交易所行情数据时间 | +| str | trading_phase_code | 交易阶段代码 | +| int | total_long_position | 总持仓量 | +| float | volume | 成交总量 | +| float | amount | 成交总金额 | +| float | pre_close | 昨收价 | +| float | pre_settle | 上次结算价 | +| float | auction_price | 动态参考价(仅上海有效) | +| int | auction_volume | 虚拟匹配数量(仅上海有效) | +| float | last | 最新价 | +| float | open | 开盘价 | +| float | high | 最高价 | +| float | low | 最低价 | +| float | close | 收盘价 | +| float | settle | 本次结算价 | +| float | high_limited | 涨停价 | +| float | low_limited | 跌停价 | +| float | ask_price1-5 | 卖1-5档价格 | +| int | ask_volume1-5 | 卖1-5档量 | +| float | bid_price1-5 | 买1-5档价格 | +| int | bid_volume1-5 | 买1-5档量 | +| str | contract_type | 合约类别 | +| int | expire_date | 到期日 | +| str | underlying_security_code | 标的代码 | +| float | exercise_price | 行权价 | + +#### 4.2.3 期货快照SnapshotFuture + +| 数据类型 | 字段名称 | 说明 | +|---------|---------|------| +| str | code | 证券代码+市场 | +| datetime | trade_time | 交易所行情数据时间 | +| str | action_day | 业务日期 | +| str | trading_day | 交易日期 | +| float | pre_close | 昨收价 | +| float | pre_settle | 上次结算价 | +| int | pre_open_interest | 昨持仓量 | +| int | open_interest | 持仓量 | +| float | last | 最新价 | +| float | open | 开盘价 | +| float | high | 最高价 | +| float | low | 最低价 | +| float | close | 收盘价 | +| float | volume | 成交总量 | +| float | amount | 成交总金额 | +| float | high_limited | 涨停价 | +| float | low_limited | 跌停价 | +| float | ask_price1-5 | 卖1-5档价格 | +| int | ask_volume1-5 | 卖1-5档量 | +| float | bid_price1-5 | 买1-5档价格 | +| int | bid_volume1-5 | 买1-5档量 | +| float | average_price | 当日均价 | +| float | settle | 本次结算价 | + +#### 4.2.4 指数快照SnapshotIndex + +| 数据类型 | 字段名称 | 说明 | +|---------|---------|------| +| str | code | 证券代码+市场 | +| datetime | trade_time | 交易所行情数据时间 | +| float | last | 最新价 | +| float | pre_close | 前收盘价 | +| float | open | 今开盘价 | +| float | high | 最高价 | +| float | low | 最低价 | +| float | close | 收盘价(仅上海有效) | +| int | volume | 成交总量 | +| float | amount | 成交总金额 | + +#### 4.2.5 港股通快照SnapshotHKT + +| 数据类型 | 字段名称 | 说明 | +|---------|---------|------| +| str | code | 证券代码+市场 | +| datetime | trade_time | 交易所行情数据时间 | +| float | pre_close | 昨收价 | +| float | last | 最新价 | +| float | high | 最高价 | +| float | low | 最低价 | +| float | volume | 成交总量 | +| float | amount | 成交总金额 | +| float | nominal_price | 暗盘价 | +| float | ref_price | 参考价 | +| float | bid_price_limit_up | 买盘上限价 | +| float | bid_price_limit_down | 买盘下限价 | +| float | offer_price_limit_up | 卖盘上限价 | +| float | offer_price_limit_down | 卖盘下限价 | +| float | high_limited | 冷静期价格上限 | +| float | low_limited | 冷静期价格下限 | +| float | ask_price1-5 | 卖1-5档价格 | +| int | ask_volume1-5 | 卖1-5档量 | +| float | bid_price1-5 | 买1-5档价格 | +| int | bid_volume1-5 | 买1-5档量 | +| str | trading_phase_code | 交易阶段代码 | + +#### 4.2.6 K线Kline + +| 数据类型 | 字段名称 | 说明 | +|---------|---------|------| +| str | code | 证券代码+市场 | +| datetime | kline_time | 交易所行情数据时间 | +| float | open | 今开盘价 | +| float | high | 最高价 | +| float | low | 最低价 | +| float | close | 收盘价 | +| int | volume | 成交总量 | +| float | amount | 成交总金额 | + +### 4.3 相关算法说明 + +#### 4.3.1 K线算法说明 + +**集合竞价的处理**: +对于分钟K线,开盘集合竞价数据的成交量包含在当日第一根K线,收盘集合竞价数据的成交量包含在当日最后一根K线。 + +**前推算法**: +9:30的1分钟K线,计算的是9:30:00.000~9:30:59.999期间的K线。9:35的5分钟K线,计算的是9:35:00.000~9:39:59.999期间的K线。 + +### 4.4 本地数据缓存方案说明 + +**应用场景**: +1. 接口取全量历史时间区间的数据:查询接口包含local_path和is_local两个参数,支持本地缓存方案,本地保存全量历史数据,且每次调用接口默认增量更新本地数据 +2. 接口取指定时间区间的数据:查询接口包含begin_date和end_date两个参数,仅从服务器获取数据,不本地缓存数据 + +**函数入参说明**: +- local_path和is_local为参数组1,begin_date和end_date为参数组2 +- 一个参数组内的参数必须同时使用 +- 两个参数组需独立使用 + +**本地存储文件说明**: +文件格式为hdf5格式 + +**本地存储空间说明**: +本地存储空间,不同的数据类型和标的范围,所需空间不同。建议本地存储空间在500GB以上。 + +--- + +## 5.免责声明 + +为了使客户更好地了解使用中国银河证券股份有限公司(以下简称"本公司")星耀数智服务平台(以下简称"本平台")的相关风险,根据相关法律、行政法规、部门规章、自律组织规则和监管规定,特提供风险揭示书,请客户务必详细阅读并充分理解以下风险: + +1. **数据准确性风险**:本公司使用外购或者自有的数据源作为基础数据进行数据加工、计算和分析,但并不能保证数据的及时性、准确性、真实性和完整性。 + +2. **网络传输风险**:由于计算机故障以及互联网数据传输等原因,数据传输可能会出现中断、停顿、延迟、数据错误等情况;因特网和移动通讯网络遭到黑客恶意攻击、您的网络终端设备及软件系统受到非法攻击或病毒感染、您的网络终端设备及软件系统与本平台不兼容、因电脑的故障或互联网故障引起的中断和错误等,都可能会造成数据传输故障,由此导致的损失由您自行承担。 + +3. **投资建议免责声明**:本平台所提供的信息数据等全部内容仅供参考,投资者须自行确认自己具备理解相关信息数据内容的专业能力,保持自身的独立判断,任何情况下本平台提供的内容不构成对投资者的投资建议,据此操作的一切风险和损失由投资者自行承担,本公司不对任何人因参考上述内容造成的直接或间接损失或与此有关的其他损失承担任何责任。 + +4. **账号安全责任**:您使用本平台过程中,凡使用您本人的用户名和密码,针对平台账号进行的操作均视为您亲自办理,由此所产生的一切后果由您承担。本公司提醒您加强账号、密码等信息的保护工作,不得出借他人使用,并建议您定期修改密码、增强密码强度、防止密码泄露、及时查询交易记录、防止用于网上交易的计算机或手机终端感染木马、病毒等。 + +5. **不可抗力风险**:由于地震、水灾、火灾等不可抗力因素或者无法控制和不可预测的系统故障、设备故障、通讯故障、电力故障、网络故障及其它因素,可能使本平台非正常运行甚至瘫痪,出现信息异常或信息传递异常等情况,由此产生的损失将由您承担。 + +6. **系统更新风险**:本公司可能不时更新或升级本平台,您应按照本公司的技术要求在规定的时间内配合做好更新或升级工作;因您未按本公司通知要求进行变更、升级的,由此发生的任何损失由您自行承担。 + +7. **服务终止风险**:如果本公司依据自身判断认为您违反本平台相关的国家法律法规、规范性文件,以及证券交易所、行业协会等自律组织的规则和要求,且不按法律法规或乙方要求及时纠正的,或影响本公司信息系统安全运行的,或监管机构、交易所、行业自律组织对本平台提出监管要求或相关业务规则发生变化,可能导致本平台的服务形式发生变化或本公司决定完全停止提供该项服务的,本公司有权立即停止您使用本平台,并且不承担任何责任,由此产生的任何损失由您承担。 + +8. **数据源局限性**:本公司在遵守国家相关法律、法规、规章及自律组织规则、监管政策前提下,尽力为客户提供高速、完整、准确的金融数据服务,但因受制于数据来源、技术能力等多种因素影响,本公司不保证数据源的及时性、准确性或者完整性,因数据源的遗漏、错误、丢失、延迟、中断而可能造成的损失将由您承担,本公司不承担任何责任。 + +9. **操作风险**:本平台的相关用户文档仅供您操作参考,如您对于本平台的使用不熟悉,可能因操作不当造成本平台出现非正常现象,上述风险可能导致发生的损失应由您自身承担,本公司不承担任何责任。 + +10. **信息更新责任**:您申请使用本平台前应如实填写相关信息和资料,使用过程中信息资料发生变更应及时告知本公司,因您未及时、准确、完整地提供或变更相关信息和资料,导致本公司不能及时、有效地为您提供服务,或导致本公司依据不准确、不完整的信息提供服务,由此可能造成的损失由您自行承担。 + +11. **权限管理**:对于客户未及时更新信息,或者不再符合本平台使用条件,或本平台权限期限到期,或存在重大风险隐患,公司认为不适合使用星耀数智服务平台时,公司可关闭客户的系统相关权限,由此导致的损失由您自行承担。 + +12. **知识产权保护**:本公司开发的本平台及本平台提供的相关数据知识产权归本公司所有。本公司为您开通本平台账号后,仅供您个人使用,如您把本平台提供的全部或部分资料和数据以任何形式转移、出售和公开给任何第三人,或因您未采取必要和合适的措施保护本平台提供的资料和数据的知识产权而造成数据资料信息泄露给任何第三人,本公司有权暂停或终止您使用本平台,由此导致的损失由您自行承担。 + +13. **风险认知**:本免责声明无法揭示您使用本平台及通过本平台从事投资交易的所有风险,故您在使用本平台之前,应全面了解相关法律法规及有关规定,对您自身的经济承受能力、风险承受能力、投资目标、风险控制能力等综合考虑,作出客观判断,对投资交易作仔细的研究。 + +--- + +**文档结束** + +*中国银河证券星耀数智量化平台*