def test_submit_order(self): p = Portfolio( buy_commission_rate=0.001, sell_commission_rate=0.0015, min_commission=5.0, round_lot=100) self.assertEqual((-10010.0, 10.0, 1000), p._submit_order(side="buy", price=10.0, volume=1000)) p.update_before_trade(divide_rate=1.0) self.assertEqual((5491.75, 11, 500), p._submit_order(side="sell", price=11, volume=500)) self.assertEqual(8.25, p.transaction_cost) self.assertEqual(9.0365, p.avg_price) self.assertEqual(500, p.volume) self.assertEqual(18.25, p.all_transaction_cost)
def test_sell_all_stock(self): p = Portfolio( buy_commission_rate=0.001, sell_commission_rate=0.0015, min_commission=5.0, round_lot=100) # sellable==0 , 无可卖 self.assertEqual((0.0, 10, 0), p._sell_all_stock(price=10)) self.assertEqual((-10010.0, 10.0, 1000), p._submit_order(side="buy", price=10.0, volume=1000)) p.update_before_trade(divide_rate=1.0) self.assertEqual((10983.5, 11, 1000), p._sell_all_stock(price=11)) self.assertEqual(16.5, p.transaction_cost) self.assertEqual(0, p.avg_price) self.assertEqual(0, p.volume) self.assertEqual(26.5, p.all_transaction_cost)
def test_order_basic(self): p = Portfolio( buy_commission_rate=0.001, sell_commission_rate=0.0015, min_commission=5.0, round_lot=100) p.update_before_trade(divide_rate=1.0) self.assertEqual((-10010.0, 10.0, 1000), p._submit_order(side="buy", price=10.0, volume=1000)) p.update_after_trade(close_price=10.0, cash_change=-10010, pre_portfolio_value=30000.0) # test update_after_trade self.assertEqual(-10.0, p.daily_pnl) self.assertEqual(10000.0, p.market_value) self.assertEqual(-10.0, p.pnl) self.assertEqual(0.0, round(p.daily_return, 3)) p.update_before_trade(divide_rate=1.0) # sell && buy # pecent = 0 self.assertEqual((10983.5, 11, 1000), p.order_target_percent( percent=0, price=11, pre_portfolio_value=29990.0, current_cash=19990)) self.assertEqual(16.5, p.transaction_cost) self.assertEqual(0, p.avg_price) self.assertEqual(0, p.volume) self.assertEqual(26.5, p.all_transaction_cost) # percent 0.5, 增仓 self.assertEqual((-14014.0, 10, 1400), p.order_target_percent(percent=0.5, price=10, pre_portfolio_value=29990.0, current_cash=30973.5)) self.assertEqual(30.5, p.transaction_cost) self.assertEqual(10.01, p.avg_price) self.assertEqual(1400, p.volume) self.assertEqual(40.5, p.all_transaction_cost) # test update after trade p.update_after_trade(close_price=10.0, cash_change=10983.5-14014.0, pre_portfolio_value=29990.0) self.assertEqual(969.5, p.daily_pnl) self.assertEqual(14000.0, p.market_value) self.assertEqual(959.5, p.pnl) self.assertEqual(0.03233, round(p.daily_return, 5)) # next day, buy_hold, then sell p.update_before_trade(divide_rate=1.0) # percent 0.452, 保持不变 p.order_target_percent(percent=0.452, price=10, pre_portfolio_value=29990.0) self.assertEqual(0, p.daily_pnl) self.assertEqual(14000.0, p.market_value) self.assertEqual(959.5, p.pnl) self.assertEqual(0.0, round(p.daily_return, 5)) p.update_after_trade(close_price=10.0, cash_change=0.0, pre_portfolio_value=29990.0) # next day p.update_before_trade(divide_rate=1.0) # percent 0.35, 减仓700 p.order_target_percent(percent=0.35, price=10, pre_portfolio_value=20000.0) self.assertEqual(10.5, p.transaction_cost) self.assertEqual(10.035, p.avg_price) self.assertEqual(700, p.volume) self.assertEqual(51, p.all_transaction_cost)