
qstock由「Python金融量化」公眾號開發,試圖打造成個人量化投研分析開源庫,目前包括數據獲取(data)、可視化(plot)、選股(stock)和量化回測(backtest)四個模塊。其中數據模塊(data)數據來源於東方財富網、同花順、新浪財經等網上公開數據。qstock致力於為用戶提供更加簡潔和規整化的金融市場數據接口。可視化模塊基於plotly.express和pyecharts包,為用戶提供基於web的交互圖形簡單操作接口;選股模塊提供了同花順的技術選股和公眾號策略選股,包括RPS、MM趨勢、財務指標、資金流模型等,回測模塊為大家提供向量化(基於pandas)和基於事件驅動的基本框架和模型。
qstock目前在pypi官網上發布,開源第一版本為1.1.0,目前更新至1.3.3。讀者第一次安裝,可以直接在cmd上輸入「pip install qstock 」進行安裝,如已安裝舊版本,需要通過』pip install –upgrade qstock』進行更新。
GitHub地址:https://github.com/tkfy920/qstock。
目前部分策略選股和策略回測功能僅供知識星球會員使用,會員可在知識星球置頂帖子上上獲取qstock-vip-1.3.3.tar.gz (強化版)安裝包,將安裝包放在工作路徑下輸入』pip install qstock-vip-1.3.3.tar.gz』進行離線安裝。
更新後的最新版本qstock 1.3.3,所有接口函數(包括可視化plot、選股stock)均可通過qstock調用,即先導入import qstock as qs,然後使用qs.xxx,xxx為對應接口函數,如qs.kline(df)畫K線圖,qs.get_data(『代碼』)獲取數據。


#導入qstock包importqstockasqs
獲取某市場交易標的代碼和名稱。
market表示行情名稱或列表,默認滬深A股;'滬深京A':滬深京A股市場; '滬深A':滬深A股市場;'滬A':滬市A股市場;'深A':深市A股市場;北A :北證A股市場;'可轉債':滬深可轉債市場;'期貨':期貨市場;'創業板':創業板市場行情;'美股':美股市場;'港股':港股市場;'中概股':中國概念股市場;'新股':滬深新股市場;'科創板':科創板市場;'滬股通' 滬股通市場;'深股通':深股通市場;'行業板塊':行業板塊市場;'概念板塊':概念板塊市場;'滬深指數':滬深系列指數市場;'上證指數':上證系列指數市場;'深證指數':深證系列指數市場;'ETF' ETF基金市場;'LOF' LOF 基金市場

codes=qs.get_code()#查看前幾行代碼codes[:5]['300392','300123','300288','301132','300890']names=qs.get_name()#查看前幾行代碼names[:5]['*ST騰信','亞光科技','朗瑪信息','滿坤科技','翔豐華']#獲取滬深A股市場名稱代碼字典name_code=qs.get_name_code()#獲取ETF基金市場名稱代碼字典name_code=qs.get_name_code(market='ETF')
get_index_data(code_list, start='19000101', end=None, freq='d')獲取多個指數收盤價數據(截面數據)
get_index_price(code_list,start='19000101', end=None, freq='d')
code_list:指數代碼(多個指數代碼的list),其他參數與個股get_data類似

#獲取滬深指數代碼index_code=qs.get_code('滬深指數')#獲取前兩個指數數據#qs.get_index_data(index_code[:2])#獲取前10個指數價格數據df=qs.get_index_price(index_code[:10])df.tail()
關於qstock的數據、可視化、選股等詳細教程請參閱以下推文:
【qstock開源了】數據篇之行情交易數據
【qstock數據篇】行業概念板塊與資金流
【qstock量化】數據篇之股票基本面數據
【qstock量化】數據篇之宏觀指標和財經新聞文本
【qstock量化】動態交互數據可視化
【qstock量化】技術形態與概念熱點選股池

選股涉及兩個方面,一是公司分析,包括財務狀況、發展潛力和成長性等,這方面是俗稱的基本面分析,可以參考的資料已經汗牛充棟;二是股票分析(包括股價技術形態分析)。
股票分析主要回答三個問題:
(1)如何判斷一隻股票有投資價值?
(2)如何從股票池中選出符合自己認為有價值的股票?
(3)選出合適的股票後如何構建投資組合併動態調整?
總體思維:多層次多角度分析
多角度保證在市場大方向上看對的正確率儘可能增加,多層次可以和多角度相互驗證,獲取超額收益。通過自上而下的分析框架確定投資方向,選擇符合投資方向的最優標的。
定義選股函數。主要基於價格和成交量的在時間周期上的走勢突破,具體參數可根據個人風險偏好和經驗修改。
importsignalfromtqdmimporttqdmfromfunc_timeoutimportfunc_set_timeoutimportmultitaskingsignal.signal(signal.SIGINT,multitasking.killall)deffind_price_vol_stock(data,n=60,rr=0.5):up_list=[]codes=data['code'].unique()pbar=tqdm(total=len(codes))@multitasking.task@func_set_timeout(5)defrun(code):df=data[data.code==code]close=df['close']vol=df['volume']#價格突破前n日新高pn=close[-n:]p=close.iloc[-1]#當前價格p0=close[-n:-3].min()#前n-3日最低價p1=close[-n:-3].max()#前n-3日最高價#n日期間價格最大回撤md=((pn.cummax()-pn)/pn.cummax()).max()#n日期間內價格回測不超過50%#歐奈爾設置為12%-15%,最高33%,牛市中可設置40%-50%c1=md<rrc2=close[-n:-3].idxmax()<close[-n:-3].idxmin()#價格突破#從低點到當前股價上漲幅度至少在30%以上c3=p/p0-1>0.3c4=p1<p<p1*(1+rr)#近期成交量平均放大兩倍以上c5=vol[-5:].mean()/vol[-n:-5].mean()>2.0c=c1&c2&c3&c4&c5ifc:up_list.append(code)else:passpbar.update()forcodeincodes:try:run(code)except:continuemultitasking.wait_for_tasks()returnup_liststocks=find_price_vol_stock(all_data,n=60,rr=0.5)選股結果。
stocks['001318','300755','600458','002669','300848','002059','002561','603000','600506','601698']K線走勢可視化。
qs.HA_kline(qs.get_data(stocks[0]))注意:以下策略選股功能僅供知識星球會員使用,即qstock-vip-1.3.3.tar.gz (強化版)安裝包才有下面的選股函數可以調用。
RPS(歐奈爾中文書是RS),即股票股價走勢橫截面(與市場其他個股對比)相對強弱,本質是動量策略。一般建議將RPS價格動量結合公司基本面進行選股。
股價相對強度RPS評級:衡量某一股票在過去n日內(如120、250)內相對股市中其他股票的表現(收益率)。市場上的每一隻股票都被指定了1-99範圍內的某一數值,99代表相對強度最高,RS值為99,說明該股票在收益率表現方面比其他99%的公司更為優秀。尋找真正的領軍股,避免上漲滯後和跟風股。歐奈爾建議選擇RPS值80或90以上(二八法則),價格形態合適的股票。一旦大盤下跌徹底結束,最先反彈到價格新高的股票基本上就是要尋找的真正領軍股。普通股票的突破行為會持續約13周,而最優秀的股票通常在前3周或前4周就突破出來。注意,根據價格形態選股有失敗的可能,一旦股價低於買入價的10%,立即賣出止損。

#獲取滬深全市場A股codes=qs.get_code()#獲取滬深全市場A股2020年以來後復權價格數據prices=qs.get_price(code_list=codes,start='20200101',fqt=2)
計算rps排序。
rps=qs.RPS(prices)df_rps=rps.date_rps()#使用RPS大於90以上選股,可以將股票池從幾千隻縮小成幾百隻#再結合公司基本面進一步選股len(df_rps[df_rps.rps_120>90])495rps.plot_stock_rps('寶明科技')藉助RPS相對強弱指標可以選擇出中短期強勢股
df_rps.sort_values('rps_20',ascending=False)[:10]
#根據5或20日篩選短期強勢股250日RPS大於90股票池
rps_result=df_rps.query('rps_250>90')print(f'120日RPS大於90個股數量:{len(rps_result)}')120日RPS大於90個股數量:495其中MM趨勢參考文章:
https://zhuanlan.zhihu.com/p/165379657。
股票價格高於150天均線和200天均線
150日均線高於200日均線
200日均線上升至少1個月
50日均線高於150日均線和200日均線
股票價格高於50日均線
股票價格比52周低點高30%
股票價格在52周高點的25%以內
相對強弱指數(RS)大於等於70,這裡的相對強弱指的是股票與大盤對比,RS = 股票1年收益率 / 基準指數1年收益率。將最後一條去掉,改成結合RPS的相對強弱選股,選擇rps_120大於90的個股。


根據上述價格技術指標篩選後滿足條件的個股數量仍較多,這時可以結合公司基本面進一步選股。
某段時間內的資金流向反映了股票供求關係,而傳統的量價無法區分市場微觀結構的流動性和私有信息對股價的影響。資金流向及價格走勢可以分為四種基本狀況:
價格上升,同時單位時間內資金主動性淨流入:這種情況下屬於強勢,未來價格繼續上升概率更大;
股價上升,同時單位時間內資金主動性淨流出:這種情況下屬於中強勢,未來價格繼續上升的速度大幅減弱;
股價下跌,同時單位時間內資金主動性淨流入:這種情況下屬於弱勢,未來價格繼續下跌概率更大;
股價下跌,同時單位時間內資金主動性淨流出:這種情況下屬於中弱勢,未來價格繼續下跌的速度大幅減弱;
資金流向的計算有兩種算法:一是如果當前單子的成交價是以對手價或超價成交的,買入成交價 >= 賣一價,代表買家更願意以較高的價格完成交易,即計入資金主動性流入;二是如果當前成交價格 > 上次成交價格,那麼可以理解為,當前的成交量主動推升了價格的上漲,即計入資金主動性流入。
對於強勢股而言,最近周期內主力資金累計淨流入應為正值。
參考資料《量化投資—策略與技術》

資金流選股池
此處設置時間周期為3、5、10、20、60日,參數可根據市場情況和自身經驗不斷調整。
qs.stock_money('中國平安',[3,5,10,20,60]).tail()篩選當前日期時間周期內(時間周期默認為[1、3、5、10、20、60]日)
#code_list=qs.moneyflow_stock(mm_rps_result.index)print(f'最近1、3、5、10、20、60日主力資金累計淨流入均大於0個股數量:{len(code_list)}')MM趨勢+RPS+資金流MM趨勢+RPS+資金流選股池
mm_rps_result.loc[(set(mm_rps_result.index)&set(code_list))]#輸出結果為空,表示沒有同時滿足兩種條件的個股獲取滬深A股基本財務指標數據。
codes=qs.get_code()basics_df=qs.stock_basics(code_list=codes)財務指標條件選股
#淨利潤大於3千萬。避開虧損或淨利潤較小的個股c1=basics_df['淨利潤']>3e7#流通市值大於100億元。目前各行業進入頭部壟斷市場,小市值企業很難逆襲,選擇流通市值100億以上個股c2=basics_df['流通市值']>1e10#市盈率c3=(0<basics_df['市盈率(動)'])&(basics_df['市盈率(動)']<30)#ROE權益收益率大於20%c4=basics_df['ROE']>20#毛利率c5=basics_df['毛利率']>20#淨利率c6=basics_df['淨利率']>15#市淨率小於10c7=basics_df['市淨率']<10c=c1&c2&c3&c4&c5&c6&c7#以淨利率排名,查看前十basics_result=basics_df[c]選股結果。
basics_result.sort_values('淨利率',ascending=False)

