Files
2025-10-31 09:32:53 +08:00

85 lines
2.2 KiB
Python

import vectorbt as vbt
import pandas as pd
import numpy as np
import datetime
end_time = datetime.datetime.now()
start_time = end_time - datetime.timedelta(days=2)
btc_price = vbt.YFData.download(
["BTC-USD","ETH-USD"],
missing_index='drop',
start=start_time,
end=end_time,
interval="1m").get("Close")
def custom_indicator(close, rsi_window = 14, ma_window = 50, entry = 30, exit = 70):
close_5m = close.resample("5T").last()
rsi = vbt.RSI.run(close_5m, window = rsi_window).rsi
rsi, _ = rsi.align(close,
broadcast_axis=0,
method='ffill',
join='right')
close = close.to_numpy()
rsi = rsi.to_numpy()
ma = vbt.MA.run(close, ma_window).ma.to_numpy()
trend = np.where( rsi > exit, -1, 0)
trend = np.where( (rsi < entry) & (close < ma), 1, trend)
return trend
ind = vbt.IndicatorFactory(
class_name = "Combination",
short_name = "comb",
input_names = ["close"],
param_names = ["rsi_window", "ma_window","entry","exit"],
output_names = ["value"]
).from_apply_func(
custom_indicator,
rsi_window = 14,
ma_window = 50,
entry = 30,
exit = 70,
keep_pd=True
)
res = ind.run(
btc_price,
rsi_window = np.arange(10,40,step=3,dtype=int),
#ma_window = np.arange(20,200,step=20,dtype=int),
entry = np.arange(10,40,step=4,dtype=int),
exit = np.arange(60,85,step=4,dtype=int),
param_product = True
)
#print(res.value.to_string())
entries = res.value == 1.0
exits = res.value == -1.0
pf = vbt.Portfolio.from_signals(btc_price, entries, exits)
returns = pf.total_return()
#returns = returns[ returns.index.isin(["BTC-USD"], level="symbol")]
#returns = returns.groupby(level=["comb_exit","comb_entry","symbol"]).mean()
print(returns.to_string())
print(returns.max())
print(returns.idxmax())
"""comb_rsi_window comb_ma_window"""
fig = returns.vbt.volume(
x_level = "comb_rsi_window",
y_level = "comb_entry",
z_level = "comb_exit",
slider_level = "symbol",
)
fig.show()