Files
quant/vectorbt-for-beginners-2022-main/4- optimization/tutorial.py
2025-10-31 09:32:53 +08:00

75 lines
1.9 KiB
Python

import vectorbt as vbt
import pandas as pd
import numpy as np
import datetime
import talib
from numba import njit
end_time = datetime.datetime.now()
start_time = end_time - datetime.timedelta(days=2)
btc_price = pd.read_csv("data.csv")
btc_price["Datetime"] = pd.to_datetime(btc_price["Datetime"])
btc_price.set_index("Datetime", inplace=True)
print(btc_price)
RSI = vbt.IndicatorFactory.from_talib('RSI')
@njit
def produce_signal(rsi, entry, exit):
trend = np.where( rsi > exit, -1, 0)
trend = np.where( (rsi < entry) , 1, trend)
return trend
def custom_indicator(close, rsi_window = 14, entry = 30, exit = 70):
rsi = RSI.run(close, rsi_window).real.to_numpy()
return produce_signal(rsi, entry, exit)
ind = vbt.IndicatorFactory(
class_name = "Combination",
short_name = "comb",
input_names = ["close"],
param_names = ["rsi_window","entry","exit"],
output_names = ["value"]
).from_apply_func(
custom_indicator,
rsi_window = 14,
entry = 30,
exit = 70,
)
rsi_windows = np.arange(10,40,step=1,dtype=int)
entries = np.arange(10,40,step=1,dtype=int)
master_returns = []
for window in rsi_windows:
res = ind.run(
btc_price,
rsi_window = window,
entry = entry,
exit = np.arange(60,85,step=1,dtype=int),
param_product = True
)
entries = res.value == 1.0
exits = res.value == -1.0
pf = vbt.Portfolio.from_signals(btc_price, entries, exits)
master_returns.append(pf.total_return())
print(master_returns)
returns = pd.concat(master_returns)
#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())