-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathquant.py
More file actions
205 lines (140 loc) · 10.9 KB
/
quant.py
File metadata and controls
205 lines (140 loc) · 10.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# The code in this file does the quantitative analysis part of HedgeHog's stock
# choices. This code uses the AlphaVantage API, which is free. To use it, go to the
# AlphaVantage website (https://www.alphavantage.co) and claim an API key. Once done,
# create a file named 'apikeys.py' and store your API key as a string in a variable
# called 'alphavantage_api_key'. The file is in the .gitignore
import json
import requests
from apikeys import alphavantage_api_key
def print_json(data : dict):
"""Prints JSON data in a more presentable way. Mainly used for Debugging."""
print(json.dumps(data, indent=4))
def alphavantage_api_request(ticker : str, function : str, av_api_key : str):
"""Auxiliary function that allows for easier AlphaVantage API calls"""
req_rep = requests.get(f"https://www.alphavantage.co/query?function={function}&symbol={ticker}&apikey={av_api_key}")
check_api_limit_reached(req_rep)
return req_rep
def check_api_limit_reached(param : dict) :
"""Checks if the AlphaVantage API call limit is reached when the API is called"""
if param == {'Information': 'Thank you for using Alpha Vantage! Our standard API rate limit is 25 requests per day. Please subscribe to any of the premium plans at https://www.alphavantage.co/premium/ to instantly remove all daily rate limits.'} :
raise ConnectionRefusedError("ALPHA VANTAGE API REQUEST LIMIT REACHED. TRY AGAIN LATER, SUBSCRIBE TO PREMIUM OR CHANGE THE API KEY IN apikeys.py")
def get_income_statement(ticker : str, av_api_key : str):
"""Retrieves the financial statement of a ticker. ticker has to be of type
string. Function requires an AlphaVantage API key as an argument."""
api_req_response = alphavantage_api_request(ticker, 'INCOME_STATEMENT', av_api_key)
check_api_limit_reached(api_req_response)
parsed_json = api_req_response.json()
return parsed_json
def get_balance_sheet(ticker : str, av_api_key : str):
"""Retrieves the balance sheet of a ticker. ticker has to be of type string.
Function requires an AlphaVantage API key as an argument"""
api_req_response = alphavantage_api_request(ticker, 'BALANCE_SHEET', av_api_key)
check_api_limit_reached(api_req_response)
parsed_json = api_req_response.json()
return parsed_json
def get_cash_flow(ticker : str, av_api_key : str):
"""Retrieves the cash flow of a ticker. ticker has to be of type string.
Function requires an AlphaVantage API key as an argument"""
api_req_response = alphavantage_api_request(ticker, 'CASH_FLOW', av_api_key)
check_api_limit_reached(api_req_response)
parsed_json = api_req_response.json()
return parsed_json
def get_earnings(ticker : str, av_api_key : str):
"""Retrieves the cash earnings of a ticker. ticker has to be of type string.
Function requires an AlphaVantage API key as an argument"""
api_req_response = alphavantage_api_request(ticker, 'EARNINGS', av_api_key)
check_api_limit_reached(api_req_response)
parsed_json = api_req_response.json()
return parsed_json
def liabilities_to_equity(balance_sheet : dict):
"""Calculates the Libailities-to-Equity ratio of a company whose balance sheet is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(balance_sheet)
if balance_sheet["annualReports"][1]["totalLiabilities"] == "None" or balance_sheet["annualReports"][1]["totalShareholderEquity"] == "None" or balance_sheet["annualReports"][1]["totalShareholderEquity"] == "0":
return False
return (int(balance_sheet["annualReports"][1]["totalLiabilities"]) / int(balance_sheet["annualReports"][1]["totalShareholderEquity"]))
def liabilities_to_capital(balance_sheet : dict):
"""Calculates the Liabilities-to-Capital ratio of a company whose balance sheet is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(balance_sheet)
if balance_sheet["annualReports"][1]["totalLiabilities"] == "None" or balance_sheet["annualReports"][1]["totalShareholderEquity"] == "None" or int(balance_sheet["annualReports"][1]["totalLiabilities"]) + int(balance_sheet["annualReports"][1]["totalShareholderEquity"]) == "0":
return False
return (int(balance_sheet["annualReports"][1]["totalLiabilities"]) / (int(balance_sheet["annualReports"][1]["totalLiabilities"]) + int(balance_sheet["annualReports"][1]["totalShareholderEquity"])))
def assets_to_equity(balance_sheet : dict):
"""Calculates the Total Assets-to-Equity ratio of a company whose balance sheet is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(balance_sheet)
if balance_sheet["annualReports"][1]["totalAssets"] == "None" or balance_sheet["annualReports"][1]["totalShareholderEquity"] == "None" or balance_sheet["annualReports"][1]["totalShareholderEquity"] == "0":
return False
return (int(balance_sheet["annualReports"][1]["totalAssets"]) / int(balance_sheet["annualReports"][1]["totalShareholderEquity"]))
def debt_to_ebitda(balance_sheet : dict, income_statement : dict):
"""Calculates the Total Debt-to-EBITDA ratio of a company whose balance sheet is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(balance_sheet)
check_api_limit_reached(income_statement)
if balance_sheet["annualReports"][1]["totalLiabilities"] == "None" or income_statement["annualReports"][1]["ebitda"] == "None" or income_statement["annualReports"][1]["ebitda"] == "0":
return False
return (int(balance_sheet["annualReports"][1]["totalLiabilities"]) / int(income_statement["annualReports"][1]["ebitda"]))
def quick_ratio(balance_sheet : dict):
"""Calculates the quick ratio of a company whose balance sheet is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(balance_sheet)
cash_plus_ce = balance_sheet["annualReports"][1]["cashAndCashEquivalentsAtCarryingValue"]
ms = balance_sheet["annualReports"][1]["totalCurrentAssets"]
nar = balance_sheet["annualReports"][1]["currentNetReceivables"]
current_liabilities = balance_sheet["annualReports"][1]["totalCurrentLiabilities"]
if cash_plus_ce == "None" or ms == "None" or nar == "None" or current_liabilities == "None" or current_liabilities == "0":
return False
return ((int(cash_plus_ce) + int(ms) + int(nar))/(int(current_liabilities)))
def current_ratio(balance_sheet : dict):
"""Calculates the current ratio of a company whose balance sheet is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(balance_sheet)
if balance_sheet["annualReports"][1]["totalCurrentAssets"] == "None" or balance_sheet["annualReports"][1]["totalCurrentLiabilities"] == "None" or balance_sheet["annualReports"][1]["totalCurrentLiabilities"] == "0":
return False
return (int(balance_sheet["annualReports"][1]["totalCurrentAssets"]) / int(balance_sheet["annualReports"][1]["totalCurrentLiabilities"]))
def ten_yr_operating_expenses_growth(income_statement : dict):
"""Calculates the 10yr op. expenses growth of a company whose income statement is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(income_statement)
if len(income_statement["annualReports"]) < 11 :
return False
if income_statement["annualReports"][1]["operatingExpenses"] == "None" or income_statement["annualReports"][10]["operatingExpenses"] == "None" or income_statement["annualReports"][10]["operatingExpenses"] == "0":
return False
return ((int(income_statement["annualReports"][1]["operatingExpenses"]) - int(income_statement["annualReports"][10]["operatingExpenses"]))/(int(income_statement["annualReports"][10]["operatingExpenses"]))) * 100
def ten_yr_assets_growth(balance_sheet : dict):
"""Calculates the 10yr assets growth of a company whose balance sheet is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(balance_sheet)
if len(balance_sheet["annualReports"]) < 11 :
return False
if balance_sheet["annualReports"][1]["totalAssets"] == "None" or balance_sheet["annualReports"][10]["totalAssets"] == "None" or balance_sheet["annualReports"][10]["totalAssets"] == "0" :
return False
return ((int(balance_sheet["annualReports"][1]["totalAssets"]) - int(balance_sheet["annualReports"][10]["totalAssets"]))/(int(balance_sheet["annualReports"][10]["totalAssets"]))) * 100
def ten_yr_liabilities_growth(balance_sheet : dict):
"""Calculates the 10yr liabilities growth of a company whose balance sheet is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(balance_sheet)
if len(balance_sheet["annualReports"]) < 11 :
return False
if balance_sheet["annualReports"][1]["totalLiabilities"] == "None" or balance_sheet["annualReports"][10]["totalLiabilities"] == "None" or balance_sheet["annualReports"][10]["totalLiabilities"] == "0":
return False
return ((int(balance_sheet["annualReports"][1]["totalLiabilities"]) - int(balance_sheet["annualReports"][10]["totalLiabilities"]))/(int(balance_sheet["annualReports"][10]["totalLiabilities"]))) * 100
def ten_yr_cash_flow_growth(cash_flow_report : dict):
"""Calculates the 10yr liabilities growth of a company whose cash flow report is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(cash_flow_report)
if len(cash_flow_report["annualReports"]) < 11 :
return False
if cash_flow_report["annualReports"][1]["operatingCashflow"] == "None" or cash_flow_report["annualReports"][10]["operatingCashflow"] == "None" or cash_flow_report["annualReports"][10]["operatingCashflow"] == "0":
return False
return ((int(cash_flow_report["annualReports"][1]["operatingCashflow"]) - int(cash_flow_report["annualReports"][10]["operatingCashflow"]))/(int(cash_flow_report["annualReports"][10]["operatingCashflow"]))) * 100
def ten_yr_share_count_growth(balance_sheet : dict):
"""Calculates the 10yr share count growth of a company whose balance sheet is
passed as a dictionary-type argument. Returns False if it fails to calculate"""
check_api_limit_reached(balance_sheet)
if len(balance_sheet["annualReports"]) < 11 :
return False
if balance_sheet["annualReports"][1]["commonStock"] == "None" or balance_sheet["annualReports"][10]["commonStock"] == "None" or balance_sheet["annualReports"][10]["commonStock"] == "0":
return False
return ((int(balance_sheet["annualReports"][1]["commonStock"]) - int(balance_sheet["annualReports"][10]["commonStock"]))/(int(balance_sheet["annualReports"][10]["commonStock"]))) * 100