4.4 Как реализовать стратегии на языке Python

Автор:Доброта, Создано: 2019-06-25 13:34:02, Обновлено: 2023-11-09 20:41:47

img

Резюме

В предыдущей статье мы узнали о знакомстве с языком Python, базовом синтаксисе, структуре стратегии и многом другом. Хотя содержание было скучным, но это непременный навык в разработке вашей торговой стратегии. В этой статье мы продолжим путь Python с простой стратегией, шаг за шагом, чтобы помочь вам достичь осуществимой количественной торговой стратегии.

Введение в стратегию

Среди многих торговых стратегий, стратегия канала Дончиана должна быть одной из самых классических прорывных стратегий. Она стала известной с 1970 года. В то время компания специализировалась на симуляционных тестах и исследованиях основных программных торговых стратегий.

Позже, в Соединенных Штатах, состоялись знаменитые тренинги трейдеров-черепах, которые имели большой успех в истории торговли ценными бумагами.

Прорывная стратегия торговли адаптирована к относительно плавному тренду торговых сортов. Наиболее распространенным способом прорыва является использование относительной позиционной связи между ценовой поддержкой и сопротивлением для определения конкретной торговой позиции.

Правила стратегии Дончианского канала

Дончианский канал является ориентированным на тренд индикатором, и его внешний вид и сигнал несколько похожи на индикатор полосы Боллинджера. Однако его ценовой канал построен в соответствии с самыми высокими и самыми низкими ценами в определенный период. Например: верхняя рельса рассчитывается по самой последней 50 к-линиивысокой цене; нижняя рельса рассчитывается по самой последней 50 к-линиинижней цене.

imgкак показано выше: этот индикатор с кривой, состоящей из трех разных цветов, по умолчанию устанавливает самую высокую и самую низкую цену в цикле 20, чтобы отобразить волатильность цен. Он будет показывать меньшую волатильность, когда цена находится в узком канале, и наоборот.

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

Метод расчета каналов Донча

На платформе FMZ Quant, вычисление Дончианского канала простое, вы можно просто получить доступ к самой высокой или самой низкой цене в данном цикле, как показано ниже: 5-я строка - получить самую высокую цену из 50 циклов, 6-я строка - получить самую низкую цену из 50 циклов.

def main(): # program entry
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        upper = TA.Highest(record, 50, 'high') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of upper and lower rails 
        Log("upper rail: ", upper) # print the upper rail value in the log
        Log("lower rail: ", lower) # print the lower rail value in the log
        Log("middle rail: ", middle) # print the middle rail value in the log

Логика стратегии

Существует много способов использования канала Дончиана, который можно использовать в одиночку или в сочетании с другими индикаторами. В этом разделе мы будем использовать его самым простым способом. То есть: когда цены прорываются через верхнюю рельсу, что означает, что она прорывается выше линии давления, покупательная способность сильна, она сформировала волну растущей энергии, генерируется сигнал покупки; когда цена прорывается ниже нижней рельсы, что означает, что она прорывается ниже линии поддержки, генерируется сигнал продажи.

img

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

Условия торговли

  • Открытая длинная позиция: если нет удерживаемой позиции, а цена закрытия выше верхней рельсы

  • Открытая короткая позиция: если нет позиции, удерживаемой, и цена закрытия ниже нижней рельсы

  • Закрытие длинной позиции: если в настоящее время держите длинную позицию, и цена закрытия ниже средней рельсы

  • Закрытие короткой позиции: если в настоящее время удерживается короткая позиция, и цена закрытия больше средней рельсы

Внедрение кодекса стратегии

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

Следующим шагом является вычисление логики торговли на основе этих данных; последний шаг заключается в торговле в соответствии с логикой. шаги следующие:

Шаг 1: Использование библиотеки торговых классов

Вы можете думать о библиотеке торгового класса как о функциональном модуле. Преимущество использования библиотеки торгового класса заключается в том, что она позволяет сосредоточиться на написании логики стратегии. Например, когда мы используем библиотеку торгового класса, чтобы открыть или закрыть позицию, мы можем напрямую использовать интерфейс API в библиотеке торгового класса; но если мы не используем библиотеку торгового класса, нам нужно получить рыночную цену при открытии позиции. Необходимо рассмотреть вопрос о неисполненных ордерах и вопрос о выводе ордеров и так далее.

def main();
    wile true:
        obj = ext.NewPositionManager() # using the trading class library
        # followed by strategy logic and placing order part

Вышеприведенная часть кодирования представляет собой рамку стратегии CTA с использованием инструмента FMZ Quant. Это фиксированный формат кодирования, и весь логический код торговли начнётся с строки 4. Никаких других изменений в другом месте не требуется.

Шаг 2: Получить все виды данных

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

  • Получить данные по линии К

Первое - получить массив данных K-линии и текущую цену закрытия K-линии, с помощью массива K-линии мы можем вычислить период N цикла наивысшей и самой низкой цены через интерфейс API. его можно написать так:

def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line 
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line

Как показано выше:

Строка 4: получите массив линий K, который является фиксированным форматом.

Строка 5: фильтруйте длину K-линии, потому что параметр для расчета показателя канала Дончиана равен 50, когда количество K-линий меньше 50, это невозможно вычислить. Так что здесь нам нужно фильтровать число K-линии. Если количество K-линий меньше 50, он пропустит текущую петлю и продолжит ждать следующей K-линии.

Строка 6: Мы используем код " records [ len (records) - 1] " для получения последних данных массива K-линий, которые являются последними данными K-линий. Эти данные являются объектом, который содержит: цену открытия, самую высокую, самую низкую и закрывающую цену, а также объем торговли, время и другие данные, так как это объект, поэтому мы просто используем .Close для получения последней цены закрытия K-линии.

  • Получить данные о положении

Информация о позиции является очень важным условием в количественной стратегии торговли. Когда условия торговли устанавливаются, необходимо судить о том, стоит ли размещать ордер по статусу позиции и количеству позиций. Например, когда устанавливаются условия для открытия длинных позиций, если есть позиции хранения, не размещайте ордер; если нет позиций хранения, размещайте ордер. На этот раз мы напрямую инкапсулируем информацию о позиции в функцию, мы можем просто вызвать эту функцию, чтобы использовать ее. вот так:

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function

Как показано выше:

Это функция, которая получает информацию о позиции. Если есть длинная позиция, значение равняется 1; если есть короткая позиция, значение равняется -1; если нет позиции, значение равняется 0.

Строка 2: Создать функцию с именем mp. Эта функция не имеет параметров.

Строка 3: Получите массив позиций, который является фиксированным форматом.

Если длина массива равна 0, это означает, что у него нет позиции, возвращает 0.

Строка 6 : Используя петлю for, начиная пересекать этот массив, следующая логика очень проста, если он держит длинную позицию, возвращает 1 ; если он держит короткую позицию, возвращает -1.

Строка 18: Вызвать функцию информации о положении mp.

  • Получить самую высокую и самую низкую цену из последних 50 K-линий

В FMZ Quant количественный торговый инструмент, вы можете напрямую использовать функции " TA.Highest " и " TA.Lowest " без необходимости писать свои собственные логические вычисления. И TA.Highest и TA.Lowest функция возвращает результат конкретных значений вместо массива. Это очень удобно. не только это, платформа FMZ Quant имеет официально встроенные сотни других индикаторных функций.

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail

Как показано выше:

Строка 19: вызовите функцию TA.Highest для получения самой высокой цены за 50 циклов

Строка 20: вызовите функцию TA.Lowest для получения наименьшей цены за 50 циклов

Строка 21: вычислить среднее значение верхней и нижней рельсы согласно самой высокой и самой низкой цене за 50 циклов

Шаг 3: размещение заказов и торговля

С помощью вышеперечисленных данных мы можем написать логику торговли и часть размещения ордера сейчас. Это также очень просто, наиболее часто используется заявление if, которое может быть описано так: если условие 1 и условие 2 истинны, разместите ордер; если условие 3 или условие 4 истинны, разместите ордер. Как показано ниже:

# get the position information function
def mp():
    positions = exchange.GetPosition() # get the holding position array
    if len(position) == 0: # if the holding position array is 0
        return 0 # meaning currently has no position holding, return 0
    for i in range(len(position)): # Traversing the position array
        if (position[i]['Type'] == PD_LONG): 
            return 1 # if there are long position holding, return 1
        elif (position[i]['Type'] == PD_SHORT):
            return -1 # if there are short position holding, return -1
        
def main(): # main function
    exchange.SetContractType("this_week") # set the variety type by using the weekly k-line
    while True: # enter the loop
        records = exchange.GetRecords() # get the k line array
        if len(records) < 50: continue # if the number of K line is less than 50, skip this loop.
        close = records[len(records) - 1].Close # get the closing price of the latest k-line
        position = mp() # get the position information function
        upper = TA.Highest(record, 50, 'High') # get the highest price of 50 cycles
        lower = TA.Lowest(record, 50, 'Low') # get the lowest price of 50 cycles
        middle = (upper + lower) / 2 # calculate the average value of the upper and lower rail
        obj = ext.NewPositionManager() # using the trading class library
        if position > 0 and close < middle: # If currently holding long position, and the closing price is less than the middle rail
            obj.CoverAll() # close all position
        if position < 0 and close > middle: # If currently holding short position, and the closing price is greater than the middle rail
            obj.CoverAll() # close all position
        if position == 0: # if currently holding no position
            if close > upper: # if the closing price is greater than the middle rail
                obj.OpenLong("this_week", 1) # open long position
            elif close < lower: # if the closing price is less than the middle rail
                obj.OpenShort("this_week", 1) # open short position

Как показано выше:

Строка 22: Используя библиотеку торговых классов, это фиксированный формат

Строки 23, 24 : Это заявление о закрытии длинной позиции, которое использует операторы сравнения и логические операторы, которые мы узнали ранее, что означает, что если текущее владение является длинной позицией, и цена закрытия меньше средней рельсы, закрыть все позиции.

Строки 25, 26 : Это заявление о закрытии короткой позиции, которое использует операторы сравнения и логических операторов, которые мы узнали ранее, что означает, что если текущий ордер является короткой позицией, и цена закрытия больше средней рельсы, закрыть все позиции.

Строка 27: Определить текущее состояние позиции.

Строки 28, 29: Определить, является ли цена закрытия выше верхней рельсы.

Строки 30, 31: Определить, является ли цена закрытия ниже нижней рельсы. Если цена закрытия падает ниже нижней рельсы, открыть короткую позицию.

Подводя итог

Выше мы узнали каждый шаг разработки полной количественной торговой стратегии с использованием Python, включая: введение стратегии, метод расчета канала Дончиана, логику стратегии, условия торговли, реализацию кода стратегии и т. Д. Этот раздел является простой стратегией.

Следующее сообщение

В разработке количественных торговых стратегий, с точки зрения скорости выполнения языка программирования, какой из них самый быстрый? это должен быть C ++. Особенно в области финансовых производных и высокочастотного трейдинга. C ++ уникален по специфике языка и имеет преимущества в численных расчетах. По сравнению с JavaScript и Python, его скорость может быть увеличена на несколько порядков величины. Если вы хотите пойти в область финансовых производных или высокочастотного трейдинга в будущем. Это будет курс, который вы не должны пропустить.

Послешкольные занятия

  1. Начинайте с основ и реализуйте стратегию этого раздела.

  2. Попробуйте добавить в стратегию в этом разделе индикатор скользящей средней, чтобы уменьшить частоту торговли.


Связанные

Больше