Skip to content

Commit 4e626c2

Browse files
committed
Add shares outstanding and free float information
1 parent e22dc74 commit 4e626c2

9 files changed

Lines changed: 46 additions & 1 deletion

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ You can either specify numbers or names (lower or upper case) - not all bits are
8888
|EX_DIV_DATE|72|Yes|Yes| |yyyy-mm-dd|
8989
|PAYOUT_RATIO|73|Yes|No|||
9090
|EXPIRY_DATE|74|Yes (on options)|No| |yyyy-mm-dd|
91+
|SHARES_OUT|75|Yes|Yes| ||
92+
|FREE_FLOAT|76|Yes|Yes| ||
9193
|CLOSE|90|No|No|Yes||
9294
|ADJ_CLOSE|91|No|No|Yes||
9395
|SECTOR|98|Yes|Yes|||

examples.ods

350 Bytes
Binary file not shown.

src/baseclient.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ def get_ticker(self):
195195
tick[Datacode.EXCHANGE] = None
196196
tick[Datacode.EXPIRY_DATE] = None
197197
tick[Datacode.EX_DIV_DATE] = None
198+
tick[Datacode.FREE_FLOAT] = None
198199
tick[Datacode.HIGH] = None
199200
tick[Datacode.HIGH_52_WEEK] = None
200201
tick[Datacode.INDUSTRY] = None
@@ -210,6 +211,7 @@ def get_ticker(self):
210211
tick[Datacode.PE_RATIO] = None
211212
tick[Datacode.PREV_CLOSE] = None
212213
tick[Datacode.SECTOR] = None
214+
tick[Datacode.SHARES_OUT] = None
213215
tick[Datacode.TICKER] = None
214216
tick[Datacode.TIMEZONE] = None
215217
tick[Datacode.VOLUME] = None
@@ -320,6 +322,12 @@ def _return_value(self, data: dict, datacode: int):
320322
else:
321323
return data[Datacode.EXPIRY_DATE]
322324

325+
elif datacode == Datacode.FREE_FLOAT.value and Datacode.FREE_FLOAT in data:
326+
return data[Datacode.FREE_FLOAT]
327+
328+
elif datacode == Datacode.SHARES_OUT.value and Datacode.SHARES_OUT in data:
329+
return data[Datacode.SHARES_OUT]
330+
323331
elif datacode == Datacode.CLOSE.value and Datacode.CLOSE in data:
324332
return data[Datacode.CLOSE]
325333

src/datacode.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ class Datacode(Enum):
4444
EX_DIV_DATE = 72
4545
PAYOUT_RATIO = 73
4646
EXPIRY_DATE = 74
47+
SHARES_OUT = 75
48+
FREE_FLOAT = 76
4749

4850
CLOSE = 90
4951
ADJ_CLOSE = 91

src/financials_ft.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,18 @@ def getRealtime(self, ticker: str, datacode: int):
241241
tick[Datacode.AVG_DAILY_VOL_3MONTH] = self.save_wrapper(
242242
lambda: handle_abbreviations(html.unescape(match.group(1))))
243243

244+
r = r'<th>\s*Shares outstanding\s*</th><td>\s*([0-9,\.btnmk]+)\s*</td>'
245+
match = re.compile(r, flags=re.DOTALL).search(text, start)
246+
if match:
247+
tick[Datacode.SHARES_OUT] = self.save_wrapper(
248+
lambda: handle_abbreviations(html.unescape(match.group(1))))
249+
250+
r = r'<th>\s*Free float\s*</th><td>\s*([0-9,\.btnmk]+)\s*</td>'
251+
match = re.compile(r, flags=re.DOTALL).search(text, start)
252+
if match:
253+
tick[Datacode.FREE_FLOAT] = self.save_wrapper(
254+
lambda: handle_abbreviations(html.unescape(match.group(1))))
255+
244256
r = r'<th>\s*P/E.*?</th><td>\s*([0-9,\.\-]+)\s*<'
245257
match = re.compile(r, flags=re.DOTALL).search(text, start)
246258
if match:

src/financials_yahoo.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ def getRealtime(self, ticker, datacode):
176176
price = results['price']
177177
quoteType = results['quoteType']
178178
summaryDetail = results['summaryDetail']
179+
defaultKeyStatistics = results['defaultKeyStatistics'] if 'defaultKeyStatistics' in results else dict()
179180

180181
if not price:
181182
return 'Could not find price for \'{}\''.format(ticker)
@@ -203,6 +204,8 @@ def getRealtime(self, ticker, datacode):
203204
tick[Datacode.DIV_YIELD] = float(raw(summaryDetail, 'dividendYield'))
204205
tick[Datacode.EX_DIV_DATE] = self.save_wrapper(
205206
lambda: dateutil.parser.parse(str(fmt(summaryDetail, 'exDividendDate')), yearfirst=True, dayfirst=False).date())
207+
tick[Datacode.SHARES_OUT] = float(raw(defaultKeyStatistics, 'sharesOutstanding'))
208+
tick[Datacode.FREE_FLOAT] = float(raw(defaultKeyStatistics, 'floatShares'))
206209

207210
tick[Datacode.PAYOUT_RATIO] = float(raw(summaryDetail, 'payoutRatio'))
208211
tick[Datacode.LOW_52_WEEK] = float(raw(summaryDetail, 'fiftyTwoWeekLow'))

src/generate_metainfo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
cur_dir = os.getcwd()
1515

1616
addin_id = "com.financials.getinfo"
17-
addin_version = "3.0.4"
17+
addin_version = "3.0.5"
1818
addin_displayname = "Financial Market Extension"
1919
addin_publisher_link = "https://github.com/cmallwitz/Financials-Extension"
2020
addin_publisher_name = "The Publisher"

src/test_ft.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ def test_US_equity(self):
7070
s = financials.getRealtime('IBM:NYQ', 'EPS', 'FT')
7171
self.assertEqual(float, type(s), 'test_US_equity EPS {}'.format(s))
7272

73+
s = financials.getRealtime('IBM:NYQ', 'SHARES_OUT', 'FT')
74+
self.assertEqual(float, type(s), 'test_US_equity SHARES_OUT {}'.format(s))
75+
76+
s = financials.getRealtime('IBM:NYQ', 'FREE_FLOAT', 'FT')
77+
self.assertEqual(float, type(s), 'test_US_equity FREE_FLOAT {}'.format(s))
78+
7379
s = financials.getRealtime('IBM:NYQ', 'PE_RATIO', 'FT')
7480
self.assertEqual(float, type(s), 'test_US_equity PE_RATIO {}'.format(s))
7581

@@ -217,6 +223,12 @@ def test_DE_equity(self):
217223
s = financials.getRealtime('SAPX:GER', 'EPS', 'FT')
218224
self.assertEqual(float, type(s), 'test_DE_equity EPS {}'.format(s))
219225

226+
s = financials.getRealtime('SAPX:GER', 'SHARES_OUT', 'FT')
227+
self.assertEqual(float, type(s), 'test_DE_equity SHARES_OUT {}'.format(s))
228+
229+
s = financials.getRealtime('SAPX:GER', 'FREE_FLOAT', 'FT')
230+
self.assertEqual(float, type(s), 'test_DE_equity FREE_FLOAT {}'.format(s))
231+
220232
s = financials.getRealtime('SAPX:GER', 'PE_RATIO', 'FT')
221233
self.assertEqual(float, type(s), 'test_DE_equity PE_RATIO {}'.format(s))
222234

src/test_yahoo.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ def test_realtime_US_equity(self):
106106
s = financials.getRealtime('IBM', Datacode.PAYOUT_RATIO.value, 'YAHOO')
107107
self.assertTrue(testutils.is_positive_float(s), 'test_realtime_US_equity PAYOUT_RATIO {}'.format(s))
108108

109+
s = financials.getRealtime('IBM', Datacode.SHARES_OUT.value, 'YAHOO')
110+
self.assertTrue(testutils.is_positive_float(s), 'test_realtime_US_equity SHARES_OUT {}'.format(s))
111+
112+
s = financials.getRealtime('IBM', Datacode.FREE_FLOAT.value, 'YAHOO')
113+
self.assertTrue(testutils.is_positive_float(s), 'test_realtime_US_equity FREE_FLOAT {}'.format(s))
114+
109115
s = financials.getRealtime('IBM', Datacode.EXCHANGE.value, 'YAHOO')
110116
self.assertEqual(s, 'NYQ', 'test_realtime_US_equity EXCHANGE')
111117

0 commit comments

Comments
 (0)