Блог им. 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())




