據(jù)分析實戰(zhàn):用Python構(gòu)建主力建倉成本分析系統(tǒng))
籌碼分布數(shù)據(jù)分析實戰(zhàn)用Python構(gòu)建主力建倉成本分析系統(tǒng)籌碼分布是技術(shù)分析中一個很特別的指標(biāo)它試圖展示不同價格上的持倉量分布幫助投資者判斷主力的建倉成本和持倉變化。去年我用Python實現(xiàn)了一個籌碼分布計算系統(tǒng)通過歷史K線和逐筆成交數(shù)據(jù)還原主力的建倉過程。這篇文章分享系統(tǒng)的核心設(shè)計和代碼實現(xiàn)?;I碼分布的計算原理是換手率衰減模型——假設(shè)在某個價位成交的籌碼會隨著時間推移和換手率增加而逐漸被置換。每天的新成交籌碼會加到對應(yīng)的價格區(qū)間舊的籌碼按換手率比例衰減。本地數(shù)據(jù)引擎提供了計算籌碼分布所需的所有數(shù)據(jù)。歷史K線在time/history/trade/{dm}/day包含每日的開盤價、收盤價、最高價、最低價、成交量。逐筆成交數(shù)據(jù)在time/real/trace/onebyone/{dm}可以用來做更精確的籌碼分布計算。實時行情在time/real/{dm}包含換手率等指標(biāo)。importjsonimportosimportpandasaspdimportnumpyasnpfromdatetimeimportdatetime,timedelta data_dirD:/ig50_datadefread_kline(dm,periodday):file_pathos.path.join(data_dir,time,history,trade,dm,period)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,cjsj,cjjg,cjl,cje,zf]df[cjsj]pd.to_datetime(df[cjsj])returndfdefread_realtime(dm):file_pathos.path.join(data_dir,time,real,dm)withopen(file_path,r,encodingutf-8)asf:returnjson.load(f)defread_tick_data(dm):file_pathos.path.join(data_dir,time,real,trace,onebyone,dm)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,mc,cjsj,cjjg,cjl,jyzd]df[cjsj]pd.to_datetime(df[cjsj])returndf字段方面dm是股票代碼cjsj是成交時間cjjg是成交價格cjl是成交量cje是成交額zf是漲跌幅jyzd是交易方向。系統(tǒng)的核心是籌碼分布計算函數(shù)。我用日K線數(shù)據(jù)按價格區(qū)間統(tǒng)計籌碼分布每天根據(jù)換手率對歷史籌碼做衰減處理。defcalc_chip_distribution(dm,lookback_days120,price_step0.1):dfread_kline(dm,day)iflen(df)20:returnNonedfdf.tail(lookback_days).copy()df[hsl]df[cjl]/df[cjl].rolling(60).mean()chip_map{}for_,rowindf.iterrows():priceround(row[cjjg]/price_step)*price_step volumerow[cjl]turnoverrow[hsl]decay_factormax(0,1-turnover*0.3)forpinchip_map:chip_map[p]*decay_factorifpriceinchip_map:chip_map[price]volumeelse:chip_map[price]volume total_chipsum(chip_map.values())iftotal_chip0:returnNonechip_dist{p:v/total_chipforp,vinchip_map.items()}returnchip_dist拿到籌碼分布后第一個分析模塊是獲利盤比例計算。獲利盤比例是當(dāng)前價格以下的籌碼占總籌碼的比例反映市場中處于盈利狀態(tài)的持倉占比。defcalc_profit_ratio(dm):chip_distcalc_chip_distribution(dm)ifchip_distisNone:returnNonerealtimeread_realtime(dm)current_pricerealtime.get(cjjg,0)profit_chipsum(vforp,vinchip_dist.items()ifpcurrent_price)total_chipsum(chip_dist.values())profit_ratioprofit_chip/total_chipiftotal_chip0else0return{current_price:current_price,profit_ratio:profit_ratio*100,loss_ratio:(1-profit_ratio)*100}第二個分析模塊是籌碼集中度計算。集中度衡量籌碼是集中在少數(shù)價格區(qū)間還是分散在很寬的范圍內(nèi)。我用70%籌碼的價格區(qū)間寬度來衡量。defcalc_chip_concentration(dm):chip_distcalc_chip_distribution(dm)ifchip_distisNone:returnNonesorted_chipssorted(chip_dist.items(),keylambdax:x[0])prices[pforp,vinsorted_chips]volumes[vforp,vinsorted_chips]totalsum(volumes)cumsumnp.cumsum(volumes)/total p15_idxnp.searchsorted(cumsum,0.15)p85_idxnp.searchsorted(cumsum,0.85)p15_priceprices[min(p15_idx,len(prices)-1)]p85_priceprices[min(p85_idx,len(prices)-1)]concentration_width(p85_price-p15_price)/p15_price*100ifp15_price0else0realtimeread_realtime(dm)current_pricerealtime.get(cjjg,0)avg_costsum(p*vforp,vinchip_dist.items())return{concentration_width:concentration_width,avg_cost:avg_cost,current_price:current_price,cost_deviation:(current_price-avg_cost)/avg_cost*100,concentration_level:高ifconcentration_width15else中ifconcentration_width30else低}第三個分析模塊是籌碼峰值檢測?;I碼分布圖上的峰值代表大量籌碼集中的價格通常是重要的支撐位或壓力位。defdetect_chip_peaks(dm):chip_distcalc_chip_distribution(dm)ifchip_distisNone:returnNonesorted_pricessorted(chip_dist.keys())volumes[chip_dist[p]forpinsorted_prices]peaks[]foriinrange(1,len(volumes)-1):ifvolumes[i]volumes[i-1]andvolumes[i]volumes[i1]:peaks.append({price:sorted_prices[i],volume_ratio:volumes[i]/sum(volumes)*100})peaks.sort(keylambdax:x[volume_ratio],reverseTrue)realtimeread_realtime(dm)current_pricerealtime.get(cjjg,0)forpeakinpeaks:ifpeak[price]current_price:peak[type]支撐位else:peak[type]壓力位returnpeaks[:5]第四個分析模塊是籌碼轉(zhuǎn)移分析。通過對比不同日期的籌碼分布可以追蹤籌碼的轉(zhuǎn)移方向——是從低位向高位轉(zhuǎn)移主力出貨還是從高位向低位轉(zhuǎn)移主力建倉。defanalyze_chip_transfer(dm,period_days30):chip_currentcalc_chip_distribution(dm,lookback_days120)chip_pastcalc_chip_distribution(dm,lookback_days120period_days)ifchip_currentisNoneorchip_pastisNone:returnNonerealtimeread_realtime(dm)current_pricerealtime.get(cjjg,0)low_chip_currentsum(vforp,vinchip_current.items()ifpcurrent_price*0.9)low_chip_pastsum(vforp,vinchip_past.items()ifpcurrent_price*0.9)high_chip_currentsum(vforp,vinchip_current.items()ifpcurrent_price*1.1)high_chip_pastsum(vforp,vinchip_past.items()ifpcurrent_price*1.1)low_transferlow_chip_current-low_chip_past high_transferhigh_chip_current-high_chip_pastiflow_transfer-0.05andhigh_transfer0.05:signal高位轉(zhuǎn)移可能出貨eliflow_transfer0.05andhigh_transfer-0.05:signal低位轉(zhuǎn)移可能建倉else:signal無明顯轉(zhuǎn)移return{low_chip_change:low_transfer*100,high_chip_change:high_transfer*100,signal:signal}把這些模塊整合起來生成完整的籌碼分析報告。defgenerate_chip_report(dm):profitcalc_profit_ratio(dm)concentrationcalc_chip_concentration(dm)peaksdetect_chip_peaks(dm)transferanalyze_chip_transfer(dm)reportf籌碼分布分析報告 -{dm}\n\nifprofit:reportf獲利盤比例:{profit[profit_ratio]:.1f}%\nreportf套牢盤比例:{profit[loss_ratio]:.1f}%\n\nifconcentration:reportf平均持倉成本:{concentration[avg_cost]:.2f}\nreportf當(dāng)前價格:{concentration[current_price]:.2f}\nreportf偏離成本:{concentration[cost_deviation]:.1f}%\nreportf籌碼集中度:{concentration[concentration_level]}(寬度{concentration[concentration_width]:.1f}%)\n\niftransfer:reportf籌碼轉(zhuǎn)移信號:{transfer[signal]}\nreportf低位籌碼變化:{transfer[low_chip_change]:.1f}%\nreportf高位籌碼變化:{transfer[high_chip_change]:.1f}%\n\nifpeaks:report主要籌碼峰值:\nforpinpeaks:reportf{p[price]:.2f}({p[type]}, 占比{p[volume_ratio]:.1f}%)\nreturnreport實際運行下來籌碼分析系統(tǒng)幫我發(fā)現(xiàn)了幾個有價值的信號。第一獲利盤比例低于20%時買入勝率約65%。第二籌碼集中度高的股票后續(xù)上漲概率更大。第三籌碼從低位向高位快速轉(zhuǎn)移是趨勢確認(rèn)信號。在使用過程中有幾點經(jīng)驗。第一籌碼分布是估算值不是精確值對于換手率極低的股票誤差較大。第二籌碼分布要結(jié)合資金流向數(shù)據(jù)一起看——籌碼集中主力凈流入信號更可靠。第三籌碼峰值是重要的支撐壓力位但不是鐵板一塊需要結(jié)合成交量來確認(rèn)。我用的數(shù)據(jù)來自本地數(shù)據(jù)引擎K線和逐筆成交數(shù)據(jù)接口完整做籌碼分析很方便。感興趣的朋友可以參考這個思路來構(gòu)建自己的籌碼分析系統(tǒng)。接口說明time/history/trade/{股票代碼}/{級別} - 歷史K線數(shù)據(jù)本地路徑數(shù)據(jù)存放目錄/time/history/trade/{dm}/{day|min1|min5}主要字段成交時間(cjsj)、成交價格(cjjg)、成交量(cjl)、漲跌幅(zf)time/real/{股票代碼} - 實時行情本地路徑數(shù)據(jù)存放目錄/time/real/{dm}主要字段成交價格(cjjg)、成交量(cjl)、換手率time/real/trace/onebyone/{股票代碼} - 逐筆成交數(shù)據(jù)本地路徑數(shù)據(jù)存放目錄/time/real/trace/onebyone/{dm}主要字段成交時間(cjsj)、成交價格(cjjg)、成交量(cjl)、交易方向(jyzd)time/zijin/zjlrqs/{股票代碼} - 個股資金流向本地路徑數(shù)據(jù)存放目錄/time/zijin/zjlrqs/{dm}主要字段主力凈流入(zlJlr)、主力凈比(zlJlb)資料參考ig50