Совет: не используйте традиционные функции потерь.

Примечание от редакторов Data Science. Хотя мы разрешаем независимым авторам публиковать статьи в соответствии с нашими правилами и рекомендациями, мы не поддерживаем вклад каждого автора. Не стоит полагаться на работы автора без консультации с профессионалами. См. Подробности в наших Условиях для читателей.

Когда я иногда наблюдаю «Прогнозирование цены акций с использованием LSTM», мерой точности и прибыльности являются убытки, обычно функция среднеквадратичной ошибки. Все это хорошо для наборов данных, в которых точность прогнозируемого значения является конечной целью.

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

Концепция:

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

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

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

Код:

Я подготовил три разных скрипта для разных видов торговли:

  • Торговля в фиксированное время
  • Нормальная торговля акциями
  • Торговля бинарными опционами

Фиксированный тайм-трейдинг:

def trading_simulator(trade_time,trade_value,close_price,sma_one,sma_two):
    intersections,insights = intersection(sma_1,sma_2)
    profit = 0
    logs = []
    for i in range(len(insights)):
        index = intersections[i]
        if insights[i] == buy:
            if index+trade_time < len(fx_data):
                if fx_data[index][-1] < fx_data[index+trade_time][-1]:
                    profit += trade_value * 0.8
                    logs.append(trade_value*0.8)
                elif fx_data[index][-1] > fx_data[index+trade_time][-1]:
                    profit -= trade_value
                    logs.append(-trade_value)
        elif insights[i] == sell:
            if index+trade_time <= len(fx_data):
                if fx_data[index][-1] > fx_data[index+trade_time][-1]:
                    profit += trade_value * 0.8
                    logs.append(trade_value*0.8)
                elif fx_data[index][-1] < fx_data[index+trade_time][-1]:
                    profit -= trade_value
                    logs.append(-trade_value)
        profit = profit
    return profit,logs

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

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

import requests
import numpy as np
from matplotlib import pyplot as plt
import datetime
API_KEY = 'YOURAPIKEYHERE'
from_symbol = 'EUR'
to_symbol = 'USD'
def sell():
    pyautogui.click(1350,320)
    
def buy():
    pyautogui.click(1350,250)
    
def SMA(prices,value):
    means = []    count = 0
    while value+count <= len(prices):
        pre_val = prices[count:value+count]
        count +=1
        means.append(np.mean(pre_val))
    return means
def intersection(lst_1,lst_2):
    intersections = []
    insights = []
    if len(lst_1) > len(lst_2):
        settle = len(lst_2)
    else:
        settle = len(lst_1)
    for i in range(settle-1):
        if (lst_1[i+1] < lst_2[i+1]) != (lst_1[i] < lst_2[i]):
            if ((lst_1[i+1] < lst_2[i+1]),(lst_1[i] < lst_2[i])) == (True,False):
                insights.append(buy)
            else:
                insights.append(sell)
            intersections.append(i)
    return intersections,insights
def trading_simulator(trade_time,trade_value,close_price,sma_one,sma_two):
    intersections,insights = intersection(sma_1,sma_2)
    profit = 0
    logs = []
    for i in range(len(insights)):
        index = intersections[i]
        if insights[i] == buy:
            if index+trade_time < len(fx_data):
                if fx_data[index][-1] < fx_data[index+trade_time][-1]:
                    profit += trade_value * 0.8
                    logs.append(trade_value*0.8)
                elif fx_data[index][-1] > fx_data[index+trade_time][-1]:
                    profit -= trade_value
                    logs.append(-trade_value)
        elif insights[i] == sell:
            if index+trade_time <= len(fx_data):
                if fx_data[index][-1] > fx_data[index+trade_time][-1]:
                    profit += trade_value * 0.8
                    logs.append(trade_value*0.8)
                elif fx_data[index][-1] < fx_data[index+trade_time][-1]:
                    profit -= trade_value
                    logs.append(-trade_value)
        profit = profit
    return profit,logs
close_price = []
r = requests.get(
        'https://www.alphavantage.co/query?function=FX_INTRADAY&from_symbol=' +
        from_symbol + '&to_symbol=' + to_symbol +
        '&interval=1min&outputsize=full&apikey=' + API_KEY)
jsondata = json.loads(r.content)
pre_data = list(jsondata['Time Series FX (1min)'].values())
fx_data = []
for data in pre_data: 
    fx_data.append(list(data.values()))
fx_data.reverse()
for term in fx_data:
    close_price.append(float(term[-1]))
sma_1 = SMA(close_price,2)
sma_2 = SMA(close_price,1)
profit,logs = trading_simulator(1,10,close_price,sma_1,sma_2)
profit

Для работы программы необходимо заменить параметр ключа API на собственный ключ API от Alphavantage.

Нормальная торговля:

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

def estimate_profits(standard_qty,model,data,close,open_,high,low):
    close_prices = close
    open_prices = open_
    low_prices = low
    high_prices = high
    pred_close = list()
    pred_open = list()
    orders = list()
    profits = list()
    
    for i in range(len(data)):
        pred = model.predict(data[i])[0]
        open_price,close_price = pred
        if open_price > close_price:
            side = -1
        elif open_price < close_price:
            side = 1
        qty = standard_qty
        orders.append([side,qty])
        pred_close.append(close_price)
        pred_open.append(open_price)
        
    for i in range(len(data)):
        sign = 0
        mult = 0
        side,qty = orders[i][0],orders[i][1]
        dif = close_prices[i] - open_prices[i]
        if dif > 0:
            sign = 1
        else:
            sign = -1
        if sign == side:
            mult = 1
        else:
            mult = -1
        profit = dif*mult*qty
        profits.append(profit)
    return profits

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

Торговля бинарными опционами:

def trading_simulator(open_prices):
    profit = 0
    insights = []
    logs = []
    for i in range(len(pred)):
        if float(open_prices[i]) > pred[i][0]:
            insights.append('sell')
        elif float(open_prices[i]) < pred[i][0]:
            insights.append('buy')
    for i in range(len(insights)):
        if insights[i] == 'sell':
            if float(open_prices[i]) > y[i]:
                profit += 8
                logs.append(8)  
            else:
                profit -= 10
                logs.append(-10)
                
        if insights[i] == 'buy':
            if float(open_prices[i]) < y[i]:
                profit += 8
                logs.append(8)  
            else:
                profit -= 10
                logs.append(-10)
            
    return profit,logs

Эта функция рассчитывает прибыль с учетом фиксированной 80% прибыли от суммы сделки. Он вычисляет разницу между текущим значением и значением для следующего временного шага.

Вывод:

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

Мои ссылки:

Если вы хотите увидеть больше моего контента, нажмите эту ссылку.