A Pythonic wrapper for the TRTH API based on Zeep.
Pytrthree attempts to provide an user-friendly interface for the notably hard to use Thomson Reuters Tick History API. Leveraging the wonderfull Zeep library, it provides a REST-like user experience, by 1) providing resonable defaults many parameters, and 2) taking care of the generation of custom XML objects.
brotchie made the original pytrth
library and Continuum Analytics fork
gave continuation to the project.
As of 2017, both projects are stale.
Pytrthree aims to be the third incarnation of a Python wrapper for TRTH,
and provides Python 3 support ONLY (because it is 2017).
It is assumed the user has some basic knowledge of the TRTH service and has a valid subscription. The official TRTH API User Guide can be found here (login required).
$ pip install git+https://github.com/plugaai/pytrthreeIn order to authenticate with the API, you need to make a YAML configuration file as the following:
credentials:
username: [email protected]
password: yourpassword
log: ~/path/to/logdir
ftp:
hostname: ftp.yourserver.com:21
user: ftpuser
password: yourpassword
path: /some/relative/pathfrom pytrthree import TRTH
api = TRTH(config='trth_config.yml')All TRTH API functions are accessible as TRTH object methods. CamelCase naming is changed in favor of more Pythonic snake_case naming. For example, the ExpandChain TRTH API function can used like the following:
>>> api.expand_chain('0#.N225', requestInGMT=True)
['.N225', '1332.T', '4061.T', '5711.T', ... ]In order to see the function signature call the signature method of the wrapped function:
>>> api.expand_chain.signature()
ExpandChain(instrument: Instrument, dateRange: DateRange, timeRange: TimeRange, requestInGMT: xsd:boolean) --> ArrayOfInstrumentIf using IPython, ? can be used instead. For further detailed usage of each API function,
please refer to the official TRTH documentation.
Pytrthree adds some extra functionality on top of Zeep in order to parse standard Python objects into XML that can be sent to the TRTH API.
In the TRTH API, there are two data types for instrument data requests,
RequestSpec and LargeRequestSpec.
The former is used for direct, single-RIC requests, while the later is used for FTP
requests. Both request type objects can be parsed from YAML files.
Here is a sample RequestSpec:
friendlyName: simple_request
requestType: TimeAndSales
instrument:
code: 7203.T
date: '2016-04-12'
timeRange:
start: 08:59
end: 09:05
messageTypeList:
messageType:
- name: Trade
fieldList:
string:
- Price
- Volume
dateFormat: YYYYMMDD
disableDataPersistence: true
includeCurrentRIC: false
requestInGMT: false
displayInGMT: true
disableHeader: false
applyCorrections: false
displayMicroseconds: trueYou can submit a RequestSpec request by passing a template file path to submit_request:
request_id = api.submit_request('templates/RequestSpec.yml')request_id contains the request ID:
>>> request_id
{'requestID': '[email protected]_request-N146877655'}Instead of using a template directly, users can also use the object generation factory
to programatically make a request object.
We recommend users start off one of the templates provided in the templates folder
and modify it according to their needs (for details see below).
For example, in order to change the instrument of the template above and
resend the request:
import yaml
request = api.factory.RequestSpec(**yaml.load(open('templates/RequestSpec.yml')))
request['instrument']['code'] = '9984.T'
req_id = api.submit_request(request)To retrieve your request result:
>>> api.get_request_result(**req_id)
#RIC Date[G] Time[G] GMT Offset Type Price Volume
0 9984.T 20160412 00:00:00.311790 9 Trade 5656 156300
1 9984.T 20160412 00:00:00.481720 9 Trade 5657 100
2 9984.T 20160412 00:00:02.143839 9 Trade 5657 100
3 9984.T 20160412 00:00:02.143839 9 Trade 5657 100
4 9984.T 20160412 00:00:02.162364 9 Trade 5660 200
5 9984.T 20160412 00:00:02.172187 9 Trade 5663 300
...The TRTH API SubmitRequest function is limited to a single day and single RIC requests.
Therefore, in request data for multiple RICs and a long period of time (i.e. all trades
of all stocks in the S&P500 over a period of 5 years), you must call SubmitFTPRequest using
a LargeRequestSpec.
You can use the request_sender.py CLI tool to send such requests.
For detailed usage see the help:
$ tools/request_sender.py --helpYou also need to prepare a YAML file to specify which RICs and fields you want to retrieve.
A sample can be found in tools/sample_criteria.yml:
TYO_eq:
ric:
Exchange: TYO
RICRegex: '^[0-9]{4}\.T$'
OSA_eqoptions:
ric:
Exchange: OSA
RICRegex: '^J\w*[0-9]\.OS$'
InstrumentType: 115
fields:
- Price
- Volume
- Implied Volatility$ tools/request_sender.py --config <CONFIG> --criteria <CRITERIA> --template <TEMPLATE> --start 2012-01-01The above will retrieve:
- Data from stocks listed in the Tokyo Stock Exchange with the fields specified in
<TEMPLATE> - Data from index options listed in the Osaka Stock Exchange with fields overridden by
<CRITERIA>
See the official TRTH documentation for field/message types information.
FTP requests can be retrieved by two methods:
- Setting up your own FTP server and having results being pushed (RECOMMENDED)
- Downloading from TRTH HTTP Pull
Since setting up you own FTP server is not always possible/straight forward,
Pytrthree comes with downloader.py, a basic tool to download files from HTTP
using asyncio. For detailed usage see the help:
$ tools/downloader.py --helpPytrthree includes a parser class to help convert downloaded CSV files into Pandas
DataFrames. It is basically a wrapper around pandas.read_csv.
from pytrthree import TRTHIterator
for df in TRTHIterator(files):
# further process DataFrame, insert into database, etcTo contribute, fork the repository on GitHub, make your changes and submit a pull request :) Pytrthree is not a mature project yet, so just simply raising issues is also greatly appreciated :)