5/17/2021

There are 10,000 CryptoPunks minted on the Ethereum blockchain.

Each one is a Non-Fungible Token (NFT) representing ownership of a 24 X 24 pixel “portrait” of a Punk. The creators of the Punks wrote a program that generated them quasi-randomly 4 years ago and promptly gave away 90% of them to anyone who had an Ether wallet and was paying attention. We have a record of every sales price since then, and in the following slides you’ll see an attempt to model those prices, which depend on the wild whims of crypto speculation and high-priced artwork trading, as well as the uncertainty of the nascent world of digital art. Last week, Christie’s Auction House sold 9 of the Punks, which will serve as the ultimate test cases for the model developed here.

## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   ID = col_character(),
##   Type = col_character(),
##   From = col_character(),
##   To = col_character(),
##   Amount = col_character(),
##   Txn = col_character(),
##   ether = col_double(),
##   USD = col_double(),
##   date = col_date(format = "")
## )
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   .default = col_double(),
##   ID = col_character(),
##   type = col_character()
## )
## ℹ Use `spec()` for the full column specifications.

How are these categorized?

33 Most Common Attributes

33 Rarest Attributes

Does scarcity of an attribute drive up the sales price?

In general, yes. But what if a Punk has a beanie (rare) and an earring (common)?

Distribution of Number of Attributes per Punk

Factors influencing sales prices

  • Date of sale
    • Speculative trends
    • Price of Ether
  • Punk attributes
    • Scarcity
    • Combinations
  • Owner/Seller
    • The Punk creators kept 10% of them, including the 9 being auctioned. Perhaps that changes their value.
  • Artificial pricing. Insofar as there is a “fair value”:
    • People can sell Punks under fair value, to friends/children etc.
    • People can buy Punks over fair value, for money laundering, price manipulation etc.

9 Punks at auction:

Attempt to model the time element

Residuals provide more evidence

that Time vs. Price isn’t modeled well as a (log-)linear relationship.

Possible remedy:

Model the Time-Price relationship with the Loess method, for a better fit, and then instead of fitting “Date” with all the Punk Attributes, just treat its predicted value for each point as another feature affecting the price. This is sort of like eliminating the time dimension, and just creating a feature for each sale, along the lines of “Average sale price of all Punks for last 90 days.”

## 
## Call:
## lm(formula = log(ether) ~ ., data = fitters)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.1110 -0.2640 -0.0765  0.1639  4.5324 
## 
## Coefficients: (1 not defined because of singularities)
##                          Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             3.926e+00  1.631e-01  24.063  < 2e-16 ***
## Beanie                 -8.414e-02  6.186e-02  -1.360 0.173776    
## Choker                  5.448e-02  7.590e-02   0.718 0.472840    
## `Pilot+Helmet`         -1.011e-01  7.023e-02  -1.440 0.149979    
## Tiara                   1.361e-01  6.234e-02   2.183 0.029048 *  
## `Orange+Side`          -7.634e-02  6.277e-02  -1.216 0.223976    
## `Buck+Teeth`           -4.900e-02  6.015e-02  -0.815 0.415255    
## `Welding+Goggles`       7.195e-02  4.723e-02   1.523 0.127674    
## Pigtails               -9.909e-03  4.829e-02  -0.205 0.837408    
## `Pink+With+Hat`         8.921e-03  5.244e-02   0.170 0.864922    
## `Top+Hat`              -8.592e-02  4.338e-02  -1.980 0.047673 *  
## Spots                  -1.400e-02  3.700e-02  -0.378 0.705212    
## `Rosy+Cheeks`          -8.072e-02  3.867e-02  -2.087 0.036879 *  
## `Blonde+Short`         -7.496e-02  4.641e-02  -1.615 0.106279    
## `Wild+White+Hair`      -6.197e-02  4.722e-02  -1.312 0.189429    
## `Cowboy+Hat`            4.129e-02  4.060e-02   1.017 0.309240    
## `Wild+Blonde`          -4.314e-02  4.572e-02  -0.944 0.345359    
## `Straight+Hair+Blonde` -3.572e-02  5.171e-02  -0.691 0.489718    
## `Big+Beard`            -3.335e-02  3.133e-02  -1.064 0.287219    
## `Red+Mohawk`           -2.298e-02  4.253e-02  -0.540 0.589005    
## `Half+Shaved`          -6.781e-02  4.229e-02  -1.603 0.108883    
## `Blonde+Bob`           -2.726e-05  4.375e-02  -0.001 0.999503    
## `Vampire+Hair`         -4.900e-02  4.543e-02  -1.079 0.280786    
## `Clown+Hair+Green`     -4.318e-02  3.247e-02  -1.330 0.183624    
## `Straight+Hair+Dark`    3.161e-02  5.964e-02   0.530 0.596164    
## `Straight+Hair`        -4.678e-02  3.874e-02  -1.208 0.227231    
## `Silver+Chain`          6.458e-02  3.436e-02   1.880 0.060192 .  
## `Dark+Hair`             1.753e-02  3.396e-02   0.516 0.605592    
## `Purple+Hair`          -6.603e-02  2.520e-02  -2.620 0.008799 ** 
## `Gold+Chain`           -6.820e-02  3.641e-02  -1.873 0.061054 .  
## `Medical+Mask`          5.291e-02  3.378e-02   1.566 0.117288    
## `Tassle+Hat`           -3.523e-02  4.485e-02  -0.785 0.432187    
## Fedora                  4.826e-02  3.654e-02   1.321 0.186648    
## `Police+Cap`            1.017e-01  3.940e-02   2.581 0.009850 ** 
## `Clown+Nose`            5.342e-02  3.171e-02   1.684 0.092132 .  
## Smile                  -5.826e-02  2.906e-02  -2.005 0.045014 *  
## `Cap+Forward`           5.387e-02  3.755e-02   1.435 0.151385    
## Hoodie                 -7.944e-02  3.511e-02  -2.263 0.023682 *  
## `Front+Beard+Dark`      2.734e-05  3.995e-02   0.001 0.999454    
## Frown                   2.972e-03  2.885e-02   0.103 0.917956    
## `Purple+Eye+Shadow`     1.394e-03  2.725e-02   0.051 0.959199    
## Handlebars              2.124e-02  2.728e-02   0.779 0.436144    
## `Blue+Eye+Shadow`       8.102e-02  2.763e-02   2.933 0.003368 ** 
## `Green+Eye+Shadow`     -4.280e-02  2.809e-02  -1.524 0.127563    
## Vape                    2.196e-02  2.627e-02   0.836 0.403274    
## `Front+Beard`          -3.166e-02  2.844e-02  -1.113 0.265612    
## Chinstrap               7.004e-04  2.715e-02   0.026 0.979420    
## `3D+Glasses`           -6.543e-03  2.757e-02  -0.237 0.812398    
## `Luxurious+Beard`      -3.777e-02  2.498e-02  -1.512 0.130515    
## Mustache               -2.905e-02  2.643e-02  -1.099 0.271759    
## `Normal+Beard+Black`    3.643e-03  3.665e-02   0.099 0.920822    
## `Normal+Beard`         -5.184e-03  2.750e-02  -0.188 0.850497    
## `Eye+Mask`             -2.345e-02  2.529e-02  -0.927 0.353949    
## Goat                    2.150e-02  2.691e-02   0.799 0.424412    
## `Do-rag`               -1.897e-02  3.439e-02  -0.552 0.581147    
## `Shaved+Head`          -4.000e-02  3.460e-02  -1.156 0.247557    
## Muttonchops            -1.246e-02  2.592e-02  -0.481 0.630811    
## `Peak+Spike`           -1.588e-02  3.334e-02  -0.476 0.633797    
## Pipe                    1.434e-02  2.565e-02   0.559 0.576168    
## VR                      1.932e-03  2.631e-02   0.073 0.941469    
## Cap                    -8.374e-02  3.282e-02  -2.552 0.010735 *  
## `Small+Shades`         -2.418e-02  2.391e-02  -1.011 0.311862    
## `Clown+Eyes+Green`      3.717e-02  2.709e-02   1.372 0.169984    
## `Clown+Eyes+Blue`       8.608e-04  2.390e-02   0.036 0.971268    
## Headband               -5.869e-02  3.139e-02  -1.869 0.061578 .  
## `Crazy+Hair`           -6.270e-02  2.944e-02  -2.129 0.033245 *  
## `Knitted+Cap`           9.543e-03  3.233e-02   0.295 0.767837    
## `Mohawk+Dark`           7.300e-02  2.983e-02   2.447 0.014422 *  
## Mohawk                 -8.817e-02  3.040e-02  -2.900 0.003733 ** 
## `Mohawk+Thin`           4.236e-02  2.980e-02   1.421 0.155223    
## `Frumpy+Hair`          -3.637e-02  2.970e-02  -1.225 0.220731    
## `Wild+Hair`            -5.471e-02  2.921e-02  -1.873 0.061142 .  
## `Messy+Hair`           -6.795e-02  2.909e-02  -2.336 0.019532 *  
## `Eye+Patch`             5.431e-02  2.161e-02   2.513 0.011971 *  
## `Stringy+Hair`         -4.803e-02  2.884e-02  -1.665 0.095853 .  
## Bandana                -4.400e-02  3.023e-02  -1.455 0.145578    
## `Classic+Shades`        6.474e-02  2.091e-02   3.096 0.001965 ** 
## `Shadow+Beard`         -4.608e-02  2.178e-02  -2.116 0.034383 *  
## `Regular+Shades`        5.902e-02  2.081e-02   2.836 0.004572 ** 
## `Horned+Rim+Glasses`    6.127e-02  2.020e-02   3.034 0.002421 ** 
## `Big+Shades`            7.437e-02  2.137e-02   3.481 0.000502 ***
## `Nerd+Glasses`          2.465e-02  2.005e-02   1.229 0.219018    
## `Black+Lipstick`       -7.093e-03  1.939e-02  -0.366 0.714570    
## Mole                   -2.864e-02  1.871e-02  -1.531 0.125740    
## `Purple+Lipstick`       4.462e-02  2.082e-02   2.143 0.032112 *  
## `Hot+Lipstick`         -4.343e-03  1.920e-02  -0.226 0.821029    
## Cigarette               9.577e-03  1.573e-02   0.609 0.542616    
## Earring                -5.575e-03  1.052e-02  -0.530 0.596165    
## ape                    -9.500e-01  1.865e-01  -5.094 3.55e-07 ***
## zombie                 -1.775e+00  1.691e-01 -10.498  < 2e-16 ***
## male                   -4.013e+00  1.616e-01 -24.834  < 2e-16 ***
## female                 -3.787e+00  1.617e-01 -23.423  < 2e-16 ***
## alien                          NA         NA      NA       NA    
## under1000               3.917e-01  2.430e-02  16.115  < 2e-16 ***
## loPred                  1.004e+00  2.491e-03 402.990  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5082 on 13071 degrees of freedom
##   (427 observations deleted due to missingness)
## Multiple R-squared:  0.9286, Adjusted R-squared:  0.9281 
## F-statistic:  1827 on 93 and 13071 DF,  p-value: < 2.2e-16

Fit a linear regression model

## 
## Call:
## lm(formula = log(ether) ~ Tiara + `Rosy+Cheeks` + `Silver+Chain` + 
##     `Purple+Hair` + `Gold+Chain` + `Police+Cap` + `Clown+Nose` + 
##     `Blue+Eye+Shadow` + Cap + `Mohawk+Dark` + Mohawk + `Eye+Patch` + 
##     `Classic+Shades` + `Shadow+Beard` + `Regular+Shades` + `Horned+Rim+Glasses` + 
##     `Big+Shades` + `Purple+Lipstick` + ape + zombie + male + 
##     female + under1000 + loPred, data = fitters)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.1110 -0.2622 -0.0793  0.1628  4.5566 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           3.86731    0.16104  24.015  < 2e-16 ***
## Tiara                 0.18624    0.05778   3.223 0.001270 ** 
## `Rosy+Cheeks`        -0.08138    0.03823  -2.129 0.033298 *  
## `Silver+Chain`        0.07313    0.03389   2.158 0.030963 *  
## `Purple+Hair`        -0.04996    0.02176  -2.296 0.021690 *  
## `Gold+Chain`         -0.06878    0.03595  -1.913 0.055731 .  
## `Police+Cap`          0.08035    0.03365   2.388 0.016971 *  
## `Clown+Nose`          0.05653    0.03132   1.805 0.071089 .  
## `Blue+Eye+Shadow`     0.07935    0.02659   2.985 0.002845 ** 
## Cap                  -0.02850    0.01491  -1.911 0.056029 .  
## `Mohawk+Dark`         0.05529    0.02566   2.155 0.031158 *  
## Mohawk               -0.03066    0.01513  -2.026 0.042799 *  
## `Eye+Patch`           0.05206    0.02068   2.518 0.011828 *  
## `Classic+Shades`      0.06570    0.01989   3.304 0.000957 ***
## `Shadow+Beard`       -0.03947    0.02084  -1.894 0.058272 .  
## `Regular+Shades`      0.05846    0.01977   2.957 0.003109 ** 
## `Horned+Rim+Glasses`  0.06126    0.01915   3.198 0.001385 ** 
## `Big+Shades`          0.06494    0.01967   3.301 0.000966 ***
## `Purple+Lipstick`     0.04266    0.01888   2.260 0.023842 *  
## ape                  -0.91427    0.18587  -4.919 8.81e-07 ***
## zombie               -1.77160    0.16851 -10.513  < 2e-16 ***
## male                 -4.00152    0.16108 -24.842  < 2e-16 ***
## female               -3.77585    0.16120 -23.424  < 2e-16 ***
## under1000             0.39693    0.02405  16.503  < 2e-16 ***
## loPred                1.00424    0.00248 404.932  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5083 on 13140 degrees of freedom
##   (427 observations deleted due to missingness)
## Multiple R-squared:  0.9282, Adjusted R-squared:  0.928 
## F-statistic:  7073 on 24 and 13140 DF,  p-value: < 2.2e-16

After pruning about 75% of the features…

Since those never sold on the open market (blockchain), we need to attach a date of May 11 to the neverSold frame and predict the prices.

##        1        2        3        4        5        6        7        8 
## 7.626661 3.758897 3.789558 3.789558 3.801558 3.750092 3.588521 3.575888 
##        9 
## 3.563888

The 9 punks sold as a group.

Here’s the predictions of the linear model, for a batch total price:

chrisPreds <- predict(m2, cpdf)
sum(exp(chrisPreds)) # take exponent of result, since model fits logs
## [1] 2378.064

( 2378 Ether at the time of the auction was worth about $9.9 Million )

According to https://techcrunch.com/2021/05/11/cryptopunks-nft-bundle-goes-for-17-million-in-christies-auction/: “The final Christie’s bid was for $14.5 million, $16.96 million after fees. Many inside the crypto community had expected the sale to reach an even higher premium in recent weeks, something that had led to a substantial run-up in prices of CryptoPunks in the weeks ahead of the auction. Though the lot sold for a significantly higher dollar amount, when priced in denominations of the surging Ethereum cryptocurrency, the entire bundle sold for slightly less than the sale price of the last alien figure, which sold in March for 4,200 Eth (some $7.2M USD at the time).”

Final thoughts:

  • It’s interesting that amidst an Ethereum frenzy, the sentiment was one of slight disappointment in the NFT world after an auction that sold for 50% higher than predicted by the model we just looked at.
  • In case you’re thinking “Wouldn’t it make more sense to model sales in USD?”, you’re right! I ran the same model but with USD as the response variable, and though the coefficients were very similar, the R-squared was .963 (vs .928 using Ether). The predicted price for the Christie’s lot was 10.45M.
  • Why is this work important? Honestly, I don’t think it is, at least as far as predicting prices for artwork. Even if there were a “fair price”, it’s just spare money changing hands. If you really want to nail the modeling part of this, you’re either going to get lucky or be disappointed. There’s currently no way to model something so unpredictable.
  • Nevertheless, attempts like this are important in their own right, as a means of trying to understand things that are as meaningless as a CryptoPunk today, but may end up pertaining to more critical things tomorrow.