conviction/.ipynb_checkpoints/ABM - discounted integral v...

382 lines
18 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import random\n",
"\n",
"from scipy.stats import gamma\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Discounted integral 'Voting'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Simple model proposed for implementing and testing a voting scheme\n",
"\n",
"- Assume a dynamic supply of governance tokens accessed by a bonding ETH (linear bonding curve)\n",
"- Assume this tokens also represent a stake in a revenue generating process\n",
"- The revenue generating process is has one parameter which is \"governed\" \n",
"- The revenue generated is random and there is a true \"best parameter\" unknown to the voters which may change\n",
"- The goal of the 'voting' system is for the selected parameter to trend toward the \"best parameter\" (even if it changes)\n",
"- In this set up, voting is completely passive, \"votes\" are automatically determined by each agents belief state and counted according to their balance of the 'Tokens' that representing their voting capacity\n",
"- An agent has the right to change their belief or preference at any time but the effect of their prior beliefs or prefences continues to influence the system, decaying in time according to the forgetfulness parameter\n",
"- These tokens also represent their stake in the pool of Ether being generated by the revenue process\n",
"\n",
"This is a sensor fusion problem -- coordination problem. The environment, the pool of agents, the process, the actions and the system updates have been made mind-numbingly noisy in order to show the effect of the di"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"#Define the Revenue generating process\n",
"def revenue(true_best_param,current_voted_param ):\n",
" #use an concave function with unique maximum as true_best_param = current_voted_param\n",
" base_scale = 1\n",
" scale = base_scale*np.exp(-(true_best_param-current_voted_param)**2)\n",
" shape = .5\n",
" return gamma(scale, shape).rvs()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10fbb8518>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#test the revenue random variable as a function of how right the param is\n",
"N = 1000\n",
"bins = 10\n",
"d11=np.zeros(N)\n",
"d12=np.zeros(N)\n",
"d21=np.zeros(N)\n",
"d110=np.zeros(N)\n",
"d101=np.zeros(N)\n",
"for i in range(N):\n",
" d11[i] = revenue(1,1)\n",
" d12[i] = revenue(1,2)\n",
" d21[i] = revenue(2,1)\n",
" d110[i] = revenue(1,10)\n",
" d101[i] = revenue(10,1)\n",
"\n",
"plt.hist(d11, bins, alpha=0.5, label='d11')\n",
"plt.hist(d12, bins, alpha=0.5, label='d12')\n",
"plt.hist(d21, bins, alpha=0.5, label='d21')\n",
"plt.hist(d110, bins, alpha=0.5, label='d110')\n",
"plt.hist(d101, bins, alpha=0.5, label='d101')\n",
"\n",
"plt.legend(loc='upper right')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"#Lets assuming that all tokens in existence is given by T\n",
"\n",
"def bond_mint(eth, Eth, Tokens):\n",
" return eth*Tokens/Eth\n",
"\n",
"def burn_withdraw(tokens, Eth, Tokens):\n",
" return tokens*Eth/Tokens\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#define a set of agents\n",
"agents = {}\n",
"\n",
"#in this passive voting model agents maintain a belief or a preference as part of their state with respect\n",
"#to the contract the 'token' came from\n",
"#their belief or preference may be updated by them at will\n",
"def add_agent(eth, tbparam, Eth, Tokens):\n",
" agents[str(len(agents))] = {\"eth\":eth,\n",
" \"tokens\":0,\n",
" \"param_belief\": 2*tbparam*np.random.uniform(),\n",
" \"value_belief\":2*Tokens/Eth*np.random.uniform()}\n",
" \n",
"\n",
"def agent_acts(a, Eth, Tokens, r, p):\n",
" #update value belief\n",
" agents[a][\"value_belief\"] = 2*Tokens/Eth*np.random.uniform()\n",
" \n",
" #update tokens held -- buy or sell -- pretty naive with random belief and random amount\n",
" if agents[a][\"value_belief\"]<Tokens/Eth:\n",
" urv =np.random.uniform() \n",
" burn = agents[a][\"tokens\"]*urv\n",
" eth_out = burn_withdraw(burn, Eth, Tokens)\n",
" \n",
" agents[a][\"tokens\"] = agents[a][\"tokens\"]-burn\n",
" agents[a][\"eth\"] = agents[a][\"eth\"] + eth_out\n",
" Tokens = Tokens - burn\n",
" Eth = Eth - eth_out\n",
" \n",
" else:\n",
" \n",
" urv =np.random.uniform() \n",
" bond =agents[a][\"eth\"]*urv\n",
" mint = bond_mint(bond, Eth, Tokens)\n",
" \n",
" agents[a][\"tokens\"] = agents[a][\"tokens\"]+mint\n",
" agents[a][\"eth\"] = agents[a][\"eth\"] -bond\n",
" Tokens = Tokens + mint\n",
" Eth = Eth + bond\n",
" \n",
" #update believe by taking a tiny step along slope of observations\n",
" #only assumption is that the agent roughly estimates the direction of better returns from observed revenue events\n",
" agents[a][\"param_belief\"] = np.max([0,agents[a][\"param_belief\"] + np.random.uniform()*np.polyfit(p, r, 1)[0]])\n",
"\n",
" #print(agents[a][\"value_belief\"])\n",
" return Eth, Tokens, agents[a]\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"K= 50000\n",
"alpha=.95 #forgetfulness\n",
"true_best_param = 5*np.ones(K) \n",
"#throw a step change in there to mix things up\n",
"#true_best_param[:int(K/2)] =.5*true_best_param[:int(K/2)]\n",
"\n",
"\n",
"E=np.zeros(K)\n",
"T=np.zeros(K)\n",
"\n",
"A=np.zeros(K)\n",
"\n",
"Eth =1\n",
"Tokens =100\n",
"E[0] = Eth\n",
"T[0] = Tokens\n",
"A[0] = 1\n",
"\n",
"agents = {}\n",
"add_agent(gamma(5,1).rvs(), true_best_param[0], Eth, Tokens)\n",
"\n",
"votes=np.zeros(K)\n",
"count=np.zeros(K)\n",
"param=np.zeros(K)\n",
"rev=np.zeros(K)\n",
"\n",
"n = np.zeros(K)\n",
"n[0]=1\n",
"\n",
"for k in range(1,K):\n",
" Eth = E[k-1]\n",
" Tokens = T[k-1]\n",
" #resolve governance -- what is the belief of the param\n",
" votes[k] = (np.sum([agents[a][\"tokens\"]*agents[a][\"param_belief\"] for a in list(agents.keys())])+ alpha*votes[k-1])\n",
" count[k] = (np.sum([agents[a][\"tokens\"] for a in list(agents.keys())])+ alpha*count[k-1])\n",
" if count[k]>0:\n",
" param[k] = votes[k]/count[k]\n",
" else:\n",
" param[k] = 1\n",
" rev[k] = revenue(true_best_param[k],param[k])\n",
" Eth = Eth+rev[k]\n",
" \n",
" #new agents join\n",
" if np.random.uniform()< np.log10(K/k):\n",
" new = int(2*np.random.uniform())\n",
" for i in range(new):\n",
" add_agent(gamma(5,1).rvs(), true_best_param[k], Eth, Tokens)\n",
" n[k]=len(agents)\n",
" \n",
" #pick some to update on the order of log of agents\n",
" active = random.sample(list(agents.keys()), int(np.log2(len(agents))))\n",
" for a in active:\n",
" Eth, Tokens, val = agent_acts(a, Eth, Tokens, rev[:k+1], param[:k+1])\n",
" agents[a] = val\n",
" \n",
" A[k] = len(active)\n",
" E[k] = Eth\n",
" T[k] = Tokens\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"k"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.plot(range(K),n)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.hist(rev)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.hist((true_best_param-param)/true_best_param, bins=(np.arange(-1,1,.1)), density=True, alpha=.5)\n",
"plt.hist((true_best_param-param)/true_best_param, bins=(np.arange(-1,1,.1)), density=True, weights = rev, alpha=.25)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.semilogy(n, np.abs(true_best_param - param)/true_best_param, n, .1)\n",
"plt.title(\"Logscale absolute percent error\")\n",
"plt.labels([\"error\", \"10% reference\"])\n",
"plt.xlabel(\"Number of Agents\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.plot(range(K), true_best_param, range(K), param )"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.plot(range(K), E/T)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.plot(range(K), E, range(K), T)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.plot(E, T)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.scatter(param,rev)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sns.kdeplot(param,rev)\n",
"plt.axis([4,6,0,4])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sns.jointplot(param, rev, kind=\"kde\", size=7, space=0, xlim=[4,6],ylim=[0,5])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}