最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)網(wǎng)格交易策略的過程

 更新時間:2025年07月31日 11:55:18   作者:Hanging_Spot  
本文講解Python網(wǎng)格交易策略,利用ccxt獲取加密貨幣數(shù)據(jù)及backtrader回測,通過設(shè)定網(wǎng)格節(jié)點,低買高賣獲利,適合震蕩行情,下面跟我一起看看我們的第一個量化策略是怎么實現(xiàn)的吧

網(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小時全年無休的,交易也比較方便。

好的接下來進(jìn)入正題,看看我們的第一個量化策略是怎么實現(xiàn)的吧。

我們使用的網(wǎng)格交易策略,是一種基于市場波動的自動化交易策略,核心邏輯是通過在特定價格區(qū)間內(nèi)設(shè)置一系列 “網(wǎng)格節(jié)點”,當(dāng)價格波動觸及節(jié)點時自動執(zhí)行買入或賣出操作,利用價格的上下震蕩實現(xiàn) “低買高賣” 的循環(huán)獲利。其本質(zhì)是將市場波動轉(zhuǎn)化為盈利機(jī)會,尤其適合震蕩行情。風(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)
            # 邊界保護(hù)(防止破網(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)文章

最新評論

海伦市| 忻州市| 广州市| 库伦旗| 泰来县| 双城市| 雷山县| 修水县| 安义县| 泽普县| 巨野县| 禄丰县| 宜良县| 凤山县| 大邑县| 玉林市| 历史| 灵山县| 若羌县| 时尚| 秦皇岛市| 四子王旗| 会泽县| 宜宾县| 富源县| 芦山县| 沙洋县| 玉林市| 林芝县| 聂拉木县| 库尔勒市| 浑源县| 汤阴县| 邹平县| 文化| 当阳市| 巴里| 南开区| 神木县| 邵东县| 曲阳县|