mirror of
				https://github.com/bspeice/metrik
				synced 2025-11-04 02:10:43 -05:00 
			
		
		
		
	Add code to get the options chain for a stock
This commit is contained in:
		@ -5,12 +5,11 @@ from datetime import timedelta
 | 
				
			|||||||
from dateutil.parser import parse
 | 
					from dateutil.parser import parse
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from metrik.tasks.base import MongoCreateTask, MongoRateLimit
 | 
					from metrik.tasks.base import MongoCreateTask, MongoRateLimit, MongoNoBackCreateTask
 | 
				
			||||||
from metrik.conf import get_config
 | 
					from metrik.conf import get_config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TradekingApi(object):
 | 
					class TradekingApi(object):
 | 
				
			||||||
 | 
					 | 
				
			||||||
    format_json = '.json'
 | 
					    format_json = '.json'
 | 
				
			||||||
    format_xml = '.xml'
 | 
					    format_xml = '.xml'
 | 
				
			||||||
    root_url = 'https://api.tradeking.com/v1/'
 | 
					    root_url = 'https://api.tradeking.com/v1/'
 | 
				
			||||||
@ -85,3 +84,31 @@ class Tradeking1mTimesales(MongoCreateTask):
 | 
				
			|||||||
            logging.error('Unable to acquire lock for Tradeking ticker {}'
 | 
					            logging.error('Unable to acquire lock for Tradeking ticker {}'
 | 
				
			||||||
                          .format(symbol))
 | 
					                          .format(symbol))
 | 
				
			||||||
            return {}
 | 
					            return {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TradekingOptionsQuotes(MongoNoBackCreateTask):
 | 
				
			||||||
 | 
					    symbol = Parameter()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_collection_name(self):
 | 
				
			||||||
 | 
					        return 'tradeking_options'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def retrieve_chain_syms(api, symbol):
 | 
				
			||||||
 | 
					        results = api.api_request('market/options/search', {
 | 
				
			||||||
 | 
					            'symbol': symbol,
 | 
				
			||||||
 | 
					            'query': 'unique:strikeprice'
 | 
				
			||||||
 | 
					        }).json()['response']['quotes']['quote']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return [r['symbol'] for r in results]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def retrieve_data(symbol):
 | 
				
			||||||
 | 
					        tradeking = TradekingApi()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # We request a first rate limit lock to get the options chain
 | 
				
			||||||
 | 
					        ratelimit = MongoRateLimit()
 | 
				
			||||||
 | 
					        chain_acquire = ratelimit.acquire_lock(
 | 
				
			||||||
 | 
					            service='tradeking',
 | 
				
			||||||
 | 
					            limit=60,
 | 
				
			||||||
 | 
					            interval=timedelta(minutes=1)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
				
			|||||||
@ -6,7 +6,7 @@ import pytest
 | 
				
			|||||||
from six.moves import map
 | 
					from six.moves import map
 | 
				
			||||||
from pytz import utc
 | 
					from pytz import utc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from metrik.tasks.tradeking import Tradeking1mTimesales
 | 
					from metrik.tasks.tradeking import Tradeking1mTimesales, TradekingOptionsQuotes, TradekingApi
 | 
				
			||||||
from metrik.trading_days import TradingDay
 | 
					from metrik.trading_days import TradingDay
 | 
				
			||||||
from metrik.targets.mongo import MongoTarget
 | 
					from metrik.targets.mongo import MongoTarget
 | 
				
			||||||
from test.mongo_test import MongoTest
 | 
					from test.mongo_test import MongoTest
 | 
				
			||||||
@ -40,6 +40,15 @@ def test_returns_verifiable(ticker):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    assert_allclose(tradeking_ohlc, yahoo_ohlc, rtol=1e-3)
 | 
					    assert_allclose(tradeking_ohlc, yahoo_ohlc, rtol=1e-3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@pytest.mark.parametrize('ticker', [
 | 
				
			||||||
 | 
					    'AAPL', 'GOOG', 'SPY', 'REGN', 'SWHC', 'BAC', 'NVCR', 'ARGT'
 | 
				
			||||||
 | 
					])
 | 
				
			||||||
 | 
					def test_chain_returns(ticker):
 | 
				
			||||||
 | 
					    api = TradekingApi()
 | 
				
			||||||
 | 
					    chain = TradekingOptionsQuotes.retrieve_chain_syms(api, ticker)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert len(chain) > 20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TradekingTest(MongoTest):
 | 
					class TradekingTest(MongoTest):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_record_is_saveable(self):
 | 
					    def test_record_is_saveable(self):
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user