A Python wrapper for Schwab API
Project description
py-schwab-wrapper
py-schwab-wrapper
is a Python wrapper for Schwab's API, designed to handle authentication, token management, and data retrieval from Schwab's market data services. The initial version provides functionality to get price history for a symbol, with OAuth2-based authentication flow.
Features
- OAuth2 authentication and token refresh.
- Fetch historical price data for a symbol.
- Extensible for other Schwab API functionalities.
Installation
You can install the py-schwab-wrapper
package via pip
:
pip install py-schwab-wrapper
Usage
Initial Setup
- Obtain OAuth Credentials: You need to get your
client_id
andclient_secret
from Schwab's developer portal. - Set Environment Variables: You can store these credentials in a
.env
file in your project root.
Example .env
file:
SCHWAB_CLIENT_ID=<your_client_id>
SCHWAB_CLIENT_SECRET=<your_client_secret>
- Authenticate and Generate
token.json
: The first time you use the API, you need to authenticate using Schwab’s OAuth2 flow to generate atoken.json
file. You can use the includedauthenticate.py
to handle this process.
OAuth2 Authentication Flow
Before making API requests, you need to authenticate via Schwab's OAuth2 flow and store the access/refresh tokens in a token.json
file. Here's how you can do it using the included authenticate.py
script:
- Run
authenticate.py
to start the OAuth2 flow:python authenticate.py
- Follow the instructions in the browser to authorize the application and obtain the tokens.
A note on authentication
Be mindful if you configure your application's callback URL to be secure https://127.0.0.1:5000/callback
, you'll need to set up HTTPS for your local Flask server. Here's how you can achieve this:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
Follow the prompts to provide the necessary information. This will create key.pem (private key) and cert.pem (certificate) files. And be sure to include them in your .gitignore file!
Additional .gitignore recommendations
# ...your boilerplate .gitignore file for python...
# Ignore .pem files
cert.pem
key.pem
.pem
# Ignore token.json file if you decide to do local storage of the token
token.json
Example API Usage
Once authenticated, you can use the wrapper to fetch price history data a version of this implementation is also available in examples/test_api.py:
from py_schwab_wrapper import SchwabAPI
from datetime import datetime, timedelta
# Initialize the API wrapper with your credentials
schwab_api = SchwabAPI(client_id="<your_client_id>", client_secret="<your_client_secret>")
# Define the time range
now = datetime.now()
start_of_day = now.replace(hour=9, minute=30, second=0, microsecond=0)
end_of_day = now.replace(hour=16, minute=0, second=0, microsecond=0)
startDate = int(start_of_day.timestamp() * 1000)
endDate = int(end_of_day.timestamp() * 1000)
# Fetch price history
price_history = schwab_api.get_price_history(
symbol='QQQ',
periodType='day',
period=1,
frequencyType='minute',
frequency=5,
needExtendedHoursData=False,
needPreviousClose=True,
startDate=startDate,
endDate=endDate
)
print(price_history)
Contributing
Feel free to contribute by submitting issues or pull requests on the GitHub repository.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgements
This project was developed with assistance from ChatGPT by OpenAI. Also special thanks to rderik for the motivation to pursue this project.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file py_schwab_wrapper-0.1.1.tar.gz
.
File metadata
- Download URL: py_schwab_wrapper-0.1.1.tar.gz
- Upload date:
- Size: 6.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 81d9484caa1507ed08909f67d9b70ea5233286419f3b0aad22456eeb2a8fbcd3 |
|
MD5 | 777ab3c307aa21ddc2a970d91debbe32 |
|
BLAKE2b-256 | cf79a9fb2bd25321ad639364335c8883e92ffbc5835844f37754941aaec47480 |
File details
Details for the file py_schwab_wrapper-0.1.1-py3-none-any.whl
.
File metadata
- Download URL: py_schwab_wrapper-0.1.1-py3-none-any.whl
- Upload date:
- Size: 6.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3cfff4be5289bdb1f229b6e5692f62f5ab97f01517868a0387082b6653a0033e |
|
MD5 | bcb90c398446a2d564f3e06396fd1c15 |
|
BLAKE2b-256 | 24fd25118df9bd868e7c7a3b57e968bec36b5e236e971d1cfcb3c678bb6571aa |