将TradingView和PineScript基于的算法交易策略转换为DeFi。一个示例仓库。
项目描述
TradingView和Coinbase到DeFi和Trader Joe算法交易策略迁移
这是一个示例Python项目,介绍如何将基于TradingView的PineScript算法交易策略转换为TradingStrategy.ai Python格式。
此示例仓库是为Avalanche Summit II工作坊制作的。在此处查看示例Github仓库。
- DeFi对算法交易员的益处
- 先决条件
- 关于示例策略
- 策略性能结果和算法迁移说明
- 示例代码
- Python和PineScript之间的显著差异
- 关于在去中心化金融中进行交易
- 安装
- 运行回测
- 回测示例的变体
- 下一步
DeFi对算法交易员的益处
在去中心化交易所(https://tradingstrategy.ai/glossary/decentralised-exchange)上运行您的交易策略,而不是在中心化交易所上,具有以下好处:
- 以对手方风险为零的方式执行您的策略
- 无需经纪人,直接到交易所
- 完全控制您的策略市场数据和实时执行
- 在高效的去中心化市场上拥有低交易费用
- 将您的交易算法转换为链上基金
- 丰富的Python量化金融库(如pandas_ta 和 quantstats)的好处。
先决条件
您的技能
要使用此示例,您需要具备以下条件:
- 加密货币的基本经验
- 交易的基本经验
- TradingView的PineScript经验
- Python的初级经验
软件
- Python 3.10
- Python的Poetry包管理器
- Git
关于示例策略
示例策略回测文件位于 bollinger_band_example_defi_strategy.ipynb 笔记本中。
示例策略是一个简单的布林带策略。 策略是否盈利不在示例的范围内。 策略没有进行任何优化,参数的选择更多是基于直觉。请将此示例作为学习材料和您自己策略的基础。
-
仅做多 - 适用于 DEX现货市场,如Trader Joe
-
蜡烛图的时间框架为4小时
-
回测期为2024-04-01至2023-04-01
-
进入仓位时使用紧止损
- 这会导致在市场反弹期间多次关闭止损仓位和少量盈利仓位
-
我们针对以下实时交易对
- 在Avalanche的Trader Joe上EAVAXTH/USDC对,费率等级为20 BPS。请参阅
decide_trades()
Python代码中的相关注释。 - Coinbase ETH/USDC,市场接受费率为60 BPS(比DeFi贵12倍)
- 在Avalanche的Trader Joe上EAVAXTH/USDC对,费率等级为20 BPS。请参阅
注意:在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对上历史表现如何。
该策略在Coinbase上的AVAX-USD对上历史表现如何。
然而,如果在Coinbase上开启50 BPS的做市商费用,我们会看到这会毁掉策略的表现,导致亏损(与Trader Joe上的20 BPS费用相比)。
持仓情况
以下是Python策略中单个赢亏持仓的截图。您可以看到我们有一些盈利的长持仓,以及非常短的非盈利持仓。
价格行为和指标
以下是策略的价格行为和技术的截图。
交易总结
总结统计如下计算
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%
仓位时间线
以下是单个持仓。
示例代码
示例策略如下展示
策略核心
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交易费用
你有四个费用元素
- 区块链交易成本或燃气费用
- 将趋向于零并在未来变得微不足道
- 交易费,包括
- 流动性提供者费用
- ...以及协议费
- 通常为大型Uniswap v3池的0.05%,否则为AMM的0.25% - 0.30%
- 与Coinbase的0.60%做市商费用相比
- 价格影响
- 与订单簿交易所不同,由于基于流动性的价格具有确定性,因此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小时蜡烛图:与上述相同,但交易非常频繁
网格搜索
- 网格搜索 - 基本搜索:自动搜索策略参数的可选组合
- 网格搜索 - 多进程:使用Python多进程在更大的数据集和参数空间中优化策略参数
下一步
链接
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定要选择哪个,请了解更多关于安装软件包的信息。
源代码分布
构建分布
哈希值 用于 tradingview_defi_strategy-0.2.0-py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d7becf4f286b2910e0a010918bac83d2700250697138d932c10300469eb363b1 |
|
MD5 | 411683ab63425f619b865a0247bbbd6c |
|
BLAKE2b-256 | 59d765245b72310bf400d325a32017914647830fe2b02518eead14d992bf9af3 |