2015-03-31 5 views
0

Я довольно новичок в использовании Python, и я работаю над скриптом анализа акций. Идея состоит в том, что сценарий в конечном итоге примет символ запаса, а сценарий рассчитает коэффициент Шарпа, коэффициент Treynor и другую финансовую информацию. Прямо сейчас у меня возникают проблемы с тем, чтобы Pandas работал правильно. Я не могу получить доступ только к столбцу из DataFrame, чтобы рассчитать доходность акций.Pandas и расчеты финансов

from pandas.io.data import DataReader 
from datetime import date, timedelta 



def calc_yield(now, old): 
    return (now-old)/old 


def yield_array(cl): 
    array = [] 
    count = 0 
    for i in cl: 
     old = cl[count] 
     count += 1 
     new = cl[count] 
     array.append(calc_yield(new, old)) 
    return array 


market = '^GSPC' 
ticker = "AAPL" 
days = 10 

# set start and end dates 
edate = date.today() - timedelta(days=1) 
sdate = edate - timedelta(days=days) 

# Read the stock price data from Yahoo 
data = DataReader(ticker, 'yahoo', start=sdate, end=edate) 

close = data['Adj Close'] 


print yield_array(close) 

Ошибка:

/Users/Tim/anaconda/bin/python "/Users/Tim/PycharmProjects/Test2/module tests.py" 
Traceback (most recent call last): 
    File "/Users/Tim/PycharmProjects/Test2/module tests.py", line 35, in <module> 
    print yield_array(close) 
    File "/Users/Tim/PycharmProjects/Test2/module tests.py", line 16, in yield_array 
    new = cl[count] 
    File "/Users/Tim/anaconda/lib/python2.7/site-packages/pandas/core/series.py", line 484, in __getitem__ 
    result = self.index.get_value(self, key) 
    File "/Users/Tim/anaconda/lib/python2.7/site-packages/pandas/tseries/index.py", line 1243, in get_value 
    return _maybe_box(self, Index.get_value(self, series, key), series, key) 
    File "/Users/Tim/anaconda/lib/python2.7/site-packages/pandas/core/index.py", line 1202, in get_value 
    return tslib.get_value_box(s, key) 
    File "tslib.pyx", line 540, in pandas.tslib.get_value_box (pandas/tslib.c:11833) 
    File "tslib.pyx", line 555, in pandas.tslib.get_value_box (pandas/tslib.c:11680) 
IndexError: index out of bounds 

Process finished with exit code 1 
+0

Что проблема у вас возникли? Какой результат вы получаете и как это отличается от ожидаемого? – TheBlackCat

+0

Я получаю IndexError: индекс за пределами. Я надеюсь, цикл for остановится после итерации по всем строкам в пределах 'close' – MrProducer

+0

На какой строке? Можете ли вы предоставить сообщение об ошибке? Измените исходный вопрос и поместите там сообщение об ошибке. – TheBlackCat

ответ

0

Я думаю, что я вижу вашу проблему. Учитывая эту функцию:

def yield_array(cl): 
    array = [] 
    count = 0 
    for i in cl: 
     old = cl[count] 
     count += 1 
     print count 
     new = cl[count] 
     array.append(calc_yield(new, old)) 
     print old 
     print new 
    return array 

Проблема заключается в том, что последний элемент cl, вы будете добавлять 1 к count, что приведет к индексу один больше, чем максимальный индекс cl. Это приводит к ошибке, поскольку она пытается получить доступ к индексу, который не существует. Вам нужно будет сделать что-то вроде for i in cl[:-1], которое пропустит последний элемент.

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

close = data['Adj Close'] 
yield_data = close.diff()/close.shift(1) 

или еще лучше, вы можете поместить результат обратно в DataFrame для последующего использования:

close = data['Adj Close'] 
data['Yield'] = close.diff()/close.shift(1) 
+0

ничего себе! ОК. Я вижу, что вы имеете в виду, итерации за пределами индекса. Позвольте мне провести некоторое исследование по векторам и посмотреть, что я могу понять. Я ценю помощь! – MrProducer

Смежные вопросы