Блог им. Eth_algotrader
"""качаем с йаху дневки Эфира""" ticker='ETH-USD'Посмотрим на Биткоин:
"""нормировка риска по бенчмарку""" riskmult=2.8 #cr.DDmaxPercTicker.max()/br.DDmaxPerc.max() #мультипликатор риска стратегии для равенства просадки с бенчмарком bAdj=pd.DataFrame(index=sr.index) bAdj['PNLcum']=riskmult*sr['PNLwFee'].cumsum() bAdj['PNLpercStrategyAdj']=bAdj['PNLcum']*100/startbal bAdj['Balance']=bAdj['PNLcum']+startbal bAdj['BalanceMax']=bAdj.Balance.cummax() bAdj['DDmax']=(bAdj.BalanceMax-bAdj.Balance).cummax() bAdj['DDmaxPerc']=((bAdj.BalanceMax-bAdj.Balance)*100/bAdj.BalanceMax).cummax() sr=bAdj #если надо скорректировать риск по стратегииИ вместо строки 73 (закомментируем) воспользуемся строкой 74 (раскомментируем), чтобы вывести нормированную по риску эквити стратегии:
# cr[['PNLpercStrategy']].plot(figsize=(14, 8), lw=3, grid=True, ax=ax, color='blue') bAdj[['PNLpercStrategyAdj']].plot(figsize=(14, 8), lw=3, grid=True, ax=ax, color='blue') #для нормированной по риску стратегииВот она:
import pandas as pd import yfinance as yf import matplotlib.pyplot as plt br=pd.read_csv('real deals 24.02-13.10.24.csv', delimiter=',') """"преобразования типов""" br['Entry Price']=pd.to_numeric(br['Entry Price'].str.strip(to_strip='USDT')) br['Closing PNL']=pd.to_numeric(br['Closing PNL'].str.strip(to_strip='USDT')) br['Max. Open Interest']=pd.to_numeric(br['Max. Open Interest'].str.strip(to_strip='ETH')) br['Opened']=pd.to_datetime(br['Opened']) br['Closed']=pd.to_datetime(br['Closed']) """считаем кривые баланса и ПнЛ""" comiss=0.001 startbal=7411 br['Fee']=br['Entry Price']*br['Max. Open Interest']*comiss br['PNLwFee']=br['Closing PNL']-br['Fee'] br['PNLcum']=br['PNLwFee'].cumsum() br['PNLperc']=br['PNLcum']*100/startbal br['Balance']=br['PNLcum']+startbal br['BalanceMax']=br.Balance.cummax() br['DDmax']=(br.BalanceMax-br.Balance).cummax() br['DDmaxPerc']=((br.BalanceMax-br.Balance)*100/br.BalanceMax).cummax() """добавляем в начало строку со стартовыми значениями баланса и PnL""" startrow=pd.DataFrame(data={'PNLwFee': 0, 'PNLcum': 0, 'PNLperc': 0, 'Balance': startbal, 'Closed': br.Opened[0]-pd.Timedelta('2d')}, index=[0]) sr=pd.concat([startrow, br], ignore_index=True) sr.set_index(sr.Closed, inplace=True) """рисуем""" sr.Balance.plot(figsize=(14, 8)) sr.PNLcum.plot(figsize=(14, 8)) sr.PNLperc.plot(figsize=(14, 8)) """качаем с йаху дневки Эфира""" ticker='ETH-USD' eth=yf.download(ticker, start=sr.index[0], end=sr.index[sr.index.size-1]) eth.Close.plot(figsize=(14, 8)) """"PnL Эфира по дневкам""" eth['PNLperc'+ticker]=eth.Close*100/eth.Close[0]-100 eth['PNLperc'+ticker].plot(figsize=(14, 8)) eth['CloseMax']=eth.Close.cummax() eth['DDmaxPercTicker']=((eth.CloseMax-eth.Close)*100/eth.CloseMax).cummax() eth[['Close', 'CloseMax', 'DDmaxPercTicker']].plot() """складываем PnL робота по дням и соединяем с PnL Эфира по дням""" cr=eth.join(sr.PNLwFee.groupby(sr.index.date).sum(), how='outer') cr.PNLwFee.fillna(0, inplace=True) cr['PNLcum']=cr.PNLwFee.cumsum() cr['PNLpercStrategy']=cr.PNLcum*100/startbal """нормировка риска по бенчмарку""" # riskmult=2.8 #cr.DDmaxPercTicker.max()/br.DDmaxPerc.max() #мультипликатор риска стратегии для равенства просадки с бенчмарком # bAdj=pd.DataFrame(index=sr.index) # bAdj['PNLcum']=riskmult*sr['PNLwFee'].cumsum() # bAdj['PNLpercStrategyAdj']=bAdj['PNLcum']*100/startbal # bAdj['Balance']=bAdj['PNLcum']+startbal # bAdj['BalanceMax']=bAdj.Balance.cummax() # bAdj['DDmax']=(bAdj.BalanceMax-bAdj.Balance).cummax() # bAdj['DDmaxPerc']=((bAdj.BalanceMax-bAdj.Balance)*100/bAdj.BalanceMax).cummax() # sr=bAdj #если надо скорректировать риск по стратегии """"рисуем Стратегия VS бенчмарк""" fig, ax = plt.subplots() cr[['PNLperc'+ticker]].plot(figsize=(14, 8), lw=2, grid=True, ax=ax, color='orange') cr[['PNLpercStrategy']].plot(figsize=(14, 8), lw=3, grid=True, ax=ax, color='blue') # bAdj[['PNLpercStrategyAdj']].plot(figsize=(14, 8), lw=3, grid=True, ax=ax, color='blue') #для нормированной по риску стратегии plt.text(x=cr.index[(int)(cr.index.size/3)], y=cr.PNLpercStrategy.max()-10, size=16, s='Strategy DD=%.1f%%\n' % sr.DDmaxPerc.max()+ticker+' DD=%.1f%%' % cr.DDmaxPercTicker.max())