跳转到主要内容

将TradingView和PineScript基于的算法交易策略转换为DeFi。一个示例仓库。

项目描述

TradingView和Coinbase到DeFi和Trader Joe算法交易策略迁移

这是一个示例Python项目,介绍如何将基于TradingView的PineScript算法交易策略转换为TradingStrategy.ai Python格式

Watch the recorded workshop session for this project

YouTube上记录的工作坊会议

此示例仓库是为Avalanche Summit II工作坊制作的。在此处查看示例Github仓库

DeFi对算法交易员的益处

在去中心化交易所(https://tradingstrategy.ai/glossary/decentralised-exchange)上运行您的交易策略,而不是在中心化交易所上,具有以下好处:

先决条件

您的技能

要使用此示例,您需要具备以下条件:

  • 加密货币的基本经验
  • 交易的基本经验
  • TradingView的PineScript经验
  • Python的初级经验

软件

关于示例策略

示例策略回测文件位于 bollinger_band_example_defi_strategy.ipynb 笔记本中。

示例策略是一个简单的布林带策略。 策略是否盈利不在示例的范围内。 策略没有进行任何优化,参数的选择更多是基于直觉。请将此示例作为学习材料和您自己策略的基础。

注意:在2021-2023年这样的下跌或横盘整理的加密货币市场中,仅做多策略具有挑战性。此外,此策略是为了一个过于短的回测期而特别挑选的,以更好地说明回测框架的功能。

技术指标文档

查找示例中使用的技术指标的相关文档

  • 指数移动平均(EMA):指数移动平均相对于简单移动平均(SMA)来说,是一个更敏感的移动平均。权重由与长度成比例的alpha确定。

  • 相对强弱指数(RSI):相对强弱指数是一种流行的动量振荡器,用于衡量价格移动的速度和幅度。

  • 布林带(BB):由John Bollinger开发的一种流行的波动性指标。

策略性能结果和算法迁移说明

TradingView和Trading Strategy策略以类似的方式开仓,因此它们在某种程度上是可以比较的。

注意。由于不同的价格来源和其他细微差异,您不能在两个不同的市场(Coinbase和Trader Joe)上获得相同的策略回测结果:**. 如果您仔细检查价格图表、RSI和其他指标,您将看到结果略有不同。在如此短的回测时间框架内,此策略容易受到微小波动的影响,并且不够稳健。然而,此示例的目标不是稳健性,而是易于展示的数据。

如果您检查,一些仓位(如~3月17日)大约在同一时间打开,所以我们确实可以看到策略遵循相同的模式。

两种策略实现都在回测期间进行了少量交易,10-20次,这使得展示示例更容易。

权益曲线

该策略在Avalanche上的Trader Joe平台上的AVAX-USDC对上历史表现如何。

equity curve trading strategy

该策略在Coinbase上的AVAX-USD对上历史表现如何。

equity curve coinbase

然而,如果在Coinbase上开启50 BPS的做市商费用,我们会看到这会毁掉策略的表现,导致亏损(与Trader Joe上的20 BPS费用相比)。

equity curve coinbase with fee

持仓情况

以下是Python策略中单个赢亏持仓的截图。您可以看到我们有一些盈利的长持仓,以及非常短的非盈利持仓。

positions

价格行为和指标

以下是策略的价格行为和技术的截图。

price action and positions

交易总结

总结统计如下计算

Trading period length                     145 days
Return %                                    11.90%
Annualised return %                         29.88%
Cash at start                            $5,000.00
Value at end                             $5,594.84
Trade volume                            $47,387.00
Position win percent                        55.56%
Total positions                                  9
Won positions                                    5
Lost positions                                   4
Stop losses triggered                            4
Stop loss % of all                          44.44%
Stop loss % of lost                        100.00%
Winning stop losses                              0
Winning stop losses percent                  0.00%
Losing stop losses                               4
Losing stop losses percent                 100.00%
Take profits triggered                           0
Take profit % of all                         0.00%
Take profit % of won                         0.00%
Zero profit positions                            0
Positions open at the end                        0
Realised profit and loss                   $594.84
Portfolio unrealised value                   $0.00
Extra returns on lending pool interest       $0.00
Cash left at the end                     $5,594.84
Average winning position profit %            6.72%
Average losing position loss %              -2.57%
Biggest winning position %                  12.12%
Biggest losing position %                   -2.76%
Average duration of winning positions       3 days
Average duration of losing positions        0 days
LP fees paid                                $94.87
LP fees paid % of volume                     0.20%
Average position:                            2.59%
Median position:                             1.65%
Most consecutive wins                            2
Most consecutive losses                          3
Biggest realized risk                       -1.38%
Avg realised risk                           -1.28%
Max pullback of total capital               -4.00%
Max loss risk at opening of position         1.10%

仓位时间线

以下是单个持仓。

position timeline

示例代码

示例策略如下展示

策略核心

rsi_series = rsi(close_prices, length=RSI_LENGTH)

# Calculate Bollinger Bands with a 20-day SMA and 2 standard deviations using pandas_ta
# See documentation here https://tradingstrategy.ai/docs/programming/api/technical-analysis/volatility/help/pandas_ta.volatility.bbands.html#bbands
bollinger_bands = bbands(close_prices, length=MOVING_AVERAGE_LENGTH, std=STDDEV)

# bbands() returns a dictionary of items with different name mangling
bb_upper = bollinger_bands[f"BBU_{MOVING_AVERAGE_LENGTH}_{STDDEV}"]
bb_lower = bollinger_bands[f"BBL_{MOVING_AVERAGE_LENGTH}_{STDDEV}"]
bb_mid = bollinger_bands[f"BBM_{MOVING_AVERAGE_LENGTH}_{STDDEV}"]  # Moving average

if not position_manager.is_any_open():
    # No open positions, decide if BUY in this cycle.
    # We buy if the price on the daily chart closes above the upper Bollinger Band.
    if price_latest > bb_upper.iloc[-1] and rsi_series[-1] >= RSI_THRESHOLD:
        buy_amount = cash * POSITION_SIZE
        trades += position_manager.open_1x_long(
            pair, 
            buy_amount, 
            stop_loss_pct=STOP_LOSS_PCT)

else:
    # We have an open position, decide if SELL in this cycle.
    # We close the position when the price closes below the 20-day moving average.        
    if price_latest < bb_mid.iloc[-1]:
        trades += position_manager.close_all()

Python和PineScript之间的显著差异

Python和PineScript之间的一些主要差异

  • Python是一种通用编程语言,因此有大量的教程、书籍和课程可供学习。
  • Python是开源的——这使得大量的软件库(如技术指标和统计)可供使用。
  • TradingView的PineScript仅针对其服务进行了优化。它简化了使用,但不够灵活。
  • PineScript速度快:回测完成得快,因为它简化了PineScript可以做的事情。
  • Python数据以Pandas DataFrame的形式呈现——这是任何数据科学的事实上核心单元,而TradingView使用其自己的数据格式。
  • 交易策略的decide_trades()函数旨在适应所有类型的策略,包括投资组合构建、借贷策略、流动性提供者持仓等。因此,它将返回一个要执行的交易列表,以在区块链上进入新位置,并且您比PineScript的入口/退出有更多的细粒度控制,后者是为传统股票市场设计的。

一些交易者应注意事项

  • 交易策略使用一个术语持仓来表示具有入场和退场的交易位置,而TradingView使用一个术语交易。这可能会令人困惑,因为单个持仓由多个交易组成。
  • 由于价格数据不是完全一致的(不同的交易所),不同的交易将在不同的时间进行
  • 根据区块链和DEX,资产使用封装代币表示法。例如,ETH变为WETH。这是由于EVM兼容的区块链的技术限制。

一些程序员应注意事项

  • Python使用零索引数组,而PineScript使用反向数组。在Python中,就像在大多数编程语言中一样,时间序列的最新值位于数组的最后一个索引中,记为-1,而最旧的值位于零索引0。在PineScript中,情况相反,最新值不记索引或记为索引0。

关于在去中心化金融中进行交易

DEX交易费用

你有四个费用元素

  • 区块链交易成本或燃气费用
    • 将趋向于零并在未来变得微不足道
  • 交易费,包括
  • 价格影响
    • 与订单簿交易所不同,由于基于流动性的价格具有确定性,因此AMM上的历史回测非常容易
  • 滑点
    • 在签署您的交易和将交易包含在区块中并由区块生产者包括在内的价格变动
    • MEV保护也很重要
    • 通常订单会带有最大滑点
  • 基于AMM和CLMM的DEX没有滑点

安装

克隆此仓库,然后运行poetry为项目创建Python环境。

poetry shell
poetry install

API密钥

首次运行笔记本时,您将被提示注册以获取API密钥以下载交易策略数据集。

运行回测

从终端运行回测笔记本

在终端中运行回测笔记本是最稳健的方法,尽管不是很有用

  • 始终有效 - 您可以看到代码是否工作
  • 在网页浏览器中打开任何图表都会在单独的窗口中打开
  • 但在终端中与笔记本一起工作非常困难
  • 使用shell笔记本允许您在Python代码中使用ipdb断点。

如何运行

ipython bollinger_band_example_defi_strategy.ipynb 

这将打开几个浏览器标签并打印出交易摘要

使用Visual Studio Code运行回测笔记本

Visual Studio Code是回测开发的推荐工具。

首先在终端中启动Poetry环境

poetry shell

在此shell会话中,启动Visual Studio Code。

code 

在Visual Studio Code中打开笔记本。

使用屏幕右上角的选择内核。Visual Studio Code应该推荐您与Poetry一起安装的相同的Python虚拟环境。

运行笔记本。

使用Jupyter运行回测笔记本

您可以通过以下方式启动Jupyter

poetry shell
jupyter notebook

然后从文件资源管理器中选择一个笔记本并运行它

回测示例的变体

我们在笔记本中创建了一些替代方案,以展示它如何影响盈亏

基线:年化回报率14%,最大回撤7%。

  • 跟踪止损 - 年化回报率18%,最大回撤7%
  • 全仓:进入仓位时使用90%的现金,而不是50%的现金。实现利润$300 -> $600。
  • 多对:交易多对而非单一对
  • Uniswap完整历史:基于Uniswap v2的ETH-USD对交易,因此我们获得了2020-2023年DEX的最大回测历史
  • Uniswap 1小时蜡烛图:与上述相同,但交易非常频繁

网格搜索

下一步

链接

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定要选择哪个,请了解更多关于安装软件包的信息。

源代码分布

tradingview_defi_strategy-0.2.0.tar.gz (16.0 kB 查看哈希值)

上传 源代码

构建分布

由以下机构支持