问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于BTC(比特币)的均值回归与趋势跟随策略

创作时间:
作者:
@小白创作中心

基于BTC(比特币)的均值回归与趋势跟随策略

引用
1
来源
1.
https://quantbuffet.com/2024/09/15/%E5%9F%BA%E4%BA%8Ebtc%EF%BC%88%E6%AF%94%E7%89%B9%E5%B8%81%EF%BC%89%E7%9A%84%E5%9D%87%E5%80%BC%E5%9B%9E%E5%BD%92%E4%B8%8E%E8%B6%8B%E5%8A%BF%E8%B7%9F%E9%9A%8F%E7%AD%96%E7%95%A5/

比特币(BTC)作为一种重要的加密货币资产,其价格波动性较高,吸引了众多投资者和量化交易员的关注。本文介绍了一种基于比特币价格均值回归与趋势跟随的交易策略,该策略通过分析比特币在过去十天内的最高价和最低价,来判断买入时机。研究显示,当比特币价格处于局部最低点时,往往会出现回升,而在处于局部最高点时,则更倾向于跟随趋势。这种策略不仅具有较高的年化收益率,而且风险调整后的回报也优于被动持有比特币的投资方式。

策略概述

该策略投资于比特币(BTC),数据来源于Gemini交易所。每天计算过去十天的最高价格(MAX)和最低价格(MIN)。如果第t天的价格等于MAX,则买入BTC并持有一天;如果等于MIN,则同样买入BTC并持有一天。

策略合理性

均值回归和趋势跟随是跨各种资产类别中最流行的交易策略之一,这两种效应已经被广泛研究(例如,移动平均线、动量或反转)。最新的研究表明,基于MAX或MIN的均值回归或趋势机会可以识别出多种结果。当比特币价格低于最高点或高于最低点时,风险似乎较大。因此,当比特币价格处于“中间位置”时,它似乎是最具风险的,尽管近年来价格飙升,但在价格未达到最高点或最低点时持有比特币会面临更大的风险和波动性。数据显示,当价格处于局部最低点时,往往会回升,或者换句话说,会回归均值。另一方面,比特币最显著的趋势出现在其处于局部最高点时。因此,该策略通过识别回升或趋势的概率最高且风险最低的强烈模式,来捕捉这些市场信号。

总的来说,与被动持有比特币投资相比,提出的策略具有显著更好的风险调整回报。

论文来源

Seasonality, Trend-following, and Mean reversion in Bitcoin

  • Matus Padysak, 科门纽斯大学 数学、物理与信息学院
  • Radovan Vojtko, Quantpedia.com, Quantpedia

摘要

加密货币市场已经变得不可忽视,并且不再是一个小众市场。随着加密货币市场的不断发展,研究人员致力于深入分析新型加密货币。一个良好的起点可能是参考其他成熟资产类别中已被认可的效应。本研究考察了季节性效应,例如当纽约证券交易所开盘或收盘时,其日内、隔夜或每日的影响。我们还研究了每日回报的分布以及显著的回报。结果表明,一种基于每天只持有比特币两小时的简单季节性策略是有效的。第二个目标是研究趋势跟随和均值回归策略。数据显示,比特币在处于最高点时倾向于跟随趋势,而在最低点时倾向于回升。这些发现支持了比特币在大跌后强劲趋势和反转的经验观察。

回测表现

  • 年化收益率:98.43%
  • 波动率:47.75%
  • Beta:0.394
  • 夏普比率:2.06
  • 索提诺比率:1.046
  • 最大回撤:-37.67%
  • 胜率:51%

完整Python代码

from AlgorithmImports import *

class MeanreversionandTrendFollowingBasedonMINandMAXinBTC(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2015, 1, 1)
        self.SetCash(100000)
        # NOTE Coinbase Pro, CoinAPI, and Bitfinex data is all set in UTC Time. This means that when accessing data from this brokerage, all data will be time stamped in UTC Time.
        self.crypto:Crypto = self.AddCrypto("BTCUSD", Resolution.Minute, Market.GDAX)
        self.crypto.SetLeverage(10)
        self.crypto.SetFeeModel(CustomFeeModel())
        self.crypto:Symbol = self.crypto.Symbol
        self.period:int = 10
        self.daily_prices:RollingWindow = RollingWindow[float](self.period)
        self.daily_close_hour:int = 22

    def OnData(self, data):
        if self.crypto in data and data[self.crypto]:
            time:datetime.datetime = self.Time
            if time.hour == self.daily_close_hour and time.minute == 0:
                price:float = data[self.crypto].Value
                self.daily_prices.Add(price)
                if self.daily_prices.IsReady:
                    daily_prices:list[float] = [x for x in self.daily_prices]
                    daily_max:float = np.max(daily_prices)
                    daily_min:float = np.min(daily_prices)
                    # open/rebalance long position
                    if price == daily_max or price == daily_min:
                        self.SetHoldings(self.crypto, 1)
                    else:
                        # close position
                        if self.Portfolio[self.crypto].Invested:
                            self.Liquidate(self.crypto)

class CustomFeeModel(FeeModel):
    def GetOrderFee(self, parameters):
        fee = parameters.Security.Price * parameters.Order.AbsoluteQuantity * 0.00005
        return OrderFee(CashAmount(fee, "USD"))
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号