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

по

Данные из QUIK в Python. Построение Дельта графика.

Данные из QUIK в Python. Построение Дельта графика.Построение нестандартных графиков в Python при помощи библиотеки finplot.
Можно строить почти любые нестандартные графики: Range, Renco, Delta.
В качестве примера скрипт для построения Дельта графика.
График строиться с момента запуска по поступающим данным из таблицы обезличенных сделок.
Для получения данных из КВИКа используется PythonServer Евгения Шибаева (огромное спасибо автору!!!)

Тапками не кидайтесь, программировать только учусь.

# В КВИКе запускаем луа-скрипт QuikLuaPython.lua
import socket
import threading
from datetime import datetime, timezone
import pandas as pd
import finplot as fplt

fplt.display_timezone = timezone.utc


class DeltaBar():
    def __init__(self):
        self.df = pd.DataFrame(columns='date_time open high low close delta delta_time_sec'.split(' '))
        self.df.loc[len(self.df)] = [0, 0, 0, 0, 0, 0, 0]

    def parser(self, parse):
        if parse[0] == '1' and parse[1] == 'RIH1':
            if abs(self.df.iloc[len(self.df) - 1]['delta']) >= 500:
                self.df.loc[len(self.df)] = [0, 0, 0, 0, 0, 0, 0]  # Добавляем строку в DF

            self.df.iloc[len(self.df) - 1]['close'] = float(parse[4])  # Записываем последнюю цену как цену close бара

            if self.df.iloc[len(self.df) - 1]['date_time'] == 0:
                self.df.iloc[len(self.df) - 1]['date_time'] = \
                    datetime.strptime(f'{parse[7]} {parse[8][0:-1]}', "%d.%m.%Y %H:%M:%S.%f").replace(microsecond=0)

            if self.df.iloc[len(self.df) - 1]['open'] == 0:
                self.df.iloc[len(self.df) - 1]['open'] = float(parse[4])

            if float(parse[4]) > self.df.iloc[len(self.df) - 1]['high']:
                self.df.iloc[len(self.df) - 1]['high'] = float(parse[4])

            if (float(parse[4]) < self.df.iloc[len(self.df) - 1]['low']) or \
                    (self.df.iloc[len(self.df) - 1]['low'] == 0):
                self.df.iloc[len(self.df) - 1]['low'] = float(parse[4])

            if parse[5] == '1026':
                self.df.iloc[len(self.df) - 1]['delta'] += float(parse[6])

            if parse[5] == '1025':
                self.df.iloc[len(self.df) - 1]['delta'] -= float(parse[6])

            self.df.iloc[len(self.df) - 1]['delta_time_sec'] = \
                datetime.strptime(f'{parse[7]} {parse[8][0:-1]}', "%d.%m.%Y %H:%M:%S.%f") - \
                self.df.iloc[len(self.df) - 1]['date_time']
            self.df.iloc[len(self.df) - 1]['delta_time_sec'] = self.df.iloc[len(self.df) - 1]['delta_time_sec'].seconds


def service():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('127.0.0.1', 3587))  # Хост-этот компьютер, порт - 3587
    while True:
        res = sock.recv(2048).decode('utf-8')
        if res == '<qstp>\n':  # строка приходит от клиента при остановке луа-скрипта в КВИКе
            break
        else:
            delta_bar.parser(res.split(' '))  # Здесь вызываете свой парсер. Для примера функция: parser (parse)
    sock.close()


def update():

    df = delta_bar.df
    # Меняем индекс и делаем его типом datetime
    df = df.set_index(pd.to_datetime(df['date_time'], format='%Y-%m-%d %H:%M:%S'))
    # print(delta_bar.df)

    # pick columns for our three data sources: candlesticks and TD
    candlesticks = df['open close high low'.split()]
    volumes = df['open close delta_time_sec'.split()]
    if not plots:
        # first time we create the plots
        global ax
        plots.append(fplt.candlestick_ochl(candlesticks))
        plots.append(fplt.volume_ocv(volumes, ax=ax.overlay()))
    else:
        # every time after we just update the data sources on each plot
        plots[0].update_data(candlesticks)
        plots[1].update_data(volumes)


if __name__ == '__main__':
    delta_bar = DeltaBar()
    # Запускаем сервер в своем потоке
    t = threading.Thread(name='service', target=service)
    t.start()

    plots = []
    ax = fplt.create_plot('RIH1', init_zoom_periods=100, maximize=False)
    update()
    fplt.timer_callback(update, 2.0)  # update (using synchronous rest call) every N seconds

    fplt.show()
  • обсудить на форуме:
  • QUIK

Строим дашборд на API бирже

Заметил, что совсем немного постов освещают тему API Мосбиржи. Вместе с тем, Мосбиржа позволяет не только отгружать котировки акций, но и например, забирать данные по кривой ОФЗ, коэффициентам корреляции, индексам и многое другое. Замечательно, что биржа отдает данные в csv и json, что позволяет легко настроить их автоматическое импортирование. Например, можно импортировать их в Google Sheets и создавать там онлайн-дашборды. 

Один такой дашборд я построил для рынка ОФЗ, выведя на панель данные о спредах, исторической динамике и индексе облигаций. Для того чтобы вся эта красота работала необходимо 4 простых шага:
  • создать запрос с помощью API в формате CSV (Google Sheets не умеет в json, а сторонние костыли не всегда справляются)
  • импортировать данные в Google Sheets с помощью функции ImportData используя ссылку из пункта 1
  • Распарсить импортированные строки на столбцы
  • Прикрутить графики
Строим дашборд на API бирже

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

Как я статус квалифицированного инвестора получал. Бесполезный achievement

    • 07 сентября 2020, 12:17
    • |
    • Finindie
      Проверенный аккаунт
  • Еще
Как я статус квалифицированного инвестора получал. Бесполезный achievement

Напомню перечень возможных вариантов получения статуса:

1. Владеть имуществом на сумму от 6 млн ₽. Учитываются деньги на счетах и ценные бумаги.
Правило, по которому я получил, но здесь не всё так просто, и об этом пост

2. Иметь опыт работы в профессиональном участнике рынка от 2 лет.
Вряд ли ради бумажки стоит идти работать туда, где тебя не ждут

3. Иметь оборот по сделкам с ценными бумагами и др. инструментами за последние 4 квартала — от 6 млн ₽. Частота сделок — не реже 10 в квартал, одной в месяц.
Самое простое и часто применяемое правило, но нельзя пропускать ни месяца

4. Иметь аттестат ФСФР / CFA, профильное образование в специальном вузе.
Многие думают, что это легко, но это не так

В июне сумма по двум брокерским счетам вкупе с суммой на накопительном счёте, где хранится подушка безопасности, насчитывали уже 6 млн ₽. В тот момент активно обсуждались изменения в законодательстве, связанными с возможностью покупать иностранные акции неквалифицированным инвесторам. Ничего не было ясно, и я решил, что надо обезопасить себя от возможных последствий, получив этот статус сейчас, по старым правилам.



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

Новичкам. Как подсчитать HV для фьюча Ri? Для чего нужна Дисперсия?

Доброе утро, страна (пока писал топик, было еще утро).

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

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

Всё очень просто. Они высчитывают всего лишь 2 параметра: IV и HV, где

IV — ожидаемая волатильность,
HV — историческая волатильность.

Если IV>HV, то они продают волатильность, если IV<HV, то они покупают волатильность.

Как всё просто, да?

Просто. Но есть очень много нюансов.

Сегодня разберемся с одним из параметров, а именно с HV.

Историческая волатильность.

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

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

Качаем исторические данные с MOEX!

Итак, передо мной, уверен, как и перед многими, встал вопрос поиска исторической информации с Мосбиржи. Немного зная python, я написал вот такой парсер:
import requests
import datetime
import pathlib

SECIDs = ["GAZP", "BANEP", "LKOH"]
DISK = "E"
for SECID in SECIDs:
    from_date = "2020-05-04"
    to_date = "2005-01-03"
    while str(to_date) != from_date:
        to_date = str(to_date)
        to_date = to_date.split('-')
        a = datetime.date(int(to_date[0]), int(to_date[1]), int(to_date[2]))
        b = datetime.timedelta(days=140)
        to_date = a + b
        pathlib.Path("{}:/{}/{}".format(DISK, "Database_MOEX", SECID)).mkdir(parents=True, exist_ok=True)
        filename = SECID + "_" + str(to_date) + ".csv"
        with requests.get("http://iss.moex.com/iss/history/engines/stock/markets/shares/boards/tqbr/securities/{}.csv?date={}".format(SECID, to_date)) as response:
            with open("{}:/Database_MOEX/{}/{}".format(DISK, SECID, filename), 'wb') as f:
                for chunk in response.iter_content():
                    f.write(chunk)
Для начала пройдемся по его плюсам и минусам. Самый главный минус, что этот парсер качает только определенный период, который уникален для каждой акции, судя по всему для увеличения этого периода надо кинуть бирже на лапу:), и то что информация предоставляется за день, теперь перейдем к плюсам: можно выкачивать историю за определенный период для нескольких инструментов сразу (их количество ограничивается лишь количеством инструментов на мосбиржи), есть возможность назначать диск для сохранения информации, быстрота выгрузки данных.

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

Вперед! должен кукарекать, петух по утру. тогда ему бы цены не было.

Дойдя до конца, люди смеются над страхами, мучившими их вначале.
Пауло Коэльо

 Если ты не знаешь, чего хочешь, ты в итоге останешься с тем, чего точно не хочешь.
Чак Паланик

 Чтобы дойти до цели, надо идти.
Оноре де Бальзак

 Это своего рода забава, делать невозможное.
Уолт Дисней

 Если люди не смеются над вашими целями, значит ваши цели слишком мелкие.
Азим Премжи

 

 Пробуйте и терпите неудачу, но не прерывайте ваших стараний.
Стивен Каггва

 К черту все! Берись и делай!
Ричард Брэнсон

 Мы сами должны стать теми переменами, которые хотим видеть в мире.
Махатма Ганди

 Препятствия – это те страшные вещи, которые вы видите, когда отводите глаза от цели.
Генри Форд

 Постановка целей является первым шагом на пути превращения мечты в реальность.
Тони Роббинс

Быть самым богатым человеком на кладбище для меня не важно… Ложиться спать и говорить себе, что сделал действительно нечто прекрасное, — вот что важно!
Стив Джобс



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

Общий финансовый анализ на Python (Часть 3)

    • 05 апреля 2020, 12:51
    • |
    • Aleks
  • Еще

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

Сначала немного теории:

О линейной регрессии

Линейная регрессия используется в качестве прогнозирующей модели, когда предполагается линейная зависимость между зависимой переменной (переменная, которую мы пытаемся предсказать) и независимой переменной (переменная и/или переменные, используемые для предсказания).



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

Сообщение медика из Италии

(Делаю репост)

Привет… к сожалению да, чуда в этот раз не будет, штука заразная и неприятная. И не придет, а уже пришла (см. количество пневмоний в одесских больницах) уже как месяц назад… все как в Италии.  Здесь официально заявили о начале эпидемии в конце февраля, в то время как было уже в полном разгаре в конце января (по своим пациентам видел), первый пациент в Италию прилетел из Мюнхена 9 января… поэтому и такие последствия. Делали вид, что «ложки нет».

Симптомы: основной — сухой кашель, обычно начинается параллельно с першением и болью в горле (иногда и часто просто боль в шее, типа мышечная и в мышцах шеи, полагаю по ходу лимф. узлов), легкое недомогание и типа продромных явлений, все как при гриппе. Температура 37,0-37,5  — 1-2 дня, или вообще без температуры. НО! как правило, нет ринита. Часто головная боль, заложенность ушей (сальпингит), легкие признаки синусита, но, повторю, необычно как-то, нет секреторного компонента. Есть просто отек слизистых. Далее, на 2-4 день боль по ходу трахеи и за грудиной (!), сухой кашель усиливается. С пятого дня может появиться боль в грудной клетке (уже более латерально, не по центру), затрудненное дыхание (периодами). И это вот продолжается без лечения около 15-20 дней. Потом, если осложнений нет, уходит и улучшается (субъективно) по 5% в день. Длится всего порядка месяца (от 3 до 6 недель). Если нет осложнений — то температуры нет, или гипотермия (36,0-36,3). В анализе крови аналогично: основной симптом — лимфопения (!), мало либо нормальное кол-во нейтрофилов, и повышенный С-реактивный белок. Больше ничего.

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

Библиотека OpenBoApi для работы с лохотронами

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

Библиотека OpenBoApi для работы с лохотронами

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

Лирическое отступление


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

Ближе к телу


OpenBoApi - это C++ header-only библиотека для работы с API брокеров бинарных опционов. С помощью этой библиотеки выполняется правило трех сигм, тфу, то есть, трех 



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

Наука! Как происходит заражение вирусом и как реагирует иммунитет

Вирусы очень интересные существа. Они не имеют клеток, с точки зрения науки не считаются живыми… да и наука до сих пор точно не может сказать что это такое. 
Всё что касается вирусов — очень сложно! Поэтому мы и наблюдаем такой ажиотаж!
Чтобы по минимуму в этом разбираться, нужно хотя бы знать следующие термины:

1) Дезоксирибонуклеиновая кислота;
2) Рибонуклеи́новая кислота;

3) капсид;
4) рецепторы и корецепторы;
5) мембрана;
6) связь ключ-замок;
7) интеграза;
8) протеаза;
9) обратная транскриптаза;
10) домен;
11) транскрипция;
12) мессенджер;
13) цитоплазма;
14) репликация;

Вирусы размножаются в клетке. Но каждый вирус специализируется на определенных клетках!
Так ВИЧ заражает Т-лимфоциты, Грипп поражает эпителий гортани и легких, коронавирус поражает эпителий верхних дыхательных путей, легких и желудочно-кишечного тракта, Герпесы поражают нервы и вызывают нейроинфекции, гепатиты поражают клетки печени и т.д.
Как вирус проникает в клетку:


Т.е. 1 вирус попав в клетку организма, превращает её в фабрику по производству новых вирусов. 

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

Но не всё так плохо! В организме есть сигнализация! Если вирус попадает в клетку, то клетка начинает индуцировать  и выбрасывать вокруг себя особые белки интерфероны. Эти белки дают сигнал соседний клеткам и клетки блокируют свои мембраны, не давая вирусам попасть внутрь себя. Также подается сигнал иммунным клеткам, что тут что-то не так и надо начинать работу.
Что касается интерферонов, то тут вообще всё очень сложно:

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

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