예제 #1
0
 def setUpClass(cls):
     cls.events = Queue()
     cls.execution = IBExecutionHandler(cls.events, CONFIG)
     cls.future = FuturesContract('GC', exp_year=2016, exp_month=6)
     cls.stock = Stock('AAPL')
     while cls.execution.next_valid_order_id is -1:
         time.sleep(.1)
예제 #2
0
    def add_stocks(self, code_list):
        """보유주식에 포함시킨다.

        :param code:
        :return:
        """
        for code in code_list:
            self.보유주식[code] = Stock.get_instance(code)
예제 #3
0
    def update_sell(self, stock: Stock, price_per_stock: int, amount: int, reason: str):
        """특정 주식을 매도했을때, 계좌정보를 업데이트

        :param code:
        :param amount:
        :return:
        """
        # stock 객체 업데이트
        stock.trading_reason = reason
        stock.update_sell(price_per_stock, amount)
        if cfg_mgr.debug_mode():
            pass
            # self.print_attr('SELL', stock.stock_name, stock.code, reason)
            # pdb.set_trace()

        # 계좌 정보 업데이트
        self.예수금 += stock.매매금액
        self.총평가금액 += stock.평가금액변동
        self.총매입금액 += stock.매입금액변동
        self.총최대매입금액 = max(self.총매입금액, self.총최대매입금액)
        self.추정자산 = self.예수금 + self.총평가금액  # 현금(예수금) + 주식(총평가금액)
        self.총누적손익 += stock.실현손익
        self.총평가손익 = float(self.총평가금액 - self.총매입금액)  # 보유한 주식의가치로 얻은 손익
        self.총손익 = self.총평가손익 + self.총누적손익  # 개념상 손익 (현금의 손익 + 가치의 손익)
        try:
            self.총수익률 = self.총평가손익 / self.총매입금액 * 100  # 보유한 주식에 대한 총 수익률
        except ZeroDivisionError as e:
            self.총수익률 = 0.0
        self.총누적수익률 = float(self.총누적손익) / self.총최대매입금액 * 100  # 실현한 수익에 대한 총 수익률

        self.sell_transaction(stock)

        if stock.보유수량 == 0:
            del self.보유주식[stock.code]
        else:
            self.보유주식[stock.code] = stock

        try:
            if cfg_mgr.debug_mode():
                self.print_attr('SELL', stock.stock_name, stock.code, reason)
                # pdb.set_trace()
        except Exception:
            pdb.set_trace()
            print("Exception")
        return ""
예제 #4
0
 def setUpClass(cls):
     cls.events = Queue()
     cls.start_date = dt.datetime(year=2015, month=12, day=1)
     cls.end_date = dt.datetime(year=2015, month=12, day=31)
     cls.products = [Stock('MSFT')]
     cls.data = StockBacktestDataHandler(cls.events, cls.products, cls.start_date, cls.end_date)
     cls.execution = StockBacktestExecutionHandler(cls.events)
     cls.strategy = BuyStrategy(cls.events, cls.data, cls.products)
     cls.backtest = StockBacktest(cls.events, cls.strategy, cls.data, cls.execution, cls.start_date, cls.end_date)
예제 #5
0
    def update_buy(self, stock: Stock, price_per_stock: int, amount: int, reason: str):
        """특정 주식을 매수했을때, 계좌정보를 업데이트

        :param code:
        :param price_per_stock:
        :param amount:
        :return:
        """
        # stock 객체 업데이트
        stock.trading_reason = reason
        stock.update_buy(price_per_stock, amount)

        if cfg_mgr.debug_mode():
            pass
            # self.print_attr('BUY', stock.stock_name, stock.code, reason)  # need to move to util/common pkg
            # pdb.set_trace()

        # 계좌 정보 업데이트
        self.예수금 -= stock.매매금액
        self.총평가금액 += stock.평가금액변동
        self.총매입금액 += stock.매입금액변동
        self.총최대매입금액 = max(self.총매입금액, self.총최대매입금액)
        self.추정자산 = self.예수금 + self.총평가금액  # 현금(예수금) + 주식(총평가금액)
        # self.총누적손익 += self.총누적손익 --> 변동없음
        self.총평가손익 = float(self.총평가금액 - self.총매입금액)  # 보유한 주식의가치로 얻은 손익
        self.총손익 = self.총평가손익 + self.총누적손익  # 개념상 손익 (현금의 손익 + 가치의 손익)
        self.총수익률 = self.총평가손익 / self.총매입금액 * 100  # 보유한 주식에 대한 총 수익률
        self.총누적수익률 = float(self.총누적손익) / self.총최대매입금액 * 100  # 실현한 수익에 대한 총 수익률

        # 보유주식에 포함
        self.보유주식[stock.code] = stock

        self.buy_transaction(stock)
        try:
            if cfg_mgr.debug_mode():
                self.print_attr('BUY', stock.stock_name, stock.code, reason)  # need to move to util/common pkg
                # pdb.set_trace()

        except Exception:
            # pdb.set_trace()
            print("Exception")
예제 #6
0
    def get_stock_list(self, date):
        """특정일에 조건검색식으로부터 검출된 모든 stock list 를 반환

        :param date:
        :return:
        """
        code_list = self.detected_code_list(date)
        stock_list = [
            Stock.get_instance(code) for code in code_list
            if code not in self.disable_code_list
        ]
        return stock_list
예제 #7
0
    def get_stock_list_at_timestamp(self, timestamp):
        """특정시간(timestamp)에 조건검색식으로부터 검출된 stock list를 반환

        :param timestamp:
        :return:
        """
        ret = []
        for code, time_series in self.condi_hist.items():
            if code in self.disable_code_list:
                continue
            if timestamp in time_series:
                ret.append(Stock.get_instance(code))
        return ret
예제 #8
0
 def test_stock(self):
     stock = Stock('AAPL')
     self.assertEqual('AAPL', stock.symbol)
     self.assertEqual('Apple Inc.', stock.name)
     self.assertEqual('Consumer Goods', stock.sector)
예제 #9
0
import pandas as pd
import datetime as dt
from Queue import Queue
from trading.stock import Stock
from stock_backtest.data_handler import StockBacktestDataHandler
from stock_backtest.execution_handler import StockBacktestExecutionHandler
from stock_backtest.backtest import StockBacktest
from strategies.buy_strategy_stock import BuyStrategy

events = Queue()
products = [Stock('MSFT'), Stock('ORCL')]
symbols = [product.symbol for product in products]
start_date = dt.datetime(year=2012, month=1, day=1)
end_date = dt.datetime(year=2016, month=1, day=10)
data = StockBacktestDataHandler(events, products, start_date, end_date)
execution = StockBacktestExecutionHandler(events)
strategy = BuyStrategy(events, data, products, initial_cash=100000)
backtest = StockBacktest(events, strategy, data, execution, start_date, end_date)
backtest.run()

print strategy.time_series.head(5)
print strategy.positions_series.head(5)
print strategy.transactions_series.head(5)
print strategy.returns_series.head(5)