2017-02-08 4 views
-1

Ich habe ein kleines Problem mit Code unten abgeschnitten. Es funktioniert perfekt, aber es ist nicht von mir geschrieben und es gibt einen Teil, den ich nicht verstehe. In meinem Kopf würde ich rm & rstd von get_rolling_mean() und get_rolling_std() zurückgeben, aber das ist nicht wirklich hier passiert. Meine Fragen sind also: Ich weiß, dass es funktioniert, aber wie es funktioniert?Bollinger Bänder in Python. Wo/Wie rm und rstd werden in Code unten definiert?

Wo und wie rm und rstd in get_bollinger_bands(rm, rstd) Variablen erhalten ihre Werte aus?

"""Bollinger Bands.""" 

import os 
import pandas as pd 
import matplotlib.pyplot as plt 


def symbol_to_path(symbol, base_dir="data"): 
    """Return CSV file path given ticker symbol.""" 
    return os.path.join(base_dir, "{}.csv".format(str(symbol))) 


def get_data(symbols, dates): 
    """Read stock data (adjusted close) for given symbols from CSV files.""" 
    df = pd.DataFrame(index=dates) 
    if 'SPY' not in symbols: # add SPY for reference, if absent 
     symbols.insert(0, 'SPY') 

    for symbol in symbols: 
     df_temp = pd.read_csv(symbol_to_path(symbol), index_col='Date', 
           parse_dates=True, usecols=['Date', 'Adj Close'], na_values=['nan']) 
     df_temp = df_temp.rename(columns={'Adj Close': symbol}) 
     df = df.join(df_temp) 
     if symbol == 'SPY': # drop dates SPY did not trade 
      df = df.dropna(subset=["SPY"]) 

    return df 


def plot_data(df, title="Stock prices"): 
    """Plot stock prices with a custom title and meaningful axis labels.""" 
    ax = df.plot(title=title, fontsize=12) 
    ax.set_xlabel("Date") 
    ax.set_ylabel("Price") 
    plt.show() 


def get_rolling_mean(values, window): 
    """Return rolling mean of given values, using specified window size.""" 
    return pd.rolling_mean(values, window=window) 


def get_rolling_std(values, window): 
    """Return rolling standard deviation of given values, using specified window size.""" 
    return pd.rolling_std(values, window=window) 


def get_bollinger_bands(rm, rstd): 
    """Return upper and lower Bollinger Bands.""" 
    upper_band = rm + (rstd * 2) 
    lower_band = rm - (rstd * 2) 
    return upper_band, lower_band 


def test_run(): 
    # Read data 
    dates = pd.date_range('2012-01-01', '2012-12-31') 
    symbols = ['SPY'] 
    df = get_data(symbols, dates) 

    # Compute Bollinger Bands 
    # 1. Compute rolling mean 
    rm_SPY = get_rolling_mean(df['SPY'], window=20) 

    # 2. Compute rolling standard deviation 
    rstd_SPY = get_rolling_std(df['SPY'], window=20) 

    # 3. Compute upper and lower bands 
    upper_band, lower_band = get_bollinger_bands(rm_SPY, rstd_SPY) 

    # Plot raw SPY values, rolling mean and Bollinger Bands 
    ax = df['SPY'].plot(title="Bollinger Bands", label='SPY') 
    rm_SPY.plot(label='Rolling mean', ax=ax) 
    upper_band.plot(label='upper band', ax=ax) 
    lower_band.plot(label='lower band', ax=ax) 

    # Add axis labels and legend 
    ax.set_xlabel("Date") 
    ax.set_ylabel("Price") 
    ax.legend(loc='upper left') 
    plt.show() 


if __name__ == "__main__": 
    test_run() 

Antwort

2

Die Get rollinger Bands Funktion erhält seine Variablen vom Benutzer:

get_bollinger_bands(rm, rstd): 
     upper_band = rm + (rstd * 2) 
     lower_band = rm - (rstd * 2) 
     return upper_band, lower_band 

Die einzigen verwendeten Variablen sind die, die zwischen den Klammern nach dem Funktionsnamen. Dies bedeutet, dass sie vom Benutzer imputtiert werden sollen.

def get_rolling_mean(values, window): 
    return pd.rolling_mean(values, window=window) 
def get_rolling_std(values, window): 
    return pd.rolling_std(values, window=window) 

fuctions mittlere ins Rollen und Std verwenden beide zwei Inputs: die Werte (auch bekannt als x = 1,2,3 und y = 2,3,4) und das Fenster (die Menge von Beobachtungen in der mitgelieferten Roll Mittel)

weitere Informationen empfehle ich die Dokumentation: http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.rolling_mean.html

und wikipedia (mittlere rollen und gleitenden Durchschnitt sind die gleiche Sache): https://en.wikipedia.org/wiki/Moving_average