Skip to content

Commit

Permalink
can run simulation with SimulationDualDataProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
msaltnet committed Dec 4, 2023
1 parent 6d1f205 commit b8f1f93
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 13 deletions.
6 changes: 3 additions & 3 deletions integration_tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
from .operator_ITG_test import OperatorIntegrationTests
from .strategy_bnh_ITG_test import StrategyBuyAndHoldIntegrationTests
from .simulation_trader_ITG_test import SimulationTraderIntegrationTests
from .simulator_ITG_test import SimulatorIntegrationTests, SimulatorWithDualIntegrationTests
from .simulator_ITG_test import SimulatorIntegrationTests

from .simulation_operator_ITG_test import (
SimulationOperatorIntegrationTests,
SimulationOperator3mIntervalIntegrationTests,
)
SimulationOperator3mIntervalIntegrationTests)

from .mass_simulator_ITG_test import (
MassSimulatorIntegrationTests,
MassSimulator3mIntervalIntegrationTests,
)
MassSimulatorDual3mIntervalIntegrationTests)
31 changes: 31 additions & 0 deletions integration_tests/mass_simulator_ITG_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,34 @@ def test_ITG_run_single_simulation(self, mock_print):
self.assertEqual(mock_print.call_args_list[-3][0][0], expected_score[3])
self.assertEqual(mock_print.call_args_list[-2][0][0], expected_score[4])
self.assertEqual(mock_print.call_args_list[-1][0][0], expected_score[5])

class MassSimulatorDual3mIntervalIntegrationTests(unittest.TestCase):
def setUp(self):
self.dp_type_backup = Config.simulation_data_provider_type
self.interval_backup = Config.candle_interval
Config.candle_interval = 180
Config.simulation_data_provider_type = "dual"

def tearDown(self):
Config.candle_interval = self.interval_backup
Config.simulation_data_provider_type = self.dp_type_backup

@patch("builtins.print")
def test_ITG_run_single_simulation(self, mock_print):
mass = MassSimulator()

mass.run("integration_tests/data/mass_simulation_3m_config.json")
expected_score = [
"Result Summary =========================================",
"수익률 평균: -2.034",
"수익률 편차: 0.872",
"수익률 최대: -1.418",
"수익률 최소: -2.651",
"========================================================",
]
self.assertEqual(mock_print.call_args_list[-6][0][0], expected_score[0])
self.assertEqual(mock_print.call_args_list[-5][0][0], expected_score[1])
self.assertEqual(mock_print.call_args_list[-4][0][0], expected_score[2])
self.assertEqual(mock_print.call_args_list[-3][0][0], expected_score[3])
self.assertEqual(mock_print.call_args_list[-2][0][0], expected_score[4])
self.assertEqual(mock_print.call_args_list[-1][0][0], expected_score[5])
62 changes: 59 additions & 3 deletions integration_tests/simulator_ITG_test.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import time
import unittest
from smtm import Simulator, Config
from .data import simulation_data
from unittest.mock import *


Expand All @@ -15,7 +13,65 @@ def tearDown(self):

@patch("builtins.print")
def test_ITG_run_single_simulation(self, mock_print):
budget = 100000
interval = 0.01
from_dash_to = "200430.055000-200430.073000"
simulator = Simulator(
budget=1000000,
interval=interval,
strategy="BNH",
from_dash_to=from_dash_to,
currency="BTC",
)

simulator.run_single()
self.assertEqual(mock_print.call_args[0][0], "Good Bye~")

@patch("builtins.input")
@patch("builtins.print")
def test_ITG_run_simulation(self, mock_print, mock_input):
simulator = Simulator()
mock_input.side_effect = [
"i", # 초기화
"200430.055000", # 시뮬레이션 기간 시작점
"200430.073000", # 시뮬레이션 기간 종료점
"0.1", # interval
"1000000", # budget
"BNH", # strategy
"ETH", # currency
"1", # 상태 출력
"r", # 시뮬레이션 시작
"1", # 상태 출력
"s", # 시뮬레이션 종료
"3", # 거래 내역 출력
"1", # 상태 출력
"2", # 수익률 출력
"t", # 시뮬레이터 종료
]
simulator.main()

expected_score = [
"ready",
"current score ==========",
"Good Bye~",
]

self.assertEqual(mock_print.call_args_list[-1][0][0], expected_score[2])
self.assertEqual(mock_print.call_args_list[-6][0][0], expected_score[1])
self.assertEqual(mock_print.call_args_list[-7][0][0], expected_score[0])

class SimulatorWithDualIntegrationTests(unittest.TestCase):
def setUp(self):
self.dp_type = Config.simulation_data_provider_type
self.interval = Config.candle_interval
Config.candle_interval = 60
Config.simulation_data_provider_type = "dual"

def tearDown(self):
Config.candle_interval = self.interval
Config.simulation_data_provider_type = self.dp_type

@patch("builtins.print")
def test_ITG_run_single_simulation(self, mock_print):
interval = 0.01
from_dash_to = "200430.055000-200430.073000"
simulator = Simulator(
Expand Down
2 changes: 2 additions & 0 deletions smtm/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ class Config:

# 시뮬레이션에 사용할 거래소 데이터 simulation_source: upbit, binance
simulation_source = "upbit"
# SimulationDualDataProvider의 데이터를 사용할지 여부: normal, dual
simulation_data_provider_type = "normal"
candle_interval = 60
"""스트림 핸들러의 레벨
CRITICAL 50
Expand Down
13 changes: 9 additions & 4 deletions smtm/controller/mass_simulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
from ..trader.simulation_trader import SimulationTrader
from ..date_converter import DateConverter
from ..data.simulation_data_provider import SimulationDataProvider

from ..data.simulation_dual_data_provider import SimulationDualDataProvider

class MassSimulator:
"""대량시뮬레이터
Expand Down Expand Up @@ -134,9 +134,14 @@ def get_initialized_operator(
raise UserWarning(f"Invalid Period! {start} ~ {end}")
end = dt[0][1]
count = dt[0][2]
data_provider = SimulationDataProvider(
currency=currency, interval=Config.candle_interval
)
if Config.simulation_data_provider_type == "dual":
data_provider = SimulationDualDataProvider(
currency=currency, interval=Config.candle_interval
)
else:
data_provider = SimulationDataProvider(
currency=currency, interval=Config.candle_interval
)
data_provider.initialize_simulation(end=end, count=count)

strategy = StrategyFactory.create(strategy_code)
Expand Down
12 changes: 9 additions & 3 deletions smtm/controller/simulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from ..trader.simulation_trader import SimulationTrader
from ..date_converter import DateConverter
from ..data.simulation_data_provider import SimulationDataProvider
from ..data.simulation_dual_data_provider import SimulationDualDataProvider
from ..strategy.strategy_factory import StrategyFactory


Expand Down Expand Up @@ -158,9 +159,14 @@ def initialize(self):
self.operator = SimulationOperator()
self._print_configuration(strategy.NAME)

data_provider = SimulationDataProvider(
currency=self.currency, interval=Config.candle_interval
)
if Config.simulation_data_provider_type == "dual":
data_provider = SimulationDualDataProvider(
currency=self.currency, interval=Config.candle_interval
)
else:
data_provider = SimulationDataProvider(
currency=self.currency, interval=Config.candle_interval
)
data_provider.initialize_simulation(end=end, count=count)
trader = SimulationTrader(
currency=self.currency, interval=Config.candle_interval
Expand Down

0 comments on commit b8f1f93

Please sign in to comment.