Избранное трейдера MrD
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ //@version=4 study("Historical Volatility") // Настройки окон HVPeriod1 = input(17, minval=1, title="Окно 1") HVPeriod2 = input(34, minval=1, title="Окно 2") HVPeriod3 = input(51, minval=1, title="Окно 3") HVPeriod4 = input(85, minval=1, title="Окно 4") // Настройка периода для сглаживания EMAPeriod = input(17, minval=2, title="Период сглаживания") // Собственно индикатор // мультипликатор, для нормирования к году mul = 252 * 1210 / timeframe.multiplier //приращение за бар ch = log(close) - log(close[1]) // Историческая волатильность в окнах HV1 = ema(sqrt(sum(ch * ch, HVPeriod1) * mul / HVPeriod1) * 100, EMAPeriod) HV2 = ema(sqrt(sum(ch * ch, HVPeriod2) * mul / HVPeriod2) * 100, EMAPeriod) HV3 = ema(sqrt(sum(ch * ch, HVPeriod3) * mul / HVPeriod3) * 100, EMAPeriod) HV4 = ema(sqrt(sum(ch * ch, HVPeriod4) * mul / HVPeriod4) * 100, EMAPeriod) // Рисуем красивое plot(HV1, color=#cccccc) plot(HV2, color=#ffcccc) plot(HV3, color=#ff9999) plot(HV4, color=#ff0000)Чтобы использовать, копируем, в TradingView открываем Редактор Pine, создаем там новый индикатор (Открыть -> Новый индикатор), удаляем все что там в скрипте по умолчанию и вставляем этот код. Жмем Сохранить. Дальше скрипт будет доступен в выпадающем списке над графиком под кнопкой Индикаторы во вкладке Мои скрипты. Модно, быстро и удобно )
Всем привет. Мой первый пост. Все началось сегодня с попытки решить задачу из этого поста smart-lab.ru/blog/713559.php, а также из этого https://smart-lab.ru/blog/646275.php
Написал бы в личку уважаемому мной автору, да рейтинг маловат, увы. Поэтому кину рукописного зверя здесь. Вначале это была попытка рассмотреть на конкретном небольшом случае, какая логика стоит за индикатором, затем это стало похоже на МНК, а затем и на решение (возможно). Вначале автор писал, что эта задачка решается просто, а затем в комментариях сказал:«Вангую — все заинтересованные резиденты пытаются решить задачу № 1 традиционными методами вариационного исчисления.Без шанса. Ключ к решению лежит в другой плоскости». Что скажете? Что это за плоскость такая?
Почему-то существует часто встречаемое мнение, что каждая акция торгуется сама по себе, а существенной связи между ними нет. Понятно, что это не так и я решил проверить наличие связи простым количественным методом.
Для анализа был взят интервал времени с 01.08.2007 по 29.10.2021 и цены дневного закрытия 16 ликвидных акций от 16 разных эмитентов. Которые более-менее регулярно торговались весь этот период. Приращение в момент времени t на акции j Рtj =ln(c(t,j)/c(t-1,j)), где С – цена закрытия.
Не вычитая никаких средних, сформируем ковариационную матрицу COV размером 16 на 16 по всему полученному массиву данных. Матрица симметричная по построению, её след равен, с одной стороны, сумме собственных значений, а с другой – сумме квадратов приращений Ptj и по времени, и по акциям. По физической аналогии назовем след совокупной мощностью наших приращений.
Если бы между отдельными акциями не было зависимости, матрица была бы близка к диагональной, собственные вектора имели по одному близкому к 1 значению, с каждой акцией был бы ассоциирован один вектор. А собственные значения были бы близки к диагональным значениям, каждый к своему.
Строя автоматизированную торговлю на базе Квик, нет-нет да и столкнёшься с ситуацией, когда отправленная заявка исполняется совсем не так быстро как хотелось бы. Удивляться тут нечему, производительность квиковских серверов брокера не резиновая, на всплесках нагрузки могут изрядно подтупливать. Что с этим делать?
Запилить торговую систему через прямое подключение к бирже задача совсем другого уровня сложности по сравнению с демократичным Квиком со встроенным языком Lua. Что же, будем выкручиваться с имеющимся инструментарием.
Для получения информации о выставлении или перестановке заявки можно использовать колбэки OnTransReply (со значением поля status = 3) или OnOrder. Сильно ли они отличаются между собой по скорости? Для ответа на этот вопрос я прикрутил логгирование задержек срабатывания этих колбэков от момента вызова функции отправки заявки на сервер до срабатывания соответствующего колбэка. Логгирование выполнялось на дельтахеджере и опционном котировщике. Данные собирались в течение месяца не первом сервере в Открывашке, сам Квик работал на VDS-хостинге.
Для анализа будем использовать данные 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()В результате получили:
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()И вот результат прогнозирования: