據(jù)量化分析從兩融余額變化識(shí)別市場(chǎng)情緒與機(jī)會(huì) IG50免費(fèi)開(kāi)源股票數(shù)據(jù)API接口)
融資融券數(shù)據(jù)量化分析從兩融余額變化識(shí)別市場(chǎng)情緒與機(jī)會(huì)最早接觸融資融券數(shù)據(jù)是在2019年的一輪牛市里。當(dāng)時(shí)我發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象每當(dāng)市場(chǎng)快要見(jiàn)頂?shù)臅r(shí)候兩融余額往往會(huì)創(chuàng)出新高而在市場(chǎng)底部區(qū)域兩融余額又會(huì)持續(xù)低迷。從那以后我就開(kāi)始系統(tǒng)地研究?jī)扇跀?shù)據(jù)試圖從這些數(shù)字背后找到市場(chǎng)情緒變化的蛛絲馬跡。這篇文章就來(lái)聊聊我是如何用Python分析融資融券數(shù)據(jù)以及如何從中識(shí)別市場(chǎng)情緒和投資機(jī)會(huì)的。融資融券簡(jiǎn)單說(shuō)就是投資者可以向券商借錢買股票融資或者借股票賣出融券。融資余額反映的是市場(chǎng)上看多的杠桿資金有多少融券余額反映的是看空的力量。兩者結(jié)合起來(lái)看就能大致判斷市場(chǎng)整體的情緒溫度。我用到的兩融數(shù)據(jù)主要有四塊第一塊是兩融標(biāo)的股列表確定哪些股票可以進(jìn)行融資融券交易第二塊是單只股票的兩融歷史走勢(shì)包含融資余額、融券余量等核心指標(biāo)第三塊是全市場(chǎng)的兩融交易總量用來(lái)分析市場(chǎng)整體的杠桿水平第四塊是每日的兩融交易明細(xì)看每只股票當(dāng)天的融資買入和償還情況。先從數(shù)據(jù)讀取開(kāi)始。兩融標(biāo)的股列表在base/rzrqGpList單只股票的歷史走勢(shì)在time/rzrq/{股票代碼}全市場(chǎng)交易總量在all/rzrqtt每日明細(xì)在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還是用了簡(jiǎn)寫的字段名dm是股票代碼mc是名稱jys是交易所。兩融歷史數(shù)據(jù)里的字段比較多我保留了原始列名方便后續(xù)處理。全市場(chǎng)總量數(shù)據(jù)里rq是日期sc是市場(chǎng)滬市/深市rzYe是融資余額rzMre是融資買入額rzChe是融資償還額rqYlje是融券余量金額。每日明細(xì)里rqYl是融券余量rqMcl是融券賣出量chl是償還量。拿到數(shù)據(jù)之后我一般先從市場(chǎng)整體層面入手看看全市場(chǎng)的兩融余額變化趨勢(shì)。這能幫我判斷當(dāng)前市場(chǎng)處于什么情緒階段。通常來(lái)說(shuō)兩融余額持續(xù)上升說(shuō)明市場(chǎng)情緒樂(lè)觀杠桿資金在進(jìn)場(chǎng)兩融余額持續(xù)下降說(shuō)明情緒偏謹(jǐn)慎杠桿資金在撤退。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(最新全市場(chǎng)融資余額{:.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(趨勢(shì)判斷兩融余額持續(xù)上升市場(chǎng)情緒偏樂(lè)觀)eliflatest_yema5ma20:print(趨勢(shì)判斷兩融余額持續(xù)下降市場(chǎng)情緒偏謹(jǐn)慎)else:print(趨勢(shì)判斷兩融余額震蕩整理市場(chǎng)情緒中性)returndf_merged分析完市場(chǎng)整體接下來(lái)就該深入到個(gè)股層面了。單只股票的兩融數(shù)據(jù)信息量更大我主要關(guān)注幾個(gè)指標(biāo)融資余額占流通市值的比例、融資余額的變化趨勢(shì)、融資凈買入額的持續(xù)性、融券余量的變化情況。融資余額占流通市值的比例是一個(gè)非常重要的指標(biāo)。這個(gè)比例太高說(shuō)明股票里的杠桿資金太多一旦市場(chǎng)回調(diào)很容易引發(fā)踩踏。一般來(lái)說(shuō)超過(guò)10%就要警惕了超過(guò)15%風(fēng)險(xiǎn)就比較大了。反過(guò)來(lái)如果這個(gè)比例很低說(shuō)明杠桿資金參與度不高股價(jià)相對(duì)安全。defanalyze_stock_rzrq(dm,df_hist):ifdf_histisNoneorlen(df_hist)0:returnNonelatestdf_hist.iloc[-1]mclatest.get(當(dāng)日收盤價(jià)元,0)rz_yelatest.get(融資當(dāng)日余額元,0)rq_yelatest.get(融券當(dāng)日余額元,0)rz_rzblatest.get(融資當(dāng)日余額占流通市值比%,0)print(股票代碼{}.format(dm))print(最新日期{}.format(latest[交易日期yyyy-MM-dd]))print(融資余額{:.2f}萬(wàn)元.format(rz_ye/1e4))print(融券余額{:.2f}萬(wàn)元.format(rq_ye/1e4))print(融資余額占流通市值比{:.2f}%.format(rz_rzb))ifrz_rzb15:print(風(fēng)險(xiǎn)提示融資余額占比過(guò)高15%注意回調(diào)風(fēng)險(xiǎn))elifrz_rzb10:print(風(fēng)險(xiǎn)提示融資余額占比較高10%需保持謹(jǐn)慎)rz_ye_5d_agodf_hist[融資當(dāng)日余額元].iloc[-6]iflen(df_hist)6elsedf_hist[融資當(dāng)日余額元].iloc[0]rz_ye_20d_agodf_hist[融資當(dāng)日余額元].iloc[-21]iflen(df_hist)21elsedf_hist[融資當(dāng)日余額元].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(資金動(dòng)向融資余額持續(xù)快速上升杠桿資金積極進(jìn)場(chǎng))elifchg_5d-5andchg_20d-10:print(資金動(dòng)向融資余額持續(xù)快速下降杠桿資金加速離場(chǎng))return{dm:dm,rz_ye:rz_ye,rz_rzb:rz_rzb,chg_5d:chg_5d,chg_20d:chg_20d}除了融資余額的絕對(duì)變化我還會(huì)看融資凈買入額的持續(xù)性。如果一只股票連續(xù)多日都是融資凈買入而且凈買入額還在逐漸放大說(shuō)明看多資金在持續(xù)加倉(cāng)這是一個(gè)比較強(qiáng)的正向信號(hào)。反過(guò)來(lái)如果連續(xù)多日融資凈賣出就要小心了。融券數(shù)據(jù)同樣值得關(guān)注。雖然目前A股的融券余額整體不大市場(chǎng)還是以融資為主但融券數(shù)據(jù)的變化往往能反映出專業(yè)投資者的看法。如果一只股票的融券余量突然大幅增加可能意味著有資金在看空這只股票需要警惕風(fēng)險(xiǎn)。defcheck_sustained_net_buy(df_hist,days5):iflen(df_hist)days1:returnFalse,0net_buy_col融資當(dāng)日凈買入額元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把個(gè)股分析擴(kuò)展到全市場(chǎng)我會(huì)做一個(gè)兩融數(shù)據(jù)的掃描找出融資余額持續(xù)上升、融資凈買入持續(xù)為正的股票同時(shí)剔除掉融資余額占比過(guò)高的風(fēng)險(xiǎn)股。這個(gè)掃描可以每周做一次形成一個(gè)兩融因子選股池。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[融資當(dāng)日余額占流通市值比%].iloc[-1]rz_yedf_hist[融資當(dāng)日余額元].iloc[-1]rz_ye_20d_agodf_hist[融資當(dāng)日余額元].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(兩融掃描選股結(jié)果TOP{}.format(top_n))print(df_selected[[dm,mc,rz_rzb,chg_20d,sustained,score]].to_string(indexFalse))returndf_selected兩融數(shù)據(jù)還有一個(gè)很重要的用法就是和股價(jià)走勢(shì)做相關(guān)性分析。我發(fā)現(xiàn)一個(gè)規(guī)律如果股價(jià)上漲的同時(shí)融資余額也在上升說(shuō)明上漲是有杠桿資金推動(dòng)的趨勢(shì)可能還會(huì)延續(xù)但如果股價(jià)創(chuàng)新高而融資余額卻在下降說(shuō)明杠桿資金在逢高減倉(cāng)這時(shí)候就要小心回調(diào)了。反過(guò)來(lái)如果股價(jià)下跌但融資余額在上升說(shuō)明有人在逆勢(shì)加倉(cāng)可能是底部信號(hào)如果股價(jià)和融資余額一起下跌說(shuō)明杠桿資金在恐慌出逃短期可能還沒(méi)見(jiàn)底。defanalyze_price_rzrq_correlation(df_hist):ifdf_histisNoneorlen(df_hist)60:returnNonedfdf_hist.copy()dfdf.tail(60)df[price_chg]df[當(dāng)日收盤價(jià)元].pct_change()*100df[rzYe_chg]df[融資當(dāng)日余額元].pct_change()*100dfdf.dropna()corrdf[price_chg].corr(df[rzYe_chg])price_trend上漲ifdf[當(dāng)日收盤價(jià)元].iloc[-1]df[當(dāng)日收盤價(jià)元].iloc[0]else下跌rzYe_trend上升ifdf[融資當(dāng)日余額元].iloc[-1]df[融資當(dāng)日余額元].iloc[0]else下降print(近60日股價(jià)走勢(shì){}融資余額走勢(shì){}.format(price_trend,rzYe_trend))print(股價(jià)漲跌幅與融資余額變化的相關(guān)系數(shù){:.3f}.format(corr))ifprice_trend上漲andrzYe_trend上升:print(判斷價(jià)漲量增趨勢(shì)健康可繼續(xù)持有)elifprice_trend上漲andrzYe_trend下降:print(判斷價(jià)漲量縮杠桿資金離場(chǎng)注意回調(diào)風(fēng)險(xiǎn))elifprice_trend下跌andrzYe_trend上升:print(判斷價(jià)跌量增有人逆勢(shì)加倉(cāng)關(guān)注底部機(jī)會(huì))elifprice_trend下跌andrzYe_trend下降:print(判斷價(jià)跌量縮杠桿資金出逃暫不宜抄底)returncorr在實(shí)際使用兩融數(shù)據(jù)的過(guò)程中我也踩過(guò)不少坑。最常見(jiàn)的一個(gè)誤區(qū)就是把融資余額上升簡(jiǎn)單等同于利好。其實(shí)不是這樣的融資余額上升只能說(shuō)明有杠桿資金在買但這些資金不一定是聰明錢很多時(shí)候反而是散戶在追漲。所以我后來(lái)學(xué)會(huì)了把兩融數(shù)據(jù)和其他數(shù)據(jù)結(jié)合起來(lái)看比如龍虎榜的機(jī)構(gòu)席位數(shù)據(jù)、基本面的財(cái)務(wù)數(shù)據(jù)等等。還有一個(gè)需要注意的點(diǎn)是兩融數(shù)據(jù)有一定的滯后性。每天的兩融數(shù)據(jù)是第二天上午才更新的也就是說(shuō)你今天看到的是昨天的數(shù)據(jù)。在市場(chǎng)劇烈波動(dòng)的時(shí)候這個(gè)時(shí)間差可能會(huì)影響判斷。所以我一般用兩融數(shù)據(jù)來(lái)做中期趨勢(shì)判斷而不是短期交易決策。另外不同市場(chǎng)環(huán)境下兩融數(shù)據(jù)的參考價(jià)值也不一樣。在牛市里融資余額持續(xù)上升是常態(tài)這時(shí)候更應(yīng)該關(guān)注哪些股票的融資余額增速最快而在熊市里融資余額整體下降這時(shí)候能保持融資余額穩(wěn)定甚至上升的股票反而更值得關(guān)注。總的來(lái)說(shuō)融資融券數(shù)據(jù)是一個(gè)非常有價(jià)值的市場(chǎng)情緒指標(biāo)。它就像一個(gè)溫度計(jì)能幫我們測(cè)量市場(chǎng)的冷熱度。但和任何工具一樣關(guān)鍵在于怎么用。結(jié)合多維度的數(shù)據(jù)、建立自己的分析框架、不斷在實(shí)踐中驗(yàn)證和優(yōu)化才能真正發(fā)揮兩融數(shù)據(jù)的價(jià)值。我用的數(shù)據(jù)來(lái)自ig50的本地?cái)?shù)據(jù)接口兩融數(shù)據(jù)每天上午8:50更新時(shí)效性和完整性都不錯(cuò)。有需要的朋友可以了解一下。接口說(shuō)明base/rzrqGpList - 融資融券標(biāo)的股本地路徑數(shù)據(jù)存放目錄/base/rzrqGpList主要字段股票代碼(dm)、股票名稱(mc)、交易所(jys)time/rzrq/{股票代碼} - 融資融券歷史走勢(shì)本地路徑數(shù)據(jù)存放目錄/time/rzrq/{股票代碼}主要字段交易日期、當(dāng)日融資融券余額、當(dāng)日融資融券余額差值、當(dāng)日收盤價(jià)、當(dāng)日漲跌幅、融資當(dāng)日余額、融資當(dāng)日余額占流通市值比(%)、融資當(dāng)日買入額、融資當(dāng)日償還額、融資當(dāng)日凈買入額、融資3/5/10日買入額/償還額/凈買入額、融券當(dāng)日余額、融券當(dāng)日余量、融券當(dāng)日賣出量、融券當(dāng)日償還量、融券當(dāng)日凈賣出量等all/rzrqtt - 融資融券交易總量本地路徑數(shù)據(jù)存放目錄/all/rzrqtt主要字段日期(rq)、市場(chǎng)(sc)、本日融資余額(元)(rzYe)、本日融資買入額(元)(rzMre)、本日融資償還額(元)(rzChe)、本日融券余量金額(元)(rqYlje)all/rzrqdt - 融資融券交易明細(xì)本地路徑數(shù)據(jù)存放目錄/all/rzrqdt主要字段日期(rq)、股票代碼(dm)、股票名稱(mc)、融資余額(元)(rzYe)、融資買入額(元)(rzMre)、融資償還額(元)(rzChe)、融券余量(股)(rqYl)、融券賣出量(股)(rqMcl)、償還量(股)(chl)gitee開(kāi)源地址github開(kāi)源地址