| Both sides previous revisionPrevious revision | |
| backtest_w_python [2025/03/23 08:31] – bruno | backtest_w_python [2025/03/27 17:02] (current) – [Sinon] bruno |
|---|
| |
| |
| ==== Sinon ==== | |
| |
| Un vieux code de 2022 (si pas plus). Chrypowatch n'existe plus, c'est dire :-) | |
| |
| <code python> | |
| # coding: utf-8 | |
| import requests | |
| import numpy as np | |
| import pandas as pd | |
| | |
| import talib | |
| | |
| url = 'https://api.cryptowat.ch/markets/kraken/btceur/ohlc' | |
| ohlc = requests.get(url).json()['result'][str(12*60*60)] | |
| columns = ['time','open','high','low','close','volume','count'] | |
| df = pd.DataFrame(ohlc, columns=columns).astype(float) | |
| df = df.iloc[-1000:] | |
| |
| df['RSI'] = talib.RSI(df['close'], timeperiod=14) | |
| #df['RSI'] = df.RSI.fillna(value=df.RSI.loc[14]) | |
| df['long'] = talib.SMA(df.close, timeperiod=200) | |
| #df['long'] = df.long.fillna(value=df.long.loc[200]) | |
| df['short'] = talib.SMA(df.close,timeperiod=14) | |
| #df['short'] = df.short.fillna(value=df.short.loc[14]) | |
| df['trend'] = df.long < df.short | |
| # signal | |
| df['sig_in'] = (df.RSI > 60) & df.trend | |
| df['sig_out'] = (df.RSI < 40)# | 1-df.trend | |
| #df['sig_in'] = (df.RSI.shift() < 70) & (df.RSI > 70) | |
| #df['sig_out'] = (df.RSI.shift() > 30) & (df.RSI < 30) | |
| #df['sig_in'] = (df.RSI.shift() < 25) & (df.RSI > 25) | |
| #df['stoploss'] = df.low.rolling(5).min().where(df.sig_in==1).ffill() | |
| #df['sig_out'] = ((df.RSI.shift() > 75) & (df.RSI < 75)) | ((df.RSI.shift()>25) & (df.RSI<25)) | (df.close < df.stoploss) | |
| |
| #df['signal'] = df.sig_in.where(df.sig_in).fillna(1-df.sig_out.where(df.sig_out)).ffill() | |
| #df['sig_out'].loc[0] = True | |
| #df['signal'] = (1-df.sig_out.where(df.sig_out)).fillna(df.sig_in.where(df.sig_in)).ffill()# * df.trend | |
| |
| df['sig_0'] = df.sig_in.astype(int) - df.sig_out.astype(int) | |
| df['sig_1'] = df.sig_0.where(df.sig_0!=0).ffill() | |
| df['signal'] = df.sig_1 > 0 | |
| # Rendements | |
| df['close'] = df.close.replace(to_replace=0, method='ffill') | |
| df['r_0'] = df.close / df.close.shift() | |
| df['r_strat'] = np.where(df.signal.shift(), df.r_0, 1) | |
| df['r_fee'] = np.where(df.signal.shift() + df.signal == 1, 1-0.0025, 1) | |
| # tronquage datafame | |
| #df = df.iloc[-700:] | |
| # Rendement cumulé | |
| df['R_net'] = (df.r_strat * df.r_fee).cumprod() | |
| # Graphiques | |
| from bokeh.plotting import figure,show | |
| from bokeh.layouts import column,row | |
| p1 = figure(height=300,width=800) | |
| p1.line(df.time,df.close) | |
| #p1.line(df.time,df.long,color='green') | |
| #p1.line(df.time,df.short,color='red') | |
| p2 = figure(height=100,width=800,x_range=p1.x_range) | |
| p2.line(df.time,df.RSI) | |
| #p3_0 = figure(height=100,width=800,x_range=p1.x_range) | |
| #p3_0.line(df.time,df.trend) | |
| p3_1 = figure(height=100,width=800,x_range=p1.x_range) | |
| p3_1.line(df.time,df.sig_in,color='green') | |
| p3_2 = figure(height=100,width=800,x_range=p1.x_range) | |
| p3_2.line(df.time,df.sig_out,color='red') | |
| p3_3 = figure(height=100,width=800,x_range=p1.x_range) | |
| p3_3.line(df.time,df.sig_0) | |
| p3_3_2 = figure(height=100,width=800,x_range=p1.x_range) | |
| p3_3_2.line(df.time,df.sig_1) | |
| p3_4 = figure(height=100,width=800,x_range=p1.x_range) | |
| p3_4.line(df.time,df.signal) | |
| p4 = figure(height=150,width=800,x_range=p1.x_range) | |
| p4.line(df.time,df.r_0,color='lightgray') | |
| p4.line(df.time,df.r_strat) | |
| p4.line(df.time,df.r_fee,color='red') | |
| p5 = figure(height=300,width=800,x_range=p1.x_range) | |
| p5.line(df.time,df.r_0.cumprod(),color='lightgray') | |
| p5.line(df.time,df.r_strat.cumprod()) | |
| p5.line(df.time,df.R_net,color='red') | |
| layout = column(p1,p2,p3_1,p3_2,p3_3,p3_3_2,p3_4,p4,p5) | |
| show(layout) | |
| </code> | |