
融資融券數據量化分析從兩融余額變化識別市場情緒與機會最早接觸融資融券數據是在2019年的一輪牛市里。當時我發現一個有趣的現象每當市場快要見頂的時候兩融余額往往會創出新高而在市場底部區域兩融余額又會持續低迷。從那以后我就開始系統地研究兩融數據試圖從這些數字背后找到市場情緒變化的蛛絲馬跡。這篇文章就來聊聊我是如何用Python分析融資融券數據以及如何從中識別市場情緒和投資機會的。融資融券簡單說就是投資者可以向券商借錢買股票融資或者借股票賣出融券。融資余額反映的是市場上看多的杠桿資金有多少融券余額反映的是看空的力量。兩者結合起來看就能大致判斷市場整體的情緒溫度。我用到的兩融數據主要有四塊第一塊是兩融標的股列表確定哪些股票可以進行融資融券交易第二塊是單只股票的兩融歷史走勢包含融資余額、融券余量等核心指標第三塊是全市場的兩融交易總量用來分析市場整體的杠桿水平第四塊是每日的兩融交易明細看每只股票當天的融資買入和償還情況。先從數據讀取開始。兩融標的股列表在base/rzrqGpList單只股票的歷史走勢在time/rzrq/{股票代碼}全市場交易總量在all/rzrqtt每日明細在all/rzrqdt。importjsonimportosimportpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfromcollectionsimportdefaultdict data_dirD:/stock_datadefread_rzrq_gplist():file_pathos.path.join(data_dir,base,rzrqGpList)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,mc,jys]returndfdefread_rzrq_history(dm):file_pathos.path.join(data_dir,time,rzrq,dm)ifnotos.path.exists(file_path):returnNonewithopen(file_path,r,encodingutf-8)asf:datajson.load(f)ifnotdata:returnNonedfpd.DataFrame(data)df[jyrq]pd.to_datetime(df[交易日期yyyy-MM-dd])dfdf.sort_values(jyrq)returndfdefread_rzrq_total():file_pathos.path.join(data_dir,all,rzrqtt)ifnotos.path.exists(file_path):returnNonewithopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[rq,sc,rzYe,rzMre,rzChe,rqYlje]returndfdefread_rzrq_detail():file_pathos.path.join(data_dir,all,rzrqdt)ifnotos.path.exists(file_path):returnNonewithopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[rq,dm,mc,rzYe,rzMre,rzChe,rqYl,rqMcl,chl]returndf還是用了簡寫的字段名dm是股票代碼mc是名稱jys是交易所。兩融歷史數據里的字段比較多我保留了原始列名方便后續處理。全市場總量數據里rq是日期sc是市場滬市/深市rzYe是融資余額rzMre是融資買入額rzChe是融資償還額rqYlje是融券余量金額。每日明細里rqYl是融券余量rqMcl是融券賣出量chl是償還量。拿到數據之后我一般先從市場整體層面入手看看全市場的兩融余額變化趨勢。這能幫我判斷當前市場處于什么情緒階段。通常來說兩融余額持續上升說明市場情緒樂觀杠桿資金在進場兩融余額持續下降說明情緒偏謹慎杠桿資金在撤退。defanalyze_market_rzrq(df_total):ifdf_totalisNoneorlen(df_total)0:returnNonedf_shdf_total[df_total[sc]滬市].copy()df_szdf_total[df_total[sc]深市].copy()df_sh[rq]pd.to_datetime(df_sh[rq])df_sz[rq]pd.to_datetime(df_sz[rq])df_mergedpd.merge(df_sh[[rq,rzYe,rzMre,rzChe]],df_sz[[rq,rzYe,rzMre,rzChe]],onrq,suffixes(_sh,_sz))df_merged[rzYe_total]df_merged[rzYe_sh]df_merged[rzYe_sz]df_merged[rzMre_total]df_merged[rzMre_sh]df_merged[rzMre_sz]df_merged[rzChe_total]df_merged[rzChe_sh]df_merged[rzChe_sz]df_merged[rzJmr_total]df_merged[rzMre_total]-df_merged[rzChe_total]df_mergeddf_merged.sort_values(rq)latest_datedf_merged[rq].max()latest_yedf_merged.loc[df_merged[rq]latest_date,rzYe_total].values[0]print(最新全市場融資余額{:.2f}億元{}.format(latest_ye/1e8,latest_date.strftime(%Y-%m-%d)))ma5df_merged[rzYe_total].rolling(5).mean().iloc[-1]ma20df_merged[rzYe_total].rolling(20).mean().iloc[-1]print(5日均值{:.2f}億元20日均值{:.2f}億元.format(ma5/1e8,ma20/1e8))iflatest_yema5ma20:print(趨勢判斷兩融余額持續上升市場情緒偏樂觀)eliflatest_yema5ma20:print(趨勢判斷兩融余額持續下降市場情緒偏謹慎)else:print(趨勢判斷兩融余額震蕩整理市場情緒中性)returndf_merged分析完市場整體接下來就該深入到個股層面了。單只股票的兩融數據信息量更大我主要關注幾個指標融資余額占流通市值的比例、融資余額的變化趨勢、融資凈買入額的持續性、融券余量的變化情況。融資余額占流通市值的比例是一個非常重要的指標。這個比例太高說明股票里的杠桿資金太多一旦市場回調很容易引發踩踏。一般來說超過10%就要警惕了超過15%風險就比較大了。反過來如果這個比例很低說明杠桿資金參與度不高股價相對安全。defanalyze_stock_rzrq(dm,df_hist):ifdf_histisNoneorlen(df_hist)0:returnNonelatestdf_hist.iloc[-1]mclatest.get(當日收盤價元,0)rz_yelatest.get(融資當日余額元,0)rq_yelatest.get(融券當日余額元,0)rz_rzblatest.get(融資當日余額占流通市值比%,0)print(股票代碼{}.format(dm))print(最新日期{}.format(latest[交易日期yyyy-MM-dd]))print(融資余額{:.2f}萬元.format(rz_ye/1e4))print(融券余額{:.2f}萬元.format(rq_ye/1e4))print(融資余額占流通市值比{:.2f}%.format(rz_rzb))ifrz_rzb15:print(風險提示融資余額占比過高15%注意回調風險)elifrz_rzb10:print(風險提示融資余額占比較高10%需保持謹慎)rz_ye_5d_agodf_hist[融資當日余額元].iloc[-6]iflen(df_hist)6elsedf_hist[融資當日余額元].iloc[0]rz_ye_20d_agodf_hist[融資當日余額元].iloc[-21]iflen(df_hist)21elsedf_hist[融資當日余額元].iloc[0]chg_5d(rz_ye-rz_ye_5d_ago)/rz_ye_5d_ago*100ifrz_ye_5d_ago0else0chg_20d(rz_ye-rz_ye_20d_ago)/rz_ye_20d_ago*100ifrz_ye_20d_ago0else0print(融資余額5日變化{:.2f}%.format(chg_5d))print(融資余額20日變化{:.2f}%.format(chg_20d))ifchg_5d5andchg_20d10:print(資金動向融資余額持續快速上升杠桿資金積極進場)elifchg_5d-5andchg_20d-10:print(資金動向融資余額持續快速下降杠桿資金加速離場)return{dm:dm,rz_ye:rz_ye,rz_rzb:rz_rzb,chg_5d:chg_5d,chg_20d:chg_20d}除了融資余額的絕對變化我還會看融資凈買入額的持續性。如果一只股票連續多日都是融資凈買入而且凈買入額還在逐漸放大說明看多資金在持續加倉這是一個比較強的正向信號。反過來如果連續多日融資凈賣出就要小心了。融券數據同樣值得關注。雖然目前A股的融券余額整體不大市場還是以融資為主但融券數據的變化往往能反映出專業投資者的看法。如果一只股票的融券余量突然大幅增加可能意味著有資金在看空這只股票需要警惕風險。defcheck_sustained_net_buy(df_hist,days5):iflen(df_hist)days1:returnFalse,0net_buy_col融資當日凈買入額元ifnet_buy_colnotindf_hist.columns:returnFalse,0recentdf_hist.tail(days)total_netrecent[net_buy_col].sum()all_positive(recent[net_buy_col]0).all()returnall_positive,total_net把個股分析擴展到全市場我會做一個兩融數據的掃描找出融資余額持續上升、融資凈買入持續為正的股票同時剔除掉融資余額占比過高的風險股。這個掃描可以每周做一次形成一個兩融因子選股池。defscan_rzrq_stocks(df_gplist,top_n30):results[]totallen(df_gplist)foridx,rowindf_gplist.iterrows():dmrow[dm]df_histread_rzrq_history(dm)ifdf_histisNoneorlen(df_hist)20:continuetry:rz_rzbdf_hist[融資當日余額占流通市值比%].iloc[-1]rz_yedf_hist[融資當日余額元].iloc[-1]rz_ye_20d_agodf_hist[融資當日余額元].iloc[-21]chg_20d(rz_ye-rz_ye_20d_ago)/rz_ye_20d_ago*100ifrz_ye_20d_ago0else0sustained,total_netcheck_sustained_net_buy(df_hist,5)results.append({dm:dm,mc:row[mc],rz_rzb:rz_rzbifpd.notna(rz_rzb)else0,chg_20d:chg_20d,sustained:sustained,total_net:total_net,rz_ye:rz_ye})exceptExceptionase:continuedf_resultpd.DataFrame(results)df_filtereddf_result[(df_result[rz_rzb]10)(df_result[chg_20d]0)].copy()df_filtered[score](df_filtered[chg_20d].rank(pctTrue)*0.4df_filtered[total_net].rank(pctTrue)*0.3df_filtered[sustained].astype(int)*0.3)df_selecteddf_filtered.sort_values(score,ascendingFalse).head(top_n)print(兩融掃描選股結果TOP{}.format(top_n))print(df_selected[[dm,mc,rz_rzb,chg_20d,sustained,score]].to_string(indexFalse))returndf_selected兩融數據還有一個很重要的用法就是和股價走勢做相關性分析。我發現一個規律如果股價上漲的同時融資余額也在上升說明上漲是有杠桿資金推動的趨勢可能還會延續但如果股價創新高而融資余額卻在下降說明杠桿資金在逢高減倉這時候就要小心回調了。反過來如果股價下跌但融資余額在上升說明有人在逆勢加倉可能是底部信號如果股價和融資余額一起下跌說明杠桿資金在恐慌出逃短期可能還沒見底。defanalyze_price_rzrq_correlation(df_hist):ifdf_histisNoneorlen(df_hist)60:returnNonedfdf_hist.copy()dfdf.tail(60)df[price_chg]df[當日收盤價元].pct_change()*100df[rzYe_chg]df[融資當日余額元].pct_change()*100dfdf.dropna()corrdf[price_chg].corr(df[rzYe_chg])price_trend上漲ifdf[當日收盤價元].iloc[-1]df[當日收盤價元].iloc[0]else下跌rzYe_trend上升ifdf[融資當日余額元].iloc[-1]df[融資當日余額元].iloc[0]else下降print(近60日股價走勢{}融資余額走勢{}.format(price_trend,rzYe_trend))print(股價漲跌幅與融資余額變化的相關系數{:.3f}.format(corr))ifprice_trend上漲andrzYe_trend上升:print(判斷價漲量增趨勢健康可繼續持有)elifprice_trend上漲andrzYe_trend下降:print(判斷價漲量縮杠桿資金離場注意回調風險)elifprice_trend下跌andrzYe_trend上升:print(判斷價跌量增有人逆勢加倉關注底部機會)elifprice_trend下跌andrzYe_trend下降:print(判斷價跌量縮杠桿資金出逃暫不宜抄底)returncorr在實際使用兩融數據的過程中我也踩過不少坑。最常見的一個誤區就是把融資余額上升簡單等同于利好。其實不是這樣的融資余額上升只能說明有杠桿資金在買但這些資金不一定是聰明錢很多時候反而是散戶在追漲。所以我后來學會了把兩融數據和其他數據結合起來看比如龍虎榜的機構席位數據、基本面的財務數據等等。還有一個需要注意的點是兩融數據有一定的滯后性。每天的兩融數據是第二天上午才更新的也就是說你今天看到的是昨天的數據。在市場劇烈波動的時候這個時間差可能會影響判斷。所以我一般用兩融數據來做中期趨勢判斷而不是短期交易決策。另外不同市場環境下兩融數據的參考價值也不一樣。在牛市里融資余額持續上升是常態這時候更應該關注哪些股票的融資余額增速最快而在熊市里融資余額整體下降這時候能保持融資余額穩定甚至上升的股票反而更值得關注。總的來說融資融券數據是一個非常有價值的市場情緒指標。它就像一個溫度計能幫我們測量市場的冷熱度。但和任何工具一樣關鍵在于怎么用。結合多維度的數據、建立自己的分析框架、不斷在實踐中驗證和優化才能真正發揮兩融數據的價值。我用的數據來自ig50的本地數據接口兩融數據每天上午8:50更新時效性和完整性都不錯。有需要的朋友可以了解一下。接口說明base/rzrqGpList - 融資融券標的股本地路徑數據存放目錄/base/rzrqGpList主要字段股票代碼(dm)、股票名稱(mc)、交易所(jys)time/rzrq/{股票代碼} - 融資融券歷史走勢本地路徑數據存放目錄/time/rzrq/{股票代碼}主要字段交易日期、當日融資融券余額、當日融資融券余額差值、當日收盤價、當日漲跌幅、融資當日余額、融資當日余額占流通市值比(%)、融資當日買入額、融資當日償還額、融資當日凈買入額、融資3/5/10日買入額/償還額/凈買入額、融券當日余額、融券當日余量、融券當日賣出量、融券當日償還量、融券當日凈賣出量等all/rzrqtt - 融資融券交易總量本地路徑數據存放目錄/all/rzrqtt主要字段日期(rq)、市場(sc)、本日融資余額(元)(rzYe)、本日融資買入額(元)(rzMre)、本日融資償還額(元)(rzChe)、本日融券余量金額(元)(rqYlje)all/rzrqdt - 融資融券交易明細本地路徑數據存放目錄/all/rzrqdt主要字段日期(rq)、股票代碼(dm)、股票名稱(mc)、融資余額(元)(rzYe)、融資買入額(元)(rzMre)、融資償還額(元)(rzChe)、融券余量(股)(rqYl)、融券賣出量(股)(rqMcl)、償還量(股)(chl)gitee開源地址github開源地址