A non-gameable liquidity points system

in #steem8 years ago

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

  1. Use theoretical price
  2. Dont allow insanity
  3. 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

Sort:  

A group of large whales could potentially be in collusion and self-trade amongst themselves (or even any other account could 'take' that is under the control of a registered market maker) if there is a system like this.

that is what the matrix solves or at least reduces. Any trading among the market makers is capped according to some sane caps. So unless ALL market makers are in on the self-trading, it wont do much good.

It reduces the issue to needing just one non-selftrading market maker, versus needing all to resist the temptation

Remember the current system allows washtrades of 100000 STEEM to get 10 million points or something crazy like that. Require accounts of a certain age, cap the amount of points obtained from unregistered takers. That is the biggest problem with the current system, you can create a maker bot that only gets positive points, and you can have another bot that accumulates all the negative without any consequence.

By assigning all the negative points to the responsible marketmaker all the washtrading goes away. Now what would be required is outright collusion.

So to get points a sybil account needs to be created that takes from all the market makers equally. That would be very capital intensive and risky, so I doubt would be practical.

The idea is that the vast majority of all the trades are with registered accounts, the only exceptions are the (presumably) retail traders. Any registered market maker to registered market maker trading will immediately show a bias in the cross trade matrix I describe in the post and unless it is spread equally across all other market makers would be capped and not contribute to the points, ie. no incentive to do artificial wash trades

Maybe I didnt explain the anti-washtrade matrix well enough?

Yeah, I didn't follow that. Also, I wouldn't put it past existing market makers to do anything to their advantage to obtain liquidity rewards. Look at what's happening now with abit.

That is why I added the human involvement part. If all accounts are registered in order to receive points and unregistered accounts are capped to smallish max amounts and it is also pegged to the feed's price, then it isnt perfect, but the insanity of 100000 STEEM wash trades is over.

Using the anti-washtrade matrix has the effect of allocating rewards proportionally to USEFUL liquidity provided. With the assumption that marketmaker <-> marketmaker liquidity is not useful

I hope this proposal gets the visibility it needs as I feel it comes really really close to solving this issue. Any chance you can post it on slack? I have no access to it yet

If I understand correctly, it is possible to work

There is problem with the market for sure. It will take a long time to balance out all the top holders because they pretty control and generating the maturity of the supply of Steem, Steem Power, and Steem Dollar. Hope this will bring closer to a better solution.

Coin Marketplace

STEEM 0.28
TRX 0.13
JST 0.032
BTC 63041.44
ETH 2985.81
USDT 1.00
SBD 3.61