做了一个支持多策略的全球市场投资交易提醒工具

36 天前
 bmpidev2019

这个产品断断续续做了好几年了,之前已经有两个版本废弃了,具体 i 可以看这个开源项目: https://github.com/myinvestpilot/gravestones

产品的初始念头是基于我自身的需求,一方面我不想浪费太多时间在投资交易上,这是因为没时间盯盘以及盯盘会受到市场的影响,再就是本金不多的情况下花太多时间在投资上挺浪费时间的,时间应该花在提高本金的事情上。

要解决这个问题,有多种办法,没有钱可以选择选好的公募基金,好的大 V 来跟投,有钱可以选择好的私募。但是这些方式并不适合我,我并不信任公募基金,也不信任大 V 的操作,虽然我认可某些大 V 的理念,但是我并不想去长期跟投一个人,这很容易出现公募基金的问题。

所以解决办法只能是通过一些量化回测的方式,通过一些策略去做自动化的交易,但股票的流动是个大问题,所以这里可选的也就只有 ETF 了。于是这个产品的雏形出现了,早期是一个双均线策略的提醒工具,策略非常简单,甚至没有去优化,因为我担心过拟合的问题,因为似乎双均线在 A 股的效果还不错,我甚至还专门做过一些回测:双均线交易策略

但这个系统存在一些问题,不支持美股与加密币,我也不想一棵树上吊死,显然全球投资是必然的,那么从资产配置的角度看,A 股、美股与加密币就是一个不错的选择。为了支持全球市场以及多种资金策略与交易策略,去年开始我把系统升级成了现在这个产品的形态。目前创建各种策略的组合非常简单,甚至在未来会把策略与组合创建的权限下放给所有用户。现在你可以查看支持全球市场的十几个组合的历史表现: https://www.myinvestpilot.com/portfolios

另外一个需要注意的是,为了展示策略的有效性,我会通过创建一些模拟组合,通过组合的历史表现风险数据来评估策略的有效性,这也是为什么策略与组合在一起出现的原因。

当然这个产品也有一个面向海外的子产品:Chat2Invest,这是基于 LLM 的一个 AI 工具,能帮助分析个股的一些技术与基本面消息面的问题,但是因为模型的不稳定,目前这个子产品还处于试验阶段,我会在后续把策略选股及组合分析的功能也加入进去,更重要的是可以监控个股或市场,这个目的都是为了降低时间成本,让长期投资变得更容易一些。

现在提供一个免费申请试用的活动,首页里填写一个调查问卷,大概十几个小问题就可能获得试用的机会,如果感兴趣,请直接提供反馈给我吧,谢谢!

12362 次点击
所在节点    分享创造
105 条回复
AllenTsui
36 天前
先点赞,再细看,想问问做这种东西都需要那些垂直领域的知识技能?
bmpidev2019
36 天前
@AllenTsui 投资方面的,比如量化回测,投资的经验啥的,因为策略可能和经验假设相关,然后就是系统架构设计之类的,不过这个系统代码大多是 ChatGPT 4 写的,所以技术方面可以不做要求。
AllenTsui
36 天前
@bmpidev2019 了解,没想到 ChatGPT 已经这么厉害了,👍
FsTurbo
36 天前
你的博客好像已经很久不更新了
xiaozirun
36 天前
这个价格有点...... 太贵了吧!!!
bmpidev2019
36 天前
@FsTurbo 因为没时间写😂
JohnChang
36 天前
你的博客好像已经很久不更新了

ps.前段也是在博客注意到这个策引网站,已经收藏了,虽然看不懂。
bmpidev2019
35 天前
@JohnChang 最近会写一些的
Livid
35 天前
如果策略是在每次 BTC 的 15m/1h RSI 下穿 30 的时候买入 BITX ( 2 倍做多 ETF )你觉得如何呢?
bmpidev2019
35 天前
@Livid 需要回测下这个策略,但存在的问题是:

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

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

另外一个问题是测试此策略的基准是什么?是买入 BTC 持有不动呢还是买入 BITX 持有不动呢?至少策略的最终表现要比持有不动的效果好才行,也需要与主流指数做对比。
Livid
35 天前
@bmpidev2019 BITX 可以 24 小时交易(除了周日),在 extended hours 会有一定的价格延迟。

卖出策略可以是手动执行,或者在 15m RSI 上穿 70 的时候卖。

在目前的牛市背景下,一直拿到 1d RSI 70 也不是不行。
Livid
35 天前
BITX 的 YTD 表现

bmpidev2019
35 天前
@Livid 我在券商里看到 BITX 还是正常的交易时间才能交易,虽然可以盘前盘后,但始终不是 24 小时交易的。另外就是日内数据的获取我手头的付费 API 虽然能拿到日内数据,但是没法拿到历史日内数据,这种策略难以回测,除非能拿到很时间的日内数据,然后通过回测框架测试才能评估这个策略的有效性。

另外一种方式就是通过 BTC 日线级别的数据来回测,我准备用你这个策略来回测下 BTC 的标的,因为产生交易信号的标的如果不是交易标的的话,回测框架也不支持,或者需要做单独的处理。如果这个策略在 BTC 下的表现不错,那在二倍做多的 BITX 上应该也是有效的。
bmpidev2019
35 天前
@Livid BITX 的问题是交易数据只能到去年,太短了,不过如果有历史日内数据,日内级别应该也够用了,但是搞不到历史的日内数据
Livid
35 天前
@bmpidev2019 因为这个 ETF 是去年才上线的。

接入了 Blue Ocean 的券商可以支持 24 小时交易:

https://blueocean-tech.io/our-services/
bmpidev2019
35 天前
@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
35 天前
@bmpidev2019 用现在回去看的上帝视角,2022 年整年的正确操作就是不要操作,年底的时候抄底。:)
bmpidev2019
35 天前
上面这个策略的代码如下:

```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

```
bmpidev2019
35 天前
@Livid 用上帝视角交易不要更简单😂但是真正的交易总是雾里看花,历史回测好歹能拨开点迷雾。有时间我用经验假设的策略最终回测效果都一般,真正效果好的反而是很简单的策略,太复杂的没有容错性,太简单的又很容易失效。
Livid
35 天前
@bmpidev2019 如果是在 2023 年 1 月 1 日开始的 15 分钟的数据上呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1031232

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX