import pandas as pd import numpy as np import datetime as date today = date.datetime.now().strftime('%Y-%m-%d') #Internal Modules from checkonchain.btconchain.btc_add_metrics import * # Plotly Libraries (+ force browser charts) import plotly.graph_objects as go from plotly.subplots import make_subplots import plotly.io as pio pio.renderers.default = "browser" BTC = btc_add_metrics().btc_oscillators() asset = BTC blk_max = int(asset['blk'][asset.index[-1]]) # Create Input Dataset for TOP PLOT x_data_1 = [ asset['blk'],asset['blk'],asset['blk'], asset['blk'],asset['blk'],asset['blk'], asset['blk'],asset['blk'],asset['blk'], asset['blk'] ] y_data_1 = [ asset['PriceUSD'],asset['PriceRealised'],asset['PriceAvg'], asset['PriceDelta'],asset['PriceTop'],asset['PriceInflow'],
import datetime as date today = date.datetime.now().strftime('%Y-%m-%d') from plotly.subplots import make_subplots import plotly.graph_objects as go import plotly.io as pio pio.renderers.default = "browser" from checkonchain.general.coinmetrics_api import * from checkonchain.btconchain.btc_add_metrics import * from checkonchain.dcronchain.dcr_add_metrics import * from checkonchain.general.regression_analysis import * #Pull Coinmetrics Data for Coins BTC = btc_add_metrics().btc_coin() LTC = Coinmetrics_api('ltc', "2011-10-07", today).convert_to_pd() BCH = Coinmetrics_api('bch', "2017-08-01", today).convert_to_pd() DAS = Coinmetrics_api('dash', "2014-01-19", today).convert_to_pd() DCR = dcr_add_metrics().dcr_coin() XMR = Coinmetrics_api('xmr', "2014-04-18", today).convert_to_pd() ZEC = Coinmetrics_api('zec', "2016-10-28", today).convert_to_pd() ETH = Coinmetrics_api('eth', "2015-07-30", today).convert_to_pd() XRP = Coinmetrics_api('xrp', "2013-01-01", today).convert_to_pd() #Reduce dataset down to date and a single metric metric = "CapMrktCurUSD" BTC2 = BTC[['date', metric]] LTC2 = LTC[['date', metric]] BCH2 = BCH[['date', metric]] DAS2 = DAS[['date', metric]]
# Plotly Libraries (+ force browser charts) import plotly.graph_objects as go from plotly.subplots import make_subplots import plotly.io as pio pio.renderers.default = "browser" from checkonchain.btconchain.btc_add_metrics import * #Set Constants blk_max = 210000 * 6 #max block height to calculate up to dustlim = 172 #sats sats = 1e8 #sats per BTC #Pull Coinmetrics data BTC_coin = btc_add_metrics().btc_coin() BTC_coin = BTC_coin.loc[:, [ 'date', 'blk', 'PriceUSD', 'PriceRealised', 'SplyCur', 'BlkCnt', 'BlkSizeByte', 'BlkSizeMeanByte ', 'FeeMeanNtv', 'FeeMeanUSD', 'FeeMedNtv', 'FeeMedUSD', 'FeeTotNtv', 'FeeTotUSD', 'TxCnt', 'TxTfr' ]] #Calculate Actual Fee performance BTC_coin['DustPrice'] = dustlim / sats * BTC_coin['PriceUSD'] BTC_coin['FeeSatsMean'] = BTC_coin['FeeMeanUSD'] / BTC_coin['PriceUSD'] BTC_coin['FeeSatsMed'] = BTC_coin['FeeMedUSD'] / BTC_coin['PriceUSD'] BTC_coin['TxCntSizeByte'] = BTC_coin['BlkSizeByte'] / BTC_coin['TxCnt'] BTC_coin['TxTfrSizeByte'] = BTC_coin['BlkSizeByte'] / BTC_coin['TxTfr'] BTC_coin['DustSizeByte'] = dustlim BTC_coin['DustSizeByte'] = dustlim BTC_coin['FeeTxCnt'] = BTC_coin['TxCntSizeByte'] / sats * BTC_coin['PriceUSD']
import numpy as np import os os.getcwd() os.chdir('D:\code_development\checkonchain\checkonchain') from checkonchain.dcronchain.charts.__init__ import * from checkonchain.btconchain.btc_add_metrics import * from checkonchain.dcronchain.dcr_add_metrics import * from checkonchain.ltconchain.ltc_add_metrics import * """************************************************************************** Part 0 - Code Setup ***************************************************************************""" """############## PULL DATSETS ##############""" """##### Bitcoin #####""" print('CALCULATING BITCOIN DATAFRAMES') BTC_sply = btc_add_metrics().btc_sply_curtailed( 2400000) #Theoretical Supply curve BTC_real = btc_add_metrics().btc_real() #Actual Performance BTC_half = btc_supply_schedule(0).btc_halvings_stepped( ) # Calculate Max-Min step to plot up Bitcoin halvings # Blockchain.com hashrate w/ coinmetrics block (UPDATE 5 Oct 2019) # Note need to add coinmetrics block manually BTC_hash = btc_add_metrics().btc_hash() #Actual Performance #BTC_hash = pd.read_csv(r"btconchain\data\btc_blockchaincom_hashrate.csv") #BTC_hash #BTC_hash = pd.concat([BTC_hash.set_index('blk',drop=False),BTC_real[['blk','date']].set_index('blk',drop=True)],axis=1,join='inner') #BTC_hash = BTC_hash.drop(BTC_hash.index[0]) #BTC_hash.reset_index(drop=True) """##### Decred #####""" print('CALCULATING DECRED DATAFRAMES') DCR_sply = dcr_add_metrics().dcr_sply(2400000 * 2 - 33600 * 2) #Theoretical Supply curve
import numpy as np import math from checkonchain.btconchain.btc_add_metrics import * from checkonchain.dcronchain.dcr_add_metrics import * from checkonchain.ltconchain.ltc_add_metrics import * from checkonchain.general.regression_analysis import * #Plotly Libraries from plotly.subplots import make_subplots import plotly.graph_objects as go import plotly.io as pio pio.renderers.default = "browser" BTC_sply = btc_add_metrics().btc_sply(1200000) #Theoretical Supply curve BTC_real = btc_add_metrics().btc_pricing_models() #Actual Performance BTC_half = btc_supply_schedule(0).btc_halvings_stepped() DCR_sply = dcr_add_metrics().dcr_sply(1200000*2-33600*2) #Theoretical Supply curve DCR_real = dcr_add_metrics().dcr_pricing_models() #Actual Market Performance DCR_natv = dcr_add_metrics().dcr_natv() #Actual On-chain Performance dcr_btc_blk_start = int(BTC_sply[BTC_sply['Sply_ideal']==1680000]['blk']) DCR_sply['btc_blk'] = dcr_btc_blk_start + 0.5*DCR_sply['blk'] DCR_real['btc_blk'] = dcr_btc_blk_start + 0.5*DCR_real['blk'] LTC_sply = ltc_add_metrics().ltc_sply(1200000*2) #Theoretical Supply curve LTC_real = ltc_add_metrics().ltc_real() #Actual Performance import os
#Calculate the dust limit and estimate future value from checkonchain.btconchain.btc_add_metrics import * from checkonchain.general.standard_charts import * from checkonchain.general.regression_analysis import * #Set Constants blk_max = 210000 * 6 #max block height to calculate up to dustlim_min = 172 #bytes dustlim_avg = 222 #bytes (based on actual performance) max_fee = 0.01 #Assume 1% of transaction cost is max viable fee sats = 1e8 #sats per BTC #Pull Coinmetrics data BTC_coin = btc_add_metrics().btc_coin() blk_cur = BTC_coin['blk'].max() #Current block BTC_coin = BTC_coin.loc[:, [ 'date', 'blk', 'CapMrktCurUSD', 'PriceUSD', 'PriceRealised', 'SplyCur', 'BlkCnt', 'BlkSizeByte', 'BlkSizeMeanByte', 'FeeMeanNtv', 'FeeMeanUSD', 'FeeMedNtv', 'FeeMedUSD', 'FeeTotNtv', 'FeeTotUSD', 'TxCnt', 'TxTfrCnt' ]] #Add in segwit_adoption from blockchair csv BTC_segwit = pd.read_csv( r'D:\code_development\checkonchain\checkonchain\btconchain\data\blockchair\segwit_adption.csv' ) BTC_segwit.columns = ['date', 'segwit'] BTC_segwit['date'] = pd.to_datetime(BTC_segwit['date'], utc=True) BTC_coin = pd.merge(BTC_coin, BTC_segwit, on='date', how='left') #BTC_coin['segwit'].fillna(0,inplace=True) #USD cost of a dust transaction
2. Cummulative sum --> assuming marginal reward = marginal cost PoW = Cummulative Sum (100% for BTC and 60% for DCR) PoS = Cummulative Sum (30% for DCR) 3. For Decred, there is a balance between PoS and PoW as described in Stafford (2019) Assume an attacker portion of ticket stake owned P_y = (1%, 5%, 30%, 50% and 95%) Probability of honest tickets having 3/5 votes sig_y = 1 - P_y Proportion of Hashrate attacker needs x_y = (1 / P_y) - 1 4. Decred cost to attack = P_y(PoS) + x_y(PoW) """ #Compile Input Dataframes BTC_subs = btc_add_metrics().btc_subsidy_models() DCR_subs = dcr_add_metrics().dcr_ticket_models() BTC_fee = btc_add_metrics().btc_coin() #Calculate Unforgeable Costliness (cummulative Sum) BTC_subs['Unforg_Cost'] = BTC_subs['PoW_income_usd'].cumsum() DCR_subs['PoW_Cost'] = DCR_subs['PoW_income_usd'].cumsum() DCR_subs['PoS_Cost'] = DCR_subs['PoS_income_usd'].cumsum() #Calculate Unforgeable Costliness (cummulative Sum) BTC_subs['Unforg_Cost_Daily'] = BTC_subs['PoW_income_usd'] DCR_subs['PoW_Cost_Daily'] = DCR_subs['PoW_income_usd'] DCR_subs['PoS_Cost_Daily'] = DCR_subs['PoS_income_usd'] #Calculate Range of Decred Security Conditions for y in range(5, 105, 5): #Assume range of Attacker ticket stake ownership
df['tic_pool'] = DCR_real['tic_pool'] df['tic_price'] = DCR_real['tic_price'] df = dcr_security_calculate_df().calculate_df(asset, atk_blk, df) if count == 0: response = df df = pd.DataFrame( columns=['blk', 'y', 'H_net', 'price', 'tic_price', 'tic_pool']) else: response = response.append(df, ignore_index=True) df = pd.DataFrame( columns=['blk', 'y', 'H_net', 'price', 'tic_price', 'tic_pool']) count += 1 DCR_secure = response """BITCOIN""" #Extract Real Data BTC_real = btc_add_metrics().btc_real() asset = 'btc' df['blk'] = BTC_real['blk'] df['y'] = 0.0 df['H_net'] = BTC_real['pow_hashrate_THs'] df['price'] = BTC_real['PriceUSD'] df['tic_pool'] = 0 df['tic_price'] = 0 df = dcr_security_calculate_df().calculate_df(asset, atk_blk, df) #plt.plot('y','pow_prof',data=df) #plt.show() plt.plot('blk', 'pow_term', data=df) plt.plot('blk', 'pos_term', data=df)