Как я могу сохранить исторические цены акций (используя массив)?

Я использую финансовую библиотеку Yahoo, которую можно найти здесь: https://pypi.python.org/pypi/yahoo-finance/1.2.1

У меня есть текстовый файл с символами тикера. Я просматриваю символы тикера и печатаю исторические данные по ценам на акции.

Как я могу взять цены закрытия и сохранить их, чтобы потом использовать их (для расчета средних значений)?

вот мой код:

from yahoo_finance import Share

from pprint import pprint #for easy to view historical data

import calendar
import datetime 
import time





cal = calendar.TextCalendar(calendar.SUNDAY)
#cal.prmonth(today)

#using datetime below:

today = datetime.date.today() #todays date
todayH = str(today) # because in .get_historical I need to use a string 

yesterday = (today.toordinal()-10) #yesterdays date mathamatically

dateYes =  datetime.date.fromordinal(yesterday) #yesterdays date in format we want
dateYesH = str(dateYes) # because in .get_historical I need to use a string 


print 'today:', today
print dateYesH
print 'ordinal:', today.toordinal()


rand = Share('yhoo')
# print rand.get_price() (works)
#pprint(rand.get_historical(dateYesH, todayH))


#reading text file
file1 = open('TickerF.txt', 'r')
words = file1.read().split(' ')
length = len(words)
#print words 
#print len(words)
#print file1.read()
file1.close()


c = 0

try :
    while c < length:
        for i in words:
            symbol = str(i)
            stock = Share(symbol)
            c= c+1
            print i
        #print c
            pprint(stock.get_historical(dateYesH, todayH))

except: 
    pass

мой вывод:

today: 2015-12-06
2015-11-26
ordinal: 735938
YHOO
[{'Adj_Close': '34.91',
  'Close': '34.91',
  'Date': '2015-12-04',
  'High': '35.200001',
  'Low': '34.18',
  'Open': '34.34',
  'Symbol': 'YHOO',
  'Volume': '15502700'},
 {'Adj_Close': '34.34',
  'Close': '34.34',
  'Date': '2015-12-03',
  'High': '35.720001',
  'Low': '34.099998',
  'Open': '35.59',
  'Symbol': 'YHOO',
  'Volume': '17068000'},
 {'Adj_Close': '35.650002',
  'Close': '35.650002',
  'Date': '2015-12-02',
  'High': '36.389999',
  'Low': '34.77',
  'Open': '35.00',
  'Symbol': 'YHOO',
  'Volume': '56614000'},
 {'Adj_Close': '33.709999',
  'Close': '33.709999',
  'Date': '2015-12-01',
  'High': '33.889999',
  'Low': '33.470001',
  'Open': '33.869999',
  'Symbol': 'YHOO',
  'Volume': '10862500'},
 {'Adj_Close': '33.810001',
  'Close': '33.810001',
  'Date': '2015-11-30',
  'High': '33.830002',
  'Low': '32.849998',
  'Open': '33.029999',
  'Symbol': 'YHOO',
  'Volume': '17363600'},
 {'Adj_Close': '32.939999',
  'Close': '32.939999',
  'Date': '2015-11-27',
  'High': '33.09',
  'Low': '32.439999',
  'Open': '32.790001',
  'Symbol': 'YHOO',
  'Volume': '5313400'}]

Как я могу сохранить значения 'close' во время прохождения массива? У меня есть идея создать еще один массив, в котором будут храниться значения "close", но как мне сделать так, чтобы массив сохранял только значения close, а не какие-либо другие значения?

2 ответа

Решение

Я написал пример, который хранит все цены закрытия (на дату) в массиве. Выходными данными являются цены закрытия GOOG за первые ~7 месяцев года:

from yahoo_finance import Share    


stock = Share('GOOG')    
start_date = '2015-01-01'    
end_date = '2015-06-30'    

closes = [c['Close'] for c in stock.get_historical(start_date, end_date)]    

for c in closes:    
    print c

Выход:

520.51001
521.52002
531.690002
535.22998
537.840027
540.47998
538.190002
536.690002
536.72998
529.26001
528.150024
527.200012
532.330017
534.609985
536.690002
526.690002
526.830017
533.330017
536.700012
540.309998
539.179993
533.98999
532.109985
539.780029
539.789978
532.320007
540.109985
542.51001
539.27002
537.359985
532.299988
533.849976
538.400024
529.619995
529.039978
535.700012
538.219971
530.700012
524.219971
530.799988
540.780029
537.900024
537.340027
549.080017
553.679993
555.369995
565.062561
547.002472
539.367458
533.972413
535.382408
524.052386
533.802391
532.532429
530.392405
539.172404
540.012477
540.782472
541.612446
537.022465
536.767432
535.532478
542.562439
548.002468
552.032502
548.342512
555.172522
558.787478
570.192597
558.81251
560.362537
557.992512
559.502513
550.842532
554.512509
547.322503
555.512505
551.182515
555.012538
568.852557
567.687558
575.332609
573.372583
573.64261
571.342601
558.402572
555.482516
543.872489
536.092424
531.912381
538.952441
542.872432
539.702422
542.842504
549.012501
542.932472
535.972405
536.942412
527.832406
531.002415
527.582391
522.762349
529.2424
528.482381
534.522445
510.662331
510.002318
518.63237
535.212448
539.952437
534.39245
518.042312
506.902294
508.082288
501.792271
500.872267
496.182251
492.552209
496.172274
502.682255
501.102268
501.962262
513.872306
524.812404

У вас есть много вариантов. Наиболее распространенным было бы взять этот список словарей и сохранить его как (и это в порядке моего предпочтения для различных форматов хранения) как pickle, json, csv или raw_text.

Я хотел бы дать вам несколько советов и направить вас к пандам. Это облегчит вашу жизнь, потому что она особенно хорошо справляется с анализом данных, а также с чтением и записью в файл. Вы можете получить большую часть преимуществ от использования панд, просто преобразовав этот список словарей в DataFrame, но pandas также предоставляет некоторые из тех же частей синтаксического анализа, которые предоставляет yahoo_finance. Например:

from pandas.io import data
df = data.get_data_yahoo('YHOO')

даст вам те же даты / Закрыть / Настроить Закрыть / Открыть / Высокий / Низкий / Громкость начиная с 2010 года. Если вы хотите сохранить / загрузить данные на диск, вы можете просто сделать

df.to_pickle('/tmp/yhoo.pkl')
df = pd.read_pickle('/tmp/yhoo.pkl')

Это также облегчит анализ данных. Например, если вы просто хотите среднюю цену закрытия

>>> print df.Close.mean()
25.470388733914213
Другие вопросы по тегам