Постов с тегом "ПРОГРАММИРОВАНИЕ": 336

ПРОГРАММИРОВАНИЕ


Кодирование свечей по Лиховидову

Кодирование свечей по Лиховидову.
Параметры большой, средний, маленький берутся по свечам того же времени предшествующих дней.
Может кому пригодится для ML.
А может ошибки найдете или улучшение предложите.

# -*- coding: utf-8 -*-
"""
Читает файл csv в DataFrame. Добавляет колонку с кодом свечи по Лиховидову.
Расчет (большой, средний, маленький) ведется по свечам тогоже времени за предшествующие дни.
Количество предшествующих дней выбирается. Нужно предусмотреть csv файл с большей историей чем start_date на day_delta
"""
import pandas as pd
import numpy as np
from pathlib import Path


class CandleCode:
    def __init__(self, start_date, day_delta, dir_source, file_source):
        self.start_date = start_date
        self.day_delta = day_delta
        self.df = pd.DataFrame()
        self.dir_source = dir_source
        self.file_source = file_source

    def csv_to_df(self):
        """
        Читает файл csv delimiter=';' в DataFrame
        :param dir_source: Папка откуда берем csv файл для обработки
        :param file_source: Исходный файл
        :return:
        """
        self.df = pd.read_csv(f'{self.dir_source}/{self.file_source}', delimiter=';')  # Загружаем файл в DF
        # Меняем индекс и делаем его типом datetime
        self.df = self.df.set_index(pd.to_datetime(self.df['date_time'], format='%Y-%m-%d %H:%M:%S'))
        # Удаляем колонку с датой и временем, т.к. дата и время у нас теперь в индексе
        self.df = self.df.drop('date_time', axis=1)

    def prev_df_to_dic_code(self, previous_df):
        """
        Из DataFrame предшествующего расчетной свече создает словарь с перцентилями для расчета
        (большой, средний, маленький) диапазон тела свечи и его теней.
        :param previous_df: Получает  аргументе DataFrame, с такимже временем свечей, предшествующий расчетной свече
        :return: Возвращяет словарь перцентилей 33% и 66%
        """
        percentile_dic = {}  # Создаем пустой словарь в который будем писать перцентили
        for index, row in previous_df.iterrows():  # Перебираем строки dataframe previous_df
            if row['open'] > row['close']:  # Свеча на понижение
                previous_df.loc[index, 'shadow_high'] = row['high'] - row['open']
                previous_df.loc[index, 'shadow_low'] = row['close'] - row['low']
                previous_df.loc[index, 'candle_body'] = row['open'] - row['close']
            else:  # Свеча на повышение
                previous_df.loc[index, 'shadow_high'] = row['high'] - row['close']
                previous_df.loc[index, 'shadow_low'] = row['open'] - row['low']
                previous_df.loc[index, 'candle_body'] = row['close'] - row['open']

        percentile_dic['shadow_high_33'] = np.percentile(previous_df['shadow_high'], 33)
        percentile_dic['shadow_high_66'] = np.percentile(previous_df['shadow_high'], 66)
        percentile_dic['shadow_low_33'] = np.percentile(previous_df['shadow_low'], 33)
        percentile_dic['shadow_low_66'] = np.percentile(previous_df['shadow_low'], 66)
        percentile_dic['candle_body_33'] = np.percentile(previous_df['candle_body'], 33)
        percentile_dic['candle_body_66'] = np.percentile(previous_df['candle_body'], 66)
        return percentile_dic

    def file_out(self, start, end, df_candle_code):
        """
        Функция записывает результирующий DF в csv файл
        :param start: Для имени выходного файла, начальная дата
        :param end: Для имени выходного файла, конечная дата
        :param df_candle_code: DataFrame который записываем в файл
        :return:
        """
        name_file_out = Path(f'{self.dir_source}/{self.file_source[:-4]}_{start}_{end}_lihovidov.csv')
        df_candle_code.to_csv(name_file_out)

    def run(self):
        df_candle_code = self.df.copy()  # Создаем копию DF, исключение предупреждений
        # Срез DF в котором будет дополнительная колонка с кодами свечей
        df_candle_code = df_candle_code.loc[self.start_date:]
        df_candle_code['candle_code'] = np.nan  # Создание дополнительного столбца и заполнение его NaN
        for index, row in df_candle_code.iterrows():  # Перебираем строки dataframe df_candle_code
            print()
            print(index)
            delta_day = pd.to_timedelta(f'{self.day_delta} days')  # Преобразование типа
            start_previous_df = index.date() - delta_day  # Вычисляем начальную дату DF
            end_previous_df = index.date() - pd.to_timedelta('1 days')  # Вычисляем конечную дату DF
            # Создаем DF предшествующий текущей строке
            previous_df = self.df.loc[start_previous_df.strftime("%Y-%m-%d"): end_previous_df.strftime("%Y-%m-%d")]
            previous_df = previous_df.loc[index.time()]  # Оставляем только строки соответствующие времени тек. строки

            percentile_dic = self.prev_df_to_dic_code(previous_df)  # Получаем словарь перцентилей

            code_str = ''  # Строка в которую будем собирать код для текущей свечи
            # Свеча на понижение (медвежья)
            if row['open'] > row['close']:  # Свеча на понижение (медвежья)
                code_str += '0'
                # Для тела медвежьей свечи
                if row['open'] - row['close'] > percentile_dic[
                    'candle_body_66']:  # 00 - медвежья свеча с телом больших размеров
                    code_str += '00'
                elif row['open'] - row['close'] > percentile_dic[
                    'candle_body_33']:  # 01 - медвежья свеча с телом средних размеров
                    code_str += '01'
                elif row['open'] - row['close'] > 0:  # 10 - медвежья свеча с телом небольших размеров
                    code_str += '10'
                # Для верхней тени медвежьей свечи
                if row['high'] - row['open'] > percentile_dic['shadow_high_66']:  # 11 - верхняя тень больших размеров
                    code_str += '11'
                elif row['high'] - row['open'] > percentile_dic['shadow_high_33']:  # 10 - верхняя тень средних размеров
                    code_str += '10'
                elif row['high'] - row['open'] > 0:  # 01 - верхняя тень небольших размеров
                    code_str += '01'
                else:  # 00 - верхняя тень отсутствует
                    code_str += '00'
                # Для нижней тени медвежьей свечи
                if row['close'] - row['low'] > percentile_dic['shadow_low_66']:  # 00 - нижняя тень больших размеров
                    code_str += '00'
                elif row['close'] - row['low'] > percentile_dic['shadow_low_33']:  # 01 - нижняя тень средних размеров
                    code_str += '01'
                elif row['close'] - row['low'] > 0:  # 10 - нижняя тень небольших размеров
                    code_str += '10'
                else:  # 11 - нижняя тень отсутствует
                    code_str += '11'

            # Свеча на повышение (бычья)
            elif row['open'] < row['close']:  # Свеча на повышение (бычья)
                code_str += '1'
                # Для тела бычьей свечи
                if row['close'] - row['open'] > percentile_dic[
                    'candle_body_66']:  # 11 - бычья свеча с телом больших размеров.
                    code_str += '11'
                elif row['close'] - row['open'] > percentile_dic[
                    'candle_body_33']:  # 10 - бычья свеча с телом средних размеров
                    code_str += '10'
                elif row['close'] - row['open'] > 0:  # 01 - бычья свеча с телом небольших размеров
                    code_str += '01'
                # Для верхней тени бычьей свечи
                if row['high'] - row['close'] > percentile_dic['shadow_high_66']:  # 11 - верхняя тень больших размеров
                    code_str += '11'
                elif row['high'] - row['close'] > percentile_dic[
                    'shadow_high_33']:  # 10 - верхняя тень средних размеров
                    code_str += '10'
                elif row['high'] - row['close'] > 0:  # 01 - верхняя тень небольших размеров
                    code_str += '01'
                else:  # 00 - верхняя тень отсутствует
                    code_str += '00'
                # Для нижней тени бычьей свечи
                if row['open'] - row['low'] > percentile_dic['shadow_low_66']:  # 00 - нижняя тень больших размеров
                    code_str += '00'
                elif row['open'] - row['low'] > percentile_dic['shadow_low_33']:  # 01 - нижняя тень средних размеров
                    code_str += '01'
                elif row['open'] - row['low'] > 0:  # 10 - нижняя тень небольших размеров
                    code_str += '10'
                else:  # 11 - нижняя тень отсутствует
                    code_str += '11'

            # Дожи
            else:  # Дожи
                if row['high'] - row['open'] > row['open'] - row['low']:  # Верхняя тень больше, медвежий дожи
                    code_str += '011'
                else:  # Верхняя тень меньше, бычий дожи
                    code_str += '100'
                    # Для верхней тени дожи
                if row['high'] - row['close'] > percentile_dic['shadow_high_66']:  # 11 - верхняя тень больших размеров
                    code_str += '11'
                elif row['high'] - row['close'] > percentile_dic[
                    'shadow_high_33']:  # 10 - верхняя тень средних размеров
                    code_str += '10'
                elif row['high'] - row['close'] > 0:  # 01 - верхняя тень небольших размеров
                    code_str += '01'
                else:  # 00 - верхняя тень отсутствует
                    code_str += '00'
                # Для нижней тени дожи
                if row['open'] - row['low'] > percentile_dic['shadow_low_66']:  # 00 - нижняя тень больших размеров
                    code_str += '00'
                elif row['open'] - row['low'] > percentile_dic['shadow_low_33']:  # 01 - нижняя тень средних размеров
                    code_str += '01'
                elif row['open'] - row['low'] > 0:  # 10 - нижняя тень небольших размеров
                    code_str += '10'
                else:  # 11 - нижняя тень отсутствует
                    code_str += '11'

            df_candle_code.loc[[index], ['candle_code']] = int(code_str, 2)
            print(int(code_str, 2))

        self.file_out(df_candle_code.index[0].date(), df_candle_code.index[-1].date(), df_candle_code)


if __name__ == '__main__':
    dir_source = 'c:/data_prepare_quote_csv'  # Папка откуда берем csv файл для обработки
    file_source = 'SPFB.RTS_5min.csv'  # Исходный файл
    start_date = '2020-09-01'  # С какой даты будем строить DF с кодами свечей
    day_delta = 365  # Дельта в днях для расчета показателей (большой, средний, маленький). Предшествует start_date

    code = CandleCode(start_date, day_delta, dir_source, file_source)
    code.csv_to_df()
    code.run()

Очередной раз или учим программированию

Сегодня суббота, а значит нетрезво пора отдать дань волшебному горшочку «Смарт-Лаба», в благодарность за тексты, которые пока еще меня хоть немного, но цепляют.
Выборы в США, война на Кавказе, COVID-19… Б-г дал нам деньги, рынки, и саморазвитие. Куда ты катишься несчастный Смарт-Лаб?

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

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

"Смартлаб" против "Яндекса"

Если измерить средний уровень интеллекта на ведущем трейдерском сайте России и в ведущей ИТ-компании России, то где он будет выше? 

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


Объявление

    • 01 октября 2020, 18:15
    • |
    • Toddler
  • Еще
Господа программисты! К Вам обращаюсь я...

Опять карантин, опять удаленка… С понедельника придется, по крайней мере, на месяц отключать свою ТС.

Результаты за 4 месяца испытаний следующие:
Объявление
Объявление

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

9 языков программирования, которые помогут зарабатывать до $150 тыс. в год

Сайт для разработчиков Stack Overflow <a class=«stk-reset» href=«insights.stackoverflow.com/survey/2020» rel=«nofollow» target="_blank" data-gtm-vis-has-fired-10171822_255=«1»>провел опрос среди 65 тыс. пользователей, чтобы узнать, какие языки программирования они знают и сколько им за это платят. С помощью этих данных Stack Overflow составил рейтинг, расположив языки по возрастанию дохода, который они приносят программистам. При подсчете результатов была использована медианная зарплата за 50 рабочих недель, иностранную валюту конвертировали в доллары.
Вся статья здесь

Калькулятор облигаций❗️ Часть 1

Продолжаю совершенствовать свою базу SQL и автоматизированные средства расчетов.

В июне я написал пост: "Автоматизация — ключ к успешному инвестированию. Python и SQL приходят на помощь❗️", где описал как и зачем я поднял собственный SQL сервер, и какие задачи он мне поможет решить.

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



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

Программирование: с чего начинать

Тем, кто интересуется гейм-девом,

Здесь подробные материалы по программированию на unity и UE,
а также о гейм-дизайне и тестировании

do.kruzhok.org/index.php/Сделать_игру,_которая_делает_мир_лучше


Здесь об обучении C#, основам алгоритмов, математической логике

stepik.org/catalog

Также можно порекомендовать
гарвардский курс по основам программирования


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

Алиса, купи акции Яндекс

Я делаю голосовой помощник с открытым исходным кодом для торговли на бирже. За основу взял платформу Яндекс.Диалоги (Алиса) и Тинькофф Инвестиции Open API. У меня получилось купить и продать акции через Яндекс.Станцию голосом. Вот как это выглядит:


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

Полезная книга для программистов

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

Описаны все подробности коммерческой разработки.

Книга большая под 900 стр.

Полезная книга для программистов

Ссылка на книгу
fktpm.ru/file/84-sovershennyy-kod.pdf


Шаги моего ребенка в хай-теке


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

Автоматизация - ключ к успешному инвестированию. Python и SQL приходят на помощь!

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

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

Я уже рассказывал, что на самоизоляции осваивал Python, и демонстрировал, что мне удалось написать профессиональный инвестиционный калькулятор, который рассчитывает различные финансовые показатели и сравнивает между собой два актива. Кстати, в последней его версии я добавил возможность учета комиссий и налогов. Это позволяет намного легче сравнивать NET результаты для инвестора, особенно если в стратегии по ДУ есть вознаграждение управляющего за успех, а в ПИФах комиссия за приобретение и погашение паев.

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



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

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