2021 Криптовалютный обзор TAQ и самая простая пропущенная стратегия 10-кратного увеличения

Автор:Нинабадасс., Создано: 2022-04-07 11:36:32, Обновлено: 2022-04-13 09:25:23

2021 Криптовалютный обзор TAQ и самая простая пропущенная стратегия 10-кратного увеличения

Заключение и будущая стратегия на 2021 год.ipynb

2021 год подходит к концу, и горячие точки от DEFI до GAMEFI появляются одна за другой, и общий рынок все еще находится на бычьем рынке. Оглядываясь назад, сколько вы заработали в 2021 году? Какую возможность вы упустили? Есть ли какие-либо успешные инвестиции? Недавно я просмотрел историю котировок рынка прошлого года и нашел неожиданно простую стратегию получения прибыли, но это мультивалютный индекс.

На платформах перечислено слишком много валютных символов, и многие из них обречены быть неизвестными и могут даже быть изъяты из торговли. Здесь мы выбираем валютные символы, которые были перечислены на Binance Perpetual Swap. Они, как правило, были протестированы и признаны основными валютами, которые относительно безопасны. После простого скрининга некоторые индексные валюты были удалены, и 134 валюты, наконец, выжили.

В [1]: запросы на импорт от даты времени даты ввоза, даты времени Время импорта Импорт панды как pd импортировать нумпи как np Импортировать matplotlib.pyplot как plt % матрицы в строке

В [144]: ##текущая торговая пара Информация = запросы.получать"https://fapi.binance.com/fapi/v1/exchangeInfo’) символы = [s[symbol] для s в Info.json() [symbols]]

В [154]: symbols_f = list(set(filter(lambda x: x[-4:] == USDT, [s.split(_) [0] для s в символах]))- В случае, если вы хотите, чтобы вы использовали данный код, вы должны установить следующие параметры: print ((символы_f)

В [155]: print(len(символы_f))

Рынок в прошлом году

Затем мы получаем их ежедневные цены за последний год, и мы замечаем, что некоторые валютные символы были на рынке только в течение короткого периода времени, поэтому данные нуждаются в обработке унитации.

Окончательная прибыль индекса примерно в 12 раз, то есть, если вы покупаете эти 134 валютных символа в среднем 1 января 2021 года, конечная прибыль от ничего не делать в 12 раз, и, по оценкам, более 90% людей не превосходят средний индекс. Среди них, валютные символы с самым большим снижением: ICP упал на 93%, DODO упал на 85%, и LINA упала на 75%. Увеличение почти в сто раз: SOL, FTM, LUNA, MATIC, SAND, AXS. Среди них AXS увеличился в 168 раз и является самой большой темной лошадью. Медиана увеличилась в 3 раза. Можно сказать, что индекс в основном движится публичными сетями и играми. Чтобы предотвратить предвзятость выживания, за исключением вновь перечисленных валютных символов в течение периода, он также достиг прибыли почти в 11 раз. Это просто держание BTC.

Это отчаянное соотношение прибыли. Я много работал и пробовал всевозможные стратегии, и я не получал столько прибыли, сколько в год, когда я не прилагал никаких дополнительных усилий. Однако следует отметить, что несколько увеличений соотношения слишком велики и, очевидно, отклоняются от индекса. Если эти валютные символы не выбраны в начале года, прибыль будет близка к медиане, которая гораздо менее заметна.

В [157]: #функция для получения K-линии в любом периоде def GetKlines ((символ=BTCUSDT,start=2020-8-10,end=2021-8-10,period=1h,base=fapi,v = v1): Клин = [] start_time = int(time.mktime(datetime.strptime(start, %Y-%m-%d).timetuple()))1000 + 860601000 end_time = int(time.mktime(datetime.strptime(end, %Y-%m-%d).метметпуль()))1000 + 860601000 intervel_map = {m:601000,h:60601000,d:2460601000) в то время как время начала < время окончания: mid_time = min(start_time+1000*int(period[:-1])intervel_map[период[-1],конец_время] url = https://+base+.binance.com/+base+/+v+/klines?символ=%s&interval=%s&startTime=%s&endTime=%s&limit=1000%(символ,период,start_time,mid_time) res = requests.get ((url)) res_list = res.json() если type ((res_list) == list и len ((res_list) > 0: start_time = res_list[-1][0] Klines += res_list elif type ((res_list) == список: start_time = start_time+1000int(период[:-1])*intervel_map[период[-1]] другие: перерыв

df = pd.DataFrame(Klines,columns=['time','open','high','low','close','amount','end_time','volume','count','buy_amount','buy_volume','null']).astype('float')
df.index = pd.to_datetime(df.time,unit='ms')
profit df

В [164]: df_all_s = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1d), столбцы=символы_s) для i в диапазоне ((len ((символы_f)): #print ((символы_s[i]) symbol_s = символы_f[i] df_s = GetKlines ((символ=символ_s,start=2021-1-1,end=2021-12-28,period=1d,base=api,v=v3) df_all_s[symbol_s] = df_s[~df_s.index.duplicated ((keep=first) ].close

В [165]: df_all_s.tail() # структура данных Выход[165]:

В [174]: df_all = df_all_s.fillna ((method=bfill) # заполнить данные df_norm = df_all/df_all.iloc[0] #unitization df_norm.mean ((ось=1).плот ((размер фига=(12,4), сетка=правда); #графика конечного индекса прибыли Выход[174]:img

В [175]: #медианное увеличение df_norm.median ((ось=1).плот ((размер фига=(12,4), сетка=правда); Выход[175]:img

В [168]: # подъем и падение сортировки print ((df_norm.iloc[-1].round ((2).sort_values().to_dict())

В [317]: #максимальный вывод текущей цены по сравнению с самой высокой ценой за последний год print ((((1-df_norm.iloc[-1]/df_norm.max()).round(2).sort_values().to_dict())

В [177]: df_all_f = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1d), столбцы=символы_s) для i в диапазоне ((len ((символы_f)): #print ((символы_s[i]) symbol_f = символы_f[i] df_f = GetKlines ((символ=символ_f,start=2021-1-1,end=2021-12-28,период=1d,база=fapi,v=v1) df_all_f[symbol_f] = df_f[~df_f.index.duplicated ((keep=first) ].close

В [208]: # не включает новые символы df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].isnull() ] df = df.fillna ((метод=bfill) df = df/df.iloc[0] df.mean ((axis=1).plot ((figsize=(12,4),grid=True); Выход[208]:img

В [212]: #по сравнению с BTC (df.mean(axis=1)/df.BTCUSDT).graph ((figsize=(12,4),grid=True); Выход[212]:img

В [213]: # Используйте старый тест-двигатель класс Обмен:

def __init__(self, trade_symbols, fee=0.0004, initial_balance=10000):
    self.initial_balance = initial_balance #initial asset  
    self.fee = fee
    self.trade_symbols = trade_symbols
    self.account = {'USDT':{'realised_profit':0, 'unrealised_profit':0, 'total':initial_balance, 'fee':0}}
    for symbol in trade_symbols:
        self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0,'unrealised_profit':0,'fee':0}
        
def Trade(self, symbol, direction, price, amount):
    
    cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
    open_amount = amount - cover_amount
    self.account['USDT']['realised_profit'] -= price*amount*self.fee #deduct service fee
    self.account['USDT']['fee'] += price*amount*self.fee
    self.account[symbol]['fee'] += price*amount*self.fee

    if cover_amount > 0: #close first 
        self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount  #profit
        self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
        
        self.account[symbol]['amount'] -= -direction*cover_amount
        self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
        
    if open_amount > 0:
        total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
        total_amount = direction*self.account[symbol]['amount']+open_amount
        
        self.account[symbol]['hold_price'] = total_cost/total_amount
        self.account[symbol]['amount'] += direction*open_amount
                

def Buy(self, symbol, price, amount):
    self.Trade(symbol, 1, price, amount)
    
def Sell(self, symbol, price, amount):
    self.Trade(symbol, -1, price, amount)
    
def Update(self, close_price): #update asset
    self.account['USDT']['unrealised_profit'] = 0
    for symbol in self.trade_symbols:
        self.account[symbol]['unrealised_profit'] = (close_price[symbol] - self.account[symbol]['hold_price'])*self.account[symbol]['amount']
        self.account[symbol]['price'] = close_price[symbol]
        self.account[symbol]['value'] = abs(self.account[symbol]['amount'])*close_price[symbol]
        self.account['USDT']['unrealised_profit'] += self.account[symbol]['unrealised_profit']
    self.account['USDT']['total'] = round(self.account['USDT']['realised_profit'] + self.initial_balance + self.account['USDT']['unrealised_profit'],6)

В [418]: #для более точного обратного теста, сканируйте 1-часовую K-линию df_all_s = pd.DataFrame ((index=pd.date_range ((start=2021-1-1, end=2021-12-28, freq=1h), столбцы=символы_s) для i в диапазоне ((len ((символы_f)): #print ((символы_s[i]) symbol_s = символы_f[i] df_s = GetKlines ((символ=символ_s,start=2021-1-1,end=2021-12-28,period=1h,base=api,v=v3) df_all_s[symbol_s] = df_s[~df_s.index.duplicated(keep=first)].close

В [419]: df = df_all_s[df_all_s.columns[~df_all_f.iloc[0].isnull() ] df = df.fillna ((метод=bfill) df = df/df.iloc[0] df.mean(axis=1).plot(figsize=(12,4),grid=True); Вне[419]:img

Сбалансированные результаты стратегии

В обратном тесте были отобраны все валютные символы, перечисленные на контрактах Binance Perpetual 1 января 2021 года. Период K-линии составляет 1h, и параметр заключается в том, что начать покупать, когда сумма позиции составляет менее 5% от среднего, и начать продавать, когда она превышает 5%. При обратном тесте всех валютных символов, окончательная прибыль стратегии составляет 7,7 раза. Значительно хуже средней прибыли в 13 раз. Это также в моем ожидании. В конце концов, те валютные символы, которые увеличились в сто раз, слишком особенны, и сбалансированная стратегия продаст их все.

Если в обратном тесте будет удалено 10 валютных символов с наибольшим увеличением, и будут рассмотрены только относительно посредственные валютные символы, конечная прибыль составит 4,8 раза, что значительно превышает среднюю производительность в 3,4 раза.

Если вращаются только три валютных символа с наибольшим увеличением, конечная прибыль составляет 373 раза, что намного превышает среднюю производительность в 160 раз.

В [494]: #Backtest всех символов символы = list(df.iloc[-1].sort_values() [:].index) e = обменные символы, плата = 0,001, первоначальный_баланс = 10000) res_list = [] avg_pct = 1/len (символы) для строки в df[символы].iterrows(): цены = строка[1] сумма = e.account[USDT][total] e.Обновление цен) для символа в символах: pct = e.счет[символ][стоимость]/общий если pct < 0,95*avg_pct: e.Покупать (символ,цены (символ), (счет)Общее количество/цены[символ]) если pct > 1,05avg_pct: e.Продажа ((символ,цены[символ],(pct-avg_pct) *всего/цены[символ]) res_list.append (([e.account[symbol][value] для символа в символах] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, столбцы=символы+[total],index = df.index)

В [495]: e.счет[USDT] Выход[495]:

В [496]: #Backtest производительность всех символов (res.total/10000).плот ((figsize=(12,4), сетка = True); df[символы].средняя ((ось=1).плот ((размер фига=(12,4), сетка=Правда); Выход[496]:img

В [498]: # уменьшить символы с огромным увеличением символы = list ((df.iloc[-1].sort_values() [:-10].index) e = обменные символы, плата = 0,001, первоначальный_баланс = 10000) res_list = [] avg_pct = 1/len (символы) для строки в df[символы].iterrows(): цены = строка[1] сумма = e.account[USDT][total] e.Обновление цен) для символа в символах: pct = e.счет[символ][стоимость]/общий если pct < 0,95*avg_pct: e.Покупать (символ,цены (символ), (счет)Общее количество/цены[символ]) если pct > 1,05avg_pct: e.Продажа ((символ,цены[символ],(pct-avg_pct) *всего/цены[символ]) res_list.append (([e.account[symbol][value] для символа в символах] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, столбцы=символы+[total],index = df.index)

В [501]: e.счет[USDT] Выход[501]:

В [499]: (res.total/10000).плот ((figsize=(12,4), сетка = True); df[символы].средняя ((ось=1).плот ((показать размер=(12,4), сетка=Правда); Выход из строя[499]:img

В [503]: # только проверьте символы с самым высоким увеличением символы = list(df.iloc[-1].sort_values()[-3:].index) e = обменные символы, плата=0,001, начальное_остаток=10000) res_list = [] avg_pct = 1/len (символы) для строки в df[символы].iterrows(): цены = строка[1] сумма = e.account[USDT][total] e.Обновление цен) для символа в символах: pct = e.счет[символ][стоимость]/общий если pct < 0,95*avg_pct: e.Покупать (символ,цены (символ), (счет)Общее количество/цены[символ]) если pct > 1,05avg_pct: e.Продажа ((символ,цены[символ],(pct-avg_pct) *всего/цены[символ]) res_list.append (([e.account[symbol][value] для символа в символах] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, столбцы=символы+[total],index = df.index)

В [504]: e.счет[USDT] Выход[504]:

В [505]: (res.total/10000).плот ((figsize=(12,4), сетка = True); df[символы].средняя ((ось=1).плот ((размер фига=(12,4), сетка=Правда); Выход[505]:img

Заключение

В целом, 2021 год был большим бычьим рынком для копийных валют и пустынным годом для BTC. Рыночная стоимость BTC упала с 70% в начале года до 40% сейчас, что уже является самым низким уровнем в истории. Поэтому средняя прибыль от покупки копирайтных валютных символов и их хранения в прошлом году была намного выше, чем от хранения BTC. Ожидая 2022 года, если вы думаете, что в будущем на текущем рынке еще несколько сотен раз родится валюта, вы можете смело диверсифицировать валютные символы, которые вы держите, и терпеливо ждать. Если вы особенно оптимистичны по отношению к нескольким валютным символам или среднему рынку, вы можете использовать стратегию вращения, чтобы получить избыточную прибыль без раздумий. Если вы согласитесь, что вещи будут развиваться в противоположном направлении, когда они станут экстремальными, вы можете рыбачить вниз BTC для лучшей прибыли и безопасности.


Больше