V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  bmpidev2019  ›  全部回复第 2 页 / 共 13 页
回复总数  252
1  2  3  4  5  6  7  8  9  10 ... 13  
@Livid 现在策引的多策略回测框架支持日线级别的股票、ETF ( A 股和美股都可以)与加密币的历史回测表现分析。刚才我做那个分析就是几分钟写策略(代码让 chatgpt 来写),然后配置一个组合,执行后就能产生那个走势图以及一个包含全部交易信号的 sqlite 数据库及组合表现(净值、benchmark 指数对比、交易记录、资金记录、持仓记录)的 sqlite 数据库,然后还能产生全部的回测日志供分析。

目前策引的组合都是我写策略然后发布的,还没有对会员开放自定义策略的功能,但是今年年底左右估计能开放给所有用户。如果会员有好的策略,我也可以帮忙创建相关的组合出来,包括策略的编写之类。

日内的数据理论上应该也行,因为底层回测引擎是 backtrader ,但是估计要做一些改动,目前还没有直接对日内数据做支持。
@Livid 我也很好奇,但我手头的 API 的日内数据,如果是 15 分钟级别只能提供最近两天的,日线可以提供到 2021 年前的,所以现在需要找到一个能有 BTC 日内历史数据的 API 接口才能回测。
@Livid 用上帝视角交易不要更简单😂但是真正的交易总是雾里看花,历史回测好歹能拨开点迷雾。有时间我用经验假设的策略最终回测效果都一般,真正效果好的反而是很简单的策略,太复杂的没有容错性,太简单的又很容易失效。
上面这个策略的代码如下:

```python
import pandas as pd
from trade_strategies import BaseTradeStrategy, TradeSignalState

class RsiStrategy(BaseTradeStrategy):
"""Relative Strength Index (RSI) Trading Strategy"""

# 默认参数
params = {
'rsi_period': 14,
'rsi_overbought': 70,
'rsi_oversold': 30,
}

def __init__(self, params=None):
super().__init__()
if params:
self.params.update(params)

def set_data(self, symbol, data):
self.symbol = symbol
self.data = data
self.calculate_indicators()

def calculate_indicators(self):
delta = self.data['Close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=self.params['rsi_period'], min_periods=1).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=self.params['rsi_period'], min_periods=1).mean()

rs = gain / loss
self.data['rsi'] = 100 - (100 / (1 + rs))

def is_buy_signal(self, rsi):
return rsi < self.params['rsi_oversold']

def is_sell_signal(self, rsi):
return rsi > self.params['rsi_overbought']

def generate_signals(self):
signals = [TradeSignalState.EMPTY.value for _ in range(len(self.data))]

for i in range(1, len(self.data)):
if self.is_buy_signal(self.data['rsi'].iloc[i]):
signals[i] = TradeSignalState.BUY.value
elif self.is_sell_signal(self.data['rsi'].iloc[i]):
signals[i] = TradeSignalState.SELL.value
else:
signals[i] = TradeSignalState.EMPTY.value

signal_df = pd.DataFrame({
'symbol': self.symbol,
'open': self.data['Open'],
'high': self.data['High'],
'low': self.data['Low'],
'close': self.data['Close'],
'volume': self.data['Volume'],
'rsi': self.data['rsi'],
'signal': signals
})

return signal_df

```
@Livid 感谢推荐。我刚实现了 RSI 日线级别的 BTC 策略(名字为加密币 3 号),回测效果一般。这个策略是当 RSI 的 14 日低于 30 时全仓买入,高于 70 时全仓卖出,它的表现效果如下:

```
{
"code": "myinvestpilot_cc_3",
"name": "加密币 3 号",
"currency": "USD",
"final_value": 108941.84725,
"net_value": 1.089418472500001,
"fund_value": 108.94184725000001,
"cagr": 3.059500151662209,
"sharpe_ratio": 0.1599847960509232,
"current_drawdown": -17.538621850579343,
"max_drawdown": -0.5061860724539857,
"max_drawdown_duration_days": 205,
"total_trades": 12,
"profit_trades": 8,
"loss_trades": 4,
"running_days": 1038,
"inception_date": "2021-06-08T00:00:00"
}
```

![]( https://img.bmpi.dev/5af30e19-6841-7886-fe35-87980b8d9ab3.png)

这个表现不如我在[策引加密币 2 号]( https://www.myinvestpilot.com/portfolios/myinvestpilot_cc_2 )中的吊灯止损均线策略的效果好。

但日内数据到底怎么样,在二倍做多的 ETF 上效果如何就不知道了,但是可以作为一个参考。
@Livid BITX 的问题是交易数据只能到去年,太短了,不过如果有历史日内数据,日内级别应该也够用了,但是搞不到历史的日内数据
@Livid 我在券商里看到 BITX 还是正常的交易时间才能交易,虽然可以盘前盘后,但始终不是 24 小时交易的。另外就是日内数据的获取我手头的付费 API 虽然能拿到日内数据,但是没法拿到历史日内数据,这种策略难以回测,除非能拿到很时间的日内数据,然后通过回测框架测试才能评估这个策略的有效性。

另外一种方式就是通过 BTC 日线级别的数据来回测,我准备用你这个策略来回测下 BTC 的标的,因为产生交易信号的标的如果不是交易标的的话,回测框架也不支持,或者需要做单独的处理。如果这个策略在 BTC 下的表现不错,那在二倍做多的 BITX 上应该也是有效的。
@Livid 需要回测下这个策略,但存在的问题是:

- 使用 BTC 得日内交易数据产生交易信号,但是买入时却是 ETF ,可能在同一天产生多个交易信号,这时候怎么处理?
- 只有买入没有卖出?

如果能对这两个问题做个假设,也就是在执行 ETF 买入时,聚合多个交易信号,只交易一次,以定投的形式进行,这样可以多次交易。

另外一个问题是测试此策略的基准是什么?是买入 BTC 持有不动呢还是买入 BITX 持有不动呢?至少策略的最终表现要比持有不动的效果好才行,也需要与主流指数做对比。
@JohnChang 最近会写一些的
@FsTurbo 因为没时间写😂
@AllenTsui 投资方面的,比如量化回测,投资的经验啥的,因为策略可能和经验假设相关,然后就是系统架构设计之类的,不过这个系统代码大多是 ChatGPT 4 写的,所以技术方面可以不做要求。
@maolon 我几个月在一个会话测试下来,感觉不影响,一个会话完全是可以的。
@cheneydog plus 会员一个月固定 20 刀。
@blankmiss 用 tailswind 写样式效果还不错。
@clifftts 就算是人来写代码都很难保证正确性,你需要给它合适的反馈才行。
@youthfire 4 的 api 根本用不起。
@prenwang coding 工作的重要性不断降低直到绝大部分的 coding 都是被生成的,当然不止 coding ,任何内容创作类的都可以被生成,人类最终从创作为主变成消费为主,消费 AI 创作的内容,这是不可避免的。既然大方向如此,作为从业者,越早接受这个事实越好。
@LeeReamond 用过 gpt 的话你不会有这种结论。
@daoqiongsi1101 对比了下,copilot 效果就是差,不如 gpt4 ,也没有 vision 功能
@LeeReamond 上千行代码有没有可能是写了几千行然后重构又删了几千行,最终保留下上千行的规模?这个规模对个人产品来说并不小。架构设计是因为一开始我设计了一个架构图上传给 chatgpt vison 来告诉它上下文,然后基于初始的架构开始设计系统,之后经过一系列的分析改进,这个架构和之前的已经完全不同,因为我并没有把初始草稿展示出来。所以架构设计在这里 chatgpt 是全程参与并改进的。
业务的复杂度无法在这里简单展示出来。整个系统涉及到了十几个服务,目前这个上千行代码的规模只是其中一个较复杂的服务之一。整体的架构图我也没有在这里展示。具体的产品功能可以看这两个网站自行理解吧:

- https://www.myinvestpilot.com/portfolios
- https://www.chat2invest.com/

最后再次说明,这些产品代码 90%(粗估)都是用 chatgpt 写出来的,我个人只是负责提供设计、验证与测试它的代码。
@rioshikelong121 管理 prompt ,我一般直接用一个 markdown 文件存储整个工程开发的记录。目前这个服务已经有一万五千行的与 gpt 对话的记录了。
@rioshikelong121 无非是 few shot 之类的技巧,因为 4 的理解能力已经很好了,3.5 的一些 prompt 其实没必要。用 GPT 用的好并不是 prompt 技巧好导致的,提合适的问题,去发现 gpt 回答存在的问题,寻找合适的方向解决问题,这些才是最重要的,也是用好它的关键。
@Yucxxxxxx 差距巨大
@lyyQAQ 页面没有长度限制,但实际上会遗忘之前到记录,有个内置窗口大小的限制
@pandaPapa 没有教程,个人经验
1  2  3  4  5  6  7  8  9  10 ... 13  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1478 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 17ms · UTC 16:58 · PVG 00:58 · LAX 09:58 · JFK 12:58
Developed with CodeLauncher
♥ Do have faith in what you're doing.