Я недавно начал изучать Python, но это был сложный проект, который я уже начал в Excel. Я использовал разные руководства для кода, который использовал до сих пор, адаптированный к моим потребностям. Я использую '...

0
David A. 27 Дек 2020 в 03:35

1 ответ

Лучший ответ

По сути, проблема заключается в том, что, поскольку Ethereum (и все другие криптовалюты) были запущены позже, чем биткойн, в течение первых нескольких лет ежедневно существуют нулевые значения цены, которые невозможно обработать. Таким образом, вы должны брать только те значения, где они не равны нулю.

Однако в вашем коде есть много вещей, которые вы можете исключить, чтобы не повторяться без надобности. Вы попытались сделать это с помощью функции linreg, но затем переопределили ее для второй криптографии, в которой не должно быть необходимости.

Вот быстрое переписывание, которое касается как фундаментальной проблемы, так и, надеюсь, иллюстрирует то, что я имел в виду выше. Результатом является фрейм данных со статистикой, которую вы ищете, по криптовалюте. Цель состоит в том, чтобы написать как можно больше кода «в общем», а затем просто предоставить список интересующих вас криптовалют.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas_datareader import data as pdr
import datetime
import yfinance as yf
import statsmodels.api as sm
from statsmodels import regression

yf.pdr_override()

cryptos = ["BTC", "ETH", "XRP"]  # Here you can specify the cryptos you want. I just used 3 for demonstration
                                 # The rest of the code is not specific to any one crypto

def get_and_process_data(c):
    raw_data = pdr.get_data_yahoo(c + '-USD', start="2015-01-01", end="2020-01-01")
    return raw_data.Close.pct_change()[1:]

df = pd.DataFrame({c: get_and_process_data(c) for c in cryptos})


df['avg_return'] = df.mean(axis=1) # avg market return
print(df)

def model(x, y):
    # Calculate r-squared
    X = sm.add_constant(x) # artificially add intercept to x, as advised in the docs
    model = sm.OLS(y,X).fit()
    rsquared = model.rsquared
    
    # Fit linear regression and calculate alpha and beta
    X = sm.add_constant(x)
    model = regression.linear_model.OLS(y,X).fit()
    alpha = model.params[0]
    beta = model.params[1]

    return rsquared, alpha, beta


results = pd.DataFrame({c: model(df[df[c].notnull()]['avg_return'], df[df[c].notnull()][c]) for c in cryptos}).transpose()
results.columns = ['rsquared', 'alpha', 'beta']
print(results)
0
SimonR 27 Дек 2020 в 21:57