Python實現(xiàn)網(wǎng)格交易策略的過程
網(wǎng)格交易是一種經(jīng)典的量化交易策略,其核心思想是在價格上下預(yù)設(shè)多個“網(wǎng)格”,當(dāng)價格觸發(fā)特定網(wǎng)格時執(zhí)行買入或賣出操作,以低買高賣賺取區(qū)間波動收益。
最近開始接觸python量化交易,記錄一個簡單的策略實現(xiàn)和回測的完整框架,不包含實盤。
量化框架是ccxt和backtrader。backtrader用來做策略和回測,ccxt用來調(diào)用交易所的API用來獲取數(shù)據(jù)或日后的實盤。ccxt主要是用來調(diào)加密貨幣交易所的,因為現(xiàn)在加密貨幣對量化比較友好,首先它獲取數(shù)據(jù)就比傳統(tǒng)的股票方便,直接調(diào)交易所的API就行,甚至不需要注冊賬號,我之前看過很多股票的量化教程,獲取數(shù)據(jù)還是比較有門檻的。其次他是7x24小時全年無休的,交易也比較方便。
好的接下來進入正題,看看我們的第一個量化策略是怎么實現(xiàn)的吧。
我們使用的網(wǎng)格交易策略,是一種基于市場波動的自動化交易策略,核心邏輯是通過在特定價格區(qū)間內(nèi)設(shè)置一系列 “網(wǎng)格節(jié)點”,當(dāng)價格波動觸及節(jié)點時自動執(zhí)行買入或賣出操作,利用價格的上下震蕩實現(xiàn) “低買高賣” 的循環(huán)獲利。其本質(zhì)是將市場波動轉(zhuǎn)化為盈利機會,尤其適合震蕩行情。風(fēng)險就是在持續(xù)向下的行情可能在高網(wǎng)格持續(xù)買入,越跌越買導(dǎo)致資金耗盡 。
下面是策略的實現(xiàn),繼承bt.Strategy,策略的執(zhí)行放在next函數(shù)中。
import backtrader as bt
import math
# 1. 網(wǎng)格策略核心類
class GridStrategy(bt.Strategy):
params = (
('number', 10), # 網(wǎng)格總數(shù)
('open_percent', 0.5), # 初始建倉比例(50%)
('distance', 0.01), # 網(wǎng)格間距(1%)
('base_price', 5.0) # 基準(zhǔn)價格
)
def __init__(self):
self.open_flag = False # 初始建倉標(biāo)記
self.last_index = 0 # 上次網(wǎng)格位置
self.per_size = 0 # 每格交易量
self.max_index = 0 # 網(wǎng)格上邊界
self.min_index = 0 # 網(wǎng)格下邊界
def next(self):
# 初始建倉邏輯(價格接近基準(zhǔn)價時觸發(fā))
if not self.open_flag and math.fabs(self.data.close[0] - self.p.base_price) / self.p.base_price < 0.01:
# 計算初始倉位(50%資金)
buy_size = self.broker.getvalue() * self.p.open_percent / self.data.close[0]
self.buy(size=buy_size)
# 初始化網(wǎng)格參數(shù)
self.last_index = 0
self.per_size = self.broker.getvalue() / self.data.close[0] / self.p.number
self.max_index = int(self.p.number * self.p.open_percent)
self.min_index = -int(self.p.number * (1 - self.p.open_percent))
self.open_flag = True
# 網(wǎng)格調(diào)倉邏輯
if self.open_flag:
# 計算當(dāng)前網(wǎng)格位置(按間距歸一化)
current_index = int((self.data.close[0] - self.p.base_price) / self.p.distance)
# 邊界保護(防止破網(wǎng))
current_index = max(min(current_index, self.max_index), self.min_index)
# 網(wǎng)格變化時交易
change = current_index - self.last_index
if change > 0: # 價格上漲→賣出
self.sell(size=abs(change) * self.per_size)
elif change < 0: # 價格下跌→買入
self.buy(size=abs(change) * self.per_size)
self.last_index = current_index # 更新網(wǎng)格位置
# 2. 訂單狀態(tài)跟蹤(調(diào)試用)
def notify_order(self, order):
if order.status in [order.Completed]:
action = '買入' if order.isbuy() else '賣出'
print(f'{action}成交: 價格={order.executed.price:.2f}, 數(shù)量={order.executed.size}')然后在另一個腳本中使用這個策略:
import backtrader as bt
from GridStrategy import GridStrategy
from backtrader.feeds import PandasData
import ccxt
import pandas as pd
# 連接交易所(以幣安為例)
exchange = ccxt.binance({
'enableRateLimit': True, # 啟用頻率限制[6](@ref)
'options': {'defaultType': 'spot'} # 現(xiàn)貨數(shù)據(jù)
})
# 獲取ETH/USDT歷史K線(1小時周期)
def fetch_eth_data(days=30, timeframe='1h'):
since = exchange.parse8601((pd.Timestamp.utcnow() - pd.Timedelta(days=days)).isoformat())
ohlcv = exchange.fetch_ohlcv('ETH/USDT', timeframe, since=since)
df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
df.set_index('timestamp', inplace=True)
return df
eth_data = fetch_eth_data(days=90, timeframe='1h') # 獲取90天1小時數(shù)據(jù)
print(eth_data)
class CCXTData(PandasData):
lines = ('volume',) # 聲明額外數(shù)據(jù)列
params = (
('datetime', None), # 使用索引作為時間列
('open', 'open'),
('high', 'high'),
('low', 'low'),
('close', 'close'),
('volume', 'volume'),
)
# 數(shù)據(jù)實例化
data_feed = CCXTData(dataname=eth_data)
# 初始化引擎
cerebro = bt.Cerebro()
cerebro.addstrategy(
GridStrategy,
base_price=1803.70, # 設(shè)置標(biāo)的基準(zhǔn)價
distance=10, # 網(wǎng)格間距5%(按價格波動調(diào)整)
number=100 # 增加網(wǎng)格密度
)
cerebro.adddata(data_feed)
cerebro.broker.setcash(10000.0) # 初始資金
cerebro.broker.setcommission(commission=0.001) # 手續(xù)費0.1%[3](@ref)
# 運行回測
print('初始資金:', cerebro.broker.getvalue())
cerebro.run()
print('最終資金:', cerebro.broker.getvalue())
# 可視化結(jié)果
cerebro.plot(style='candlestick')執(zhí)行上面的腳本,可以看到回測結(jié)果,我們投入10000塊,經(jīng)過差不多一個月的時間最終受益有870塊之多,實在是太賺了XD。

backtrader比較厲害的是它能把所有的操作都標(biāo)記出來:

到此這篇關(guān)于Python實現(xiàn)網(wǎng)格交易策略的文章就介紹到這了,更多相關(guān)python網(wǎng)格交易策略內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python搭建APNS蘋果推送通知推送服務(wù)的相關(guān)模塊使用指南
這里總結(jié)了一份Python搭建蘋果推送通知推送服務(wù)的相關(guān)模塊使用指南,包括PyAPNs、基于twisted框架的pyapns以及apns-client三個模塊的介紹,需要的朋友可以參考下2016-06-06
Python基礎(chǔ)之循環(huán)語句相關(guān)知識總結(jié)
今天給大家?guī)淼氖顷P(guān)于Python基礎(chǔ)的相關(guān)知識,文章圍繞著Python循環(huán)語句展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06
使用Python實現(xiàn)在Word文檔中批量標(biāo)記關(guān)鍵字
在日常辦公和文檔處理中,我們常常需要在大量的Word文檔中標(biāo)記關(guān)鍵字,然后進行接下來的操作,比如關(guān)鍵字替換等,本文給大家介紹了如何使用Python實現(xiàn)在Word文檔中批量標(biāo)記關(guān)鍵字,還可以單獨為每個關(guān)鍵字指定顏色,需要的朋友可以參考下2025-08-08
Python實戰(zhàn)之能監(jiān)控文件變化的神器—看門狗
這篇文章主要介紹了Python實戰(zhàn)之能監(jiān)控文件變化的神器—看門狗,文中有非常詳細的圖文及代碼示例,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05
分位數(shù)回歸模型quantile regeression應(yīng)用詳解及示例教程
這篇文章主要為大家介紹了介紹了分位數(shù)回歸quantile regeression的概念詳解及代碼示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11

