Расширенные исследования платформ
FMZ имеет встроенный ноутбук jupyter, который помогает пользователям ознакомиться с API платформы и проводить исследования стратегии, и поддерживает среды обучения Python3 C++11/17 и Javascript. Notebook+Python является очень мощным инструментом, который практически незаменим для анализа данных и исследования стратегии. Хотя бэкстест, который поставляется с платформой FMZ, очень полезен, он не подходит для стратегий со сложными и большими объемами данных. В этой статье будут представлены некоторые передовые навыки использования ноутбука jupyter и реализованы бэкстесты стратегий случайной торговли парами и многопарной торговли.
Внутри FMZ можно использовать исследовательскую среду, но сеть неудобна. Рекомендуется установить на собственное устройство анаконда3, с ноутбуком и часто используемыми связанными библиотеками для математических вычислений; он может делиться локальной сетевой средой и иметь лучшую производительность. Также рекомендуется использовать Google colab. Хотя есть некоторые ограничения на хранение, он бесплатный и мощный, подходящий для исследований, связанных с изучением роботов.
Существует множество онлайн-уроков для конкретных навыков использования блокнот и Python. Вы можете найти много информации, искав ключевые слова, такие как квантификация Python и инструкция по блокнот jupyter. Вам нужно выучить и освоить ряд основ, таких как сканер, обработка данных, бэкстест, проектирование стратегии и планирование.
Платформы обычно предоставляют API для получения K-линий с данными истории, а некоторые также предоставляют данные о выполнении торговли по торговле.
Далее мы продемонстрируем, как получить и сохранить данные K-линии вечных контрактов на Binance.
Во-первых, найдите документацию на Бинанс:https://binance-docs.github.io/apidocs/futures/cn/#c59e471e81. Вы можете увидеть необходимые параметры и возвращенные форматы данных. Обычно количество K-линий, приобретенных API, ограничено, а Binance имеет максимум 1000, поэтому он должен быть приобретен путем итерации петли. Ситуация на других платформах аналогична Binance. Обратите внимание, что сеть должна быть подключена к зарубежной сети (по сравнению с внутренней сетью в Китае), чтобы сканировать K-линии.
Периоды поддержки Binance: 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M.
В [24]:
запросы импорта #просьбы сети для общей библиотеки
от даты времени даты ввоза, даты времени
Время импорта
Импорт панды как pd
В [160]:
def GetKlines ((символ=
Сохранение и чтение данных может использовать функции внутри библиотеки панды. Формат - csv, который можно открыть непосредственно с помощью программного обеспечения excel.
В дополнение к самой высокой цене, самой низкой цене, открытой цене, цене закрытия и объему исполнения, данные K-линии, возвращенные Binance, также включают общую сумму торговли, сумму покупки инициативы, сумму исполнения и т. Д. Это ценная информация, которая может быть использована для построения стратегий.
В [86]:
df.to_csv ((
- Да.
В [88]:
df.index = pd.to_datetime ((df.time,unit=
В предыдущей статье также был представлен двигатель обратной проверки Python, но вот оптимизированная версия. USDT-маржированные (или другие котируемые валютные маржированные) вечные контракты очень похожи на спотовые контракты. Разница заключается в том, что вечные контракты могут быть использованы и держать отрицательную сумму (эквивалент короткого), и могут делиться двигателем обратной проверки.
Здесь приводится простой пример, который может реализовать многосимвольное спотовое или многосимвольное постоянное обратное тестирование. Многие детали игнорируются: такие как рычаг фьючерсов, занятость маржи, ставка финансирования, механизм ликвидации, рыночное создание и транзакции заказчиков, а также поддержание заказов, но это обычно не влияет на обычные результаты обратного тестирования. И цена и количество соответствия и обновление счета все должны быть импортированы извне. Читатели могут улучшить его на этой основе.
Введение класса обмена:
account:USDT указывает базовую валюту, которая не требуется; realized_profit: уже реализованная прибыль и убыток; unrealised_profit: еще не реализованная прибыль и убыток; сумма: общий собственный капитал; комиссионная: комиссионная за обработку. Для других торговых пар сумма (которая является отрицательным числом при покупке); hold_price: цена хранения; стоимость: стоимость хранения; цена: текущая цена.
trade_symbols: массив торговых пар; вы также можете передавать в одной торговой паре; валютой по умолчанию является USDT, но вы также можете использовать другие символы валют для обратного тестирования.
сбор: сбор за передачу; проще говоря, не различайте производителя и получателя.
initial_balance: первоначальные активы; первоначальная сумма двойной торговой пары по умолчанию равна 0.
Функция покупки: покупка, которая соответствует длинному и короткому закрытию постоянных контрактов без механизма соответствия.
Функция продажи: продавать.
Функция обновления: для обновления информации о счете, которая должна быть передана в словарь цен всех торговых пар. В [98]: класс Обмен:
def Инит(self, trade_symbols, fee=0.0004, initial_balance=10000):
self.initial_balance = initial_balance #первоначальный баланс
self.fee = плата
self.trade_symbols = trade_symbols
self.account = {
def Торговля ((самостоятельно, символ, направление, цена, сумма):
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 #take out the 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 Купить ((самостоятельно, символ, цена, сумма):self.Trade(символ 1, цена, сумма)
def Продать ((самостоятельно, символ, цена, сумма):self.Trade(символ -1, цена, сумма)
def Update ((self, close_price): #обновление активов
собственный счет[
Во-первых, давайте проверим классическую стратегию вечной сетки. Эта стратегия очень популярна на нашей платформе в последнее время. По сравнению со спотовой сеткой, ей не нужно держать валюту и она может добавить рычаг, что гораздо удобнее, чем спотовая сетка. Однако, поскольку ее нельзя напрямую проверить, это не благоприятно для выбора валютных символов. Здесь мы используем движок backtest прямо сейчас, чтобы проверить его.
В верхней части
Чем короче период K-линии, тем точнее соответствующие результаты бэкстеста, и тем больше требуемый объем данных.
В [241]:
символ =
e = Exchange (([символ], сбор=0.0002, первоначальный_баланс=10000)
init_price = df.loc[0,
if kline.low < buy_price: #the lowest price of K-line is less than the current maker price; the buy order is executed
e.Buy(symbol,buy_price,value/buy_price)
if kline.high > sell_price:
e.Sell(symbol,sell_price,value/sell_price)
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount'], e.account['USDT']['total']-e.initial_balance])
res = pd.DataFrame ((data=res_list, columns=[
Этот тип стратегии также относительно популярен, но платформа FMZ не очень хороша в обратном тестировании стратегий с несколькими символами, просто используйте этот механизм обратного тестирования, чтобы попробовать. Мы выбираем четыре основных валютных символа, BTC, ETH, LTC и XRP, и настраиваем 25% рыночной стоимости соответственно, и балансируем каждое 1% отклонение.
Во-первых, получите цены закрытия четырех символов за последний год. Можно увидеть, что ETH имеет наибольший рост, а другие три имеют аналогичные увеличения. Если вы держите эти четыре символа в среднем, конечная чистая стоимость составляет 4.5. После обратного тестирования стратегия равновесия имеет конечную чистая стоимость 5.3, которая немного улучшена.
В [290]:
символы = [
Стратегия черепахи - это классическая стратегия тренда, которая включает в себя полную логику стоп-лосса для добавления позиций.https://zhuanlan.zhihu.com/p/27987938Мы будем реализовывать простую версию здесь для бэкстеста.
Период стратегии черепахи оказывает большое влияние на стратегию, и не рекомендуется выбирать слишком короткий период. Здесь мы выбираем 6h. Период канала Дончиана выбирается как 5, а отношение позиций выбирается как 0,003 в соответствии с бэкстером. Когда цена проходит через upBand канала для открытия 1 единицы длинной позиции, и цена продолжает расти на 0,3 волатильности после открытия позиций, продолжайте добавлять 1 единицу, и цена падает ниже 2,5 волатильности последней открытой цены для остановки убытка. Принцип короткого ордера тот же. Из-за большого бычьего рынка ETH стратегия черепахи захватила основной тренд и в конечном итоге достигла 27 раз прибыли, с максимальным рычагом использования 4 раза в течение периода.
Параметры стратегии черепахи тесно связаны с периодом, и они должны быть выбраны путем обратного теста.
По окончательному диаграмме чистой стоимости можно увидеть, что стратегия черепахи - это долгосрочная стратегия, в течение которой может не быть прибыли в течение 3-4 месяцев, и повторяющиеся остановки убытков, но как только есть большая рыночная котировка с одной стороны, стратегия черепахи может воспользоваться трендом для накопления большой позиции, удержать ее до конца тренда, заработать много прибыли. В конце роста стратегия будет накапливать много позиций. В это время волатильность будет относительно большой, и часто большие прибыли будут сняты. Использование стратегии черепахи требует от вас принять ее недостатки и ваше терпение.
В [424]:
символ =
if kline.high > kline.up and e.account[symbol]['amount'] == 0: #first time to open long position
e.Buy(symbol,kline.up,unit) #notice the trading price here
last_price = kline.up
if e.account[symbol]['amount'] > 0 and kline.high > last_price + open_times*kline.N: #long position, buy in
e.Buy(symbol,last_price + open_times*kline.N,unit)
last_price = last_price + open_times*kline.N
if e.account[symbol]['amount'] > 0 and kline.low < last_price - stop_times*kline.N: #long position, stop loss
e.Sell(symbol,last_price - stop_times*kline.N,e.account[symbol]['amount'])
if kline.low < kline.down and e.account[symbol]['amount'] == 0: #open short
e.Sell(symbol,kline.down,unit)
last_price = kline.down
if e.account[symbol]['amount'] < 0 and kline.low < last_price - open_times*kline.N: #short position, buy in
e.Sell(symbol,last_price - open_times*kline.N,unit)
last_price = last_price - open_times*kline.N
if e.account[symbol]['amount'] < 0 and kline.high > last_price + stop_times*kline.N: #short position, stop loss
e.Buy(symbol,last_price + stop_times*kline.N,-e.account[symbol]['amount'])
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount']*kline.close, e.account['USDT']['total']])
res = pd.DataFrame ((data=res_list, columns=[
Если вы хорошо разбираетесь в использовании платформы исследований для ноутбуков jupyter, вы можете легко выполнять операции, такие как сбор данных, анализ данных, обратный тест стратегии, отображение диаграмм и т. Д., Что является неизбежным способом количественной торговли. Если у вас нет понятия о написании стратегии прямо сейчас, вы также можете сначала проанализировать данные.
Используйте Python для анализа данных:https://wizardforcel.gitbooks.io/pyda-2e/content/
Количественное обучение Python:https://wizardforcel.gitbooks.io/python-quant-uqer/content/
В [ ]: