Git Product home page Git Product logo

pyex's Introduction

๐Ÿšจ This library is no longer actively maintained ๐Ÿšจ

Python interface to IEX Cloud

Build Status Coverage License PyPI

Getting Started

Install

Install from pip

pip install pyEX

or from source

python setup.py install

Extensions

  • pyEX[async]: asyncio integration for streaming APIs
  • pyEX[studies]: Technical indicators and other calculations

Demos + Docs

Overview

pyEX supports the IEX Cloud api through 2 interfaces. The first is a simple function call, passing in the api version and token as arguments

In [1]: import pyEX as p

In [2]: p.chart?
Signature: p.chart(symbol, timeframe='1m', date=None, token='', version='', filter='')
Docstring:
Historical price/volume data, daily and intraday

https://iexcloud.io/docs/api/#historical-prices
Data Schedule
1d: -9:30-4pm ET Mon-Fri on regular market trading days
    -9:30-1pm ET on early close trading days
All others:
    -Prior trading day available after 4am ET Tue-Sat

Args:
    symbol (str); Ticker to request
    timeframe (str); Timeframe to request e.g. 1m
    date (datetime): date, if requesting intraday
    token (str); Access token
    version (str); API version
    filter (str); filters: https://iexcloud.io/docs/api/#filter-results

Returns:
    dict: result

For most calls, there is a convenience method that returns a dataframe as well:

In [5]: [_ for _ in dir(p) if _.endswith('DF')]
Out[5]:
['advancedStatsDF',
 'auctionDF',
 'balanceSheetDF',
 'batchDF',
 'bookDF',
 'bulkBatchDF',
 'bulkMinuteBarsDF',
 'calendarDF',
...

Since the token rarely changes, we have a Client object for convenience:

In [6]: p.Client?
Init signature: p.Client(api_token=None, version='v1', api_limit=5)
Docstring:
IEX Cloud Client

Client has access to all methods provided as standalone, but in an authenticated way

Args:
    api_token (str): api token (can pickup from IEX_TOKEN environment variable)
    version (str): api version to use (defaults to v1)
                      set version to 'sandbox' to run against the IEX sandbox
    api_limit (int): cache calls in this interval
File:           ~/Programs/projects/iex/pyEX/pyEX/client.py
Type:           type
Subclasses:

The client will automatically pick up the API key from the environment variable IEX_TOKEN, or it can be passed as an argument. To use the IEX Cloud test environment, simple set version='sandbox'.

In [8]: c = p.Client(version='sandbox')

In [9]: c.chartDF('AAPL').head()
Out[9]:
              open   close    high     low    volume   uOpen  uClose   uHigh    uLow   uVolume  change  changePercent   label  changeOverTime
date
2019-11-27  271.31  274.04  277.09  268.75  16994433  267.69  271.99  271.82  266.32  16811747    0.00         0.0000  Nov 27        0.000000
2019-11-29  271.30  272.19  280.00  279.20  12135259  270.90  275.02  270.00  267.10  11927464   -0.60        -0.2255  Nov 29       -0.002232
2019-12-02  279.96  265.23  276.41  267.93  23831255  279.97  266.80  281.32  269.29  24607845   -3.20        -1.1646   Dec 2       -0.013820
2019-12-03  261.54  271.05  259.96  262.09  30331487  259.87  271.34  269.02  260.71  30518449   -4.93        -1.8450   Dec 3       -0.032745
2019-12-04  272.81  273.56  271.26  267.06  17109161  267.30  262.82  274.99  270.83  17230517    2.39         0.8955   Dec 4       -0.023411

Improvements over native API, other libraries, etc

  • pyEX will transparently cache requests according to the refresh interval as defined on the IEX Cloud website (and in the docstrings), to avoid wasting credits. It can also cache to disk, or integrate with your own custom caching scheme.
  • pyEX fully implements the streaming APIs

Demo

Rules Engine

pyEX implements methods for interacting with the Rules Engine.

rule = {
        'conditions': [['changePercent','>',500],
                       ['latestPrice','>',100000]],
        'outputs': [{'frequency': 60,
                     'method': 'email',
                     'to': 'your_email@domain'
                    }]
        }

c.createRule(rule, 'MyTestRule', 'AAPL', 'all')  # returns {"id": <ruleID>, "weight": 2}

c.rules()  # list all rules
c.ruleInfo("<ruleID>")
c.ruleOutput("<ruleID>")
c.pauseRule("<ruleID>")
c.resumeRule("<ruleID>")
c.deleteRule("<ruleID>")

We also provide helper classes in python for constructing rules such that they abide by the rules schema (dictated in the schema() helper function)

Methods

Data

pyEX provides wrappers around both static and SSE streaming data. For most static data endpoints, we provide both JSON and DataFrame return functions. For market data endpoints, we provide async wrappers as well using aiohttp (to install the dependencies, pip install pyEX[async]).

DataFrame functions will have the suffix DF, and async functions will have the suffix Async.

SSE streaming data can either be used with callbacks:

newsSSE('AAPL', on_data=my_function_todo_on_data)

or via async generators (after installing pyEX[async]):

async for data in newsSSE('AAPL'):

Full API

Please see the readthedocs for a full API spec. Implemented methods are provided in CATALOG.md.

All methods share a common naming convention. If the API method is called technicals, there will be technicals and technicalsDF methods on the client. Additionally, most methods are provided in a scope, e.g. wti is available as client.wti and client.commodities.wti, analystDays from Wall Street Horizon is available as client.premium.analystDays, etc.

Development

See CONTRIBUTING.md for guidelines.

License

This software is licensed under the Apache 2.0 license. See the LICENSE and AUTHORS files for details.

pyex's People

Contributors

adamklaff avatar andrescevp avatar brandonhawi avatar christian-oudard avatar dependabot[bot] avatar timkpaine avatar westonplatter avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pyex's Issues

invalid socket.io namespace (/1.0//deep)

The auction WS is throwing the following error:

sock = pyEX.auctionWS(symbols='ZIEXT', on_data=on_data)
sock.run()
...

C:\ProgramData\Anaconda3\lib\site-packages\socketIO_client_nexus\__init__.py in _should_stop_waiting(self, for_namespace, for_callbacks)
    455             if getattr(namespace, '_invalid', False):
    456                 raise ConnectionError(
--> 457                     'invalid socket.io namespace (%s)' % namespace.path)
    458             if not getattr(namespace, '_connected', False):
    459                 self._debug(

ConnectionError: invalid socket.io namespace (/1.0//deep)

chart and chartDF won't ever return minute data for a date other than today

Hi,

Nice library! I was using it and found a bug (I think) when trying to get minute date for date earlier in the week.

For example, if today is 2018-11-28 but I want data from 11-26 and I call:

df = pyEX.chartDF(ticker, timeframe='1d', date='2018-11-26')

I will get back minute data for 11-28 instead of 11-26.

In chart, there's a check for "if timeframe" which will always pass since there's a default value for that parameter. I've changed that one line in the function to this (locally) and it works:

if timeframe is not None and timeframe != '1d':

The complete function is below:

def chart(symbol, timeframe='1m', date=None):
    '''
    https://iextrading.com/developer/docs/#chart
    https://iextrading.com/developer/docs/#time-series
    '''
    _raiseIfNotStr(symbol)
    if timeframe is not None and timeframe != '1d':
        if timeframe not in _TIMEFRAME_CHART:
            raise PyEXception('Range must be in %s' % str(_TIMEFRAME_CHART))
        return _getJson('stock/' + symbol + '/chart' + '/' + timeframe)
    if date:
        date = _strOrDate(date)
        return _getJson('stock/' + symbol + '/chart' + '/date/' + date)
    return _getJson('stock/' + symbol + '/chart')

How do you trade on IEX?

How do you trade on IEX? Where do you open and fund your account? Which endpoints do you use to open LIMIT/MARKET orders?

Add support for additional endpoints

In dev @ iex

auctionDF not found

======================================================================
ERROR: test_api.TestAPI.test_auctionDF

Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/nose/case.py", line 198, in runTest
self.test(*self.arg)
File "/home/developer/related-code/pyEX/tests/test_api.py", line 351, in test_auctionDF
from pyEX import auctionDF
ImportError: cannot import name 'auctionDF'


invalid socket.io namespace (/1.0/tops/last)

Hey - Thanks for putting all this together!

I had a few quick questions about your API:

  1. Connecting seems to take a long time, and it's flaky (I sometimes have to manually kill the script and restart). Have you noticed this behavior?

  2. I was able to get the "/1.0/tops" endpoint to work, but the "/1.0/tops/last" endpoint fails with this error: socketIO_client_nexus.exceptions.ConnectionError: invalid socket.io namespace (/1.0/tops/last)
    Were you able to find a word-around?

  3. How do i subscribe to the "firehose", i.e. full list of symbols?

Thanks again!

date axes not actually dates

Stock

  • bookDF
  • chartDF
  • companyDF
  • collectionsDF
  • cryptoDF
  • delayedQuoteDF
  • dividendsDF
  • earningsDF
  • earningsTodayDF
  • spreadDF
  • financialsDF
  • ipoTodayDF
  • ipoUpcomingDF
  • thresholdDF
  • shortInterestDF
  • marketShortInterestDF
  • stockStatsDF
  • largestTradesDF
  • listDF
  • newsDF
  • marketNewsDF
  • ohlcDF
  • marketOhlcDF
  • peersDF
  • yesterdayDF
  • marketYesterdayDF
  • priceDF
  • quoteDF
  • relevantDF
  • sectorPerformanceDF
  • splitsDF
  • volumeByVenueDF

Stats

  • statsDF
  • recentDF
  • recordsDF
  • summaryDF
  • dailyDF

Markets

  • marketsDF

Refdata

  • symbolsDF
  • corporateActionsDF
  • dividendsDF
  • nextDayExtDateDF
  • directoryDF

Marketdata

  • topsDF
  • lastDF
  • histDF
  • deepDF
  • bookDF
  • tradesDF
  • systemEventDF
  • tradingStatusDF
  • opHaltStatusDF
  • ssrStatusDF
  • securityEventDF
  • tradeBreakDF
  • auctionDF
  • officialPriceDF

Creating Dataframe returns error

import pyEX as iex
import pandas as pd
stock = 'aapl'
book = iex.book(stock)
pd.DataFrame(book)

Yields:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-13-0c3c0a75f518> in <module>()
      3 stock = 'aapl'
      4 book = iex.book(stock)
----> 5 pd.DataFrame(book)

~/anaconda/lib/python3.6/site-packages/pandas/core/frame.py in __init__(self, data, index, columns, dtype, copy)
    328                                  dtype=dtype, copy=copy)
    329         elif isinstance(data, dict):
--> 330             mgr = self._init_dict(data, index, columns, dtype=dtype)
    331         elif isinstance(data, ma.MaskedArray):
    332             import numpy.ma.mrecords as mrecords

~/anaconda/lib/python3.6/site-packages/pandas/core/frame.py in _init_dict(self, data, index, columns, dtype)
    459             arrays = [data[k] for k in keys]
    460 
--> 461         return _arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype)
    462 
    463     def _init_ndarray(self, values, index, columns, dtype=None, copy=False):

~/anaconda/lib/python3.6/site-packages/pandas/core/frame.py in _arrays_to_mgr(arrays, arr_names, index, columns, dtype)
   6161     # figure out the index, if necessary
   6162     if index is None:
-> 6163         index = extract_index(arrays)
   6164     else:
   6165         index = _ensure_index(index)

~/anaconda/lib/python3.6/site-packages/pandas/core/frame.py in extract_index(data)
   6212 
   6213             if have_dicts:
-> 6214                 raise ValueError('Mixing dicts with non-Series may lead to '
   6215                                  'ambiguous ordering.')
   6216 

ValueError: Mixing dicts with non-Series may lead to ambiguous ordering.

Hope this helps. :) Same error returns from iex.bookDF(stock)

Verify completeness

  • collections
  • crypto
  • earnings today
  • IPO Calendar
  • largest trades
  • sector performance
  • official price

Can't install via pip

  Failed building wheel for ujson
Command "c:\programdata\anaconda2\python.exe -u -c "import setuptools, tokenize;__file__='c:\\users\\xxx\\appdata\\local\\temp\\pip-install-59od11\\ujson\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record c:\users\xxx\appdata\local\temp\pip-record-oignye\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in c:\users\xxx\appdata\local\temp\pip-install-59od11\ujson\

any workaround for this?

WS example

hello,

Can you include a working WS example in the notebook? I'm not able to get the on_data callback to work as expected on updates to the TOPS feed.

pyEX.topsWS(symbols='SIRI', on_data=print)
<pyEX.common.WSClient at 0x97eb940>

Checking the DF method shows updates coming through.

IEX Cloud updates

  • add client
  • update existing methods to support token
  • call existing methods from client
  • add client tests

Handle Reconnection

Hi,

I'm using this get the TOPS Websocket feed. Does it handle reconnecting if it gets disconnected?

Running with logging at info level.

WARNING:socketIO-client:ws-api.iextrading.com:443/socket.io [connection error] recv disconnected (Connection is already closed.)
WARNING:socketIO-client:ws-api.iextrading.com:443/socket.io [connection error] recv disconnected ([Errno 11] Resource temporarily unavailable)

Thanks for the great work on this!

Not sure what this system does.

I'm looking to write an application that interfaces with IEX as well. Is this just a python wrapper around their API? How much of their API do you intend to support? Do you need help?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.