2016-06-20 21 views
0

Ich versuche, monatliche Bestandsdaten von Yahoo zu verwenden, um Muster zu analysieren. Aus irgendeinem Grund stimmen die monatlichen Renditen, die das Programm in einem Datenrahmen für eine bestimmte Aktie (ATVI) ausgibt, nicht mit den Renditen der tatsächlichen Yahoo-Site überein. Ich habe die monatlichen Renditen für den Zeitraum 2015 verglichen und Spalten für die durchschnittlichen Zu- und Abnahmen sowie die Anzahl der Vorkommen der einzelnen Perioden angegeben.Python - Pandas Dataframe - Daten stimmen nicht überein

Yahoo Link: https://finance.yahoo.com/q/hp?s=ATVI&a=00&b=1&c=2015&d=11&e=31&f=2015&g=m

Mein Code:

from datetime import datetime 
from pandas_datareader import data, wb 
import pandas_datareader.data as web 
import pandas as pd 
from pandas_datareader._utils import RemoteDataError 
import csv 
import sys 
import os 
import time 

class MonthlyChange(object): 
    months = { 0:'JAN', 1:'FEB', 2:'MAR', 3:'APR', 4:'MAY',5:'JUN', 6:'JUL', 7:'AUG', 8:'SEP', 9:'OCT',10:'NOV', 11:'DEC' } 

def __init__(self,month): 
    self.month = MonthlyChange.months[month-1] 
    self.sum_of_pos_changes=0 
    self.sum_of_neg_changes=0 
    self.total_neg=0 
    self.total_pos=0 
def add_change(self,change): 
    if change < 0: 
     self.sum_of_neg_changes+=change 
     self.total_neg+=1 
    elif change > 0: 
     self.sum_of_pos_changes+=change 
     self.total_pos+=1 
def get_data(self): 
    if self.total_pos == 0: 
     return (self.month,0.0,0,self.sum_of_neg_changes/self.total_neg,self.total_neg) 
    elif self.total_neg == 0: 
     return (self.month,self.sum_of_pos_changes/self.total_pos,self.total_pos,0.0,0) 
    else: 
     return (self.month,self.sum_of_pos_changes/self.total_pos,self.total_pos,self.sum_of_neg_changes/self.total_neg,self.total_neg) 


for ticker in ['ATVI']: 

try: 

    data = web.DataReader(ticker.strip('\n'), "yahoo", datetime(2015,01,1), datetime(2015,12,31)) 
    data['ymd'] = data.index 
    year_month = data.index.to_period('M') 
    data['year_month'] = year_month 
    first_day_of_months = data.groupby(["year_month"])["ymd"].min() 
    first_day_of_months = first_day_of_months.to_frame().reset_index(level=0) 
    last_day_of_months = data.groupby(["year_month"])["ymd"].max() 
    last_day_of_months = last_day_of_months.to_frame().reset_index(level=0) 
    fday_open = data.merge(first_day_of_months,on=['ymd']) 
    fday_open = fday_open[['year_month_x','Open']] 
    lday_open = data.merge(last_day_of_months,on=['ymd']) 
    lday_open = lday_open[['year_month_x','Open']] 

    fday_lday = fday_open.merge(lday_open,on=['year_month_x']) 
    monthly_changes = {i:MonthlyChange(i) for i in range(1,13)} 
    for index,ym, openf,openl in fday_lday.itertuples(): 
     month = ym.strftime('%m') 
     month = int(month) 
     diff = (openf-openl)/openf 
     monthly_changes[month].add_change(diff) 

    changes_df = pd.DataFrame([monthly_changes[i].get_data() for i in monthly_changes],columns=["Month","Avg Inc.","Inc","Avg.Dec","Dec"]) 


    print ticker 
    print changes_df 

Antwort

0

Um die durchschnittliche tägliche Auf-/Ab-Preis bewegt zu bekommen, könnten Sie:

from pandas_datareader.data import DataReader 

data = DataReader('ATVI', "yahoo", datetime(2015, 1, 1), datetime(2015, 12, 31))[['Open', 'Close']] 
open = data.Close.resample('M').first() # get the open of the first day, assign date of last day of month 
close = data.Close.resample('M').last() # get the close of the last day, assign date of last day of month 
returns = close.subtract(open).div(open) # calculate returns 

zu erhalten:

Date 
2014-01-31 -0.052020 
2014-02-28 0.134232 
2014-03-31 0.047131 
2014-04-30 -0.032866 
2014-05-31 0.040561 
2014-06-30 0.081474 
2014-07-31 -0.007539 
2014-08-31 0.049020 
2014-09-30 -0.124263 
2014-10-31 -0.031083 
2014-11-30 0.066503 
2014-12-31 -0.042755 
2015-01-31 0.038251 
2015-02-28 0.103644 
2015-03-31 -0.022366 
2015-04-30 0.017387 
2015-05-31 0.095879 
2015-06-30 -0.046850 
2015-07-31 0.042863 
2015-08-31 0.121865 
2015-09-30 0.108758 
2015-10-31 0.124919 
2015-11-30 0.089384 
2015-12-31 0.003630 
Freq: M, Name: Close, dtype: float64 

den Mittelwert von Monaten zu erhalten, können Sie:

returns.groupby(returns.index.month).mean() 

zu erhalten:

1 -0.006884 
2  0.118938 
3  0.
4 -0.007739 
5  0.068220 
6  0.017312 
7  0.017662 
8  0.085442 
9 -0.007752 
10 0.046918 
11 0.077943 
12 -0.019563 
+0

Ich bin für die durchschnittliche Zunahme/durchschnittliche Abnahme Spalten in dem Datenrahmen suchen, um die Rückkehr passen ich bekommen würde aus Verwenden Sie die monatlichen Daten von der oben genannten Website. Return = (open-close)/open – RageAgainstheMachine

+0

Siehe Update mit durchschnittlicher Differenz in 'Open' /' Close'. – Stefan

+0

@ Stefan, danke für die Hilfe. Um ehrlich zu sein, ich habe keine Ahnung, wo ich meinen Code in meinen schreiben kann. Wäre es möglich, den von mir geposteten Code zu ändern? Außerdem suche ich die Rendite basierend auf dem Öffnen des ersten Tages des Monats und dem Schließen des letzten Tages des Monats (Entschuldigung, wenn das vorher nicht klar war) return = (Ende des letzten Tages -Open des ersten Tages)/Open des ersten Tages Dann nehmen Sie den Durchschnitt für jeden gleichen Monat -> Wenn der Zeitraum 2 Jahre ist dann (Juli 2014 + Juli 2015)/2 = Avg Return – RageAgainstheMachine