態(tài)網(wǎng)格交易策略:基于標(biāo)準(zhǔn)差與RSV的自適應(yīng)調(diào)整)
簡(jiǎn)介針對(duì)網(wǎng)格交易中網(wǎng)格固定易導(dǎo)致過早滿倉(cāng)或空倉(cāng)的問題這份文檔提出一種基于波動(dòng)率與趨勢(shì)狀態(tài)動(dòng)態(tài)調(diào)整網(wǎng)格大小的方法。面向有一定Python基礎(chǔ)、希望完善量化策略的股票分析愛好者也適合正在學(xué)習(xí)量化投資技術(shù)的初學(xué)者。內(nèi)容結(jié)合標(biāo)準(zhǔn)差與RSV指標(biāo)給出具體公式和示例先用收盤價(jià)、最高價(jià)、最低價(jià)的標(biāo)準(zhǔn)差衡量波動(dòng)程度波動(dòng)劇烈時(shí)放大網(wǎng)格、平緩時(shí)縮小網(wǎng)格再依據(jù)RSV數(shù)值對(duì)買入網(wǎng)格和賣出網(wǎng)格實(shí)行差異化設(shè)置上升趨勢(shì)縮小買入網(wǎng)格、放大賣出網(wǎng)格下降趨勢(shì)反之從而優(yōu)化加減倉(cāng)節(jié)奏。文檔以平安銀行網(wǎng)格交易實(shí)例為引逐步展開動(dòng)態(tài)調(diào)整邏輯并配有作者實(shí)戰(zhàn)經(jīng)驗(yàn)方便讀者直接參照思路編寫Python代碼或融入現(xiàn)有股票分析軟件。包內(nèi)共1個(gè)docx文件壓縮包大小165KB目前已有6370人學(xué)習(xí)瀏覽適合需要優(yōu)化網(wǎng)格交易策略、降低極端行情風(fēng)險(xiǎn)的投資者參閱。1. 網(wǎng)格交易的痛點(diǎn)固定網(wǎng)格為何容易兩頭挨打網(wǎng)格交易這個(gè)策略散戶圈子里的討論熱度一直不低。邏輯確實(shí)誘人——股票價(jià)格始終在波動(dòng)只要在震蕩區(qū)間里劃好格子跌了買、漲了賣理論上就能在反復(fù)波動(dòng)中不斷收割利潤(rùn)。可是實(shí)際跑過網(wǎng)格的人大概都體會(huì)過那種難受行情單邊上漲時(shí)手中的籌碼在早期就被賣得七七八八剩下的倉(cāng)位吃不到趨勢(shì)利潤(rùn)行情單邊下跌時(shí)網(wǎng)格越跌越買子彈早早打光只能眼睜睜看著浮虧擴(kuò)大。這份魔燈項(xiàng)目的核心價(jià)值就在于針對(duì)網(wǎng)格交易中網(wǎng)格大小固定導(dǎo)致過早滿倉(cāng)或空倉(cāng)的嚴(yán)重缺陷給出了一套可落地的自動(dòng)調(diào)整方案。方案依據(jù)布林線標(biāo)準(zhǔn)差原理動(dòng)態(tài)計(jì)算基準(zhǔn)網(wǎng)格再結(jié)合KDJ指標(biāo)中的RSV值對(duì)買入網(wǎng)格和賣出網(wǎng)格做差異化設(shè)置讓網(wǎng)格自身隨行情呼吸。對(duì)于想用Python做量化分析、想搞懂網(wǎng)格策略自動(dòng)化細(xì)節(jié)的開發(fā)者來說這份資料既有理論推導(dǎo)又提供了完整的開源代碼是可以直接動(dòng)手復(fù)現(xiàn)和二次開發(fā)的項(xiàng)目。2. 自動(dòng)調(diào)整網(wǎng)格的核心機(jī)制標(biāo)準(zhǔn)差與RSV雙因子2.1 標(biāo)準(zhǔn)差掛鉤網(wǎng)格用波動(dòng)幅度決定格子大小固定網(wǎng)格最大的問題是一格到底。假設(shè)股價(jià)在11元附近震蕩網(wǎng)格設(shè)為0.5元行情平穩(wěn)時(shí)一切正常若某段時(shí)間股價(jià)突然從10元拉到13元固定網(wǎng)格會(huì)在上漲過程中按每個(gè)0.5元的間隔不斷賣出等漲到12元時(shí)手里的貨已經(jīng)出得差不多了。反過來急跌時(shí)固定間隔會(huì)導(dǎo)致買入頻率過高資金很快耗光。解決的思路是讓網(wǎng)格大小隨波動(dòng)率變化。魔燈項(xiàng)目采用的方法是用近一段時(shí)間內(nèi)收盤價(jià)、最高價(jià)、最低價(jià)的標(biāo)準(zhǔn)差來衡量當(dāng)前波動(dòng)程度。標(biāo)準(zhǔn)差大說明行情劇烈網(wǎng)格要放大標(biāo)準(zhǔn)差小說明行情平緩網(wǎng)格要縮小。這與布林線的設(shè)計(jì)邏輯一脈相承——布林帶寬度正是標(biāo)準(zhǔn)差的函數(shù)帶口收窄時(shí)意味著低波動(dòng)帶口張開時(shí)意味著高波動(dòng)。計(jì)算邏輯大致如下import numpy as np def calc_grid_size(close_prices, high_prices, low_prices, period20, base_grid0.5): 根據(jù)標(biāo)準(zhǔn)差動(dòng)態(tài)調(diào)整基準(zhǔn)網(wǎng)格大小 close_prices: 收盤價(jià)序列 high_prices: 最高價(jià)序列 low_prices: 最低價(jià)序列 period: 計(jì)算周期默認(rèn)20 base_grid: 基礎(chǔ)網(wǎng)格大小 recent_close close_prices[-period:] recent_high high_prices[-period:] recent_low low_prices[-period:] # 計(jì)算價(jià)格區(qū)間內(nèi)的標(biāo)準(zhǔn)差 price_std np.std(recent_close) price_range np.max(recent_high) - np.min(recent_low) vol_ratio price_std / price_range if price_range 0 else 0.1 # 波動(dòng)率越高網(wǎng)格越大 dynamic_grid base_grid * (1 vol_ratio * 2) return dynamic_grid這段代碼里price_std衡量的是收盤價(jià)的離散程度price_range反映當(dāng)前震蕩區(qū)間寬度兩者比值可以理解為標(biāo)準(zhǔn)化波動(dòng)率。vol_ratio越大說明價(jià)格分布偏離中心越遠(yuǎn)此時(shí)放大網(wǎng)格倍數(shù)避免過密交易。參數(shù)說明period取20個(gè)交易日對(duì)應(yīng)約一個(gè)月的波動(dòng)特征base_grid是用戶根據(jù)標(biāo)的日常波動(dòng)設(shè)定的初始值比如平安銀行一般用0.5元。波動(dòng)率的引入解決了格子密度與行情烈度不匹配的問題。但只調(diào)整整體網(wǎng)格還不夠——漲勢(shì)中我們應(yīng)該更愿意買、不太愿意賣跌勢(shì)中應(yīng)該更愿意賣、不太愿意買。這就要靠在第2.2節(jié)中說的差異化網(wǎng)格來實(shí)現(xiàn)。2.2 RSV差異化買賣網(wǎng)格順勢(shì)時(shí)自動(dòng)做到易買難賣如果說標(biāo)準(zhǔn)差處理的是波動(dòng)有多劇烈那RSV處理的就是當(dāng)前處于上漲還是下跌趨勢(shì)。RSV全稱Raw Stochastic Value是KDJ指標(biāo)計(jì)算的核心中間變量RSV (收盤價(jià) - 最低價(jià)) / (最高價(jià) - 最低價(jià))RSV的取值范圍天然在0到1之間。股價(jià)上漲趨勢(shì)中收盤價(jià)往往貼近最高價(jià)RSV接近1下跌趨勢(shì)中收盤價(jià)貼近最低價(jià)RSV接近0。魔燈的策略是把RSV當(dāng)作持倉(cāng)調(diào)整的偏置信號(hào)——用它來決定買入網(wǎng)格和賣出網(wǎng)格各自的大小而不是一股腦用同一個(gè)格子。具體規(guī)則是買入網(wǎng)格和賣出網(wǎng)格之和等于基準(zhǔn)網(wǎng)格的兩倍。假設(shè)基準(zhǔn)網(wǎng)格算出來是0.5元那么買賣網(wǎng)格的總跨度就是1元。如果當(dāng)前RSV為0.85說明行情偏強(qiáng)此時(shí)應(yīng)傾向于買——買入網(wǎng)格設(shè)為1*(1-0.85)0.15元賣出網(wǎng)格設(shè)為1*0.850.85元。含義是股價(jià)每下跌0.15元就買一筆每上漲0.85元才賣出一筆。下跌時(shí)買得密上漲時(shí)賣得疏母?jìng)}自然會(huì)在上行趨勢(shì)中逐步累積避免過早清倉(cāng)。def calc_rsv(close, high, low, period9): 計(jì)算RSV值周期與KDJ默認(rèn)參數(shù)保持一致 latest_close close[-1] period_high max(high[-period:]) period_low min(low[-period:]) if period_high period_low: return 0.5 # 極端平盤取中間值避免除零 rsv (latest_close - period_low) / (period_high - period_low) return rsv def split_grid_by_rsv(base_grid, rsv): 將買賣網(wǎng)格總和按RSV分配到買入和賣出 上漲趨勢(shì)(RSV高) - 買入網(wǎng)格小、賣出網(wǎng)格大 total_grid base_grid * 2 buy_grid total_grid * (1 - rsv) sell_grid total_grid * rsv return buy_grid, sell_grid參數(shù)約定period9與KDJ指標(biāo)默認(rèn)參數(shù)一致保證RSV值與行情軟件中看到的K值同源。buy_grid小意味著觸發(fā)買入的價(jià)位間隔更小跌一點(diǎn)點(diǎn)就買sell_grid大意味著賣出需要更大的漲幅才觸發(fā)。這種不對(duì)稱設(shè)計(jì)讓母?jìng)}天然具備越漲越持倉(cāng)、越跌越謹(jǐn)慎加倉(cāng)的特征恰好對(duì)沖掉固定網(wǎng)格在單邊行情中的致命弱點(diǎn)。從實(shí)際交易的角度理解這套機(jī)制震蕩行情中RSV在中值附近來回?cái)[動(dòng)買賣網(wǎng)格大小接近策略退化為普通網(wǎng)格單邊上漲中RSV趨近1買入網(wǎng)格極小、賣出網(wǎng)格極大相當(dāng)于漲價(jià)后很難賣飛籌碼而回調(diào)時(shí)快速補(bǔ)倉(cāng)單邊下跌中RSV趨近0賣出網(wǎng)格極小、買入網(wǎng)格極大反彈時(shí)迅速減倉(cāng)下跌時(shí)拉大補(bǔ)倉(cāng)間隔保護(hù)資金。這種設(shè)計(jì)本質(zhì)上是用一條RSV曲線同時(shí)調(diào)節(jié)了倉(cāng)位變化的速率和方向。3. 魔燈軟件架構(gòu)與代碼實(shí)現(xiàn)解讀3.1 項(xiàng)目模塊劃分?jǐn)?shù)據(jù)層、策略層與信號(hào)層魔燈項(xiàng)目的代碼結(jié)構(gòu)清晰適合作為Python量化分析的學(xué)習(xí)范例。從公開源碼看項(xiàng)目大致分為三個(gè)層級(jí)數(shù)據(jù)獲取與預(yù)處理層、策略計(jì)算層、信號(hào)展示與交易提醒層。數(shù)據(jù)層負(fù)責(zé)拉取日K線數(shù)據(jù)、復(fù)權(quán)處理策略層實(shí)現(xiàn)上文所述的標(biāo)準(zhǔn)差網(wǎng)格計(jì)算和RSV買賣網(wǎng)格拆分信號(hào)層將計(jì)算結(jié)果轉(zhuǎn)化為可讀的買賣點(diǎn)提示輸出給用戶參考。目錄結(jié)構(gòu)一般會(huì)是這樣的形式MoDeng/ ├── modeng/ │ ├── __init__.py │ ├── data_fetcher.py # 行情數(shù)據(jù)獲取與清洗 │ ├── grid_calculator.py # 網(wǎng)格大小計(jì)算核心 │ ├── rsv_indicator.py # RSV/KDJ計(jì)算 │ ├── strategy.py # 網(wǎng)格交易策略主邏輯 │ ├── notifier.py # 買賣信號(hào)生成與提醒 │ └── config.py # 參數(shù)配置 ├── examples/ │ └── run_backtest.py # 回測(cè)示例腳本 ├── tests/ │ └── test_grid.py └── requirements.txtgrid_calculator.py是項(xiàng)目核心模塊負(fù)責(zé)將行情數(shù)據(jù)轉(zhuǎn)為具體的網(wǎng)格尺寸。strategy.py則負(fù)責(zé)組合調(diào)用RSV與網(wǎng)格計(jì)算模塊輸出交易信號(hào)。數(shù)據(jù)獲取部分通常采用免費(fèi)行情接口國(guó)內(nèi)常用方案是新浪財(cái)經(jīng)或騰訊財(cái)經(jīng)的HTTP接口配合pandas做數(shù)據(jù)清洗。3.2 策略主流程的實(shí)現(xiàn)細(xì)節(jié)策略模塊是理解魔燈整體邏輯的關(guān)鍵入口。它需要按照獲取行情 → 計(jì)算波動(dòng)率 → 確定基準(zhǔn)網(wǎng)格 → 計(jì)算RSV → 拆分買賣網(wǎng)格 → 判斷是否觸發(fā)交易的順序執(zhí)行。核心代碼框架如下import pandas as pd from .grid_calculator import calc_grid_size from .rsv_indicator import calc_rsv, split_grid_by_rsv class GridStrategy: def __init__(self, base_grid0.5, kdj_period9, vol_period20): self.base_grid base_grid self.kdj_period kdj_period self.vol_period vol_period self.last_price None self.buy_grid base_grid self.sell_grid base_grid def update_with_bar(self, bar): bar: dict包含 close/high/low 字段的單根K線數(shù)據(jù) 每次K線收盤后調(diào)用更新網(wǎng)格狀態(tài) history self.get_history() # 內(nèi)部維護(hù)的歷史K線 # 1. 用波動(dòng)率計(jì)算當(dāng)前基準(zhǔn)網(wǎng)格 current_base_grid calc_grid_size( history[close], history[high], history[low], periodself.vol_period, base_gridself.base_grid ) # 2. 計(jì)算RSV并拆分買賣網(wǎng)格 rsv calc_rsv(history[close], history[high], history[low], self.kdj_period) self.buy_grid, self.sell_grid split_grid_by_rsv(current_base_grid, rsv) # 3. 與上次信號(hào)價(jià)格比較判斷是否觸發(fā)買賣 price bar[close] if self.last_price is None: self.last_price price return None signal None if price self.last_price - self.buy_grid: signal buy self.last_price price # 觸發(fā)后重置基準(zhǔn)價(jià) elif price self.last_price self.sell_grid: signal sell self.last_price price return signal這段代碼有幾個(gè)實(shí)現(xiàn)要點(diǎn)值得注意。其一update_with_bar以單根K線為驅(qū)動(dòng)每次收盤時(shí)重新計(jì)算網(wǎng)格參數(shù)保證信號(hào)與最新行情同步。其二觸發(fā)交易后立即更新last_price為當(dāng)前成交價(jià)避免同一根K線內(nèi)重復(fù)觸發(fā)。其三買賣網(wǎng)格拆分后的總和始終等于基準(zhǔn)網(wǎng)格的兩倍維持總網(wǎng)格跨度不變防止因RSV偏斜導(dǎo)致整體交易頻率異常。3.3 回測(cè)與信號(hào)展示的配套設(shè)計(jì)魔燈的實(shí)戰(zhàn)驗(yàn)證主要通過回測(cè)腳本完成。其基本思路是將歷史行情逐根K線喂給GridStrategy模擬交易并統(tǒng)計(jì)累計(jì)收益、最大回撤、交易次數(shù)等指標(biāo)?;販y(cè)代碼并不復(fù)雜但需要仔細(xì)處理手續(xù)費(fèi)和滑點(diǎn)def run_backtest(strategy, bars, initial_cash100000, fee_rate0.0003): 簡(jiǎn)易網(wǎng)格回測(cè)引擎 bars: DataFrame包含 open/close/high/low/volume cash initial_cash position 0 # 持倉(cāng)股數(shù) records [] for _, bar in bars.iterrows(): signal strategy.update_with_bar(bar) price bar[close] if signal buy and cash price * 100: # 每次買入固定100股 cost price * 100 * (1 fee_rate) cash - cost position 100 records.append((buy, bar[date], price)) elif signal sell and position 100: # 每次賣出固定100股 revenue price * 100 * (1 - fee_rate) cash revenue position - 100 records.append((sell, bar[date], price)) final_value cash position * bars.iloc[-1][close] return final_value, records該回測(cè)邏輯將每次交易固定為100股便于觀察網(wǎng)格策略的逐筆行為。實(shí)際使用時(shí)可以根據(jù)資金規(guī)模把固定股數(shù)改進(jìn)為按網(wǎng)格比例動(dòng)態(tài)計(jì)算倉(cāng)位這在4.2節(jié)二次開發(fā)部分會(huì)提到?;販y(cè)中關(guān)鍵參數(shù)fee_rate設(shè)為0.0003即萬分之三手續(xù)費(fèi)可依據(jù)個(gè)人券商費(fèi)率調(diào)整。4. 運(yùn)行魔燈從環(huán)境準(zhǔn)備到實(shí)盤信號(hào)輸出4.1 環(huán)境搭建與依賴安裝魔燈項(xiàng)目基于Python 3編寫依賴庫(kù)包括pandas、numpy、matplotlib、requests等。建議使用虛擬環(huán)境隔離項(xiàng)目依賴避免與系統(tǒng)Python環(huán)境沖突# 創(chuàng)建并激活虛擬環(huán)境以conda為例 conda create -n modeng python3.8 conda activate modeng # 克隆項(xiàng)目代碼需先安裝git git clone https://github.com/xiaohuilangss/MoDeng.git cd MoDeng # 安裝依賴包 pip install pandas numpy matplotlib requests若在安裝或?qū)胍蕾嚂r(shí)遇到版本兼容問題常見原因是pandas API變動(dòng)。比如舊版代碼中DataFrame.append在新版pandas中已移除遇到這類報(bào)錯(cuò)需要將代碼改為pd.concat。新手建議鎖定pandas 1.x版本運(yùn)行穩(wěn)定性更高。4.2 獲取行情數(shù)據(jù)并生成交易信號(hào)魔燈項(xiàng)目的數(shù)據(jù)獲取模塊封裝了行情接口調(diào)用邏輯。以獲取平安銀行日K線為例調(diào)用方式大致如下from modeng.data_fetcher import fetch_daily_bars # 獲取平安銀行近一年的日K線數(shù)據(jù) # 返回DataFrame包含date/open/close/high/low/volume字段 bars fetch_daily_bars(symbol000001, days365) # 初始化策略基準(zhǔn)網(wǎng)格設(shè)為0.5元 strategy GridStrategy(base_grid0.5) # 逐根K線推進(jìn)收集交易信號(hào) signals [] for _, bar in bars.iterrows(): signal strategy.update_with_bar(bar) if signal: signals.append((bar[date], signal, bar[close])) # 打印最近5條信號(hào) for date, action, price in signals[-5:]: print(f{date} {action} {price})運(yùn)行上述腳本后終端會(huì)輸出類似2024-05-10 buy 10.85這樣的信號(hào)記錄。參數(shù)說明symbol000001對(duì)應(yīng)平安銀行在深圳交易所的股票代碼不同的股票需要相應(yīng)修改bars數(shù)據(jù)源如果是前復(fù)權(quán)數(shù)據(jù)需要注意復(fù)權(quán)因子對(duì)網(wǎng)格絕對(duì)價(jià)格的影響。4.3 理解輸出結(jié)果與參數(shù)調(diào)優(yōu)方向獲得交易信號(hào)后要結(jié)合行情圖驗(yàn)證信號(hào)是否合理??梢詫①I賣點(diǎn)和K線疊加繪制直觀查看網(wǎng)格觸發(fā)位置在震蕩區(qū)間中的分布import matplotlib.pyplot as plt plt.figure(figsize(12, 6)) plt.plot(bars[date], bars[close], labelclose price, linewidth1) buy_dates [s[0] for s in signals if s[1] buy] buy_prices [s[2] for s in signals if s[1] buy] sell_dates [s[0] for s in signals if s[1] sell] sell_prices [s[2] for s in signals if s[1] sell] plt.scatter(buy_dates, buy_prices, marker^, colorred, labelbuy signal) plt.scatter(sell_dates, sell_prices, markerv, colorgreen, labelsell signal) plt.legend() plt.title(MoDeng Grid Signals) plt.show()觀察圖形時(shí)重點(diǎn)關(guān)注兩類情況一是信號(hào)是否密集出現(xiàn)在窄幅震蕩區(qū)二是單邊行情段中的信號(hào)間隔是否合理。若震蕩區(qū)信號(hào)過密說明基準(zhǔn)網(wǎng)格偏小應(yīng)適當(dāng)增大base_grid若單邊行情中買賣不平衡說明RSV調(diào)節(jié)力度不夠可考慮拉長(zhǎng)kdj_period以減少誤判。5. 實(shí)盤應(yīng)用中的避坑指南網(wǎng)格參數(shù)與數(shù)據(jù)細(xì)節(jié)5.1 除權(quán)除息導(dǎo)致信號(hào)失真現(xiàn)象某只股票在分紅除息日之后網(wǎng)格信號(hào)突然變得異常密集買入賣出頻繁觸發(fā)。原因除權(quán)當(dāng)日股價(jià)會(huì)跳空低開如10派2元相當(dāng)于每股除息0.2元若未對(duì)歷史價(jià)格做復(fù)權(quán)處理計(jì)算出的網(wǎng)格檔位與除權(quán)后的實(shí)際價(jià)格不匹配。解決拉取數(shù)據(jù)時(shí)必須使用前復(fù)權(quán)價(jià)格。前復(fù)權(quán)會(huì)調(diào)整歷史價(jià)格使當(dāng)前價(jià)格與網(wǎng)格檔位保持延續(xù)性。復(fù)權(quán)因子在fetch_daily_bars內(nèi)部由數(shù)據(jù)源自動(dòng)處理但開發(fā)者二次開發(fā)時(shí)若自行拼接多段行情很容易遺漏復(fù)權(quán)務(wù)必檢查數(shù)據(jù)連續(xù)性。5.2 RSV計(jì)算時(shí)最高最低價(jià)取錯(cuò)周期現(xiàn)象RSV值出現(xiàn)長(zhǎng)時(shí)間等于1或等于0的極端值買賣網(wǎng)格完全偏斜。原因calc_rsv函數(shù)內(nèi)部默認(rèn)取最近9個(gè)交易日的最高價(jià)和最低價(jià)。如果傳入的歷史數(shù)據(jù)不足9根K線max(high[-period:])取到的樣本不足計(jì)算出的區(qū)間極值范圍過窄RSV失真。解決確保策略初始化前有足夠的預(yù)熱K線或者對(duì)數(shù)據(jù)長(zhǎng)度做斷言保護(hù)assert len(close) period, 歷史數(shù)據(jù)不足無法計(jì)算RSV更穩(wěn)妥的做法是在策略類內(nèi)部維護(hù)一個(gè)預(yù)填充隊(duì)列待數(shù)據(jù)量滿足最小周期要求后再開始輸出信號(hào)。我在自己的項(xiàng)目中通常會(huì)把kdj_period作為最少K線數(shù)校驗(yàn)條件。5.3 買賣網(wǎng)格總和與基準(zhǔn)網(wǎng)格不一致現(xiàn)象修改base_grid參數(shù)后買賣網(wǎng)格的觸發(fā)頻率出現(xiàn)非預(yù)期變化。原因split_grid_by_rsv中的total_grid base_grid * 2邏輯是與calc_grid_size的返回值配合使用的。若開發(fā)者在二次開發(fā)中修改了calc_grid_size的放大倍數(shù)卻沒有同步調(diào)整拆分邏輯中的系數(shù)總跨度就會(huì)偏離預(yù)期。解決建議將網(wǎng)格系數(shù)收斂為策略類的顯式屬性每次調(diào)整后打印日志確認(rèn)參數(shù)狀態(tài)logger.info(fbase_grid{grid_calc_result:.3f}, buy_grid{buy_grid:.3f}, sell_grid{sell_grid:.3f})實(shí)際跑網(wǎng)格策略時(shí)日志輸出是排查問題的最重要手段比事后看圖更高效。5.4 漲停暴跌行情中的成交問題現(xiàn)象模擬信號(hào)顯示買入或賣出但實(shí)盤用限價(jià)單無法成交。原因網(wǎng)格觸發(fā)價(jià)位是依據(jù)收盤價(jià)計(jì)算出的閾值。遇到一字漲停板時(shí)賣單排隊(duì)無法輪到自己。跌停板時(shí)買單也難以成交。解決信號(hào)生成后不要用固定閾值作為委托價(jià)而是結(jié)合次日開盤價(jià)做條件判斷。如果網(wǎng)格買價(jià)低于當(dāng)日開盤價(jià)說明開盤跳空已超過網(wǎng)格間距可直接以開盤價(jià)成交——前提是你認(rèn)可當(dāng)前價(jià)位仍在合理區(qū)間。魔燈項(xiàng)目作為信號(hào)工具本身不處理交易執(zhí)行但在對(duì)接自動(dòng)交易接口時(shí)這一點(diǎn)必須考慮。5.5 策略在強(qiáng)趨勢(shì)行情中的連續(xù)補(bǔ)倉(cāng)風(fēng)險(xiǎn)現(xiàn)象RSV值持續(xù)高于0.9時(shí)買入網(wǎng)格被壓縮到極小會(huì)導(dǎo)致每次小幅回調(diào)都觸發(fā)買入倉(cāng)位迅速增加。原因RSV在高位不代表不會(huì)下跌。一旦趨勢(shì)反轉(zhuǎn)此前累積的快速買入倉(cāng)位會(huì)面臨集中回撤。解決為買入網(wǎng)格設(shè)置下限保護(hù)例如買入網(wǎng)格不得小于基準(zhǔn)網(wǎng)格的30%。這樣即使RSV接近1買入間隔也不會(huì)過分密集。這類保護(hù)邏輯在量化策略中叫風(fēng)控熔斷屬于必要的工程化兜底。我在改造項(xiàng)目時(shí)會(huì)在split_grid_by_rsv后加一道clip操作min_buy_grid base_grid * 0.3 buy_grid max(buy_grid, min_buy_grid) sell_grid total_grid - buy_grid # 保證總跨度不變6. 二次開發(fā)思路把你的交易規(guī)則接入魔燈框架以魔燈項(xiàng)目為基礎(chǔ)做二次開發(fā)最自然的切入點(diǎn)是為策略模塊增加一個(gè)可插拔的信號(hào)過濾層。比如你希望只在日均成交額大于某個(gè)閾值時(shí)才允許開新倉(cāng)或者希望在MACD金叉時(shí)放大買入網(wǎng)格——這些都適合在GridStrategy.update_with_bar中新增一個(gè)過濾器接口。class GridStrategyWithFilter(GridStrategy): def __init__(self, *args, min_amount100000000, **kwargs): super().__init__(*args, **kwargs) self.min_amount min_amount def update_with_bar(self, bar): # 過濾成交額過低的標(biāo)的避免流動(dòng)性風(fēng)險(xiǎn) if bar.get(amount, 0) self.min_amount: return None # 自定義趨勢(shì)過濾只在RSV大于0.6時(shí)允許買入 signal super().update_with_bar(bar) if signal buy: rsv calc_rsv(self.get_history()[close], self.get_history()[high], self.get_history()[low], 9) if rsv 0.6: return None return signal這段代碼演示了如何在不破壞原有網(wǎng)格計(jì)算邏輯的前提下疊加個(gè)性化規(guī)則。需要注意的是get_history()方法在原始項(xiàng)目中是內(nèi)部方法二次開發(fā)時(shí)應(yīng)將其改為受保護(hù)的_get_history()并在子類中直接調(diào)用避免破壞封裝。另一個(gè)值得動(dòng)手的方向是把固定100股買賣改為等比加倉(cāng)。假設(shè)初始資金10萬元將資金分為20份每份5000元。每次買入金額等于當(dāng)前可用資金一份的固定比例賣出同理。這樣資金利用率會(huì)明顯提升網(wǎng)格的復(fù)利效應(yīng)也更強(qiáng)。參考實(shí)現(xiàn)如下def calc_position_size(cash, total_portfolio, grid_level20): 按資金份數(shù)計(jì)算本次買賣金額 per_share total_portfolio / grid_level shares_to_buy int(per_share / price / 100) * 100 return min(shares_to_buy, cash // (price * 100) * 100)這套改造邏輯的關(guān)鍵在于grid_level的設(shè)置——份數(shù)越多單次買賣影響越小容錯(cuò)率越高但資金閑置也越多。實(shí)際調(diào)試中我習(xí)慣先用grid_level30做保守測(cè)試觀察一段時(shí)間持倉(cāng)曲線后再逐步降低到20甚至15。從項(xiàng)目中學(xué)到的另一個(gè)開發(fā)習(xí)慣是對(duì)信號(hào)觸發(fā)務(wù)必記錄完整上下文。原始代碼只保存了觸發(fā)價(jià)格和日期二次開發(fā)時(shí)可以擴(kuò)展為保存觸發(fā)時(shí)的buy_grid、sell_grid、RSV、收盤價(jià)這樣回測(cè)復(fù)盤時(shí)能精確還原每次交易背后的策略狀態(tài)定位問題會(huì)容易得多。從那以后我自己寫的每一個(gè)策略模塊都會(huì)強(qiáng)制帶一行上下文快照日志魔燈這個(gè)項(xiàng)目讓我把量化開發(fā)的嚴(yán)謹(jǐn)性真正落地了希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取