Path: blob/master/ invest-robot-contest_tinkoff-invest-volume-analysis-robot-master/tests/test_profile_touch_strategy.py
5927 views
import csv1import datetime2import logging34import pandas as pd56from services.order_service import OrderService7from strategies.profile_touch_strategy import ProfileTouchStrategy8from utils.logger import init_logging9from utils.parse_util import parse_date10from utils.format_util import fixed_float11from utils.strategy_util import apply_frame_type1213pd.options.display.max_columns = None14pd.options.display.max_rows = None15pd.options.display.width = None1617init_logging()18logger = logging.getLogger(__name__)192021class TestProfileTouchStrategy:22def __init__(self, instrument_name, file_path):23self.instrument_name = instrument_name24self.file_path = file_path2526self.df = pd.DataFrame(columns=["figi", "direction", "price", "quantity", "time"])27self.df = apply_frame_type(self.df)2829self.profile_touch_strategy = ProfileTouchStrategy(instrument_name)30self.profile_touch_strategy.start()3132self.order_service = OrderService()33self.order_service.start()3435def run(self):36test_start_time = datetime.datetime.now()37logger.info("анализ истории: %s", self.file_path)3839with open(self.file_path, newline='') as file:40reader = csv.DictReader(file, delimiter=",")41for row in reader:42figi = row["figi"]43price = float(row["price"])44time = parse_date(row["time"])4546processed_trade_df = pd.DataFrame.from_records([47{48"figi": figi,49"direction": row["direction"],50"price": price,51"quantity": row["quantity"],52"time": pd.to_datetime(str(time), utc=True),53}54])55self.order_service.processed_orders(self.instrument_name, price, time)5657processed_trade_df = apply_frame_type(processed_trade_df)58orders = self.profile_touch_strategy.analyze(processed_trade_df)59if orders is not None:60for order in orders:61self.order_service.create_order(order)6263# после завершения анализа перестраиваю график, т.к. закрытие торгов не совпадает целому часу64# например 15:59:59.230333+00:0065self.profile_touch_strategy.calculate_clusters()66self.order_service.write_statistics()6768test_end_time = datetime.datetime.now()69total_test_time = (test_end_time - test_start_time).total_seconds() / 6070logger.info("анализ завершен")71logger.info("время тестирования: %s мин.", fixed_float(total_test_time))727374if __name__ == "__main__":75usd_histories = {"name": "USD000UTSTOM",76"files": ["./../data/USD000UTSTOM-20220504.csv", "./../data/USD000UTSTOM-20220505.csv",77"./../data/USD000UTSTOM-20220506.csv", "./../data/USD000UTSTOM-20220511.csv",78"./../data/USD000UTSTOM-20220512.csv", "./../data/USD000UTSTOM-20220513.csv",79"./../data/USD000UTSTOM-20220516.csv", "./../data/USD000UTSTOM-20220517.csv",80"./../data/USD000UTSTOM-20220518.csv", "./../data/USD000UTSTOM-20220519.csv",81"./../data/USD000UTSTOM-20220520.csv"]}8283sber_histories = {"name": "SBER",84"files": ["./../data/SBER-20220504.csv", "./../data/SBER-20220505.csv",85"./../data/SBER-20220506.csv", "./../data/SBER-20220511.csv",86"./../data/SBER-20220512.csv", "./../data/SBER-20220513.csv",87"./../data/SBER-20220516.csv", "./../data/SBER-20220517.csv",88"./../data/SBER-20220518.csv", "./../data/SBER-20220519.csv",89"./../data/SBER-20220520.csv"]}9091gaz_histories = {"name": "GAZP",92"files": ["./../data/GAZP-20220504.csv", "./../data/GAZP-20220505.csv",93"./../data/GAZP-20220506.csv", "./../data/GAZP-20220511.csv",94"./../data/GAZP-20220512.csv", "./../data/GAZP-20220513.csv",95"./../data/GAZP-20220516.csv", "./../data/GAZP-20220517.csv",96"./../data/GAZP-20220518.csv", "./../data/GAZP-20220519.csv",97"./../data/GAZP-20220520.csv", ]}9899for history in [usd_histories, sber_histories, gaz_histories]:100for file_path in history["files"]:101tester = TestProfileTouchStrategy(history["name"], file_path)102tester.run()103104105