We want to reward market makers for providing liquidity, but the problem has been that the algorithm's used so far have been toys. Very easy to break and only looks like the real thing as abit has repeatedly shown.
I made a market maker called "taker" that never takes and doesnt selftrade (wash trade with any of my accounts) and it gets about 2% the rewards that the selftrading bots do. Clearly something is wrong, but it is impossible to fix, or at least that is what people say.
However, as one who is deep in this problem, I do see a way to have an algorithm that is mostly ungameable, but I dont have the math skills to figure out the exact equations. Following the process of curation rewards, the first thing that is needed are:
The principles
What are they? From a systems point of view we want to have as much liquidity as possible with as small a spread from the theoretical price. The current reward only looks at amount of liquidity offered, without regard to the value being provided, ie. a below market bid is quite useless as is an above market ask.
Before you go and say that we dont know what the price should be so we cant have the rewards based on the theoretical price, keep in mind that we dont need an exact theoretical price, just an approximation is fine as the rewards system is a statistical process. As long as the reference theoretical price is close to what it really should be most of the time, well, that is much better than what we had in the past.
So, the first principle is to reward market makers based on providing liquidity close to the theoretical price. And conveniently if you look at steemd.com way down the right hand column, what do we see?
state
feed_price
base 3.460 SBD
quote 1.000 STEEM
I am just a simple C programmer, but to me that sure looks like a theoretical price. I know its not perfect, but its there already accessible to the consensus code and sure is a lot more accurate than arbitrary 10% to 30% discounting that is done to minimize risk by the large market makers in the past.
The second principle would be to not reward silly things. I know that sounds silly, but right now massive points are awarded for orders that will never ever be filled, ie. asks for 100000 STEEM, which would use up ALL of the SBD in existence outside of poloniex and bittrex. Somehow I really doubt that order would be filled. Yet, when the washtrade comes through and clears out the 100000 STEEM, we just generated millions of points and bots that are not washtrading get left behind in the dust.
So that would mean some sort of common sense cap on the amount of points that can be earned due to amount of liquidity provided. Maybe this principle is to incentivize reasonable amounts of liquidity, but not unreasonable amounts.
Similarily, time on the books (duration) is something that we want, but only to a certain point. Long enough that simultaneous washtrading is not possible, but not too long that wet paint dries. The 30 minute timeframe now actually discourages making tight spreads as they are likely to be filled before the 30 minutes and no credit obtained. I estimate that if all the volumes my bot provided were counted, it would have earned a much fairer amount of points
Putting these things together we have distance from theoretical price, sane limits to volume and duration. I am sure @theoretical can make an equation based on these principles that will provide the right type of incentives most of the time.
Something like (DURATION / DISTANCE) * sqrt(BUYVOLUME * ASKVOLUME) where the variables have sane caps/floors applied to them.
Now to the question of washtrades, is this a real problem or will the above solve things enough? I think it would be pretty good, but given the creativity shown so far by the existing market makers, I would like to add a layer of human judgement to this.
Clearly, nobody has the time or inclination to be watching each and every bid, ask, trade, so the human judgement needs to be applied at the account level. Why not have each market maker that wants to earn points register their intent by naming their accounts. Before you say, sybil accounts dont have to register, I say that only registered accounts would get points. And this goes for both making and taking. Right now, all you need to do is split your making account from your taking account and then your taking account gets all the negative points which you dont suffer from and your maker account accrues all the benefits. My guess is that if the existing point systems penalized the accounts for the takings, they would have very little points indeed.
So, now we have the problem of unregistered accounts that fill the orders from the registered ones, which while technically impossible to prevent, practically speaking it is usually possible to identify the controller of an account. So we would be left with dishonest rogue operators only and I do not believe any of the existing market makers would resort to such things.
What that means is that 99% of the volumes can be fully accounted for by mapping the account to its controller and thus washtrades can be removed from the points calculations. Add a provision that only accounts older than a week (a month?) are eligible for some reasonable exemption (100 STEEM) amount of volume and so even in the presence of a dishonest player, the total amount of false liquidity possible is capped by the need for new accounts that are old enough and then it is only good for a small amount.
I dont have the exact equations, but I am hopeful that @theoretical can use this information to come up with some specifics and I am sure the community will be happy to provide feedback and identify any blatant attack vectors.
Principles
- Use theoretical price
- Dont allow insanity
- Apply human judgement
While it is possible for collusion between market makers, I think that can be solved with an objective summary report of market maker to market maker trades that is either voted on or maybe some sort of correlation is done and only the least common denominator is credited.
As an example, let us say there are 4 market makers A, B, C, D, where all the accounts for each market maker is combined, ie only net trades outside the market maker's own accounts are relevant.
For each period a matrix is created that represents the amount of trades between the pair of market makers, conveniently the diagonal is the amount of washtrades. In a busy market, it cant be helped that some cross trades will happen, but there will be some sort of average amount of cross trading (normalized for each market maker's overall volumes).
Once we have this data it should be possible to find min/max/ave amounts of cross trades that are allowed and anything above the max would not be allowed, or maybe there is some steep decay function after it goes above the minimum.
Anyway, now that liquidity point awards are being suspended, we need a replacement! Hopefully this post will help toward achieving this