Как я могу использовать переменную класса в Python в качестве аргумента по умолчанию для метода? - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь использовать переменную класса Stock.today в качестве аргумента по умолчанию для метода buy_and_hold, однако мой код не работает. Переменная класса today возвращает сегодняшнюю дату в виде строки. Если я введу ту же самую строку (например, «2020-6-18») вручную в качестве аргумента по умолчанию, код будет работать. Как я могу запустить код, используя Stock.today?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import time
from datetime import datetime
import yfinance as yf


class Stock:

    year = time.strftime('%Y')
    month = time.strftime('%m').replace("0","")
    day = time.strftime('%d').replace("0","")
    today = Stock.year + '-' + Stock.month + '-' + Stock.day

    def __init__(self,ticker):

        self.ticker = ticker

    # frequency as string # start and end are strings "Y-M-D" # Benchmark as string
    def buy_and_hold(self,frequency,start,end=Stock.today,yfbenchticker='^SPX'):

        sdate_list =[]
        for date in start.split("-"):
            sdate_list.append(int(date))
        sdate = datetime(year=sdate_list[0],month=sdate_list[1],day=sdate_list[2])

        edate_list = []
        for date in end.split("-"):
            edate_list.append(int(date))
        edate = datetime(year=edate_list[0],month=edate_list[1],day=edate_list[2])

        stock = yf.Ticker(self.ticker).history(interval=frequency,start=sdate,end=edate)
        stock.drop(['Dividends','Stock Splits'],axis=1, inplace=True)

        bench = yf.Ticker(yfbenchticker).history(interval=frequency,start=sdate,end=edate)
        bench.drop(['Dividends','Stock Splits'],axis=1, inplace=True)

        # Interpolate missing values
        if stock.isnull().values.any() == True:
            stock['Close'].fillna(value=stock['Close'].mean())

        if bench.isnull().values.any() == True:
            bench['Close'].fillna(value=stock['Close'].mean())

        # Calculate cumulative returns
        stock['Cumulative return'] = stock['Close'] / stock['Close'].iloc[0]
        bench['Cumulative return'] = bench['Close'] / bench['Close'].iloc[0]


        # Plot cumulative returns
        stock['Cumulative return'].plot(color='#00008b',figsize=(16,8))
        plt.plot(bench['Cumulative return'], color='#cd2b00')
        plt.xlabel('Date')
        plt.ylabel('Multiplier')
        plt.legend((self.ticker,yfbenchticker),loc=0,prop={'size':10})

        plt.show()

        return bench


amd = Stock("AMD")

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Один из способов обойти это - использовать значение по умолчанию None, а затем назначить значение, которое вы действительно хотите, в теле функции:

def buy_and_hold(self,frequency,start,end=None,yfbenchticker='^SPX'):
    if end is None:
        end = Stock.today

Однако, как прокомментировал Марк Рэнсом, вы должны просто иметь возможность используйте end=today.

0 голосов
/ 18 июня 2020

Использовать self вместо Stock И поместить инициализацию в конструктор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...