åŒèšïŒäžºä»ä¹âäžä¹°âæ¯âä¹°ä»ä¹âæŽéèŠ åšè¡åžäžïŒåŸå€æ£æ·æèµè
åžžåžžé·å
¥äžç§æ æçå€å¥ïŒæ¯å€©åºå¯å¿é£å°ç ç©¶åºæ¬é¢ãæ»å®ç¯çïŒåŽäŸç¶åšâèž©é·âåäºæäžæ£æãå
¶å®ïŒäœäžºäžäžªåšåžåºæžç¬æ»æå€å¹Žççç¥åæåžïŒæå§ç»è®€äžºïŒæèµçç¬¬äžæ³åæ¯çåã åšå€æç亀æååŒäžïŒè¯å«å¹¶é¿åŒé£äºé«é£é©çâå¿
äºâæ çïŒå
¶éèŠæ§è¿è¶
å¯»æŸæè°çç¿»åé»é©¬ãåŠäŒåšè¯±æé¢åä¿æç©ºä»ïŒäžä»
æ¯äžç§å¢çïŒæŽæ¯ä¿æ€äœ èŸèŠé±çéåŸã 第äžç±»ïŒæ·±é·äžéééçâèªç±èœäœâ è¶å¿ç圢æç»éå¶ç¶ïŒå®æ¯åžåºäžå€éå çŽ äº§çå
±æ¯å¹¶åœ¢æåååçç»æãæåžžè¯ŽïŒè¶å¿äžæŠåœ¢æå°±äžå®¹ææ¹åïŒå°±åé«éäžè¡çå蜊ïŒè¯åŸå»æ¡äœå®åªäŒç²èº«ç¢éªšã å€å®æ åïŒ åŠæè¡ä»·é¿æ¶éŽè¿è¡åš **10 ****æ¥ã**20 æ¥åçº¿äžæ¹ïŒäžæ³¢åšçé«ç¹åäœç¹éœåšäžæäžç§»ïŒå匹ååºŠäžæ³¢æ¯äžæ³¢åŒ±ã 深床èŠç€ºïŒ æ£æ·æå®¹æäº§ççéè§æ¯âè·åŸå€å€äºïŒè¯¥å匹äºâãäœåšäžéè¶å¿äžïŒè¡ä»·äŒäžæååºæ°äœã äžäžå»ºè®®ïŒ å¿
é¡»çå°ææŸçâ起皳迹象âåºç°ââäŸåŠå线åŒå§èµ°å¹³å¹¶ç²åãå°é³çº¿æ¯äŸå¢å€ãåºéšèµ·çš³å¹³å°çæ£èµ°åºãåšæ€ä¹åïŒä»»äœæåºéœæ¯åšæ¥äžèœçé£åã âäžè·è¶å¿äžèšåºïŒäžæ¶šè¶å¿äžèšé¡¶ãåšè¶å¿é¢åïŒäžèŠçšäž»è§èæææåžåºè§åŸãâ 第äºç±»ïŒè¶å¿ç ŽäœïŒå°€å
¶æ¯âäž»è·äžæµªâ è¶å¿äžæŠç ŽäœïŒæå³çåæçæ¯æé»èŸåœ»åºçŠè§£ãåšææ¯æŽŸçŒäžïŒæèŽåœçé·é±å°±æ¯âäž»è·äžæµªâçåŒå¯ã ææ¯é»èŸïŒ åšäžäžªæ åçäžè·åºåäžïŒç»åäºäžæµªåè·åäºæµªåŸ®åŒ±å匹åïŒåœç¬¬äžæµªæ£åŒç Žäœäžè¡æ¶ïŒææ¯æäŒ€åææäººçé¶æ®µã é£é©èŠåïŒ äž»è·äžæµªéåžžè·å¹
æå€§ãé床æå¿«ïŒä¹æ¯å€§éšåæ£æ·èŽŠæ·è¢«è
°æ©çè³æž
é¶çåºåãåŠæäžæµªæ£åšéäžæåååŒå¯ïŒåè®°ïŒç»äžå¯å
¥åºæ¡äŸ¿å®ã 第äžç±»ïŒæ¯«æ æ³¢åšçâå¿çµåŸâåµå°žè¡ æäºè¡ç¥šçåæ¶èµ°å¿é垞诡åŒïŒå
šå€©å 乿²¡æèµ·äŒïŒçèµ·æ¥å°±åäžæ¡å¹³çŽçâå¿çµåŸâã ç¹åŸè¯å«ïŒ åæ¶åŸæ³¢åšæåŸ®ïŒæ¢æçåžžå¹Žåš 0.5% å·Šå³ã 深床åæïŒ è¿ç§èµ°å¿éåžžåºç°åšâå倧è¡âè¿ç§è¶
倧çè¡äžïŒè¿å°å±æ£åžžïŒäœåŠæäžäžªå°çè¡èµ°åºè¿ç§âå¿çµåŸâïŒè¯Žæè¯¥è¡å·²åœ»åºè¢«åžåºæåŒã èŽåœäŒ€ïŒ è¿ç±»è¡æ²¡æéè¡å·®ä»·ïŒäœ è¿å»å¯èœè¿æç»è޹éœèµäžåæ¥ãæŽå¯æçæ¯å®æ¶èäºäœ çæ¶éŽææ¬ââåšè¡åžäžïŒèµéçåšèœ¬çå°±æ¯çåœïŒè¢«åµå°žè¡éæ»èµäº§æ¯æå€§çèµæºæµªè޹ã 第åç±»ïŒå€§è¡äžåæçâæ¥çé·é±â 倧è¡äžå
¬ååæïŒæ¯å
¬åžå
éšäººå¯¹èªå®¶è¡ç¥šä»·åŒçåçžâæäœç¥šâã å¿çååŒïŒ åæçåå£å¯ä»¥æåçŸç§ïŒäœåšäœåªæäžäžªïŒçéçœé¶çååºçŠ»åºã 倧è¡äžçŠ»åºæå³ç倧ç¬ç¹ç å°çŽæ¥ç žåäºçº§åžåºïŒåŠææ²¡æçžåºé级ç倧èµéæ¥çïŒæ£æ·é£ç¹èµééæ ¹æ¬æ¡äžäœæåã æ žå¿ååïŒ å€§è¡äžåæäŒäž¥éæå»åžåºä¿¡å¿ãè®°äœïŒäœäžºæèµè
ïŒäžèŠå¬ä»ä»¬åŽäžè¯ŽåŸå€ä¹å åå çïŒèŠçä»ä»¬å®é
æ¯æä¹æäœèµéçã å«å»åé£äžªæ¿æ¥æççâæ¥çäŸ âã 第äºç±»ïŒå©å¥œå
ç°åçâè§å
æ»â æ£æ·æç±è¿œå©å¥œïŒèäž»åæç±åå©å¥œåºèާã é»èŸæè§£ïŒ åžåºçäœçæ¯â颿âãåœå©å¥œè¿åšé¢æé¶æ®µæ¶ïŒè¡ä»·åŸåŸå·²ç»æåæåå°ç®æ äœã çç¥å¯åïŒ âåœäžäžªå©å¥œå·²ç»æ¯å
šäžçéœç¥éçç§å¯æ¶ïŒå®è¿æä»·åŒåïŒâ åœå©å¥œçæ£èœå°ä¹æ¥ïŒåŸåŸå°±æ¯äž»åèµéå©çšç床掟åç¹ç ãåæèº«é乿¶ãè¿ç±»è¡ç¥šåšæ¶æ¯å
¬åžç¬éŽïŒåŸåŸå°±æ¯è¡ä»·çé¶æ®µæ§é¡¶å³°ã 第å
ç±»ïŒè¡äžäººæ°æ¿å¢çâç¹ç æ£ä¹±â 䞪è¡çè¡æ¬æ¯åºå®çïŒè¡äžäººæ°çååæ¬èŽšäžåæ äºç¹ç çæµåïŒæ¯ä»åºå®¶æäžæµåæ£æ·ïŒè¿æ¯åä¹ã ç¹ç åé
é»èŸïŒ è¡äžäººæ°çªç¶å€§å¹
å¢å ïŒè¯Žæäž»åå·²ç»æåææäžç倧é¢ç¹ç ïŒææ£å¹¶æŽŸåç»äºæ æ°çå°æ£æ·ã âç¹ç ç¶æïŒé«åºŠéäž è¡äžäººæ°ïŒè¡äžäººæ°å°ïŒå€äžºâ区åæâææ åžåºè¡šç°ïŒæ§ç床é«ïŒæåœ¢æååïŒèœèµ°åºç¬ç«è¡æ
âç¹ç ç¶æïŒæç«¯åæ£ è¡äžäººæ°ïŒè¡äžäººæ°æ¿å¢ïŒå€äžºâåŒ±å¿æâææ åžåºè¡šç°ïŒäººå¿äžéœïŒæåæ¶æåå·šå€§ïŒæéŸåœ¢æåå ç»è®ºïŒ ç¹ç è¶åæ£ç祚ïŒè¶éŸäº§çäžæ¶šå
±æ¯ïŒä¹å°±è¶æ²¡æåäžä»·åŒã 第äžç±»ïŒæ äžç»©ãæ 颿çâäžæ è¡ç¥šâ åšè¡åžèµé±éåžžåªæäž€æ¡è·¯ïŒèŠä¹èµå
¬åžæé¿çé±ïŒäžç»©ïŒïŒèŠä¹èµæªæ¥æ¿æ¯çé±ïŒé¢æïŒã æµåšæ§é·é±ïŒ åŠæäžå®¶å
¬åžæ¢æ²¡äžç»©æ¯æïŒå讲äžåºé¢ææ
äºïŒè¿å°±æ¯å
žåçâäžæ è¡ç¥šâã ç»å±é¢æµïŒ 没æäžç»©ïŒéæ¶é¢äžŽéåžé£é©ïŒæ²¡æé¢æïŒäž»åæ ¹æ¬äžäŒè±å€§ä»·é±å»æšåè¡ä»·ãå³äœ¿äž»å硬æïŒç±äºçŒºä¹æ
äºåžåŒæ£æ·âæ¥èާâïŒæç»ç¹ç è¿æ¯äŒç žåšäž»åèªå·±æéã æä»¥ïŒè¿ç±»è¡æ¢æ¿äžäœïŒä¹æ²¡çŒå€Žã ç»è¯ïŒæå»ºäœ ç亀æé²çº¿ äœäžºäžåçç¥åžïŒææåæ³éç»å€§å®¶äžå¥è¯ïŒåšè¡åžäžïŒåŠäŒâå¿èâåâå
å¶âè¿æ¯åŠäŒâè¿æ»âæŽéŸãé¿åŒè¿ 7 ç§âå°é·âè¡ïŒæ¯æå»ºæç亀æäœç³»çåºç³ã 空ä»è§æå¹¶äžå¯è»ïŒç²ç®å
¥åºææ¯å¯¹æ¬éçäžèŽèŽ£ãåªæå
å®äœé²çº¿ïŒäœ æææºäŒåšæªæ¥ççåžäžååšåæ»ã ä¹åæå享è¿äžäžªå°å·¥å
·çœç«ïŒæ¯æåœå
äž»æµéåå¹³å°ïŒå¯ä»¥è®© AI çŽæ¥åž®äœ åå䞪平å°ççç¥ä»£ç ïŒçŽæ¥çæå¯è¿è¡ççç¥ä»£ç ïŒä»£ç 莚éè¿é«äºçŽæ¥äœ¿çš DeepSeekãTrae çå¹³å°ãäžçº¿ä¹åè·åŸäºéåžžå€æåç奜è¯ã 倧家å¯ä»¥çŽæ¥çšæè¿°çç¥ïŒç¶åäžé®çæå¯è¿è¡ç宿Žçç¥ä»£ç ïŒä¹å¯ä»¥æå®åœåäžäžªAPI æ¥è¯¢å·¥å
·ã AIå·¥å
·å¹³å°ïŒhttps://easyquant.ai æçå¹³å°å·²ç»æ¯æSuperMindçææ°çæ¬äºïŒå¹¶äžè¯äžæ¥ææåŸäžé å€çæèާL2éç¬è®¢åç°¿æ°æ®ïŒå°åºèœæ¿æ¥å¹²å åå 倩æŽç硬çïŒåç°å»å¹Žåå€çåæ²¹ç线çç¥æ¶æäžæ¥çäžå csvïŒå
å猩å
å°±3䞪å€Gãåœæ¶äžºäºæŸçšåŸ®é è°±ç¹çéç¬æ°æ®ïŒæå·®äžå€æåžé¢äžèœè¯çæž ééœèž©äºäžéåïŒå¥œå€èŠä¹çŒºå段ïŒèŠä¹çŽæ¥ç»äœ åå¹¶è¿çå¿«ç
§ïŒæ ¹æ¬æ²¡æ³çšã忥æ»ç®æŸå°äžäžªèœçŽæ¥äžåå§è®¢åç°¿çå°æ¹ïŒæ°æ®å段è¿ç®å®æŽïŒå°±é¡ºææåžžçšçå 䞪åç§éœæäžæ¥äºã ç°åšå®é£äžªé¡µé¢ææ°æ®åäºå äžªå€§ç±»ïŒæçŽæ¥è¯ŽæåªäºïŒçåŸäœ äžäžªäžªç¹è¿å»ç¿»ã éç¬è®¢åèæ°æ®ïŒL2ïŒ è¿äžªæ¯ææåžžçšçïŒä¹æ¯åé«é¢ç±»çç¥åæµç»äžåŒçäžè¥¿ãå®ç»çæ¯æ¯äžªäº€ææ¥äžäžªcsvæä»¶ïŒéé¢è®°åœçæ¯å
šåžåºè®¢åç°¿çæ¯æ¬¡ååšïŒäžæ¯é£ç§åºå®æ¶éŽéŽéçå¿«ç
§ïŒæ¯ççéç¬æšéã æåŒäžäžªæä»¶å€§æŠé¿è¿æ ·ïŒå段æçŽæ¥ååºæ¥æ¯èŸçŽè§ïŒ åæ®µå å€§æŠææ Timestamp æ¶éŽæ³ïŒç²Ÿç¡®å°æ¯«ç§ Symbol å纊代ç ïŒæ¯åŠCLãES Side è®¢åæ¹åïŒAsk/Bid Price æ¥ä»·ä»·æ Œ Size æåé OrderID 订åçŒå·ïŒåäžç¬å¢å æ¹èœå¯¹äž UpdateAction æ°å¢ãä¿®æ¹ãå é€ Sequence æ¶æ¯åºåå·ïŒç𿥿éåº è¿ç©æå¿æå®çšçå°æ¹åšäºïŒäœ å¯ä»¥èªå·±è¿ååºä»»ææ¶å»çç壿·±åºŠïŒèäžæ¯åªæ¿å°äºæ¡£æè
åæ¡£ãæè¯è¿æ¿å®åæµäžäžªå°åååçç¥ïŒåç°åŠæåªçšåžžè§çtickå¿«ç
§ïŒéé¢åŸå€æ¡£äœæ¶å€±æ ¹æ¬ææäžå°ïŒåæµç»æåå®çå·®åŸçŠ»è°±ã忥æéç¬è¿åäºïŒææŸåºé®é¢åšåªã åŠå€ïŒå®åäžäžªé¡µé¢è¿æäŸåé级å«è¡æ
äžèœœïŒè¿äžªå°±ç®åå€äºïŒå°±æ¯æ åçOHLCVïŒé¢çæ1åéã5åéã15åéã1å°æ¶ãæ¥çº¿ïŒåæ®µåºæ¬å°±æ¯ïŒ åæ®µ 诎æ Timestamp åéçº¿èµ·ç¹æ¶éŽ Open åŒçä»· High æé«ä»· Low æäœä»· Close æ¶çä»· Volume æäº€é OpenInterest æä»éïŒè¿äžªåŸå€å
èŽ¹æºæ²¡æ åé线éåå忥çéæè
è·äžäºå¯¹ç®åèŠæ±äžé«çè¶å¿æš¡åïŒæäžè¬å
æ¿åé线è¿äžéæ¡ä»¶ïŒè§åŸææäºååå°è®¢åç°¿æ°æ®éç»çã äžéŽæäžå¥ïŒæåœæ¶å«äžèœœcsv忬å°è§£æå€ªéº»çŠïŒæ¬æ¥æç®èªå·±å䞪äžèœœèæ¬ïŒåæ¥åç°ä»ä»¬æäžª CMESéèæ°æ®åº çæ¥å£ïŒå¯ä»¥çŽæ¥pipè£
ïŒçäºäžå°äºãå®è£
å°±äžè¡ïŒ pip install cmesdata ç¶åè°çšçæ¶åïŒè®°åŸæå纊代ç åæ¶éŽèåŽå¡«å¯¹ïŒæèŽŽäžäžæçšç瀺äŸïŒ from cmesdata import HistoryData # CMESéèæ°æ®åºçè¡æ
æ¥å£ïŒæ³šæå
¥åæ£ç¡®ïŒè°çšé¢çæ£åžž # åå§åæ°æ®æºïŒtokenå»å®çœäžªäººäžå¿æ¿ hd = HistoryData(token="your_token_here") # æåCLå纊æå€©çéç¬è®¢åç°¿ df = hd.get_tick_orderbook(symbol="CL", trade_date="2024-05-20") print(df.head()) 泚ééæéçé£å¥âè°çšé¢çæ£åžžâæ¯ççèŠæ³šæïŒæä¹ååŸçäºåŒäºå€çº¿çšå¹¶åïŒæ²¡å äžå°±è¢«éæµäºïŒèèå®å®åçº¿çšæé¡ºåºæåèåŸå¿«ã è¯Žåæ°æ®æ¬èº«ïŒæè§åŸè¿äžªæºç订åç°¿æäžªå¥œå€æ¯å®æ²¡è¿æ»€æé£äºæå°åïŒæäºæ°æ®åäŒæå°äºäžå®éåŒçæåçŽæ¥å»æïŒçèµ·æ¥å¹²åïŒäœå®é
çå£äžçâå°å±âå¯èœå°±çäžå°äºãé£äžªSequenceåæ®µä¹æºå
³é®ïŒæäžæ¬¡ææ¬å°è·åæµåç°æå床çªç¶æäºåŸå€ïŒæ¥äºåå€©å°±æ¯æäžå°æ®µæ¶æ¯é¡ºåºä¹±äºïŒé è¿äžªåæ®µéæ°æäºåºææ¢å€æ£åžžã åéçº¿æ°æ®éïŒæä»éè¿äžªå段æç»åžžæ¿æ¥çåç§ïŒåå€©ç¶æ°ãéè¿ç±»åç§ïŒæä»éååå€§çæ¶åè·çæŸéïŒè¿æ¶åæè®¢åç°¿çç»èç¹å«æææïŒèœçå°äžäºå€§åæ¯æä¹æåŒæ¥æçã æåæéäžäžïŒè¿äºæ°æ®äžèœœäžæ¥éœæ¯csvæ ŒåŒïŒååç§æ®éäº€ææ¥å€§æŠå çŸMBïŒåé¿åšæåæµçè¯ç¡¬çåŸçå€ç©ºéŽãåŠå€è¿ç±»æ°æ®åªéååç ç©¶åçç¥åŒåïŒäžèŠåœææèµå»ºè®®ïŒèªå·±çšçç©å¯ä»¥ïŒå«æ¿åºå»ä¹±è¯Žã 倧æŠå°±è¿äºïŒåæ£æ°æ®æ¬èº«æ¯ç°æçïŒæéèŠçŽæ¥å»ç¿»äžäžïŒæ¯æä¹åå°å€æ±äººåçœçéŸæ¥åŒºå€äºã äžå¥è¯åçïŒ åä»»äœéè¡ãåæµãç¯çä¹åïŒäœ éœéèŠäžä»œ"å
šåžåºæ çæž
å"ãçš AlphaFeed ç**æ çæ± ïŒuniverseïŒ**äžæ¬¡å°±èœæ¿åå
šéš A è¡ïŒå®æµçºŠ 5556 åªïŒæå
šéš ETFïŒçºŠ 1572 åªïŒç代ç äžå®æ¶å¿«ç
§ïŒåé
å instruments è¡¥éœäžåžæ¥æãè¡æ¬ãæ¶šè·åä»·çåºç¡ä¿¡æ¯ïŒå è¡ä»£ç çæå¯çŽæ¥å
¥åºçæž
åã 䞺ä»ä¹äŒæè¿äžªé®é¢ æ°æåžžå¡åšç¬¬äžæ¥ïŒ"æè¿å
š A æåªäºä»£ç éœäžç¥éïŒæä¹æ¹éåæ°ïŒ"æå·¥ç»Žæ€ä»£ç 衚æ¢å®¹ææŒïŒæ°è¡/éåžïŒãåäžåžŠåºç¡ä¿¡æ¯ãçæ³æ¹æ¡æ¯ä»æ°æ®æºçŽæ¥æå
šåžåºæ± âïŒä»£ç ãåç§°ãäžåžæ¥æäžæ¥å°äœïŒäžéåžåºèªåšæŽæ°ã åæ¥éª€è§£å³ ç¬¬ 1 æ¥ïŒäžæ¬¡ååå
šéš A è¡ä»£ç + 宿¶å¿«ç
§ from alphafeed import AlphaFeed import pandas as pd af = AlphaFeed() # 读å ALPHAFEED_API_KEY q = af.quotes.get(universes="CN_Stock", to_dataframe=True) print("å
š A æ°é:", len(q)) # 宿µçºŠ 5556 codes = q["symbol"].tolist() print(codes[:5]) # ['301069.SZ', '002666.SZ', ...] quotes çæ çæ± äžä»
ç»ä»£ç ïŒè¿åžŠåœåè¡æ
äžåžžçšåæ®µïŒ åæ®µ å«ä¹ 诎æ symbol æ å代ç åŠ600519.SHïŒäº€ææåçŒïŒ ext.name è¯åžç®ç§° åŠè޵å·è
å° last_price ææ°ä»· 宿¶å¿«ç
§ ext.change_pct æ¶šè·å¹
ïŒå°æ°ïŒ 0.03 = 3% ext.turnover_rate æ¢æçïŒå°æ°ïŒ â ext.type åç§ç±»å å
š A 䞺cn_equity 第 2 æ¥ïŒæ¢æ ETF æž
å æ universes æ¢æ CN_ETF å³å¯æ¿å°å
šéš ETFïŒ etf = af.quotes.get(universes="CN_ETF", to_dataframe=True) print("å
š A ETF æ°é:", len(etf)) # 宿µçºŠ 1572 æ¯æçæ± ååŒïŒæ¬æå®æµå¯çšè
è§å€æ³šïŒïŒ universe å«ä¹ 倿³š CN_Stock å
šéš A è¡ â
宿µçºŠ 5556 åª CN_ETF å
šéšæ²ªæ·± ETF â
宿µçºŠ 1572 åª æž¯è¡/çŸè¡å
šåžåºæ± ãææ°æ± ç屿Žé«æéïŒè¥è¿å PermissionError: Access mode 'universe' not available 诎æåœåå¥é€æªåŒéïŒå¯æå䞪代ç çš instruments.get ååºç¡ä¿¡æ¯ïŒæå级å¥é€ã 第 3 æ¥ïŒè¡¥éœäžåžæ¥æãè¡æ¬ãæ¶šè·åä»· quotes ç»çæ¯è¡æ
ïŒéæåºç¡ä¿¡æ¯ïŒäžåžæ¥æãè¡æ¬ãæ¯ç¬æå°ååšãåœæ¥æ¶šè·åä»·ïŒçš instruments.batchïŒ insts = af.instruments.batch(codes[:200]) # è¿å list[dict]ïŒæ¯ææ¹é rows = [{ "symbol": i["symbol"], "name": i["name"], "exchange": i["exchange"], # SH / SZ / BJ "type": i["type"], # stock / etf ... "listing_date": i["ext"].get("listing_date"), "total_shares": i["ext"].get("total_shares"), "float_shares": i["ext"].get("float_shares"), "limit_up": i["ext"].get("limit_up"), "limit_down": i["ext"].get("limit_down"), "tick_size": i["ext"].get("tick_size"), } for i in insts] info = pd.DataFrame(rows) print(info.head(3).to_string(index=False)) instruments è¿åçæ¯æ¡è®°åœåæ®µïŒ åæ®µ å«ä¹ symbol / code æ å代ç / 纯æ°å代ç name è¯åžç®ç§° exchange 亀ææïŒSH/SZ/BJïŒ type åç§ç±»åïŒstock/etf çïŒ ext.listing_date äžåžæ¥æ ext.total_shares / float_shares æ»è¡æ¬ / æµéè¡æ¬ ext.limit_up / limit_down åœæ¥æ¶š/è·åä»· ext.tick_size æå°ä»·æ Œååšåäœ ç¬¬ 4 æ¥ïŒåå¹¶å¹¶èœåºäžºäžä»œè¡ç¥šæž
å insts_all = af.instruments.batch(codes) # å
šéåºç¡ä¿¡æ¯ïŒçºŠ 5556ïŒ base = pd.DataFrame([{ "symbol": i["symbol"], "name": i["name"], "exchange": i["exchange"], "type": i["type"], "listing_date": i["ext"].get("listing_date"), "total_shares": i["ext"].get("total_shares"), "float_shares": i["ext"].get("float_shares"), } for i in insts_all]) base.to_csv("a_share_list.csv", index=False) print("å·²ä¿åæž
å:", base.shape) instruments.batch å
çœ®åæ¹äžå¹¶åïŒbatch_size/max_workersïŒïŒå
šåžåºäžæ¬¡ååå³å¯ã å
³é®åäžæ³šæäºé¡¹ ext.* æ¶šè·å¹
/æ¢æçæ¯å°æ°ïŒ0.05 衚瀺 5%ïŒå«åœæçŸåæ°ã è¡æ¬åäœæ¯"è¡"ïŒåžåŒ = last_price à total_sharesïŒææµéåžåŒçš float_sharesïŒã æ çæ± é»è®€åªå«åšåžæ çïŒéåžè¡äžåšæ± äžïŒååå²åæµèŠé¿å
幞åè
åå·®éåŠè¡ä¿çéåžåºåã æž¯è¡/çŸè¡/ææ°å
šåžåºæ± éæŽé«æéïŒåœåå¥é€äžæ¯æäŒæ PermissionErrorïŒå¯æ¹çšåæ ç instruments.getã quotes æ¯å®æ¶å¿«ç
§ïŒä»£ç æž
åçžå¯¹çš³å®ïŒäœä»·æ Œå段æ¯åœååŒïŒååå²æšªæªé¢å«çšä»å€©çå¿«ç
§ã åžžè§é®é¢ïŒFAQïŒ QïŒæä¹åªèŠæ²ªåž / æ·±åž / å亀æïŒ AïŒæ¿å°æž
ååæ exchangeïŒSH/SZ/BJïŒæä»£ç åçŒè¿æ»€å³å¯ã QïŒèœæ¿å°äžåžæ¥æå次æ°è¡çéåïŒ AïŒå¯ä»¥ïŒçš instruments ç ext.listing_dateïŒææ¥æè¿æ»€å³å¯ã QïŒETF åè¡ç¥šèœäžèµ·ååïŒ AïŒåå«çš CN_Stock å CN_ETF äž€äžªæ± ååå concat åå¹¶ã QïŒéèŠä»è޹åïŒ AïŒå
šåžåºæ± ïŒuniversesïŒé Starter å以äžïŒåæ ç instruments.get/quotes æå
莹é¢åºŠã诊è§å®ä»·é¡µã å°ç» è·åå
šåžåºä»£ç æž
忝éåç¬¬äžæ¥ãçš AlphaFeed ç CN_Stock/CN_ETF æ çæ± äžæ¬¡æ¿å
šä»£ç äžå¿«ç
§ïŒåçš instruments.batch è¡¥éœäžåžæ¥æãè¡æ¬ãæ¶šè·åçåºç¡ä¿¡æ¯ïŒå è¡ä»£ç å°±èœçæå¯å
¥åºãéåžåºæŽæ°çè¡ç¥šæž
åã åè AlphaFeed Python SDK ææ¡£ïŒhttps://docs.alphafeed.org/zh-Hans/sdk/python-quickstart æ¬æè®°åœäžå¥é¢å䞪人éåç ç©¶åºæ¯ççŸè¡å®æ¶æ°æ®è·åæ¹æ¡ãè¯¥æ¹æ¡ä»¥äœææ¬ãæéæäžºç®æ ïŒéçšäºéèŠå®æ¶è¡æ
äžåéKçº¿æ°æ®ççç¥åŒåè
äžç ç©¶è
ãç»è¿è¿äž€åšçéåäžæµè¯ïŒè¯¥æ¹æ¡å·²çš³å®è¿è¡äžäžªæïŒèœå€æ»¡è¶³å€æ°éé«é¢çç¥çæ°æ®éæ±ã ç ç©¶çç¹äžæ°æ®éæ±åæ åšæå»ºçŸè¡çæ§æåæµç³»ç»æ¶ïŒæ°æ®æ¥å
¥ç¯èéåžžé¢äžŽäž€äžªçªåºé®é¢ïŒ äžäžæ°æ®ç»ç«¯è®¢é
莹çšé«æïŒäžªäººç ç©¶è
éŸä»¥æ¿åã 宿¶æ°æ®äžåå²Kçº¿æ°æ®åŸåŸéèŠäžåçè·åæ¹åŒïŒåäžæ¥å£éŸä»¥å
Œé¡Ÿå»¶è¿äžæ¹éæ¥è¯¢æçã é对äžè¿°é®é¢ïŒæ¬ææåºäžç§ç»ååŒæ°æ®è·åæ¶æïŒæ žå¿åšäºæ ¹æ®æ°æ®äœ¿çšåºæ¯éæ©äžåçéä¿¡åè®®ã ææ¯è·¯åŸå¯¹æ¯ïŒWebSocketäžRESTçéçšèŸ¹ç 绎床 WebSocket REST éçšåºæ¯ çäžå®æ¶è¡æ
çæ§ãéç¬æšé åå²K线åè¡¥ãæ¹éæ¥è¯¢ å»¶è¿æ°Žå¹³ 毫ç§çº§ åå³äºèœ®è¯¢é¢ç è¿æ¥æ¹åŒ é¿è¿æ¥ïŒé绎æ€ç¶æ æ ç¶æïŒæ¯æ¬¡è¯·æ±ç¬ç«å»ºç« èµæºæ¶è 客æ·ç«¯éå€çå¿è·³äžéè¿ ç®åçŽæ¥ïŒäœé«é¢èœ®è¯¢å¢å åŒé å
žåçšäŸ å°æ°æ ççé«é¢æŽæ° 倿 çå岿°æ®äžæ¬¡æ§æå ä»è¡šäžå¯ç¥ïŒå®æ¶è¡æ
éåéçšWebSocketïŒåå²K线éåéçšRESTïŒäºè
ç»åå¯åšææ¬äžæ§èœä¹éŽååŸå¹³è¡¡ã å®ç°ç€ºäŸäžéæè¯Žæ äžé¢ç»åºäžäžªåºäºPythonçWebSocket订é
瀺äŸïŒçšäºè·åçŸè¡AAPLç宿¶æ¥ä»·ã瀺äŸäžäœ¿çšçæ¥å£èŠççŸè¡ã枯è¡å倿±çå€äžªåç§ïŒäŸ¿äºåç»æ©å±ã该æ¥å£ç泚åäžå¯é¥è·åæµçšèŸäžºç®äŸ¿ïŒéåå¿«ééªè¯ã python import websocket import json def on_message(ws, message): data = json.loads(message) print("æ¶å°è¡æ
:", data) def on_open(ws): sub_msg = { "cmd_id": 22002, "seq_id": 1, "trace": "sub-us-stock", "data": { "symbol_list": [{"code": "AAPL.US"}] } } ws.send(json.dumps(sub_msg)) ws = websocket.WebSocketApp( "wss://quote.alltick.co/quote-stock-b-ws-api", on_open=on_open, on_message=on_message ) ws.run_forever() äžè¿°ä»£ç è¿è¡åïŒç»ç«¯å°æç»æ¥æ¶AAPLç宿¶æ¥ä»·ïŒå»¶è¿å€äºæ¯«ç§é级ïŒå¯äœäžºäžªäººçæ§é¢æ¿æçç¥ä¿¡å·èŸå
¥çåºç¡æ°æ®æºã åéKçº¿æ°æ®åè¡¥çç¥ åéKçº¿æ°æ®ç宿޿§çŽæ¥åœ±ååæµç»æçåç¡®æ§ãæ¬æ¹æ¡éçšä»¥äžæµçšïŒ çç¥å¯åšæ¶ïŒéè¿RESTæ¥å£æ¹éæåæè¿æ°æ¥çåéK线ã å°æåçæ°æ®åå
¥æ¬å°ååšïŒæå»ºåå§K线åºåã åç»æ°åœ¢æçK线ç±WebSocket宿¶æšéæŽæ°ïŒè¿œå è³æ¬å°åºåæ«å°Ÿã 讟眮èªåšéè¿æºå¶ïŒé²æ¢å çœç»æ³¢åšå¯ŒèŽæ°æ®äžæã 该æµçšé¿å
äºå¯åšåæK线åŸåºç°ç©ºçœåºéŽçé®é¢ïŒç¡®ä¿æ°æ®è¿ç»æ§ã å®é
è¿è¡ææäžå¯é æ§ è¯¥æ¹æ¡å·²æç»è¿è¡çºŠäžäžªæïŒæå¡åšæ»ææ¬æ§å¶åšäººæ°åžäžåå
以å
ãè¿è¡æéŽåºç°çäž»èŠé®é¢æ¯WebSocketå¶åæçº¿ïŒéè¿å®¢æ·ç«¯èªåšéè¿é»èŸå·²ææè§£å³ã对äºåžæä»¥èŸäœææ¬è·åçŸè¡å®æ¶apiæ°æ®çç ç©¶è
ïŒäžè¿°ç»åæ¶ææäŸäºäžæ¡å¯èœå°çææ¯è·¯åŸãå»ºè®®æ ¹æ®èªèº«çç¥å¯¹æ°æ®é¢çåæ çæ°éçå®é
éæ±ïŒè°æŽè®¢é
å衚äžååšçç¥ã ð æèŠ / å¿«éè§£ç (Direct Answer) åŸå€è¡æ°ä»¥äžºâä¹° 10 åªè¡ç¥šâå°±æ¯åæ£é£é©ïŒå
¶å®å®å
šå¯èœåºç° 10 åªè¡ç¥šéœæŒåšåäžè¡äžçæ
åµãå A è¡éåæ¶ïŒæå»ºè®®å
çš QuantDash æ¹éè·åæä»è¡æ
ïŒåéè¿ Pandas 计ç®è¡ç¥šåžåŒãè¡äžæéå HHI éäžåºŠïŒå åéå°±èœæç»åçè¡äžé£é©æŽé²ç®åºæ¥ã äžã䞺ä»ä¹äŒ ç»æ¹åŒåéè¡çç¥è¿ä¹çŽ¯ïŒ æè§è¿äžå°ååŒå§ç© Python éåçæåïŒç¬¬äžä»¶äºå°±æ¯ç ç©¶ïŒ MACD æä¹ç®ïŒ KDJ æä¹ç®ïŒ å线éåæä¹åïŒ è¿äºåœç¶éèŠã äœæåè建议倧家å
æäžäžªæŽåºç¡çé®é¢è§£å³ïŒ äœ çç»åå°åºåæ£æ²¡ïŒ 䞟䞪æç®åçäŸåã 莊æ·éæïŒ 莵å·è
å° äºç²®æ¶² 泞å·èçª å±±è¥¿æ±Ÿé
å€äºèŽ¡é
æåäžçïŒ âäžéåïŒ5 åªè¡ç¥šãâ äœæäžçïŒ âèå¥ïŒäœ è¿æ¯ 5 åªè¡ç¥šïŒè¿æ¯äžäžªè¡äžç 5 䞪马ç²ïŒâ è¿å°±æ¯è¡äžéäžåºŠé£é©ã çæ£çç»åé£é©ïŒäžåºè¯¥åªæç
§âè¡ç¥šæ°éâ计ç®ã åºè¯¥è¿äžæ¥ææïŒ è¡ç¥š â è¡äž â è¡äžæé â ç»åéäžåºŠã 䞺ä»ä¹åŸå€äººçéåä»£ç æåéœå¡åšæ°æ®äžïŒ å 䞺ç论éåžžç®åïŒå®é
æ°æ®åŽåŸæè
Ÿã 以åæä¹è¢«è¿äºäºæ
æç£šè¿ïŒ Tushare æäºæ°æ®éèŠç§¯ååæéïŒ AkShare æäºæ¥å£å¶å°äžçš³å®ïŒ èªå·±ç¬æ°æ®å®¹æéå°æ¥å£ååïŒ A è¡ä»£ç æ ŒåŒå®¹ææ··ïŒ å岿°æ®éèŠå€æïŒ å€è¡ç¥šåŸªç¯è¯·æ±é床æ
¢ïŒ æåè¿èŠææ°æ®èœ¬æ¢æ Pandasã ç»æå°±æ¯ïŒ çç¥ä»£ç 30 è¡ïŒæ°æ®æž
æŽä»£ç 300 è¡ã è¿å°±æç¹æ¬æ«å眮äºã QuantDash 宿¹ Python SDK çæè·¯æ¯èŸçŽæ¥ïŒ pip install quantdash ç¶åïŒ from quantdash import QuantDash qd = QuantDash() API Key å¯ä»¥éè¿ QUANTDASH_API_KEY ç¯å¢åéæäŸïŒå®æ¹ GitHub 瀺äŸä¹æç¡®å»ºè®®äžèŠæçå® API Key åè¿ä»£ç æè
æäº€å° Gitã äºãè§£å³æ¹æ¡å¯¹æ¯ïŒQuantDash vs äŒ ç»æ°æ®æº 对æ¯ç»ŽåºŠ äŒ ç»/ç«åæ¹æ¡ïŒåŠ Tushare/AkShare/æåšç¬è«ïŒ QuantDash è§£å³æ¹æ¡ æ°æ®çš³å®æ§ éèŠèªè¡å€çæ¥å£åŒåžžåæ°æ®æž
æŽ é¢åéåç ç©¶çæ°æ® API 䜿çšéšæ§ å¯èœæ¶å积åãæéæé¢å€æž
æŽ pip install quantdash è·šåžåºæ¯æ åå¹³å°ä»£ç äœç³»ååšå·®åŒ .SH/.SZ/.BJ/.US/.HKç»äžä»£ç æ°æ®æ ŒåŒ éèŠèªè¡èœ¬æ¢ åç Pandas DataFrame æ¹éè¡ç¥š éåžžéèŠèªè¡ç»ç»è¯·æ± klines.batch() 倿 å¯èœèªè¡è®¡ç® API æ¯æå€ç§adjustæ¹åŒ éåç ç©¶ æ°æ®åå€å·¥äœèŸå€ è·åæ°æ®åçŽæ¥è¿å
¥ Pandas QuantDash å®çœç®åæç¡®æäŸ A è¡ãçŸè¡ãæž¯è¡æ°æ®ïŒå¹¶æäŸåå² K 线ã宿¶è¡æ
ãäºæ¡£çå£åæ¥å
åæ¶çèœåã äžãPython代ç 宿ïŒä»æä»å°è¡äžé£é© è¿æ¬¡ææ¢äžäžªæŽå æ¥è¿å®é
亀æçåæ³ã å讟ææäžåŒ èªå·±çæä»è¡šïŒ # pip install quantdash pandas from quantdash import QuantDash import pandas as pd # æšèéè¿ç¯å¢åéé
眮 API Key # export QUANTDASH_API_KEY="your_api_key" qd = QuantDash() # ============================================ # 1. æš¡ææç A è¡æä» # ============================================ portfolio = pd.DataFrame([ ["600519.SH", "é£å饮æ", 120], ["000858.SZ", "é£å饮æ", 180], ["600887.SH", "é£å饮æ", 100], ["600036.SH", "é¶è¡", 500], ["601398.SH", "é¶è¡", 800], ["000333.SZ", "å®¶çšçµåš", 200], ["300750.SZ", "çµå讟å€", 100], ["601012.SH", "çµå讟å€", 150], ], columns=["symbol", "industry", "shares"]) print("åå§æä»ïŒ") print(portfolio) # ============================================ # 2. æ¹éè·å宿¶è¡æ
# ============================================ symbols = portfolio["symbol"].tolist() quote_df = qd.quotes.get( symbols=symbols, to_dataframe=True ) # åªä¿çæä»¬éèŠçåæ®µ quote_df = quote_df[ ["symbol", "last_price"] ].copy() print("\nææ°è¡æ
ïŒ") print(quote_df) # ============================================ # 3. åå¹¶æä»äžè¡æ
# ============================================ portfolio = portfolio.merge( quote_df, on="symbol", how="left" ) # ============================================ # 4. 计ç®è¡ç¥šåžåŒ # ============================================ portfolio["market_value"] = ( portfolio["shares"] * portfolio["last_price"] ) # ============================================ # 5. 计ç®è¡ç¥šåšç»åäžçæé # ============================================ total_value = portfolio["market_value"].sum() portfolio["stock_weight"] = ( portfolio["market_value"] / total_value ) # ============================================ # 6. èåå°è¡äž # ============================================ industry = ( portfolio .groupby("industry")["market_value"] .sum() .sort_values(ascending=False) ) industry_weight = ( industry / total_value ).rename("industry_weight") print("\nè¡äžæéïŒ") print(industry_weight) # ============================================ # 7. HHI è¡äžéäžåºŠ # ============================================ hhi = ( industry_weight ** 2 ).sum() print(f"\nç»åè¡äž HHI = {hhi:.4f}") # ============================================ # 8. æŸåºæå€§è¡äžæŽé² # ============================================ top_industry = industry_weight.idxmax() top_weight = industry_weight.max() print(f"æå€§è¡äžïŒ{top_industry}") print(f"è¡äžå æ¯ïŒ{top_weight:.2%}") # ============================================ # 9. èŸåºäžäžªç®åçé£é©æç€º # ============================================ if top_weight >= 0.40: print("é£é©æç€ºïŒæå€§è¡äžä»äœå·²ç»è¶
è¿ 40%ïŒéèŠéç¹æ£æ¥è¡äžéäžé£é©ã") elif top_weight >= 0.25: print("é£é©æç€ºïŒæå€§è¡äžä»äœèŸé«ïŒå»ºè®®ç»åæ³¢åšçåçžå
³æ§è¿äžæ¥æ£æ¥ã") else: print("åœåæå€§è¡äžæéçžå¯¹åæ£ïŒäœä»éç»åè¡ç¥šçžå
³æ§å€æã") è¿éæç¹ææ²¡ææå€æã æ žå¿ææ åªæäž€äžªïŒ ææ 1ïŒæå€§è¡äžæé äŸåŠïŒ é£å饮æïŒ42% é¶è¡ïŒ21% çµå讟å€ïŒ18% å®¶çšçµåšïŒ11% å
¶ä»ïŒ8% é£ä¹ç¬¬äžçŒå°±ç¥éïŒ è¿äžªç»åæå€§çé£é©æ¥æºå
¶å®æ¯é£å饮æã ææ 2ïŒHHI HHI ç计ç®éåžžç®åïŒ hhi = (industry_weight ** 2).sum() åè®ŸïŒ è¡äž A = 50% è¡äž B = 30% è¡äž C = 20% é£ä¹ïŒ HHI = 0.5² + 0.3² + 0.2² = 0.38 åŠæåæïŒ è¡äž A = 25% è¡äž B = 25% è¡äž C = 25% è¡äž D = 25% é£ä¹ïŒ HHI = 0.25 æä»¥ HHI å¯ä»¥åŸå¥œå°åž®å©æä»¬åçïŒ æçç»åå°åºæå€éäžïŒ åœç¶ïŒHHI æ¬èº«äžæ¯ä¹°åä¿¡å·ïŒæŽäžèœç®åè§å®âè¶
è¿æäžªæ°åå°±å¿
é¡»åè¡ç¥šâã å®åºè¯¥äœäžºç»åé£é©çæ§ææ ã åã亀æåé¿åæåïŒå«è®©â忣âåæåŠäžç§é£é© é¿å 1ïŒè¡äžåæ£ïŒäžçäºé£é©äžå®åæ£ æ¯åŠïŒ å
äŒ éçµæ± çµçœè®Ÿå€ çµæ± ææ è¡šé¢äžçæ¯å 䞪è¡äžã äœåšæäºåžåºé¶æ®µïŒå®ä»¬å¯èœååšéåžžææŸç产äžéŸå
³èã æä»¥æçä¹ æ¯æ¯ïŒ 第äžå±çè¡äžæéã 第äºå±çè¡ç¥šçžå
³æ§ã 第äžå±çåå²åæ€ã è¿æ ·æ¯åç¬çè¡äžåç±»é è°±åŸå€ã é¿å 2ïŒäžèŠäžºäºéäœ HHI 区è¡åæåŒºå¿è¡ç¥š è¿æ¯åŸå€éåæ°æç误åºã åŠææäžªè¡äžåºæ¬é¢é垞区ïŒèäœ çæš¡å乿ç»ç»åºæ£åä¿¡å·ïŒé£ä¹è¡äžéäžåºŠåé«å¯èœæ¯ç»æïŒäžäžå®æ¯éè¯¯ã æ£ç¡®åæ³äžæ¯ïŒ âHHI é«äºïŒé©¬äžç ä»ãâ èæ¯ïŒ âHHI é«äºïŒæèŠç¥é䞺ä»ä¹é«ãâ åŠææ¯å 䞺暡åé¿æç奜è¿äžªè¡äžïŒé£æ¯çç¥ç»æã åŠææ¯å 䞺å åªè¡ç¥šäžèµ·æŽæ¶šå¯ŒèŽä»äœè¢«åšèšèïŒé£å°±å±äºåŠå€äžç§é®é¢ã é¿å 3ïŒåæµå«å¿äºå倿 å讟æèŠç ç©¶æåªè¡ç¥šè¿å» 120 äžªäº€ææ¥çæ¶ççïŒå¯ä»¥ïŒ df = qd.klines.get( "600519.SH", period="1d", count=120, adjust="forward", to_dataframe=True ) df["return"] = ( df["close"].pct_change() ) print(df[[ "trade_date", "close", "return" ]].tail()) QuantDash 宿¹ææ¡£æç¡®æ¯æ forwardãbackwardãnoneãforward_additiveãbackward_additive äºç§å€ææ¹åŒïŒå
¶äžæ¯äŸå€æåå·®åŒå€æéçšåºæ¯äžåã æä»¥åçç¥çæ¶åäžèŠæºæ¢°å°å€å¶ïŒ adjust="forward" èæ¯å
æ³æž
æ¥ïŒ ææ¯åæ¶çç计ç®ïŒè¿æ¯è§å¯ç»å¯¹ä»·æ ŒååïŒ é¿å 4ïŒDeepSeek å¯ä»¥åž®äœ è§£éç»æïŒäœå«è®© AI æ¿äœ å®ä¹æ°æ® è¿äžç¹æç¹å«æ³åŒºè°ã å¯ä»¥æè¿æ ·çç»æïŒ é£å饮æïŒ38.5% é¶è¡ïŒ22.3% çµå讟å€ïŒ17.8% å®¶çšçµåšïŒ11.4% å
¶ä»ïŒ10.0% HHIïŒ0.245 æå€§è¡äžïŒé£å饮æ äº€ç» DeepSeekïŒè®©å®åž®äœ åèªç¶è¯èšåæã äŸåŠïŒ âè¯·æ ¹æ®è¿ä»œç»åè¡äžæéïŒåæåœåæå€§çè¡äžéäžé£é©ïŒå¹¶åå«ä»è¡äžé£é©ãç»åé£é©åå平衡è§åºŠç»åºæ£æ¥å»ºè®®ãäžèŠçŽæ¥ç»åºä¹°å建议ãâ è¿äžªæµçšæè§åŸåŸåçïŒ QuantDash èŽèŽ£æ°æ®ã Pandas èŽèŽ£è®¡ç®ã DeepSeek èŽèŽ£è§£éã èäžæ¯è®© AI å空çè¡ç¥šæ°æ®ã ç±äºäœ çæ£èŠæ¥å
¥ DeepSeek API æ¶ïŒéèŠäœ¿çš DeepSeek èªå·±ç宿¹æ¥å£åæ°ïŒæè¿éäžèæå
·äœ API è°çšä»£ç ã äºãåžžè§é®é¢è§£çïŒQ&A / FAQïŒ Q1ïŒA è¡éåéè¡äžºä»ä¹è¿èŠè®¡ç®è¡äžéäžåºŠïŒ AïŒå 䞺è¡ç¥šæ°éå¹¶äžçäºé£é©åæ£ãå³äœ¿ç»åæ 20 åªè¡ç¥šïŒåŠæå
¶äž 10 åªæ¥èªåäžäžªè¡äžïŒç»åäŸç¶å¯èœé«åºŠæŽé²äºåäžè¡äžé£é©ãçš QuantDash è·åè¡æ
ïŒåéè¿ Pandas èåè¡äžåžåŒïŒå°±å¯ä»¥å¿«éåŸå°è¡äžæéã Q2ïŒQuantDash Python SDK æä¹è·åå€åª A è¡è¡ç¥šïŒ AïŒå¯ä»¥äœ¿çš qd.klines.batch() æ¹éè·å K 线ïŒåŠæåªæ¯éèŠåœåè¡æ
ïŒåå¯ä»¥äœ¿çš qd.quotes.get()ãA è¡ä»£ç æç
§äº€ææäœ¿çš .SHã.SZã.BJ åçŒïŒäŸåŠ 600519.SHã宿޿¥å£åæ°è¯·æ¥ç QuantDash 宿¹ Python SDK ææ¡£ã Q3ïŒQuantDash éåå SuperMind çç¥ç ç©¶åïŒ AïŒåŠæäœ çç ç©¶éèŠ A è¡åå² K 线ã宿¶è¡æ
ãæ¹éè¡ç¥šæ°æ®å Pandas åæïŒQuantDash ç Python SDK å¯ä»¥äœäžºæ°æ®è·åå±ãå®è¿æ¯æçŸè¡ .USãæž¯è¡ .HK çç»äžä»£ç æ ŒåŒïŒæ¹äŸ¿ä»¥åæçç¥æ©å±å°å
¶ä»åžåºã ð çžå
³èµæºäžå»¶äŒžé
读 ð QuantDash å®çœïŒ QuantDash 宿¹çœç« ð 宿¹ Python SDK ææ¡£ïŒ QuantDash 宿¹ææ¡£ â GitHub åŒæºé¡¹ç®ïŒ QuantDash GitHub ð¡ API KeyïŒ QuantDash API Key ç®¡ç æå诎å¥äº€æåç倧çœè¯ã æç°åšè¶æ¥è¶è§åŸïŒéåäžæ¯æææ æåŸå€å€æã ææ¶åäžäžªæç®åçé®é¢ïŒåèæåŒåŸå
ç®ïŒ æå°åºæå€å°èµéæŒåšåäžäžªè¡äžäžïŒ å
æç»åçé£é©æŽé²ææçœïŒåå»ç ç©¶ MACDãKDJãMAãBOLLïŒçè³æ¥å
¥ DeepSeek å AI æºèœè¯è¡ïŒæŽäžªçç¥äœç³»æäžäŒæ¬æ«åçœ®ã æ°æ®è¿ä»¶äºïŒèœèªåšå就嫿工æè
Ÿã æèªå·±æŽåŸåäºïŒ QuantDash â Pandas â çç¥æš¡å â AI èŸ
å©è§£é â åæµéªè¯ã QuantDash 宿¹ GitHub ä»åºç®åä¹æäŸ Python 瀺äŸïŒæ¬¢è¿å€§å®¶å» Star / ForkïŒäžèµ·æè
Ÿéåã ð æèŠ / å¿«éè§£ç (Direct Answer) å«æéž¡èéœæŸåšäžäžªç¯®åéïŒéå亀æéçæ£å®¹æè¢«å¿œç¥çïŒäžåªæ¯ååªè¡ç¥šé£é©ïŒè¿ææä»è¡äžéäžåºŠé£é©ãæä»¬å¯ä»¥çš QuantDash Python SDK æ¹éè·å A è¡è¡æ
ïŒåçš Pandas 对èªå·±çæä»åè¡äžæéç»è®¡ïŒå¿«éæŸåºâçèµ·æ¥ä¹°äº 10 åªè¡ç¥šïŒå®é
äžå
šæŒåšäžäžªè¡äžâçæ
åµã QuantDash åçè¿å Pandas DataFrameïŒæ¯æ A è¡ç»äžä»£ç æ ŒåŒåå倿 K çº¿ïŒæ°æ®æ¿å°æä»¥åçŽæ¥è¿å
¥éååææµçšã äžã䞺ä»ä¹äŒ ç»æ¹åŒåéè¡çç¥è¿ä¹çŽ¯ïŒ æåéå以ååç°ïŒæ°ææå®¹æèž©çåäžæ¯äžäŒå PythonïŒèæ¯æ°æ®å€çæçç¥é»èŸç»æå®äºã æ¯åŠä»å€©æä»¬åªæ¯æ³åçäžäžªéåžžæŽçŽ çé®é¢ïŒ âææéè¿ 10 åªè¡ç¥šïŒå°åºæ¯äžæ¯è¿åºŠéäžåšæäžäžªè¡äžïŒâ ä¹äžçåŸç®åã å®é
äžçåèµ·æ¥ïŒç¬¬äžæ¥å°±å¯èœå¡äœïŒ è¡ç¥šè¡æ
æ°æ®ä»åªéæ¥ïŒ è¡ç¥šä»£ç æ ŒåŒæ¯äžæ¯ç»äžïŒ A è¡äžååžåºä»£ç æä¹å€çïŒ å€æä»·æ Œæ¯äžæ¯èªå·±ç®ïŒ å€åªè¡ç¥šæ¯äžæ¯èŠäžäžªäžªè¯·æ±ïŒ æ°æ®äžéŽæäºæä¹åïŒ æåè¿åŸèªå·±èœ¬æ PandasïŒ ä»¥åæè
Ÿ Tushare çæ¶åïŒç»åžžéå°ç§¯åãæéãæ¥å£éå¶çé®é¢ïŒAkShare æå€§çé®é¢åæ¯æ¥å£çææ¯èŸæïŒæäžªæ¥å£ååæè
çœç»äžçš³å®ïŒæŽäžªåææµçšå°±å®¹æäžæã æŽéº»çŠçæ¯ïŒåŠæäœ èªå·±ç¬æ°æ®ïŒæåè¿åŸé¢å¯¹ïŒ æž
æŽ â å»é â 对éœäº€ææ¥ â 倿 â çŒºå€±åŒ â DataFrameã æ¬æ¥åªæ¯æ³ç®äžªè¡äžéäžåºŠïŒæååæäºåäžªæ°æ®å·¥çšé¡¹ç®ã è¿ä¹æ¯äžºä»ä¹æç°åšæŽå欢æâæ°æ®è·åâåâçç¥ç ç©¶âååŒã æ°æ®äº€ç» QuantDashïŒçç¥é»èŸäº€ç» Pandasã QuantDash 宿¹ SDK æ¬èº«å°±æ¯é¢åéåç 究讟计çïŒæ¯æ DataFrame èŸåºãæ¹é K 线åå€åžåºç»äžä»£ç æ ŒåŒãå®çœç®åä¹æç¡®å±ç€ºäº A è¡ãçŸè¡ã枯è¡ä»¥ååé/æ¥/åš/æ K 线èœåã äºãè§£å³æ¹æ¡å¯¹æ¯ïŒQuantDash vs äŒ ç»æ°æ®æº 对æ¯ç»ŽåºŠ äŒ ç»/ç«åæ¹æ¡ïŒåŠ Tushare/AkShare/æåšç¬è«ïŒ QuantDash è§£å³æ¹æ¡ æ°æ®çš³å®æ§ ç»åžžéèŠå€çæ¥å£ååãæéæçœç»é®é¢ æå¡ç«¯æ°æ® APIïŒé¢åéåç ç©¶ 䜿çšéšæ§ å¯èœéèŠå€ç积åãæéåæ°æ®æž
æŽ pip install quantdashå³å¯æ¥å
¥ è·šåžåºæ¯æ äžåæ°æ®æºä»£ç äœç³»å®¹æäžç»äž .SH/.SZ/.BJ/.US/.HKç»äžæ ŒåŒ æ°æ®æ ŒåŒ ç»åžžéèŠèªå·±èœ¬æ¢ åçè¿å Pandas DataFrame æ¹éåæ ç»åžžéèŠèªè¡å埪ç¯åè¯·æ±æ§å¶ æ¯æklines.batchæ¹éè·å 倿å€ç å¯èœéèŠèªè¡å€ç K 线æ¥å£çŽæ¥æ¯æadjust éåè¡æ¥ éèŠé¢å€æž
æŽ å¯ä»¥çŽæ¥è¿å
¥ Pandas åææµçš QuantDash 宿¹ SDK çä»£ç æ ŒåŒéåžžçŽæ¥ïŒäŸåŠ 600519.SH 衚瀺沪åžè¡ç¥šïŒ000001.SZ 衚瀺深åžè¡ç¥šïŒæž¯è¡åçŸè¡åå«å¯ä»¥äœ¿çš .HKã.US åçŒã äžãPython代ç 宿ïŒè®¡ç®æä»è¡äžéäžåºŠ è¿éæäžæè±éè¡åšçæš¡åïŒçŽæ¥åäžäžªå®çšçæ¬ã å讟æçæä»åŠäžïŒ # å®è£
ïŒ # pip install quantdash pandas from quantdash import QuantDash import pandas as pd # æšè䜿çšç¯å¢åéïŒ # macOS / Linux: # export QUANTDASH_API_KEY="your_api_key" # Windows PowerShell: # $env:QUANTDASH_API_KEY = "your_api_key" # QuantDash èªåšè¯»å QUANTDASH_API_KEY qd = QuantDash() # ------------------------------------------------ # 1. æçæš¡ææä» # ------------------------------------------------ # shares 衚瀺ææè¡æ° # industry æ¯æä»¬èªå·±ç»Žæ€çè¡äžæ çŸ # å®é
ç ç©¶äžå¯ä»¥æ¢æèªå·±çæä»è¡š positions = pd.DataFrame([ ["600519.SH", "é£å饮æ", 100], ["000858.SZ", "é£å饮æ", 200], ["600036.SH", "é¶è¡", 500], ["601318.SH", "éé¶éè", 300], ["000333.SZ", "å®¶çšçµåš", 200], ["300750.SZ", "çµå讟å€", 100], ], columns=["symbol", "industry", "shares"]) # ------------------------------------------------ # 2. æ¹éè·åææ°è¡æ
# ------------------------------------------------ symbols = positions["symbol"].tolist() quotes = qd.quotes.get( symbols=symbols, to_dataframe=True ) # æ¥çå®é
è¿åçæ°æ® print(quotes.head()) # ------------------------------------------------ # 3. æåè¡ç¥šä»·æ Œ # ------------------------------------------------ # QuantDash 宿¶è¡æ
åæ®µäžå
å« last_price price_df = quotes[[ "symbol", "last_price" ]].copy() # ------------------------------------------------ # 4. è®¡ç®æ¯åªè¡ç¥šæä»åžåŒ # ------------------------------------------------ positions = positions.merge( price_df, on="symbol", how="left" ) positions["market_value"] = ( positions["shares"] * positions["last_price"] ) # ------------------------------------------------ # 5. è®¡ç®æ»èµäº§ # ------------------------------------------------ total_value = positions["market_value"].sum() positions["weight"] = ( positions["market_value"] / total_value ) # ------------------------------------------------ # 6. æ±æ»å°è¡äžå±é¢ # ------------------------------------------------ industry_weight = ( positions .groupby("industry")["market_value"] .sum() .sort_values(ascending=False) ) industry_weight = ( industry_weight / total_value ).rename("weight") print("\nè¡äžæéïŒ") print(industry_weight) # ------------------------------------------------ # 7. 计ç®è¡äžéäžåºŠ HHI # ------------------------------------------------ # HHI = åè¡äžæéå¹³æ¹ä¹å # # è¶æ¥è¿ 1ïŒè¯Žæè¡äžè¶éäž # è¶æ¥è¿ 0ïŒè¯Žæè¡äžè¶åæ£ hhi = (industry_weight ** 2).sum() print(f"\nè¡äžéäžåºŠ HHI: {hhi:.4f}") # æå€§è¡äžæé max_industry = industry_weight.idxmax() max_weight = industry_weight.max() print(f"æå€§è¡äž: {max_industry}") print(f"æå€§è¡äžæé: {max_weight:.2%}") è¿äžªä»£ç çæ žå¿å
¶å®åªæäžå¥è¯ïŒ å
ç®æ¯åªè¡ç¥šçåžåŒïŒåæåžåŒæç
§è¡äžèåã è¿æ ·å°±èœé¿å
äžäžªéåžžå
žåçæèµéè§ã æ¯åŠäœ 莊æ·éé¢æïŒ èŽµå·è
å° äºç²®æ¶² 泞å·èçª å±±è¥¿æ±Ÿé
äœ å¯èœè§åŸïŒ âæä¹°äº 4 åªè¡ç¥šïŒåºè¯¥æºåæ£ãâ éã åŠæå®ä»¬éœå±äºåäžäžªè¡äžïŒé£ä¹äœ çè¡ç¥šæ°éæ¯ 4ïŒäœäœ çè¡äžé£é©æŽé²å¯èœäŸç¶éåžžéäžã 1. 䞺ä»ä¹ææŽæšèçè¡äžæéïŒ å 䞺å纯çæä»æ°éïŒåŸå®¹æäº§çéè§ã äŸåŠïŒ è¡ç¥š è¡äž ä»äœ A é£å饮æ 15% B é£å饮æ 12% C é£å饮æ 10% D é¶è¡ 8% E å®¶çµ 7% F çµåè®Ÿå€ 6% çèµ·æ¥æ 6 åªè¡ç¥šã äœæ¯åäžåªå èµ·æ¥å·²ç»ïŒ 37% å
šååšé£å饮æã åŠæé£å饮æè¡äžæŽäœåºç°äŒ°åŒæè·ïŒé£ä¹è¿ 3 åªè¡ç¥šå¯èœåæ¶æ¿åã æä»¥æèªå·±åç»åæ£æ¥æ¶ïŒæŽåæ¬¢åæ¶çïŒ åè¡æé è¡äžæé æå€§è¡äžæé HHI è¡äžéäžåºŠ 2. åå äžå±ïŒçšå倿 K 线ååå²åæ åŠææä»¬äžåªæ¯çåœåä»äœïŒèæ¯èŠåæïŒ âè¿å»å幎æçè¡äžéäžé£é©ææ²¡ææç»äžåïŒâ å°±å¯ä»¥äœ¿çš QuantDash ç K 线æ¥å£ã äŸåŠïŒ from quantdash import QuantDash qd = QuantDash() df = qd.klines.get( "600519.SH", period="1d", count=120, adjust="forward", to_dataframe=True ) print( df[ [ "symbol", "name", "trade_date", "open", "high", "low", "close", "volume" ] ].tail() ) è¿éç adjust="forward" æ¯ QuantDash 宿¹æ¯æçå倿æ¹åŒïŒèäžæ¯é»è®€å€ææ¹åŒã宿¹ææ¡£åæ¶æ¯æ backwardãnoneãforward_additive å backward_additiveã æåæ¶ççè®¡ç®æ¶ïŒäžè¬äŒç¹å«æ³šæè¿äžç¹ã äžèŠæ¿äžå€æä»·æ ŒçŽæ¥åé¿ææ¶ççæ¯èŸã 3. åŠæè¡ç¥šåŸå€ïŒå«äžäžªäžªè¯·æ± å讟æçç»åäžæ¯ 6 åªè¡ç¥šïŒèæ¯ 50 åªã100 åªã è¿æ¶åå¯ä»¥çŽæ¥çšïŒ symbols = [ "600519.SH", "000858.SZ", "600036.SH", "601318.SH", "000333.SZ", "300750.SZ" ] dfs = qd.klines.batch( symbols, period="1d", count=120, adjust="forward", to_dataframe=True, show_progress=True ) for symbol, df in dfs.items(): print(symbol) print(df.tail()) è¿å°±æ¯æè§åŸ QuantDash 对éåç ç©¶æ¯èŸèæçå°æ¹ïŒ æ°æ®è·å代ç åŸçïŒç ç©¶æ¶éŽå¯ä»¥çæ£æŸåšçç¥é»èŸäžã 宿¹ GitHub ä»åºä¹æäŸäº Python 瀺äŸå SDK 䜿çšè¯ŽæïŒåœåä»åºæç¡®è¯Žæå®æŽæ¥å£ä»¥å®æ¹ææ¡£äžºåã åã亀æåé¿åæåïŒè¡äžéäžåºŠäžæ¯è¶äœè¶å¥œ è¿éæèŠæéäžäžªåŸå®¹æèµ°æç«¯çé®é¢ã åŸå€äººç¬¬äžæ¬¡ç®å®è¡äžéäžåºŠä»¥åïŒå°±åŒå§ïŒ âè¿äžªè¡äžè¶
è¿ 20%ïŒç ïŒâ æè§åŸæ²¡å¿
èŠã é£é©æ§å¶äžæ¯ç®å远æ±åæ£ã åŠæäœ ç¹å«ç奜æäžªè¡äžïŒéåœéäžæ¯å®å
šå¯ä»¥çè§£çã çæ£åºè¯¥èŠæçæ¯ïŒ å 1ïŒæâè¡ç¥šæ°éâåœæâé£é©åæ£â 10 åªè¡ç¥šäžä»£è¡š 10 䞪ç¬ç«é£é©ã åŠæ 8 åªéœæ¥èªåäžäžªäº§äžéŸïŒå®é
é£é©å¯èœé«åºŠçžå
³ã å 2ïŒåªçåœåä»·æ ŒïŒäžç倿 ååå²åæµæ¶ïŒå»ºè®®æç¡®éæ©å€ææ¹åŒã åŠæäž»èŠè®¡ç®æ¶ççïŒå¯ä»¥èèäœ¿çšæ¯äŸåå€æïŒ adjust="forward" QuantDash 宿¹ææ¡£æç¡®å° forward å®ä¹äžºå倿æ¯äŸæ¹åŒïŒéåæ¶çç计ç®ã å 3ïŒåæµæ¶å¿è®°äº€æææ¬ å³äœ¿è¡äžéäžåºŠæš¡åæ¬èº«æ²¡æé®é¢ïŒåæµç»æä¹å¯èœèé«ã è³å°èŠèèïŒ æç»è޹ å°è±çš æ»ç¹ æ¢æç å®é
æäº€ä»·æ Œ å°€å
¶æ¯é«é¢è°ä»çç¥ã åæµæ¶ç 30%ïŒåŠææ¢ææé«ïŒå®çäžäžå®è¿èœå©å€å°ã å 4ïŒæçžå
³æ§åœæåºå®åŒ 䞀䞪è¡ç¥šä»å€©çžå
³æ§é«ïŒäžä»£è¡šæªæ¥æ°žè¿é«ã è¡äžéäžåºŠæå¥œåïŒ æ¶ççžå
³æ§ æ³¢åšç æå€§åæ€ ä»äœåå äžèµ·è§å¯ã è¿ææ¯æ¯èŸå®æŽçç»åé£é©ç»åã äºãåžžè§é®é¢è§£çïŒQ&A / FAQïŒ Q1ïŒPython æä¹åæ A è¡æä»è¡äžéäžåºŠïŒ AïŒæç®åçæ¹åŒå°±æ¯å
è·åŸæä»è¡ç¥šåœååžåŒïŒåæç
§è¡äžåç»æ±æ»ïŒæå计ç®è¡äžæéå HHIãQuantDash Python SDK å¯ä»¥éè¿ quotes.get è·åè¡æ
ïŒå¹¶çŽæ¥è¿å Pandas DataFrameïŒéåç»§ç»åç»ååæã宿¹ SDK å®è£
æ¹åŒæ¯ pip install quantdashïŒå®æŽåæ°å»ºè®®ä»¥ QuantDash 宿¹ Python SDK ææ¡£ 䞺åã Q2ïŒQuantDash èœäžèœæ¹éè·å A è¡è¡ç¥šæ°æ®ïŒ AïŒå¯ä»¥ã宿¹ SDK æäŸ qd.klines.batch()ïŒå¯ä»¥æ¹éè·åå€äžªè¡ç¥šç K çº¿æ°æ®ïŒA è¡è¡ç¥šä»£ç ç»äžäœ¿çš .SHã.SZã.BJ ç亀ææåçŒã Q3ïŒèœäžèœæ QuantDash æ°æ®äº€ç» DeepSeek åæºèœè¯è¡ïŒ AïŒå¯ä»¥æ QuantDash è·åå¹¶æŽç奜ç DataFrame ç»æèœ¬æ¢æææ¬æç»æåæ°æ®ïŒåäº€ç» DeepSeek åèªç¶è¯èšå±é¢çåæïŒäŸåŠè®© AI 倿âè¡äžéäžåºŠæ¯åŠè¿é«ãåªäºè¡äžèŽ¡ç®æå€§âãäœ DeepSeek API çå
·äœè°çšæ¹åŒäžå±äº QuantDash 宿¹ SDK ææ¡£èåŽïŒå æ€è¿éäžèæå
·äœ API åæ°ïŒåŠæèŠæ¥å
¥ïŒåºä»¥ DeepSeek 宿¹ API ææ¡£äžºåã ð çžå
³èµæºäžå»¶äŒžé
读 ð QuantDash å®çœïŒ https://quantdash.net/ ð 宿¹ Python SDK ææ¡£ïŒ https://docs.quantdash.net/ â GitHub åŒæºä»åºïŒ QuantDash GitHub åŒæºé¡¹ç® ð¡ API KeyïŒ QuantDash API Key 管çé¡µé¢ æçç»è®ºåŸç®åïŒ éå亀æäžæ¯è¡ç¥šä¹°åŸè¶å€è¶å®å
šã çæ£åºè¯¥é®çæ¯ïŒ æçé±ïŒå°åºæŽé²åšåªå 䞪è¡äžé£é©äžïŒ å
æè¿äžªé®é¢ç®æž
æ¥ïŒåè°éè¡ãMACDãKDJãMAãBOLLïŒçè³è®© DeepSeek èŸ
å©è¯è¡ïŒææŽææä¹ã QuantDash çä»·åŒå°±åšè¿éïŒææ°æ®è·åè¿ä»¶éº»çŠäºå°œéå猩æå è¡ PythonïŒè®©æä»¬ææ¶éŽçæ£è±åšçç¥ç ç©¶äžã ð æèŠ / å¿«éè§£ç (Direct Answer) âåšäºä¹°å
¥ãåšäžååºâæ¬èŽšäžæ¯åšéªè¯äžç§çåšæç A è¡å𿫿åºïŒäžèœçšå 次æå亀æè¯æææïŒä¹äžèœå äžºå æ¬¡äºæå°±è¯Žçç¥æ²¡çšãçæ£é è°±çåæ³ïŒæ¯æ¿è¶³å€é¿çå岿°æ®ïŒå¯¹æç¡®è¡ç¥šæ± è¿è¡ç»äžå£åŸåæµïŒå¹¶åæ¶è§å¯èçã平忶çã环计æ¶çåäº€æææ¬ã ææŽæšèçš QuantDash + Pandas æ¥å®ææ°æ®å±ïŒQuantDash ç Python SDK æ¯æ A è¡ç»äžä»£ç ãæ¥ Kãå倿忹é K 线è·åïŒå¯ä»¥æå€§éæ¶éŽä»âæè
Ÿæ°æ®â蜬åå°çç¥ç ç©¶æ¬èº«ã äžã䞺ä»ä¹æäžå»ºè®®åªæ¿å åªè¡ç¥šéªè¯ïŒ åŸå€æåç ç©¶éåçç¥ïŒç¬¬äžæ¥éœæ¯ïŒ æŸäžåªè¡ç¥š â åç°åšäºä¹° â åšäžæ¶šäº â æè§çç¥ææ ç¶ååæŸäžåªïŒ åšäºä¹° â åšäžåæ¶š â ç¡®è®€ïŒ è¿å
¶å®åŸå±é©ã å äžºäœ äžç¥éïŒ æ¯äžæ¯å奜碰äžçåžïŒ æ¯äžæ¯äžªè¡èªå·±çèµ°å¿ïŒ æ¯äžæ¯æ ·æ¬å€ªå°ïŒ æ¯äžæ¯æåºæ¥çæåæ¡äŸïŒ ææ²¡ææäº€æææ¬ç®è¿å»ã æä»¥æåçç¥ç ç©¶æ¶æäžäžªä¹ æ¯ïŒ 塿¯å¬èµ·æ¥ç¹å«æéçç亀æè§åŸïŒç¬¬äžååºäžæ¯çžä¿¡ïŒèæ¯åæµã äºãè§£å³æ¹æ¡å¯¹æ¯ïŒæ°æ®å·¥çšäžèŠå§å®Ÿå€ºäž» 对æ¯ç»ŽåºŠ äŒ ç»/ç«åæ¹æ¡ QuantDash æ¹æ¡ A è¡ä»£ç äžåæ°æ®æºæ ŒåŒå¯èœéèŠéé
ç»äž.SH/.SZ/.BJ åå² K 线 éèŠèªå·±å€çæ¥å£ååæ®µ klines.get() æ¹éå岿°æ® éåžžéèŠèªå·±è®Ÿè®¡æ¹å€çé»èŸ klines.batch() 倿 容æåšäžåæ°æ®æºéŽæ··çš SDK çŽæ¥æäŸadjust DataFrame å¯èœéèŠèœ¬æ¢ åçto_dataframe=True å€åžåº éèŠé¢å€éé
A è¡/枯è¡/çŸè¡ç»äžä»£ç äœç³» çç¥ç å æ°æ®å€çå·¥äœèŸå€ å¯ä»¥çŽæ¥è¿å
¥ Pandas QuantDash 宿¹ç®åæç¡®æ¯æ A è¡ãçŸè¡ã枯è¡ïŒå®çœè¿ååºäºåå²/宿¶è¡æ
ãåé/æ¥/åš/æ Kãæ çæ± ãPython SDK å DataFrame èŸåºçèœåã äžãPython 代ç å®æïŒæâåšæ«æåºâåæäžäžªå¯æµè¯çå å è¿äžçæäžåªè®¡ç®äžäžªè¡ç¥šïŒèæ¯æçç¥æœè±¡æäžäžªåœæ°ã è¿æ ·ä»¥åæ³ç ç©¶ïŒ åšäºä¹° â åšäžå åšäžä¹° â åšäºå åšåä¹° â åšäºå éœå¯ä»¥å€çšã ç¬¬äžæ¥ïŒå®è£
QuantDash pip install quantdash 宿¹ GitHub åœå瀺äŸä¹æ¯æéè¿ç¯å¢åéïŒ export QUANTDASH_API_KEY="your_api_key_here" ç¶åïŒ from quantdash import QuantDash qd = QuantDash() è¿æ ·äžäŒæ API Key çŽæ¥åè¿ä»£ç ã ç¬¬äºæ¥ïŒå®ä¹åšäºçç¥ from quantdash import QuantDash import pandas as pd qd = QuantDash() def backtest_friday_strategy( symbol, count=1000, sell_at="close" ): """ åšäºæ¶çä¹°å
¥ äžäžäžªäº€ææ¥ååº sell_at: close -> äžäžäº€ææ¥æ¶çååº open -> äžäžäº€ææ¥åŒçååº """ df = qd.klines.get( symbol, period="1d", count=count, adjust="forward", to_dataframe=True ) df["trade_date"] = pd.to_datetime(df["trade_date"]) # æäº€ææ¥æåº df = ( df .sort_values("trade_date") .reset_index(drop=True) ) # åšäº df["weekday"] = df["trade_date"].dt.weekday friday_indices = df.index[df["weekday"] == 4] trades = [] for idx in friday_indices: # æåäžæ ¹æ°æ®æ²¡æäžäžäº€ææ¥ if idx + 1 >= len(df): continue buy = df.iloc[idx] sell = df.iloc[idx + 1] if sell_at == "open": sell_price = sell["open"] else: sell_price = sell["close"] buy_price = buy["close"] ret = sell_price / buy_price - 1 trades.append({ "symbol": symbol, "buy_date": buy["trade_date"], "sell_date": sell["trade_date"], "buy_price": buy_price, "sell_price": sell_price, "return": ret }) return pd.DataFrame(trades) # ç€ºäŸ result = backtest_friday_strategy( "600519.SH", count=1000, sell_at="close" ) print(result.tail()) if not result.empty: print("\n===== åæµç»è®¡ =====") print( f"äº€ææ¬¡æ°ïŒ{len(result)}" ) print( f"èçïŒ{(result['return'] > 0).mean():.2%}" ) print( f"平忶çïŒ{result['return'].mean():.2%}" ) print( f"环计å€åæ¶çïŒ" f"{((1 + result['return']).prod() - 1):.2%}" ) è¿éæéèŠçäžæ¯ä»£ç æå€å€æã æ°æ°çžåïŒ çæ£å¥œççç¥ä»£ç ïŒåºè¯¥è®©çç¥é»èŸäžçŒå°±èœçæã åãä»âå祚æµè¯âå级æâè¡ç¥šæ± æµè¯â çæ£è®©æè§åŸè¿äžªçç¥æç ç©¶ä»·åŒçïŒäžæ¯ïŒ 莵å·è
å°è¿å»ææ²¡æèµé±ã èæ¯ïŒ äžå€§æ¹ A è¡è¡ç¥šïŒåšçžåè§åäžæ¯äžæ¯éœæç»è®¡äŒå¿ïŒ QuantDash æ¯æ A è¡ CN_Stock æ çæ± ïŒä¹æ¯ææ¹é K 线ã äŸåŠïŒ from quantdash import QuantDash qd = QuantDash() symbols = [ "600519.SH", "000001.SZ", "000858.SZ", "600000.SH" ] dfs = qd.klines.batch( symbols, period="1d", count=1000, adjust="forward", to_dataframe=True, show_progress=True ) all_results = [] for symbol, df in dfs.items(): df["trade_date"] = pd.to_datetime( df["trade_date"] ) df = ( df .sort_values("trade_date") .reset_index(drop=True) ) df["weekday"] = ( df["trade_date"].dt.weekday ) friday_indices = df.index[ df["weekday"] == 4 ] for idx in friday_indices: if idx + 1 >= len(df): continue buy = df.iloc[idx] sell = df.iloc[idx + 1] ret = ( sell["close"] / buy["close"] - 1 ) all_results.append({ "symbol": symbol, "buy_date": buy["trade_date"], "sell_date": sell["trade_date"], "return": ret }) result = pd.DataFrame(all_results) print("\n===== å
šéšè¡ç¥šæ±æ» =====") print( f"æ»äº€ææ¬¡æ°ïŒ{len(result)}" ) print( f"èçïŒ" f"{(result['return'] > 0).mean():.2%}" ) print( f"å¹³å忬¡æ¶çïŒ" f"{result['return'].mean():.2%}" ) print( f"环计å€åæ¶çïŒ" f"{((1 + result['return']).prod() - 1):.2%}" ) è¿é就已ç»ä»ïŒ âææè§åšäºä¹°åšäžåäžéâ è¿åæïŒ âæçšå岿 ·æ¬éªè¯è¿äžªè§åŸææ²¡æç»è®¡äŒå¿ãâ è¿ææ¯éå亀æçæ£æææçå°æ¹ã äºãåè¿äžæ¥ïŒäžèŠåªçâèµé±æ²¡èµé±â å讟æååŸå°ïŒ èçïŒ53% 平忶çïŒ0.12% åŸå€äººç¬¬äžååºïŒ âäžéåïŒèµé±ïŒâ æåèäŒç»§ç»åŸäžé®ã 1. çåžèµé±ïŒçåžè¿èµé±åïŒ å¯ä»¥æç
§äžå幎仜åå«ç»è®¡ã 2. 倧çè¡ææåïŒ å¯ä»¥æè¡ç¥šæ± è¿äžæ¥åç±»ã 3. å°çè¡ææåïŒ ç»§ç»åç»æµè¯ã 4. åšäºæ¶šçæ¶åä¹°ïŒååšäºè·çæ¶åä¹°äžæ ·åïŒ è¿æ¶åå°±å¯ä»¥å å
¥ïŒ åšäºæ¶šè·å¹
æäº€é MA MACD KDJ BOLL åœ¢ææ¡ä»¶çç¥ã äŸåŠïŒ åšäºæ¶çç«äž MA20 + åšäºäžæ¶š + æäº€éæŸå€§ â åšäžååºã è¿æ ·å°±ä»äžäžªç®åçâæ¥åæåºâïŒåŒå§åçæ£çA è¡éåéè¡çç¥æŒè¿ã å
ã亀æåé¿åæåïŒæå®¹ææåæµåæŒäº®çäžäžªæ¹æ³ é¿å 1ïŒäžèŠå·å·äœ¿çšæªæ¥ä¿¡æ¯ è¿æ¯ç¬¬äžååã äŸåŠäœ èŠæš¡æïŒ åšäºæ¶çä¹°å
¥ã é£ä¹åšäºæ¶ç以å产ççæ°æ®ïŒå°±äžèœåäžåšäºè¿ç¬äº€æçå³çã åŠåïŒ å
ç¥éçæ¡ â åå倎暡æäº€æ åæµåœç¶äŒåŸå¥œçã äœå®ç没æ³å€å¶ã é¿å 2ïŒåå€æè§£å³çæ¯ä»·æ Œè¿ç»æ§ïŒäžçäºçå®æäº€ QuantDash ç forward æ¯æ¯äŸå倿ïŒå®æ¹ææ¡£è¯Žææ¯äŸå€æéåè®¡ç®æ¶ççã äœçå®äº€æè¿éèŠèèïŒ æç»è޹ æ»ç¹ æ¶šè·å åç æäº€æ¶éŽ æä»¥ïŒ æ°æ®å€ææ£ç¡® â 念已ç»å®å
šçå®ã é¿å 3ïŒäžèŠåªäŒåäžäžªæŒäº®ææ æå±é©çäžå¥è¯ïŒ âææåæ°è°å°èç 80% äºïŒâ åŠæäœ æµè¯äºå åç§æ¡ä»¶ïŒ MA5 MA10 MA20 MA30 MA60 æåæäžäžªææŒäº®çïŒæ¬èŽšäžå¯èœåªæ¯è¿æåã æç建议æ¯ïŒ å
æåºäº€æé»èŸïŒåéªè¯ïŒäžèŠå
çç»æïŒååæšé»èŸã äžãåŠæåç»å AIïŒäŒæä¹ç©ïŒ è¿éææ¯èŸæšèæ AI æŸåšçç¥ç ç©¶èŸ
å©å±ïŒèäžæ¯è®© AI çŽæ¥æ¿ä»£åæµã æ¯åп们å¯ä»¥æ QuantDash çå岿°æ®æŽçæïŒ è¡ç¥š æ¥æ åšäºæ¶šè·å¹
åšäºæäº€éåå MA5 MA20 MACD KDJ BOLL åšäžæ¶ç ç¶åæè¿äºç»æåç»æäº€ç» DeepSeek äžç±»ç倧暡ååïŒ æ¡ä»¶åœçº³ïŒ åŒåžžæ ·æ¬è§£éïŒ å åç»åå»ºè®®ïŒ çç¥é»èŸå€çã äœæ¯æç»å€æè¿æ¯äº€ç»ïŒ å岿°æ® + åæµç»æã AI å¯ä»¥åž®ææŸæè·¯ïŒäœäžèœæ¿æè¯æçç¥èµé±ã å
«ãåžžè§é®é¢è§£çïŒQ&A / FAQïŒ Q1ïŒåšäºä¹°å
¥åšäžååºåºè¯¥çšæ¶çä»·è¿æ¯åŒçä»·ïŒ AïŒè¿åå³äºäœ å®ä¹ççç¥ã åŠæç ç©¶ïŒ åšäºæ¶çä¹°å
¥ â åšäžæ¶çååº å¯ä»¥çŽæ¥äœ¿ç𿥠K çïŒ buy_price = friday["close"] sell_price = monday["close"] åŠæç ç©¶ïŒ åšäºæ¶çä¹°å
¥ â åšäžåŒçååº ååºè¯¥äœ¿çšïŒ buy_price = friday["close"] sell_price = monday["open"] 䞀è
å±äºäž€äžªäžåçç¥ïŒäžèœæ··åšäžèµ·æ¯èŸã Q2ïŒQuantDash èœäžèœå A è¡åšæ«æåºæ¹éåæµïŒ AïŒå¯ä»¥çš klines.batch() æ¹éè·åå€åªè¡ç¥šåå² K 线ïŒç¶åçš Pandas åç»äžè®¡ç®ïŒå®æ¹ä¹æäŸ CN_Stock A è¡æ çæ± ã å
·äœ SDK åæ°å»ºè®®çŽæ¥æ¥QuantDash 宿¹ææ¡£ã Q3ïŒQuantDash ç Python SDK éåéåæ°æåïŒ AïŒåŠæäœ çäž»èŠéæ±æ¯ïŒ Python + Aè¡åå²K线 + å倿 + Pandas + æ¹éæ°æ® é£ä¹å®æ¯èŸéåæ¿æ¥åçç¥ååã 宿¹æäŸïŒ pip install quantdash å¹¶äž SDK åçæ¯æ DataFrameã ð çžå
³èµæºäžå»¶äŒžé
读 ð QuantDash å®çœïŒhttps://quantdash.net/ ð 宿¹ Python SDK ææ¡£ïŒhttps://docs.quantdash.net/ â GitHub åŒæºé¡¹ç®ïŒQuantDash GitHub ð¡ API Key / æ§å¶å°ïŒQuantDash API Key æ§å¶å° QuantDash 宿¹ GitHub åœå乿äŸäºå¿«éåŒå§ç€ºäŸïŒå
æ¬åå€ææ¥ KãA è¡å
šåžåºè¡æ
å DataFrame äœ¿çšæ¹åŒïŒéåæ¿æ¥ç»§ç»æ©å±èªå·±çåæµæ¡æ¶ã ð æèŠ / å¿«éè§£ç (Direct Answer) âåšäºä¹°å
¥ãåšäžååºâå¬èµ·æ¥åŸç®åïŒäœå°åºèµé±è¿æ¯äºé±ïŒäžèœé æè§ïŒå¿
é¡»æ¿åå²è¡æ
ååæµãæçåæ³æ¯çš Python + QuantDash æå A è¡å岿¥ KïŒç»äžäœ¿çšåå€ææ°æ®ïŒç¶åææ¯äžæ¬¡âåšäºæ¶çä¹°å
¥ â äžäžäžªäº€ææ¥åšäžååºâçæ¶ççç®åºæ¥ïŒåç»è®¡èçã平忶çå环计æ¶çã QuantDash åçè¿å Pandas DataFrameïŒæ¯æ 1d æ¥ Kãå倿以å A è¡ç»äžä»£ç æ ŒåŒïŒåè¿ç§å𿫿è¡çç¥åºæ¬å°±æ¯âæ¿æ°æ® â 对éœäº€ææ¥ â ç®æ¶çâã äžã䞺ä»ä¹äŒ ç»æ¹åŒåéè¡çç¥è¿ä¹çŽ¯ïŒ æååŒå§åéåçæ¶åïŒä¹ç¹å«å欢è¿ç§å¬èµ·æ¥âåŸæéçâç亀æè§åŸã æ¯åŠïŒ âåšäºèµéäžæ¿ææè¡ïŒæä»¥åšäžå®¹æé«åŒãâ æè
ïŒ âåšæ«ææ¶æ¯åºæ¿ïŒæä»¥åšäºä¹°å
¥ãåšäžååºå¯ä»¥å溢价ãâ å¬èµ·æ¥äžäžªæ¯äžäžªæéçã äœçæ£æå®åæåæµçšåºä»¥åïŒæåªèœè¯ŽïŒ æ
äºåœæ
äºïŒæ°æ®åœæ°æ®ã æéº»çŠçåŸåŸè¿äžæ¯çç¥é»èŸïŒèæ¯æ°æ®ã 以ååè¿ç§æµè¯ïŒç»åžžäŒéå°å 䞪é®é¢ïŒ 1. å岿°æ®æ¿èµ·æ¥éº»çŠ äœ éèŠå
è§£å³ïŒ è¡ç¥šä»£ç æä¹ç»äžïŒ æ¥ææä¹èœ¬æ¢ïŒ åçæä¹åïŒ åšäºååšäžæ¯äžæ¯è¿ç»äº€ææ¥ïŒ 逿逿¯æä¹å€çïŒ è¿åæ°æ®å°åºæ¯äžæ¯ DataFrameã çæ£åŒå§åçç¥åïŒäŒåç°è¿äºâææŽ»âæ¯çç¥æ¬èº«è¿çŠã 2. å€ææ°æ®å€çåŸå®¹æèž©å åŠæçŽæ¥æ¿åå§ä»·æ Œè®¡ç®é¿ææ¶çïŒéå°å红ãéè¡ãæåçæ
åµïŒç»æå¯èœå€±çã QuantDash ç K 线æ¥å£æ¯æïŒ forward backward none forward_additive backward_additive å
¶äžå倿é»è®€å°±æ¯ forwardïŒæ¯äŸå€æéåè®¡ç®æ¶ççã æä»¥æåè¿ç§å岿¶ççæµè¯æ¶ïŒäžè¬äŒæç¡®åïŒ adjust="forward" èäžæ¯è®©å€æé®é¢å·å·æ··è¿åæµç»æã 3. æå®¹æç¯çéè¯¯ïŒæåšæ«åœæäž€äžªèªç¶æ¥ è¿æ¯æ°æç¹å«å®¹æèž©çåã æ¯åŠïŒ åšäº â åšå
â åšæ¥ â åšäž äœ äžèœç®åçè§£æïŒ df.shift(-3) å 䞺 A è¡çç¥é¢å¯¹çæ¯äº€ææ¥ïŒäžæ¯èªç¶æ¥ã æä»¥æ£ç¡®æè·¯åºè¯¥æ¯ïŒ å
æç
§äº€ææ¥æåºïŒåæŸå°åšäºïŒç¶åå®äœå®ä¹åç第äžäžªäº€ææ¥ã äºãè§£å³æ¹æ¡å¯¹æ¯ïŒQuantDash vs äŒ ç»æ°æ®è·åæ¹åŒ è¿éæäžè¯ä»·äžåæ°æ®æå¡åœåå
·äœå¥é€ïŒèæ¯ä»æèªå·±åéåçç¥æ¶æå
³å¿çç åæµçšæ¥æ¯èŸã 对æ¯ç»ŽåºŠ äŒ ç»/ç«åæ¹æ¡ïŒåŠ Tushare/AkShare/æåšç¬è«ïŒ QuantDash è§£å³æ¹æ¡ æ°æ®è·å ç»åžžéèŠå€çæ¥å£ãåæ®µåæ°æ®æž
æŽé®é¢ Python SDK çŽæ¥è·å K 线 䜿çšéšæ§ åŸåŸéèŠé¢å€å€çæ°æ®è·åæµçš pip install quantdashå³å¯æ¥å
¥ è·šåžåºæ¯æ äžåæ°æ®æºä»£ç æ ŒåŒå¯èœäžå ç»äž.SH/.SZ/.BJ/.US/.HK æ°æ®æ ŒåŒ ç»åžžéèŠèªå·±èœ¬æ¢ åçæ¯æ Pandas DataFrame 倿å€ç éèŠé¢å€èè倿é»èŸ K 线æ¥å£çŽæ¥æ¯æadjust æ¹éåæµ éèŠèªå·±è®Ÿè®¡æ¹éè¯·æ± klines.batch()æ¯ææ¹éè·å çç¥ç å æ°æ®åå€å·¥äœå æ¯èŸé« å¯ä»¥çŽæ¥è¿å
¥çç¥é»èŸ QuantDash å®çœç®åæç¡®æäŸ A è¡ãçŸè¡ã枯è¡è¡æ
ïŒå¹¶æäŸ Python SDKãDataFrame 蜬æ¢åæ¹é请æ±èœåã äžãPython 代ç 宿ïŒçŽæ¥åæµâåšäºä¹°å
¥ãåšäžååºâ å
å®è£
ïŒ pip install quantdash 宿¹ SDK æ¯æ Python 3.9+ïŒAPI Key ä¹å¯ä»¥éè¿ QUANTDASH_API_KEY ç¯å¢åéé
眮ã äžé¢è¿ä»œä»£ç ïŒæäžéšæé»èŸååŸç®åäžç¹ã æ žå¿å®ä¹ïŒ åšäºæ¶çä¹°å
¥ïŒäžäžäžªäº€ææ¥ååºã è¿éçšâäžäžäžªäº€ææ¥âæ¥å®ä¹åšäžïŒèäžæ¯æ»åæ¥æå 3 倩ã from quantdash import QuantDash import pandas as pd # ========================= # 1. åå§å QuantDash # ========================= # æšè䜿çšç¯å¢åéïŒ # export QUANTDASH_API_KEY="your_api_key" qd = QuantDash() # ä¹å¯ä»¥çŽæ¥ïŒ # qd = QuantDash(api_key="your_api_key") # ========================= # 2. è·åå岿¥K # ========================= symbol = "600519.SH" df = qd.klines.get( symbol, period="1d", adjust="forward", # å倿ïŒçšäºæ¶ççè®¡ç® count=1000, to_dataframe=True ) # ç¡®ä¿æç
§äº€ææ¥æåº df["trade_date"] = pd.to_datetime(df["trade_date"]) df = df.sort_values("trade_date").reset_index(drop=True) # ========================= # 3. æŸåºåšäº # ========================= # pandas weekday: # Monday=0 ... Friday=4 df["weekday"] = df["trade_date"].dt.weekday friday_idx = df.index[df["weekday"] == 4] # ========================= # 4. åšäºæ¶ç -> äžäžäº€ææ¥ # ========================= results = [] for idx in friday_idx: # åŠæåšäºå·²ç»æ¯æåäžæ ¹K线ïŒå°±æ²¡æäžäžäº€ææ¥ if idx + 1 >= len(df): continue buy_row = df.iloc[idx] sell_row = df.iloc[idx + 1] buy_price = buy_row["close"] sell_price = sell_row["close"] ret = sell_price / buy_price - 1 results.append({ "buy_date": buy_row["trade_date"], "sell_date": sell_row["trade_date"] if False else sell_row["trade_date"], "buy_price": buy_price, "sell_price": sell_price, "return": ret }) result = pd.DataFrame(results) # ========================= # 5. ç»è®¡åæµç»æ # ========================= if len(result) > 0: win_rate = (result["return"] > 0).mean() avg_return = result["return"].mean() cumulative_return = (1 + result["return"]).prod() - 1 print("========== åšäºä¹°å
¥ / äžäžäº€ææ¥ååº ==========") print(f"äº€ææ¬¡æ°ïŒ{len(result)}") print(f"èçïŒ{win_rate:.2%}") print(f"å¹³å忬¡æ¶çïŒ{avg_return:.2%}") print(f"å€å环计æ¶çïŒ{cumulative_return:.2%}") print("\næè¿10次亀æïŒ") print( result.tail(10).to_string(index=False) ) 泚æäžäžªéåžžéèŠçå°æ¹ äžé¢ä»£ç å®é
äžéªè¯çæ¯ïŒ åšäºæ¶ç â äžäžäžªäº€ææ¥æ¶ç ä¹å°±æ¯æŽå®¹æç𿥠K äž¥æ Œå®ä¹ççæ¬ã åŠæäœ æ³æµè¯çæ¯ïŒ åšäºæ¶ç â åšäžåŒç é£ä¹é»èŸåºè¯¥æ¹æïŒ buy_price = buy_row["close"] sell_price = sell_row["open"] ret = sell_price / buy_price - 1 è¿äž€äžªçç¥åäžäžèŠæ··äžºäžè°ã äžäžªæµè¯çæ¯ïŒ åšæ«æè¡å°åšäžæ¶ç åŠäžäžªæµè¯çæ¯ïŒ åªååšäžåŒçç跳空æ¶ç ç»æå¯èœå®å
šäžåã åãä»ååªè¡ç¥šåçº§å° A è¡æ¹éåæµ åŠæåªæµè¯è޵å·è
å°ïŒå
¶å®è¯Žæäžäºå€ªå€é®é¢ã çæ£æææçæ¯ïŒ æŽäžª A è¡åžåºïŒåšäºä¹°å
¥åšäžååºïŒå°åºææ²¡æç»è®¡äŒå¿ïŒ QuantDash æ¯æ A è¡æ çæ± CN_StockïŒä¹æ¯æ klines.batch() æ¹éè·åå€åªæ çåå² K 线ã宿¹ç€ºäŸäžå°±æ¯éè¿ klines.batch() åæ¶è¯·æ±å€äžªè¡ç¥šã äŸåŠïŒ from quantdash import QuantDash qd = QuantDash() symbols = [ "600519.SH", "000001.SZ", "000858.SZ" ] dfs = qd.klines.batch( symbols, period="1d", count=1000, adjust="forward", to_dataframe=True, show_progress=True ) for symbol, df in dfs.items(): print(f"\n===== {symbol} =====") print( df[ [ "trade_date", "open", "close", "volume" ] ].tail() ) è¿æ ·åçå¥œå€æ¯ïŒ å
ææ°æ®å·¥çšçé®é¢è§£å³æïŒåæç²ŸåæŸå°çç¥ç ç©¶äžã äºã亀æåé¿åæåïŒè¿äžªçç¥æå®¹æåšåªéâäœåŒâïŒ å 1ïŒäžèŠäœ¿çšæªæ¥æ°æ® æ¯åŠäœ åšåšäºæ¶çä¹åå³å®ïŒ âè¿åªè¡ç¥šåšäºæ¶çåç¬Šåæ¡ä»¶ïŒæä»¥æåšäºä¹°ãâ è¿æ¬èº«å°±æé®é¢ã åŠæäœ çéè¡æ¡ä»¶çšäºïŒ åšäºæ¶çä»· åšäºæäº€é åšäºæ¶çåçææ é£ä¹çå®äº€æäžïŒäœ è³å°éèŠæç¡®èªå·±æ¯åšä»ä¹æ¶åäžåã åŠæå®ä¹äžºïŒ åšäºæ¶çæäº€ é£ä¹çç¥ä¿¡å·å¿
é¡»åšå
è®žçæ¶éŽç¹äº§çã åŠååŸå®¹æåºç°å
žåçæªæ¥åœæ°ã å 2ïŒåå€æäžæ¯äžèœç å倿éåžžéååå岿¶ççç ç©¶ïŒäœäžèŠå æ€è®€äžºïŒ âåå€æä»·æ Œå°±æ¯åœæ¶çå®æäº€ä»·æ Œãâ å®è§£å³çæ¯ä»·æ Œåºå坿¯æ§é®é¢ã çå®åæµè¿åºè¯¥è¿äžæ¥èèïŒ äº€æææ¬ïŒ æ»ç¹ïŒ æ¶šè·åïŒ åçïŒ å®é
æäº€æ¶éŽã æä»¥æå»ºè®®ïŒ 第äžçå
éªè¯çç¥ææ²¡æç»è®¡äŒå¿ïŒç¬¬äºçåå å
¥äº€æææ¬ã å 3ïŒäžèŠçå°èç 55% å°±æ¿åš åè®Ÿç»æïŒ äº€ææ¬¡æ°ïŒ1000 èçïŒ55% å¹¶äžä»£è¡šè¿äžªçç¥èµé±ã è¿å¿
é¡»çïŒ å¹³åæ¶ç äºæå¹
床 çå©å¹
床 æå€§åæ€ çŽ¯è®¡æ¶ç äº€æææ¬ äžäžªèç 70% ççç¥ïŒä¹å¯èœå 䞺å¶å°åºç°å 䞪倧äºèæç»äºé±ã æä»¥æåçç¥æ¶æŽå
³å¿ïŒ æ¶çååžïŒèäžæ¯åç¬çèçã å
ãåžžè§é®é¢è§£çïŒQ&A / FAQïŒ Q1ïŒA è¡åšäºä¹°å
¥åšäžååºççèµé±åïŒ AïŒäžèœå
å
¥äžºäž»å°è¯Žèµé±ã æ£ç¡®çæ¡åºè¯¥æ¯ïŒ é对æç¡®çè¡ç¥šæ± ãæ¶éŽåºéŽåæäº€å®ä¹è¿è¡åå²åæµã QuantDash å¯ä»¥éè¿ klines.get() è·åæ¥ KïŒå¹¶äœ¿çš adjust="forward" è·ååå€ææ°æ®ïŒåçš Pandas 计ç®åšäºå°äžäžäº€ææ¥çæ¶çã宿޿¥å£å¯ä»¥æ¥çQuantDash 宿¹ Python SDK ææ¡£ã Q2ïŒPython æä¹æå A è¡åå² K çº¿ïŒ AïŒå®è£
ïŒ pip install quantdash ç¶åïŒ from quantdash import QuantDash qd = QuantDash() df = qd.klines.get( "600519.SH", period="1d", count=1000, adjust="forward", to_dataframe=True ) è¿åç»æå¯ä»¥çŽæ¥è¿å
¥ Pandas åæµæµçšã宿¹ææ¡£æäŸäºå®æŽçåæ°åæ°æ®æ ŒåŒè¯Žæã Q3ïŒQuantDash èœäžèœæ¹éåæµå€åª A è¡ïŒ AïŒå¯ä»¥éè¿ qd.klines.batch() æ¹éè·åå€åªæ ç K 线ïŒåç± Pandas ç»äžè®¡ç®çç¥æ¶çãå¯¹äº A è¡å
šåžåºç ç©¶ïŒè¿å¯ä»¥äœ¿çš CN_Stock æ çæ± è·åå
šåžåºè¡æ
ã ð çžå
³èµæºäžå»¶äŒžé
读 ð QuantDash å®çœïŒhttps://quantdash.net/ ð 宿¹ Python SDK ææ¡£ïŒhttps://docs.quantdash.net/ â GitHub åŒæºé¡¹ç®ïŒQuantDash GitHub åŒæºä»åº GitHub ä»åºç®åæäŸå®æ¹ Python 瀺äŸãå¿«éåŒå§ä»£ç åæµè¯çå
容ïŒSDK æ¬èº«éè¿ PyPI ååã ð¡ API KeyïŒQuantDash æ§å¶å° åšéå亀æçç¥ç åäžïŒåéçº§æ°æ®æ¯è¿æ¥âå®è§æ¥çº¿âäžâ埮è§éç¬âçå
³é®æ¡¥æ¢ãæ¬æä»¥é»çŒæ°æ®å¹³å°äžºäŸïŒç³»ç»è®²è§£åŠäœé«ææ¹éè·å宿¶åéæ°æ®ïŒä»æ¥å£è°çšå°æ°æ®å€çïŒæææåžŠäœ æå»ºæ°æ®æµæ°Žçº¿ã åŒèšïŒäžºä»ä¹åéæ°æ®æ¯éåçç¥çâé»éç²åºŠâïŒ æ¥çº¿æ°æ®é¢ç²åºŠå€ªç²ïŒæ æ³ææçäžçè¶å¿å¯åšäžå蜬ïŒTick级éç¬æ°æ®åè¿äºç»ç¢ïŒåžŠæ¥é«æçååšäžè®¡ç®ææ¬ãåéçº§æ°æ®æ°å¥œå€äºäž€è
ç平衡ç¹ââæ¢èœç²Ÿååæ çäžèµ°å¿ïŒåæ éå€æçæ°æ®æž
æŽïŒæ¯éååæµäžå®ççç¥çâé»éç²åºŠâã åéçº§æ°æ®çæ žå¿ä»·åŒäœç°åšäžäžªæ¹é¢ïŒ ä»·åŒç»ŽåºŠ 诎æ åæµæŽçå® ææçäžçè¶å¿å¯åšäžå蜬ïŒé¿å
æ¥çº¿ä¿¡å·çæ»å ææ æŽçµæ åé级å线ãMACDçèœæŽå¿«ååºä»·æ Œåå éä»·åææŽç²Ÿç» æž
æ°è§å¯èµéåšåé级å«çæµå
¥æµåº æ¬æä»¥é»çŒæ°æ®å¹³å°ïŒhttp://www.fxyz.siteïŒäžºäŸïŒä»æ¥å£è°çšãæ¹éå¹¶åãæ°æ®å€çå°å®æåºçšïŒç³»ç»è®²è§£åŠäœé«æè·åå¹¶å©çšå®æ¶åéæ°æ®ã äžãé»çŒæ°æ®å¹³å°ïŒåéæ°æ®æºçäŒå¿è§£æ é»çŒæ°æ®æ¯äžäžçéèæ°æ®APIå¹³å°ïŒåšåéçº§æ°æ®æ¹é¢å
·å€ä»¥äžæŸèäŒå¿ïŒ text âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â é»çŒæ°æ®å¹³å°åéæ°æ®äŒå¿ â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ†â â
æ°æ®æºå
šé¢å级 ââ æ²ªæ·±Aè¡å®æ¶åéæ°æ®æºå·²å级 â â â
å€ç»ŽåºŠæ°æ®èŠç ââ åéK线+宿¶è¡æ
+èµéæµåç â â â
çµæŽ»æ¥å
¥æ¹åŒ ââ HTTPæå + WebSocketæšé â â â
æ ååè¿åç»æ ââ åæ®µæž
æ°ïŒæ¶éŽæ³è§è â â â
å
šåžåºèŠç ââ æ²ªæ·±äº¬+ææ°+ETF+å¯èœ¬åº â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ å¹³å°åºç¡URL䞺 http://api.fxyz.siteïŒææAPIè¿åJSONæ ŒåŒæ°æ®ïŒæ¯æè¡ç¥šãææ°ãETFãå¯èœ¬åºçå€åç§ã äºãåéK线æ¥å£è¯Šè§£ 2.1 æ¥å£å°åäžåæ° é»çŒæ°æ®åéK线æ¥å£çæ žå¿ä¿¡æ¯åŠäžïŒ é¡¹ç® è¯Žæ æ¥å£å°å http://api.fxyz.site/wolf/time/kline è¯·æ±æ¹åŒ GET è¿åæ ŒåŒ JSON 请æ±åæ°ïŒ åæ°å ç±»å å¿
å¡« 诎æ symbol String æ¯ è¡ç¥šç±»å«ïŒåŠstock code String æ¯ è¡ç¥šä»£ç ïŒåŠ000001 period String æ¯ åéåšæïŒ1m/5m/15m/30m/60m cq String æ¯ å€ææ¹åŒïŒ1=äžå€æïŒ2=å倿ïŒ3=å倿 startDate String æ¯ åŒå§æ¥æïŒåŠ2026-03-01 endDate String æ¯ ç»ææ¥æïŒåŠ2026-03-27 token String æ¯ å¹³å°API TokenïŒç»åœçœç«è·åïŒ 2.2 è¿ååæ®µè¯Žæ é»çŒæ°æ®åéK线æ¥å£çè¿ååæ®µäžéååæé«åºŠå¥åïŒæ éé¢å€éåœåå³å¯çŽæ¥äœ¿çšïŒ åæ®µ å«ä¹ éååºçš t æ¶éŽæ³ ç»äžæ¶éŽèœŽïŒçšäºå¯¹éœåçŽ¢åŒ o åŒçä»· 计ç®åéçº§å«æ¶šè·å¹
h æé«ä»· åææ³¢åšåºéŽãé»åäœ l æäœä»· åææ¯æäœ c æ¶çä»· æ žå¿ä»·æ ŒåºåïŒçšäºææ è®¡ç® v æäº€éïŒæïŒ éä»·é
ååæ a æäº€é¢ïŒå
ïŒ èµéæµåçåºç¡ pc æšæ¶ä»· è®¡ç®æ¶šè·å¹
åºå äžãå®æïŒæ¹éè·ååéæ°æ® 3.1 ååªè¡ç¥šåéæ°æ®è·å 以äžä»£ç æŒç€ºåŠäœè·åå¹³å®é¶è¡ïŒ000001ïŒ2026幎3æå
šæç1åéKçº¿æ°æ®ïŒ python import requests import pandas as pd API_TOKEN = "your_blackwolf_token" # æ¿æ¢äžºäœ çtoken url = "http://api.fxyz.site/wolf/time/kline" params = { "symbol": "stock", "code": "000001", "period": "1m", "cq": "1", "startDate": "2026-03-01", "endDate": "2026-03-27", "token": API_TOKEN } resp = requests.get(url, params=params) data = resp.json() # 蜬æ¢äžºDataFrameïŒçŽæ¥çšäºéååæ df = pd.DataFrame(data) df['t'] = pd.to_datetime(df['t']) # æ¶éŽå蜬æ¢äžºdatetimeæ ŒåŒ print(df.head()) è¿åæ°æ®ç€ºäŸïŒ t o c h l v a pc 2026-03-01 11.15 11.12 11.21 11.11 804741 896712400 11.19 2026-03-02 11.12 11.18 11.20 11.10 912345 987654321 11.12 3.2 æ¹éå€è¡ç¥šå¹¶åè·å â åšå€è¡ç¥šçç¥ç åäžïŒäž²è¡è·åå€åªè¡ç¥šæ°æ®æçæäœãæšè䜿çšçº¿çšæ± å¹¶åæåïŒå€§å¹
çŒ©çæ°æ®å倿¶éŽïŒ python import requests import pandas as pd from concurrent.futures import ThreadPoolExecutor, as_completed API_TOKEN = "your_blackwolf_token" def fetch_minute_data(code, start_date, end_date, period="1m"): """è·åååªè¡ç¥šçåéæ°æ®""" url = "http://api.fxyz.site/wolf/time/kline" params = { "symbol": "stock", "code": code, "period": period, "cq": "1", "startDate": start_date, "endDate": end_date, "token": API_TOKEN } resp = requests.get(url, params=params) df = pd.DataFrame(resp.json()) df['t'] = pd.to_datetime(df['t']) df['code'] = code # æ·»å è¡ç¥šä»£ç å return df # æ¹éè·åå€åªè¡ç¥š stock_codes = ["000001", "600519", "000858", "600036", "000333"] start_date = "2026-09-01" end_date = "2026-09-09" all_data = {} with ThreadPoolExecutor(max_workers=5) as executor: futures = { executor.submit(fetch_minute_data, code, start_date, end_date): code for code in stock_codes } for future in as_completed(futures): code = futures[future] try: all_data[code] = future.result() print(f"â
{code} æ°æ®è·åæåïŒå
± {len(all_data[code])} æ¡") except Exception as e: print(f"â {code} è·å倱莥: {e}") # åå¹¶æææ°æ® df_all = pd.concat(all_data.values(), ignore_index=True) print(f"æ»è®¡è·å {len(df_all)} æ¡åéæ°æ®") 3.3 WebSocketæšéïŒå®æ¶åºæ¯çæäŒè§£ 对äºéèŠçäžå®æ¶çæ§ãä¿¡å·è§Šåççç¥ïŒé»çŒæ°æ®æäŸWebSocketæ¹åŒïŒæ°æ®å»¶è¿æŽäœïŒäžæ éé¢ç¹èœ®è¯¢ã äžåéååºæ¯çæŽæ°çç¥å»ºè®®ïŒ éååºæ¯ æšèæ¹åŒ 诎æ åå²åæµ HTTPäžæ¬¡æ§æ¹éæå ä¿è¯æ°æ®å®æŽæ§ïŒçŠ»çº¿è¿è¡ è¡æ
å¯è§å æ¯åé蜮询æåææ°æ¡ ç®åå®ç°ïŒæ»¡è¶³å±ç€ºéæ± å®æ¶çç¥ WebSocketæšé æäœå»¶è¿ïŒéé
å®çä¿¡å·è§Šå åãåéæ°æ®å€ççæ žå¿æå·§ 4.1 æ¶éŽå¯¹éœïŒè§£å³æ°æ®çŒºå€±é®é¢ â åéçº§æ°æ®æåžžè§ççç¹æ¯æ¶éŽæ³çŒºå€±ïŒéäº€ææ¶æ®µãèåæ¥ãæ°æ®è¿æ»€çïŒïŒå¯ŒèŽæ¶éŽèœŽäžè¿ç»ïŒåœ±åææ è®¡ç®ã æäŒè§£å³æ¹æ¡ïŒ æ ¹æ®Aè¡äº€ææ¶éŽïŒ9:30-11:30ã13:00-15:00ïŒçæå®æŽçåé级æ¶éŽåºå å°å®é
è·åçæ°æ®äžå®æŽæ¶éŽåºåè¿è¡å·Šè¿æ¥ïŒmergeæreindexïŒ å¯¹çŒºå€±çä»·æ Œåæ®µäœ¿çšååå¡«å
ïŒffillïŒïŒå¯¹æäº€éãæäº€é¢çŒºå€±åŒå¡«å
0 python import pandas as pd def align_minute_data(df): """对åéæ°æ®è¿è¡æ¶éŽå¯¹éœ""" # çæå®æŽçäº€ææ¶éŽåºåïŒ9:30-11:30, 13:00-15:00ïŒ trading_hours = pd.date_range( start=df['t'].min().replace(hour=9, minute=30), end=df['t'].max().replace(hour=15, minute=0), freq='1min' ) # è¿æ»€éäº€ææ¶æ®µ trading_hours = trading_hours[ ((trading_hours.hour >= 9) & (trading_hours.hour < 11) & (trading_hours.minute >= 30)) | ((trading_hours.hour >= 13) & (trading_hours.hour < 15)) ] # å¯¹éœæ°æ® df_full = df.set_index('t').reindex(trading_hours) # ååå¡«å
ä»·æ ŒïŒæäº€éå¡«0 df_full[['o', 'h', 'l', 'c', 'pc']] = df_full[['o', 'h', 'l', 'c', 'pc']].fillna(method='ffill') df_full[['v', 'a']] = df_full[['v', 'a']].fillna(0) return df_full.reset_index().rename(columns={'index': 't'}) 对éœåçæ°æ®æ¶éŽèœŽè¿ç»ïŒå¯çŽæ¥çšäºææ¯ææ 计ç®ã 4.2 åéçº§ææ¯ææ è®¡ç® åºäºå¯¹éœåçåéæ°æ®ïŒå¯å¿«é计ç®åç±»ææ¯ææ ïŒ python # 计ç®5åéå线 df['MA5'] = df['c'].rolling(window=5).mean() # 计ç®MACD exp1 = df['c'].ewm(span=12, adjust=False).mean() exp2 = df['c'].ewm(span=26, adjust=False).mean() df['MACD'] = exp1 - exp2 df['Signal'] = df['MACD'].ewm(span=9, adjust=False).mean() äºãå
šæµçšæ¶ææ»ç» text âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â æ¹éè·å宿¶åéæ°æ® ââ å
šæµçšæ¶æ â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ†â â â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â â â æ°æ®è·åå± â â â â ââââââââââââââââ ââââââââââââââââ â â â â â HTTPæå â â WebSocketæšéâ â â â â â åå²åæµ â â 宿¶çç¥ â â â â â ââââââââââââââââ ââââââââââââââââ â â â â â â â â â â âââââââââââââââââââââââââââââââââââââââââââââââââââ â â â â â é»çŒæ°æ® APIïŒåéK线æ¥å£ïŒ â â â â â â http://api.fxyz.site/wolf/time/kline â â â â â âââââââââââââââââââââââââââââââââââââââââââââââââââ â â â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â â â â â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â â â æ°æ®å€çå± â â â â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â â â â â å¹¶åæ¹éæå âââ æ¶éŽå¯¹éœ âââ ææ è®¡ç® â â â â â â (ThreadPool) â â (ffill/0å¡«å
)â â (MA/MACDç) â â â â â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â â â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â â â â â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â â â ååšäžåºçšå± â â â â ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ â â â â â CSV â â SQLite â âPostgreSQLâ â åæµ/å®ç â â â â â ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ â â â ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ æ žå¿èŠç¹éè®°ïŒ åºå· èŠç¹ 诎æ â æ¥å£å°å http://api.fxyz.site/wolf/time/kline â¡ æ žå¿åæ° codeïŒè¡ç¥šä»£ç ïŒ+ periodïŒåšæïŒ+ tokenïŒè®€è¯ïŒ ⢠æ¹éæå·§ 䜿çšThreadPoolExecutor å¹¶åæåå€åªè¡ç¥š ⣠æ¶éŽå¯¹éœ çæå®æŽäº€ææ¶éŽåºå + ååå¡«å
çŒºå€±åŒ â€ åºæ¯éå åå²åæµçšHTTPïŒå®æ¶çç¥çšWebSocket â¥ æ°æ®ååš ç ç©¶çšCSVïŒç产ç¯å¢çšPostgreSQLææ¶åºæ°æ®åº çéšåžå
7倩çéš
30倩çéš
å幎çéš