111 lines
3.1 KiB
Vue
111 lines
3.1 KiB
Vue
<template>
|
|
<div class="overflow-x-auto px-12">
|
|
<label>Simulation step: {{ steps }} </label>
|
|
<input
|
|
class="range"
|
|
type="range"
|
|
v-model="steps"
|
|
min="1"
|
|
:max="entries.length"
|
|
/>
|
|
|
|
<table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th>Order #</th>
|
|
<th>Yes bid</th>
|
|
<th>No Bid</th>
|
|
<th>Yes Weight</th>
|
|
<th>No Weight</th>
|
|
<th>Implied Probability</th>
|
|
<th>Yes Payout</th>
|
|
<th>No Payout</th>
|
|
<th>Yes Return</th>
|
|
<th>No Return</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr v-for="(entry, i) in truncatedEntries">
|
|
<th>{{ i + 1 }}</th>
|
|
<td>{{ entry.yesBid || '' }}</td>
|
|
<td>{{ entry.noBid || '' }}</td>
|
|
<td>{{ entry.yesWeight.toFixed(2) || '' }}</td>
|
|
<td>{{ entry.noWeight.toFixed(2) || '' }}</td>
|
|
<td>{{ entry.prob.toFixed(2) || '' }}</td>
|
|
<td>{{ entry.yesPayout.value.toFixed(2) || '' }}</td>
|
|
<td>{{ entry.noPayout.value.toFixed(2) || '' }}</td>
|
|
<td>{{ (entry.yesReturn.value * 100).toFixed(2) || '' }}%</td>
|
|
<td>{{ (entry.noReturn.value * 100).toFixed(2) || '' }}%</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { bids } from './orders'
|
|
import { ref, computed } from '@vue/reactivity'
|
|
|
|
const entries = [] as any
|
|
// Constants
|
|
const YES_SEED = 1
|
|
const NO_SEED = 9
|
|
// Regular variables
|
|
let yesPot = 0
|
|
let noPot = 0
|
|
// UI parameters
|
|
const steps = ref(10)
|
|
|
|
// Computed variables: stop the simulation at the appropriate number of steps
|
|
const truncatedEntries = computed(() => entries.slice(0, steps.value))
|
|
const yesPotC = computed(() =>
|
|
truncatedEntries.value.reduce((acc, entry) => acc + entry.yesBid, 0)
|
|
)
|
|
const noPotC = computed(() =>
|
|
truncatedEntries.value.reduce((acc, entry) => acc + entry.noBid, 0)
|
|
)
|
|
const yesWeightsC = computed(() =>
|
|
truncatedEntries.value.reduce((acc, entry) => acc + entry.yesWeight, 0)
|
|
)
|
|
const noWeightsC = computed(() =>
|
|
truncatedEntries.value.reduce((acc, entry) => acc + entry.noWeight, 0)
|
|
)
|
|
|
|
// Calculations:
|
|
for (const bid of bids) {
|
|
const { yesBid, noBid } = bid
|
|
const yesWeight = noPot * (Math.log(yesBid + yesPot) - Math.log(yesPot)) || 0
|
|
const noWeight = yesPot * (Math.log(noBid + noPot) - Math.log(noPot)) || 0
|
|
|
|
// Note: Need to calculate weights BEFORE updating pot
|
|
yesPot += yesBid
|
|
noPot += noBid
|
|
const prob = yesPot / (yesPot + noPot)
|
|
|
|
// Payout: You get your initial bid back, as well as your share of the
|
|
// (noPot - seed) according to your yesWeight
|
|
const yesPayout = computed(
|
|
() => yesBid + (yesWeight / yesWeightsC.value) * (noPotC.value - NO_SEED)
|
|
)
|
|
const noPayout = computed(
|
|
() => noBid + (noWeight / noWeightsC.value) * (yesPotC.value - YES_SEED)
|
|
)
|
|
|
|
const yesReturn = computed(() => (yesPayout.value - yesBid) / yesBid)
|
|
const noReturn = computed(() => (noPayout.value - noBid) / noBid)
|
|
|
|
entries.push({
|
|
yesBid,
|
|
noBid,
|
|
// Show two decimal places
|
|
yesWeight: yesWeight,
|
|
noWeight: noWeight,
|
|
prob: prob,
|
|
yesPayout,
|
|
noPayout,
|
|
yesReturn,
|
|
noReturn,
|
|
})
|
|
}
|
|
</script>
|