Steem Voting weight % is not that linear as we may think

in #steem6 years ago (edited)

image.png

TLDR; 10% upvote is only 9x stronger than 1% upvote (in my case)

Linear Rewards Curve

Since the 0.19 hardfork released last year, Steemian's vote impact have changed in favor of minnows. Linear Rewards Curve #1051 changed rewards curve to be n from n^2. In short: before, stakers with 2x more Steem Power than others had 4x stronger vote. In HF19 this changed to be equally linear.

image.png

This is how people think it is

Linear reward curve makes people voting strength directly proportional to their stake.

The devil is in the details :>

Steem Voting weight % is linear indeed. Linear enough that anybody who uses voting slider in integers won't even notice it's irregularity.

I have been studying Steem Voting and Curation mechanics for weeks. My conclusion is the most efficient way to luqidate Steem Power with best gains is to spread votes as wide as it is possible. This is my curation game I am playing for some time. I have started voting to small % upvotes, even fractions. I call these a "tip" for author's work.
Imagine my surprise when during backtests I discovered that my 0,2% upvote is equal to 0,5% upvote or 2,1% upvote is equal to 2,5% upvote in rshares. These are numbers for my current holdings (~2,5k SP).

This is chart I have prepared during tests to have a better view:

image.png

Chart represent a sample of votes spent in range of 0,2% up to 10% of their power. At the same time, account's Voting Power loss was monitored too.
This was done via steem-python API call
post.upvote(weight = vote_weight, voter = 'mys')

Gathered data:

vote %rsharesVP~ %
0,2498075654-0,01
0,3498075654-0,01
0,4498075654-0,01
0,5498075654-0,01
0,6996151309-0,02
0,7996151309-0,02
0,8996151309-0,02
0,9996151309-0,02
1996151309-0,02
1,11494226963-0,03
1,21494226963-0,03
1,31494226963-0,03
1,41494226963-0,03
1,51494226963-0,03
1,61992302618-0,04
1,71992302618-0,04
1,81992302618-0,04
1,91992302618-0,04
21992302618-0,04
2,12490378272-0,05
2,22490378272-0,05
2,32490378272-0,05
2,42490378272-0,05
2,52490378272-0,05
2,62988453927-0,06
2,72988453927-0,06
2,82988453927-0,06
2,92988453927-0,06
32988453927-0,06
3,13486529581-0,07
3,23486529581-0,07
3,33486529581-0,07
3,43486529581-0,07
3,53486529581-0,07
3,63486529581-0,07
3,73984605236-0,08
3,83984605236-0,08
3,93984605236-0,08
43984605236-0,08
4,13984605236-0,08
4,24482680891-0,09
4,34482680891-0,09
4,44482680891-0,09
4,54482680891-0,09
4,64482680891-0,09
4,74980756545-0,1
4,84980756545-0,1
4,94980756545-0,1
54980756545-0,1
5,14980756545-0,1
5,24980756545-0,1
5,35478832200-0,11
5,45478832200-0,11
5,55478832200-0,11
5,65478832200-0,11
5,75478832200-0,11
5,85478832200-0,11
5,95976907854-0,12
65976907854-0,12
6,15976907854-0,12
6,25976907854-0,12
6,35976907854-0,12
6,46474983509-0,13
6,56474983509-0,13
6,66474983509-0,13
6,76474983509-0,13
6,86474983509-0,13
6,96474983509-0,13
76973059163-0,14
7,16973059163-0,14
7,26973059163-0,14
7,36973059163-0,14
7,46973059163-0,14
7,56973059163-0,14
7,67471134818-0,15
7,77471134818-0,15
7,87471134818-0,15
7,97471134818-0,15
87471134818-0,15
8,17471134818-0,15
8,27471134818-0,15
8,37969210473-0,16
8,47969210473-0,16
8,57969210473-0,16
8,67969210473-0,16
8,77969210473-0,16
8,87969210473-0,16
8,98467286127-0,17
98467286127-0,17
9,18467286127-0,17
9,28467286127-0,17
9,38467286127-0,17
9,48467286127-0,17
9,58467286127-0,17
9,68965361782-0,18
9,78965361782-0,18
9,88965361782-0,18
9,98965361782-0,18
108965361782-0,18



Source code:

print('vote%    rshares     VP~%')
vote_weight = 0.2
for post in s.get_discussions_by_created({'limit': 100}):
    voting_power_pre = Account('mys')['voting_power']
    try:
        Post('@' + post['author'] + '/' + post['permlink']).upvote(weight = vote_weight, voter = 'mys')
        time.sleep(3)
    except Exception as e:
        print(e)
    post_after = Post('@' + post['author'] + '/' + post['permlink'])
    for vote in post_after['active_votes']:
        if 'mys' == vote['voter']:
            rshares = vote['rshares']
    voting_power_after = Account('mys')['voting_power']
    print(str(vote_weight) + '  ' + str(rshares) + '    ' + str(voting_power_after-voting_power_pre))
    vote_weight = round(vote_weight + 0.1, 1)



This is not the end. Even 0,02% upvote is rounded up to same size as 0,5% upvote!
0,02% = 498M rshares and 0,5% = 498M rshares

As we see there is some quantization in values for small ranges. Good that Voting Power loss decreases as the same function, so there isn't any abuse flaw here. Just lack of explanation in Steem docs how the numbers are rounded up.

Some explanations

  • rshares - each vote cast results in Reward Shares. These are voters' stake being thrown into the article's reward pot.
    The formula for calculating rshares is as follows:
    rshares = (account.vesting_shares - account.delegated_vesting_shares + account.received_vesting_shares) * account.voting_power * vote_weight / 100

  • why didn't I start voting from 0,01%? The minimum rshares that can be thrown into the pot is 50M rshares. This value is defined as STEEMIT_VOTE_DUST_THRESHOLD.
    For my holdings, voting for 0,01% returns an error from Steem node: "Voting weight is too small, please accumulate more voting power or steem power"

image.png

This is also the reason why small accounts doesn't even have a slider while voting. But hardly anyone knows this can still be done via API call :)

My summary

Most people won't even notice these small inaccuracies. Steemit.com/busy.org voting sliders values in integer range between 1-100%. Voters are not interested if their vote is 49,9% or 50,1% strength. Above charts prove that Steem Voting weight % <> rshares has linear ratio with rounded up fractions for its simplicity.

Who can benefit from this research? Voters who cast many many small votes every day. Yes, I am blinking toward bots and automatized curators ;) The formulas can be adjusted to earn more SP from curation. Steem currency is worth more and more in time. Where serious money is in the game, there comes efficiency.

Sort:  

Very interesting, I really must get around to playing with steem-python.

This post is too old to "tip" you, so I upvoted a random comment with an integer value instead :)

Why does it matter?

As the rshares are always using the same amount of vp it doesn't matter if i vote with 0.2% or 0.5% right? It's all the same and can't be used for anything, right?

You got a 21.79% upvote from @th3voter thanks to: @mwfiae!


kitten fighting :)
Image Source cloudinary.com


This post has upvoted from @th3voter !For more information, click here!

You can earn daily profit by delegating SP to our bot, 100% of earnings paid out to delegators. To do so, click below:
30SP, 50SP, 100SP, 250SP, 500SP, 1000SP, 5000SP, 10000SP,
Custom Amount
Make sure you have at least 15 SP left on your account.

Look at formula for calculating rshares:

rshares = (account.vesting_shares - account.delegated_vesting_shares + account.received_vesting_shares) * account.voting_power * vote_weight / 100

0.5% upvote should give 2.5x more rshares than 0.2%

Yeah butit doesn't. My question is how this can be utilized for anything or is this just a 'good to know'.

It doesn't really change the optimal voting behaviour. Its just a bit "unexpected" for the users.

Its just a bit "unexpected" for the users

this^
What I can imagine is a situation when someone buys a vote from bot service. He pays for 0.2% upvote and get 0.5% instead.

Oh thats a very interesting thought...

You got a 100.00% upvote from @allaz courtesy of @mwfiae!

Thanks for using Bid Voting Bot @allaz service and Steem Upvote Bot Tracker
I want to introduce you to my new friend @monsterbit in order to give additional thanks!
Do you know who is @monsterbit is? My friend, you can miss a lot. I highly recommend checking him with introduceyourself. He is going to hold interesting contests with cash prizes and promises to tell a lot of interesting stories!

In financial absolute rewards that won't help.

In the post there was another big for upvote bots with more than 1mln SP. If you were able to exploit that bug you had a much better business case.

That's why voting bots have minimum bid / payment so they vote with at least 1% or more. But some small rounding errors happen all the time :)

Re-reading the whole thing until it sticks. And also fiddling with steempy. Thanks for the hard work on this, let's clean up this place.

Be careful with very small votes, at least if you're interested in curation rewards. Rewards are distributed in VESTS, which are very finely divisible, but they are denominated in STEEM, which is divisible only down to 1000ths. Quantization errors there could lose you a lot of money if your votes are too small.

Agree, people could be trapped here. The lowest reward in the system is 0.001 SP. Everything below that value is not payed out!

Thanks for digging into this :) noticed that too with @tipU upvotes. tip! 1

Hi @mys! You have received 1.0 SBD tip from @cardboard!

Earn daily profit with @tipU :) 100% of profit + additional 60% of curation rewards is distributed daily to all investors.

When I look at your activity on busy. It says a .5 percent vote. When you go to the actual upvote it says .1 percent upvote. Which one is true? how can there be such a big range between what you vote and what is actually voted to the post?

image.png
this says you gave a 0.5% upvote
image.png
then when you go to the post it says you gave 1%

The numbers presented in blockchain are true (0.5%), eg. at steemd.com.
I believe it is just rounding to integer numbers in busy.org interface.

ok we just tried with a low sp acct and it worked at 5% but we got the error at 1%
We will see how it turns out. You might be wasting lots of sp still.

Interesting. I am wondering the reason behind that... Like you I guess.

Btw, I liked your final figure. I can apply it to many many situation of my own life ;)

very good article and I discover something ( Sir Steemnova +1 ! )

Czemu nie wrzucisz tego na #polish? A steemauto? Oplaca sie ustawic glosowania powyzej 30 minuty? Czy glosujac mocą 0.01$ i podgladajac na curations widze 0.00 czy jest to 0.008 naprzyklad którego nie widać? Testowałem twój sposób i nie wyszło mi z kuracji więcej. Mam 850 SP głosowałem 5% głosu czyli 0.01$. Więc nie rozumiem do końca. Warto głosować na posty np. Post- 130$ głosowalo juz 40 osób ?

To jest zupełnie inny temat.
O kuracji na Steem może skrobnę jakiś artykuł po polsku w najbliższym czasie.

To na czacie rozjasnij mi czemu mi nie wyszla kuracja w zeszlym tygodniu a glosowalem taka sama sila co ty?

Coin Marketplace

STEEM 0.29
TRX 0.12
JST 0.033
BTC 63855.79
ETH 3113.00
USDT 1.00
SBD 4.04