def market_test_vote(request): bill = get_object_or_404(Bill, id = request.POST.get("bill", "0")) prediction = int(request.POST.get("prediction", "0")) market = bill.get_open_market(request.user) if not market: return { } from predictionmarket.models import Trade, TradingAccount account = TradingAccount.get(request.user) if prediction != 0: # Buy shares in one of the outcomes. try: t = Trade.place(account, market.outcomes.get(owner_key = 1 if prediction == 1 else 0), 10) except ValueError as e: return { "error": str(e) } else: # Sell shares. positions, pl = account.position_in_market(market) for outcome in positions: Trade.place(account, outcome, -positions[outcome]["shares"]) return { "vote": prediction }
def handle(self, *args, **options): bank = TradingAccount.get(User.objects.get(id=settings.PREDICTIONMARKET_BANK_UID)) bill_ct = ContentType.objects.get_for_model(Bill) # For every bill, make a market for its next major step and close any other markets. for bill in Bill.objects.filter(congress=settings.CURRENT_CONGRESS): market_key = None # current market to open market_name = None # name of the market to open market_outcomes = None # dict of outcome names market_close = { } # markets to close, key is market id and value is the key of the winning outcome if bill.current_status in (BillStatus.introduced, BillStatus.referred, BillStatus.reported): market_key = 0 market_name = "Will %s pass the %s?" % (bill.display_number, bill.originating_chamber) market_outcomes = { 0: "No", 1: "Yes" } market_close = { } elif bill.current_status in (BillStatus.pass_over_house, BillStatus.pass_over_senate): market_key = 1 market_name = "Will %s pass the %s?" % (bill.display_number, bill.opposite_chamber) market_outcomes = { 0: "No", 1: "Yes" } market_close = { 0: 1 } # originating chamber passed elif bill.current_status in (BillStatus.pass_back_house, BillStatus.pass_back_senate): market_key = 2 market_name = "Will %s pass in identical form in the House and Senate?" % bill.display_number market_outcomes = { 0: "No", 1: "Yes" } market_close = { 0: 1, 1: 1 } # originating chamber passed, other chamber passed elif bill.current_status in (BillStatus.fail_originating_house, BillStatus.fail_originating_senate): market_close = { 0: 0 } # originating chamber failed elif bill.current_status in (BillStatus.fail_second_house, BillStatus.fail_second_senate): market_close = { 0: 1, 1: 0 } # originating chamber passed, second chamber failed elif bill.current_status in (BillStatus.passed_constamend, BillStatus.passed_concurrentres, BillStatus.passed_bill, BillStatus.override_pass_over_house, BillStatus.override_pass_over_senate, BillStatus.vetoed_pocket, BillStatus.vetoed_override_fail_originating_house, BillStatus.vetoed_override_fail_originating_senate, BillStatus.vetoed_override_fail_second_house, BillStatus.vetoed_override_fail_second_senate, BillStatus.enacted_signed, BillStatus.enacted_veto_override): market_close = { 0: 1, 1: 1 } # originating chamber passed, other chamber passed elif bill.current_status in (BillStatus.passed_simpleres,): market_close = { 0: 1 } # originating chamber passed else: # Don't know what to do in this state, so just keep whatever we had before. continue did_see_market = False for market in Market.objects.filter(owner_content_type=bill_ct, owner_object_id=bill.id, isopen=True): if int(market.owner_key) == market_key: did_see_market = True elif int(market.owner_key) in market_close: print "Closing market:", market market.close_market() # do this before the next check to make sure no trades slip in at the last moment if Trade.objects.filter(outcome__market=market).exclude(account=bank).count() == 0: print "\tDeleting market because the only trader was the bank." market.delete() # TODO: Leaves the bank's account balance alone, which is not really good. else: for outcome in market.outcomes.all(): outcome.liquidate(1.0 if market_close[int(market.owner_key)] == int(outcome.owner_key) else 0.0) else: print "Don't know what to do with market:", market, market.owner_key if not did_see_market and market_key != None: starting_price = compute_prognosis(bill)["prediction"] / 100.0 # Create the market. m = Market() m.owner_object = bill m.owner_key = market_key m.name = market_name m.volatility = 200.0 # large enough so that an integer number of shares can yield .01 precision in pricing m.save() ocmap = { } for k, v in market_outcomes.items(): o = Outcome() o.market = m o.owner_key = k o.name = v o.save() ocmap[k] = o # The bank buys enough shares to make the starting price match our bill prognosis. # Since we have two outcomes and the yes-price is exp(q1/b) / (exp(q1/b) + exp(q2/b)) # then.... if starting_price < .01: starting_price = .01 if starting_price > .99: starting_price = .99 shares = int(round(m.volatility * log(starting_price / (1.0 - starting_price)))) t = None if starting_price > .5 and shares > 0: t = Trade.place(bank, ocmap[1], shares, check_balance=False) elif starting_price < .5 and shares < 0: t = Trade.place(bank, ocmap[0], -shares, check_balance=False) print "Created market", m if t: print "\twith", t.shares, "of", t.outcome
def handle(self, *args, **options): bank = TradingAccount.get( User.objects.get(id=settings.PREDICTIONMARKET_BANK_UID)) bill_ct = ContentType.objects.get_for_model(Bill) # For every bill, make a market for its next major step and close any other markets. for bill in Bill.objects.filter(congress=settings.CURRENT_CONGRESS): market_key = None # current market to open market_name = None # name of the market to open market_outcomes = None # dict of outcome names market_close = { } # markets to close, key is market id and value is the key of the winning outcome if bill.current_status in (BillStatus.introduced, BillStatus.referred, BillStatus.reported): market_key = 0 market_name = "Will %s pass the %s?" % ( bill.display_number, bill.originating_chamber) market_outcomes = {0: "No", 1: "Yes"} market_close = {} elif bill.current_status in (BillStatus.pass_over_house, BillStatus.pass_over_senate): market_key = 1 market_name = "Will %s pass the %s?" % (bill.display_number, bill.opposite_chamber) market_outcomes = {0: "No", 1: "Yes"} market_close = {0: 1} # originating chamber passed elif bill.current_status in (BillStatus.pass_back_house, BillStatus.pass_back_senate): market_key = 2 market_name = "Will %s pass in identical form in the House and Senate?" % bill.display_number market_outcomes = {0: "No", 1: "Yes"} market_close = { 0: 1, 1: 1 } # originating chamber passed, other chamber passed elif bill.current_status in (BillStatus.fail_originating_house, BillStatus.fail_originating_senate): market_close = {0: 0} # originating chamber failed elif bill.current_status in (BillStatus.fail_second_house, BillStatus.fail_second_senate): market_close = { 0: 1, 1: 0 } # originating chamber passed, second chamber failed elif bill.current_status in ( BillStatus.passed_constamend, BillStatus.passed_concurrentres, BillStatus.passed_bill, BillStatus.override_pass_over_house, BillStatus.override_pass_over_senate, BillStatus.vetoed_pocket, BillStatus.vetoed_override_fail_originating_house, BillStatus.vetoed_override_fail_originating_senate, BillStatus.vetoed_override_fail_second_house, BillStatus.vetoed_override_fail_second_senate, BillStatus.enacted_signed, BillStatus.enacted_veto_override): market_close = { 0: 1, 1: 1 } # originating chamber passed, other chamber passed elif bill.current_status in (BillStatus.passed_simpleres, ): market_close = {0: 1} # originating chamber passed else: # Don't know what to do in this state, so just keep whatever we had before. continue did_see_market = False for market in Market.objects.filter(owner_content_type=bill_ct, owner_object_id=bill.id, isopen=True): if int(market.owner_key) == market_key: did_see_market = True elif int(market.owner_key) in market_close: print "Closing market:", market market.close_market( ) # do this before the next check to make sure no trades slip in at the last moment if Trade.objects.filter(outcome__market=market).exclude( account=bank).count() == 0: print "\tDeleting market because the only trader was the bank." market.delete( ) # TODO: Leaves the bank's account balance alone, which is not really good. else: for outcome in market.outcomes.all(): outcome.liquidate( 1.0 if market_close[int(market.owner_key)] == int(outcome.owner_key) else 0.0) else: print "Don't know what to do with market:", market, market.owner_key if not did_see_market and market_key != None: starting_price = compute_prognosis(bill)["prediction"] / 100.0 # Create the market. m = Market() m.owner_object = bill m.owner_key = market_key m.name = market_name m.volatility = 200.0 # large enough so that an integer number of shares can yield .01 precision in pricing m.save() ocmap = {} for k, v in market_outcomes.items(): o = Outcome() o.market = m o.owner_key = k o.name = v o.save() ocmap[k] = o # The bank buys enough shares to make the starting price match our bill prognosis. # Since we have two outcomes and the yes-price is exp(q1/b) / (exp(q1/b) + exp(q2/b)) # then.... if starting_price < .01: starting_price = .01 if starting_price > .99: starting_price = .99 shares = int( round(m.volatility * log(starting_price / (1.0 - starting_price)))) t = None if starting_price > .5 and shares > 0: t = Trade.place(bank, ocmap[1], shares, check_balance=False) elif starting_price < .5 and shares < 0: t = Trade.place(bank, ocmap[0], -shares, check_balance=False) print "Created market", m if t: print "\twith", t.shares, "of", t.outcome