Избранное трейдера RuslanX

по

Шаблон торговой системы на Python (backtrader, quantstats)

    • 22 сентября 2021, 21:54
    • |
    • Diamond
  • Еще
Сначала я пытался бэктестить системы в TradingView и этого было достаточно для быстрой оценки торговых гипотез, но оказалось, что мало просто знать, где купить и где продать. Не менее важно понимать, сколько купить или продать и для этого нужны другие инструменты.

Зачем Python?

Лично мне он показался удобнее. Например, можно быстро подключить telebot и система начнёт отправлять сигналы прямо в телегу на все девайсы. Работать со скриптами можно даже на айпаде где-нибудь в дороге, тоже плюс.

Самая простая система, которую можно потестить это пересечение двух скользящих средних: если быстрая SMA пересекает медленную вверх, то покупаем, а если вниз, то закрываем открытую позицию, шортить рынок не будем. Комиссии, проскальзывание и прочие расходы пока не учитываем, нужно начать с какой-то основы.

Что потребуется?

— backtrader для логики торговой системы

— quantstats для формирования отчёта

— Jupyter Notebook, если нужно удобнее редактировать код

( Читать дальше )

Анализ и визуализация данных в финансах — анализ ETF с использованием Python

    • 18 сентября 2021, 00:55
    • |
    • Aleks
  • Еще
С проникновением аналитики во многие сферы нашей жизни она не могла обойти стороной финансы. В этой статье рассмотрим ее применение для анализа ETF с целью их анализа, в том числе и с применением визуализиции.

1. О данных

Для анализа будем использовать данные ETF c базовой валютой USD: FXCN, FXRL, FXIT, FXUS и FXRU. Временной ряд рассмотрим за три года с 2018 по 2020 года. Само исследование проведем в Google Colaboratory.

Как обычно в начале импортируем все необходимые библиотеки для дальнейшей работы.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from google.colab import files
import warnings
warnings.filterwarnings("ignore")
Сначала необходимо получить данные. Есть несколько способов. Мы воспользовались — взяли их с Finam в формате csv. Дальше написал функцию для обработки полученных данных и при помощи concat свел их в один датафрейм.

def changeDF(df):
  df['date'] = pd.to_datetime(df['<DATE>'].astype(str), dayfirst=True)
  name =[x for x in globals() if globals()[x] is df][0]
  df = df.drop(['<DATE>','<TIME>', '<OPEN>', '<HIGH>', '<LOW>'], axis=1)
  df = df.set_index(['date'])
  df.columns = [name+'_cl', name + '_vol']
  return df

fxgd_change = changeDF(fxgd)
fxrl_change = changeDF(fxrl)
fxit_change = changeDF(fxit)
fxus_change = changeDF(fxus)
fxru_change = changeDF(fxru)
fxcn_change = changeDF(fxcn)

etf = pd.concat([fxgd_change, fxrl_change, fxit_change, fxus_change, fxru_change, fxcn_change], axis=1)

etf.head()
В результате получили:

( Читать дальше )

Хотите попрогнозировать рыночные котировки? Нет проблем - вот код.

    • 14 сентября 2021, 22:46
    • |
    • 3Qu
  • Еще
Итак, код обучения и прогнозирования нейросетью рыночных котировок на 5 минут.
import sqlite3 as sql
from scipy.stats import logistic
import math
import numpy as np
import numpy.random as rnd
import matplotlib.pyplot as plt
from sklearn.neural_network import MLPRegressor

sdata =[]
sql1= "select ticker, date, open, high, low, close, vol \
    from Hist_1m where ticker_id=1 order by Date;"
con=sql.connect('C:/Users/ubase/Documents/StockDB/StockDB21.sqlite')
cur=con.cursor()
cur.execute(sql1)
sdata=cur.fetchall()
con.commit()
con.close()

Ldata = len(sdata)
N = 8000 # Количество сделок
ld = 5 #Продолжительность сделки
NNinterval = 20 # Количество входов NN

# Генерация случайных чисел
rng = rnd.default_rng()
rm=rng.integers(0, Ldata, N )

class Candle:
    tr = 0
    dt = 1
    o = 2
    h = 3
    l = 4
    c = 5
    v = 6
    
cl = Candle
DataC =[sdata[i][cl.c] for i in range(0,Ldata)]

# sigmoid линейность до 0.5
def sigmoidnorm(x, alfa = 0.9, xmin = -1.3, xmax = 1.3):
    return (xmax - xmin)*((1 / (1 + math.exp(-x*2.0*alfa))) - 1.0) + xmax

x = [0.002 * i - 3 for i in range(0,3000)]
y = [sigmoidnorm(x[i]) for i in range(len(x))]


plt.plot(x,y)
plt.grid()
plt.show()

# формируем сделки.
def DealsGenL(rm,ld):
   #Lm = len(rm)
   ix = []
   x = []
   pr = []
   
   for i in range(0,N):
        if rm[i] + ld < Ldata and rm[i] - NNinterval - 1 > 0:
            delta = (sdata[rm[i]+ld][cl.c] - sdata[rm[i]][cl.c])/sdata[rm[i]+ld][cl.c]*100
            x0 = [sigmoidnorm((sdata[rm[i] - j][cl.c] - sdata[rm[i]][cl.c])/sdata[rm[i]][cl.c]*100) \
                 for j in range(0, NNinterval)]
            ix.append(rm[i])
            x.append(x0)
            pr.append(delta)
   return ix, x, pr


Ix, X, Pr = DealsGenL(rm,ld)



Ib = 0
Ie = 100

plt.plot(X)
plt.legend()
plt.grid()
plt.show()


plt.plot(Pr, label = 'Prof')
plt.legend()
plt.grid()
plt.show()


regr = MLPRegressor(hidden_layer_sizes = [30,20,15,10,5], \
                    max_iter=500, activation = 'tanh')

regr.fit(X, Pr)
Out = regr.predict(X)

plt.plot(Pr, Out, '.')
plt.grid()
plt.show()
И вот результат прогнозирования:

( Читать дальше )

Как отправлять сообщения из Квика в Телеграм! И писать в файлик разную дребедень!


Все очень и  очень просто!
Достаточно создать бота в телеге,  написать примитивный  луа  скрипт и запустить его.

Про ботов в телеге здесь  https://core.telegram.org/bots
в гугле  куча инфы  и примеров, как чего куда и зачем.


--
--СКРИПТ Niki для smart-lab.ru 260321  ревизия
---------------------------------------

-- Флаг для поддержания работы функции main
is_run=true

fut_limit_old =0
fut_limit_max =0
kgo_old       =0.5


function main( ... )  -- чудотворная функция внутри  которой все  работает

		   
		    --"r": режим чтения (по умолчанию);
			--"w": режим записи;
			--"a": режим добавления;
			--"r+": режим обновления, все предыдущие данные сохраняются;
			--"w+": режим обновления, все предыдущие данные стираются;
			--"a+": режим добавления и обновления, предыдущие данные сохраняются, запись разрешена только в конец файла.     b бинарные файлы
		   
		   -- Пытается открыть файл в режиме "чтения/записи"
		   f = io.open(getScriptPath().."\\Limits.txt","a");
		   -- Если файл не существует
		   if f == nil then 
			  -- Создает файл в режиме "записи"
			  f = io.open(getScriptPath().."\\Limits.txt","w"); 
			  -- Закрывает файл
			  f:close();
			  -- Открывает уже существующий файл в режиме "чтения/записи"
			  f = io.open(getScriptPath().."\\Limits.txt","a");
		   end;

    while is_run do    
        sleep(1000)   -- 1000 = 1 секунда    --волшебная пауза в  работе  скрипта
		
		if getFuturesLimit("A111", "A111111", 0, "SUR") ~= nil then     -- защита от  пустых таблиц    -- впишите ваши данные из Квика
		
			-- %c   - дата и время (по-умолчанию) (пример, 03/22/15 22:28:11) 
			-- %x   - дата (пример, 09/16/98)
			-- %X   - время (пример, 23:48:10)
			
			seconds = os.time(); -- в seconds будет значение 1427052491
			date1 = os.date("%x",seconds);  --  %c   - дата (по-умолчанию) (пример, 03/22/15 22:28:11) 
			time1 = os.date("%X",seconds);  --  %c   - время (по-умолчанию) (пример, 03/22/15 22:28:11) 
			
			
			--[[
			liquidity_coef           --NUMBER  Коэффициент ликвидности  
			cbp_prev_limit           --NUMBER  Предыдущий лимит открытых позиций на спот-рынке» 
			cbplimit                 --NUMBER  Лимит открытых позиций  
			cbplused                 --NUMBER  Текущие чистые позиции  
			cbplplanned              --NUMBER  Плановые чистые позиции  
			varmargin                --NUMBER  Вариационная маржа  
			accruedint               --NUMBER  Накопленный доход   
			cbplused_for_orders      --NUMBER  Текущие чистые позиции (под заявки)  
			cbplused_for_positions   --NUMBER  Текущие чистые позиции (под открытые позиции)  
			options_premium          --NUMBER  Премия по опционам  
			ts_comission             --NUMBER  Биржевые сборы  
			kgo                      --NUMBER  Коэффициент клиентского гарантийного обеспечения  
			currcode                 --STRING   Валюта, в которой транслируется ограничение  
			real_varmargin           --NUMBER  Реально начисленная в ходе клиринга вариационная маржа. Отображается с точностью до 2 двух знаков. При этом в поле «varmargin» транслируется вариационная маржа, рассчитанная с учетом установленных границ изменения цены  
			--]]
			
			
			fut_limit    = getFuturesLimit("A111", "A111111", 0, "SUR").cbplused_for_positions    --  NUMBER  Текущие чистые позиции (под открытые позиции)     -- впишите ваши данные из Квика
			varmargin    = getFuturesLimit("A111", "A111111", 0, "SUR").varmargin                 -- впишите ваши данные из Квика
			accruedint   = getFuturesLimit("A111", "A111111", 0, "SUR").accruedint                -- впишите ваши данные из Квика
			ts_comission = getFuturesLimit("A111", "A111111", 0, "SUR").ts_comission              -- впишите ваши данные из Квика
			kgo          = getFuturesLimit("A111", "A111111", 0, "SUR").kgo                       -- впишите ваши данные из Квика
			
			profit = varmargin + accruedint;
	 
			--if  math.abs(fut_limit-fut_limit_old) > 10000 then       -- каждые 10000 рублей изменения ГО,   слишком частый файл печати 
			if  math.abs(fut_limit-fut_limit_old) > 100000 then       -- каждые 100000 рублей изменения ГО,   настраиваем под себя.
			
				open_lim     = getFuturesLimit("A111", "A111111", 0, "SUR").cbplimit                  --NUMBER  Лимит открытых позиций
				f:write( tostring(date1).."  "..tostring(time1).."  ".."ГО: "..tostring(fut_limit).."  ".."Профит: "..tostring(profit).."  ".."Комис: "..tostring(ts_comission).."  ".. "КГО: "..tostring(kgo).."  Lim: "..tostring(open_lim)..  "\n"); -- "\n" признак конца строки
				--f:write( tostring(date1).. "  " ..tostring(time1)..  "  " .. "BID: " .. tostring(res_trans) .. "  " .. "ASK: " ..  tostring(MXU8ask_vol) .. "\n"); -- "\n" признак конца строки
				   -- Сохраняет изменения в файле на диск
				f:flush();
				
				fut_limit_old = fut_limit;
			end
			
			if fut_limit_max == 0  then   								
				fut_limit_max = fut_limit;
			end	
				
			if ( math.abs(fut_limit-fut_limit_max) > 1000000 and fut_limit>0 ) then   	  -- настраиваем под себя							
				message( tostring(fut_limit) )   ----сообщение в Квик--
				--message( tostring(time1) )
				---------------------------------------- отправляем сообщение в  Телеграмм--
				pos_free     = getFuturesLimit("A111", "A111111", 0, "SUR").cbplplanned               --NUMBER  ГО свободных денег от позы без пониженного ГО 
				open_lim     = getFuturesLimit("A111", "A111111", 0, "SUR").cbplimit                  --NUMBER  Лимит открытых позиций
				tg_message = tostring(open_lim).."   ГО:"..tostring(fut_limit).."   Поза:"..tostring(open_lim-pos_free) 
				os.execute('curl  "https://api.telegram.org/botВашиДанныеИзТелеграмм&text= + '..tg_message..' " ')    -- отправляем в телегу, через винду. Вписать ваши данные из Телеграмм
				----------------------------------------
				-- Пример строки   https://api.telegram.org/bot365877050:AAE232342348HIqifnyGSsw89U_4TK3Y/sendMessage?chat_id=202560128&text=  + Привет Квик!
				----------------------------------------
				fut_limit_max = fut_limit;
			end	
			
			if  math.abs(kgo-kgo_old) > 0 then
				---------------------------------------- отправляем сообщение в  телеграмм
				tg_message = tostring(kgo).." Внимание! Изменился коэффициент КГО" 
				os.execute('curl  "https://api.telegram.org/botВашиДанныеИзТелеграмм&text= + '..tg_message..' " ')    -- отправляем в телегу, через винду. Вписать ваши данные из Телеграмм
				----------------------------------------
				-- Пример строки   https://api.telegram.org/bot365877050:AAE232342348HIqifnyGSsw89U_4TK3Y/sendMessage?chat_id=202560128&text=  + Привет Квик!
				----------------------------------------
				kgo_old = kgo;
			end
		end
		
		
		
    end
f:close();  -- закрываем файл печати.
end		
		

-- Остановка скрипта из Квика
function OnStop(stop_flag)

    is_run=false

end


( Читать дальше )
  • обсудить на форуме:
  • QUIK

Визуализация рекомендаций Романа Андреева на Python. Часть 2. Компьютерное зрение.

Всем здоровья и бодрого расположения духа!
В статье «Визуализация рекомендаций Романа Андреева на Python» мы разобрали как можно с помощью нескольких строк кода на Питоне разобрать текст, который выкладывает каждое утро в своем блоге Роман Андреев (далее по тексту Роман) — известный трейдер и блогер (или наоборот), и отобразить эти рекомендации в виде уровней и зон на графиках. В этом топике я покажу способ для извлечения информации из графических изображений с помощью технологий компьютерного зрения (но без использования нейронных сетей) на примере таблиц-рекомендаций из блога Романа Андреева.
Визуализация рекомендаций Романа Андреева на Python. Часть 2. Компьютерное зрение.
Надеюсь, что я не напугал читателей термином «компьютер вижн», скоро вы поймете, что это просто. И что любой юный прогер может написать код для распознавания внешними камерами номеров автомобилей, который впоследствии возненавидят все автолюбители мегаполисов, а МАДИ и ГИБДД будут собирать со всех нас миллиардные штрафы



( Читать дальше )

Бесплатный робот на quik XoraX боковик на lua, нефть Brent (обновление)

    • 20 мая 2020, 21:15
    • |
    • XoraX
  • Еще
Теперь робот на гите )

https://github.com/koras/robot_xorax

Релизы будут там же

https://github.com/koras/robot_xorax/releases

Старая версия робота сильно устарела за неделю. Есть люди которые тестируют в режиме эмуляции (респект вам ребята, спасибо)


Что нового:
Так как у бота нет стопов, ну он и не рассчитан на большие объёмы торговли, то была добавлена блокировка покупок при условии, что осуществляется покупка более определённого числа контрактов и не было продано за промежуток покупок ни одного контракта.
Так же можно увеличивать промежуток покупок при падении, информация регулируемая(динамически)

Бесплатный робот на quik XoraX боковик на lua, нефть Brent (обновление)

Ранее заявки на продажу выставлялись как просто лимитки, теперь выставляются тейк-профиты. Настройки выведены на скрин выше.

( Читать дальше )

Моделирование Торговых Систем на Python. 1.

    • 09 мая 2020, 19:31
    • |
    • 3Qu
  • Еще

Для моделирование ТС на Python, прежде всего нужен сам Python. Pythonы бывают очень разные.

Самый большой и длинный Python — Anaconda (https://anaconda.org/). Скачать дистрибутив Anaconda можно здесь — Индивидуальное издание -https://www.anaconda.com/products/individual.
Я работаю именно с Anaconda. Установив Anaconda мы получаем сам Python, уже установленные значительную часть нужных и ненужных пакетов с библиотеками Python, и несколько сред разработки. И все это сразу готово к работе, и нам, по большей части, уже не придется дополнительно устанавливать пакеты и среды.

Самый маленький Python последней версии 3.8.2. скачивается с сайта самого Python — https://www.python.org/. Это, практически, только сам язык, компилятор и минимальный набор пакетов. Сделать с ним практически ничего невозможно, и для работы придется постоянно устанавливать нужные пакеты. Среду разработки придется также устанавливать самостоятельно.
Этот Python больше подходит для запуска и работы с уже отлаженными законченными программами.



( Читать дальше )

Кипрское налоговое резидентство, как инструмент для оптимизации НДФЛ от IB, Dorman, Exante, etc..

Пару лет назад на Кипре стало возможным получить добровольно статус налогового резидента без необходимости проводить там свыше 183 дней в году.
Кипрское налоговое резидентство, как инструмент для оптимизации НДФЛ от IB, Dorman, Exante, etc..


Это так называемое правило 60+ ( в России кстати тоже действует подобный механизм, только 90+)

Общий смысл в том, что если ВЫ находились на территории Кипра хотя-бы 60 дней в календарном году, имеете там формальное трудоустройство и/или владение компанией и собственное или долгосрочно арендованное жилье, И НЕ ПРОЖИВАЕТЕ В ИНОМ ГОСУДАРСТВЕ СВЫШЕ 183 ДНЕЙ.....
Вы можете получить подтвержденный статус налогового резидента Кипра.
Что Вам это дает ???

ИСКЛЮЧЕНИЕ ИЗ НАЛОГООБЛАГАЕМОЙ БАЗЫ ДОХОДОВ ОТ РЕАЛИЗАЦИИ ЦЕННЫХ БУМАГ, ФИСС (не всех), ДИВИДЕНДОВ, CFD в сочетании с отсутствием необходимости уплаты Кипрского налога на оборону (антиофшорная поправка 200х)

( Читать дальше )

Искусственный трейдер. Часть 2. Парсинг и визуализация тренировочного набора данных в Python

Всем, привет! Неделя выдалась «боевой», надеюсь все живы-здоровы!
В продолжении топика «Искусственный трейдер. Часть 1. Подготовка данных для машинного обучения (видео)»
Рассмотрим python-код «парсера» и «визуализатора» данных. Скажу сразу, что этот код вы можете легко модифицировать для анализа ваших данных любого другого формата.
Сам датасет формируется при помощи платформы Jatotrader, которая во время воспроизведения исторических данных сохраняет параметры частотных графиков для дальнейшего анализа и построения модели машинного обучения  в Python.
Для работы с тестовой выборкой нам понадобятся:
1. Установленная платформа Jatotrader FREE (или круче) версии 2.9.3 (или выше). С ее помощью вы сможете создавать любые тестовые наборы для любых инструментов. Либо воспользоваться, в качестве примера, готовым набором для фьючерсного контракта RIH0 с 20.12.19 по 28.02.20 (по два частотных графика 500 и 125 тиков на бар для каждой торговой сессии).

( Читать дальше )

Практическая теория 3

Пора начинать. Теперь мы сделаем опционную книгу в экселе. Это несколько модулей. В первом модуле мы будем видеть и рассчитывать стоимость опционов и всех греков. Второй модуль ниже. Рассчитывается коридор бинарной сетки. Граница, где у нас будут ордера, изменение в пунктах, и расчетная дельта. И наши пометки где мы поставили и сколько ордеров. Три, сюда мы записываем текущую цену БА. Можете связать терминал с экселем, а можно вручную. Четыре, тут мы записываем каких, сколько, по чем, опционов мы купили. Текущую цену с рынка и расчетную с таблицы 1. Правее рассчитываем суммарно все греки. Пять, все сделки с БА, когда, сколько, почем. Шесть. Финансовый результат бумажный и рыночный. Семь. Параметры рынка на текущий день. Вола опционов рынка, цена по которой БА коснулся сетки, приращение этого касания, гамма в долларах, тетта БА (ДХ), тетта опциона, сумма этих тетт, вега позиции, изменение веги позиции, вола в деньгах и финансовый результат, а так же график этого результата. Шесть, фин рез по рынку и расчетный. По ходу дела еще будем добавлять.  https://cloud.mail.ru/public/4Mgx/32ZL2imQf 



( Читать дальше )

....все тэги
UPDONW
Новый дизайн