finmodeling 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -0
- data/Gemfile +2 -0
- data/README.md +289 -269
- data/Rakefile +12 -0
- data/TODO.txt +113 -20
- data/examples/{dump_report.rb → dump_latest_10k.rb} +1 -1
- data/examples/list_disclosures.rb +50 -0
- data/examples/lists/nasdaq-mid-to-mega-tech-symbols.txt +0 -0
- data/examples/show_report.rb +112 -32
- data/examples/show_reports.rb +162 -33
- data/finmodeling.gemspec +4 -1
- data/lib/finmodeling/annual_report_filing.rb +97 -18
- data/lib/finmodeling/array_with_stats.rb +0 -0
- data/lib/finmodeling/assets_calculation.rb +12 -3
- data/lib/finmodeling/assets_item.rb +0 -0
- data/lib/finmodeling/assets_item_vectors.rb +0 -0
- data/lib/finmodeling/balance_sheet_analyses.rb +19 -4
- data/lib/finmodeling/balance_sheet_calculation.rb +52 -37
- data/lib/finmodeling/calculation_summary.rb +119 -14
- data/lib/finmodeling/can_cache_classifications.rb +0 -0
- data/lib/finmodeling/can_cache_summaries.rb +0 -0
- data/lib/finmodeling/can_choose_successive_periods.rb +15 -0
- data/lib/finmodeling/can_classify_rows.rb +0 -0
- data/lib/finmodeling/capm.rb +80 -0
- data/lib/finmodeling/cash_change_calculation.rb +3 -3
- data/lib/finmodeling/cash_change_item.rb +0 -0
- data/lib/finmodeling/cash_change_item_vectors.rb +0 -0
- data/lib/finmodeling/cash_change_summary_from_differences.rb +36 -0
- data/lib/finmodeling/cash_flow_statement_analyses.rb +36 -0
- data/lib/finmodeling/cash_flow_statement_calculation.rb +28 -52
- data/lib/finmodeling/classifiers.rb +2 -0
- data/lib/finmodeling/company.rb +0 -0
- data/lib/finmodeling/company_filing.rb +30 -7
- data/lib/finmodeling/company_filing_calculation.rb +16 -6
- data/lib/finmodeling/company_filings.rb +112 -46
- data/lib/finmodeling/comprehensive_income_calculation.rb +60 -0
- data/lib/finmodeling/comprehensive_income_statement_calculation.rb +74 -0
- data/lib/finmodeling/comprehensive_income_statement_item.rb +20 -0
- data/lib/finmodeling/comprehensive_income_statement_item_vectors.rb +235 -0
- data/lib/finmodeling/config.rb +0 -0
- data/lib/finmodeling/debt_cost_of_capital.rb +14 -0
- data/lib/finmodeling/equity_change_calculation.rb +43 -0
- data/lib/finmodeling/equity_change_item.rb +25 -0
- data/lib/finmodeling/equity_change_item_vectors.rb +156 -0
- data/lib/finmodeling/factory.rb +0 -0
- data/lib/finmodeling/fama_french_cost_of_equity.rb +119 -0
- data/lib/finmodeling/float_helpers.rb +14 -8
- data/lib/finmodeling/forecasted_reformulated_balance_sheet.rb +55 -0
- data/lib/finmodeling/forecasted_reformulated_income_statement.rb +110 -0
- data/lib/finmodeling/forecasts.rb +4 -4
- data/lib/finmodeling/has_string_classifer.rb +0 -0
- data/lib/finmodeling/income_statement_analyses.rb +23 -17
- data/lib/finmodeling/income_statement_calculation.rb +46 -43
- data/lib/finmodeling/income_statement_item.rb +1 -1
- data/lib/finmodeling/income_statement_item_vectors.rb +24 -13
- data/lib/finmodeling/invalid_filing_error.rb +4 -0
- data/lib/finmodeling/liabs_and_equity_calculation.rb +18 -8
- data/lib/finmodeling/liabs_and_equity_item.rb +1 -1
- data/lib/finmodeling/liabs_and_equity_item_vectors.rb +24 -24
- data/lib/finmodeling/linear_trend_forecasting_policy.rb +23 -0
- data/lib/finmodeling/net_income_calculation.rb +23 -10
- data/lib/finmodeling/net_income_summary_from_differences.rb +51 -0
- data/lib/finmodeling/paths.rb +0 -0
- data/lib/finmodeling/period_array.rb +8 -4
- data/lib/finmodeling/quarterly_report_filing.rb +9 -4
- data/lib/finmodeling/rate.rb +8 -0
- data/lib/finmodeling/ratio.rb +0 -0
- data/lib/finmodeling/reformulated_balance_sheet.rb +47 -88
- data/lib/finmodeling/reformulated_cash_flow_statement.rb +18 -41
- data/lib/finmodeling/reformulated_income_statement.rb +44 -206
- data/lib/finmodeling/reformulated_shareholder_equity_statement.rb +50 -0
- data/lib/finmodeling/reoi_valuation.rb +104 -0
- data/lib/finmodeling/shareholder_equity_statement_calculation.rb +34 -0
- data/lib/finmodeling/string_helpers.rb +18 -1
- data/lib/finmodeling/time_series_estimator.rb +25 -0
- data/lib/finmodeling/trailing_avg_forecasting_policy.rb +23 -0
- data/lib/finmodeling/version.rb +1 -1
- data/lib/finmodeling/weighted_avg_cost_of_capital.rb +35 -0
- data/lib/finmodeling/yahoo_finance_helpers.rb +20 -0
- data/lib/finmodeling.rb +33 -2
- data/spec/annual_report_filing_spec.rb +81 -45
- data/spec/assets_calculation_spec.rb +7 -4
- data/spec/assets_item_spec.rb +9 -14
- data/spec/balance_sheet_analyses_spec.rb +13 -13
- data/spec/balance_sheet_calculation_spec.rb +45 -51
- data/spec/calculation_summary_spec.rb +113 -21
- data/spec/can_classify_rows_spec.rb +0 -0
- data/spec/cash_change_calculation_spec.rb +1 -10
- data/spec/cash_change_item_spec.rb +10 -18
- data/spec/cash_flow_statement_calculation_spec.rb +10 -24
- data/spec/company_beta_spec.rb +53 -0
- data/spec/company_filing_calculation_spec.rb +39 -49
- data/spec/company_filing_spec.rb +0 -0
- data/spec/company_filings_spec.rb +75 -25
- data/spec/company_spec.rb +37 -47
- data/spec/comprehensive_income_statement_calculation_spec.rb +54 -0
- data/spec/comprehensive_income_statement_item_spec.rb +56 -0
- data/spec/debt_cost_of_capital_spec.rb +19 -0
- data/spec/equity_change_calculation_spec.rb +33 -0
- data/spec/equity_change_item_spec.rb +58 -0
- data/spec/factory_spec.rb +2 -2
- data/spec/forecasts_spec.rb +2 -2
- data/spec/income_statement_analyses_spec.rb +23 -21
- data/spec/income_statement_calculation_spec.rb +17 -49
- data/spec/income_statement_item_spec.rb +17 -29
- data/spec/liabs_and_equity_calculation_spec.rb +6 -3
- data/spec/liabs_and_equity_item_spec.rb +14 -22
- data/spec/linear_trend_forecasting_policy_spec.rb +37 -0
- data/spec/matchers/custom_matchers.rb +79 -0
- data/spec/mocks/calculation.rb +0 -0
- data/spec/mocks/income_statement_analyses.rb +0 -0
- data/spec/mocks/sec_query.rb +0 -0
- data/spec/net_income_calculation_spec.rb +16 -10
- data/spec/period_array.rb +0 -0
- data/spec/quarterly_report_filing_spec.rb +21 -38
- data/spec/rate_spec.rb +0 -0
- data/spec/ratio_spec.rb +0 -0
- data/spec/reformulated_balance_sheet_spec.rb +56 -33
- data/spec/reformulated_cash_flow_statement_spec.rb +18 -10
- data/spec/reformulated_income_statement_spec.rb +16 -15
- data/spec/reformulated_shareholder_equity_statement_spec.rb +43 -0
- data/spec/reoi_valuation_spec.rb +146 -0
- data/spec/shareholder_equity_statement_calculation_spec.rb +59 -0
- data/spec/spec_helper.rb +4 -1
- data/spec/string_helpers_spec.rb +15 -13
- data/spec/time_series_estimator_spec.rb +61 -0
- data/spec/trailing_avg_forecasting_policy_spec.rb +37 -0
- data/spec/weighted_avg_cost_of_capital_spec.rb +32 -0
- data/tools/create_equity_change_training_vectors.rb +49 -0
- data/tools/time_specs.sh +7 -0
- metadata +182 -36
- data/lib/finmodeling/constant_forecasting_policy.rb +0 -23
- data/lib/finmodeling/generic_forecasting_policy.rb +0 -19
- data/spec/constant_forecasting_policy_spec.rb +0 -37
- data/spec/generic_forecasting_policy_spec.rb +0 -33
@@ -0,0 +1,235 @@
|
|
1
|
+
module FinModeling
|
2
|
+
class ComprehensiveIncomeStatementItem < String
|
3
|
+
TRAINING_VECTORS = [
|
4
|
+
|
5
|
+
# Fake: made up to show an example of FIAT. Need to pull in more real examples..
|
6
|
+
{:klass=>:or, :item_string=>"Advertising Revenue"},
|
7
|
+
{:klass=>:cogs, :item_string=>"Advertising Revenue Cost"},
|
8
|
+
{:klass=>:oe, :item_string=>"General And Administrative Expense"},
|
9
|
+
{:klass=>:oe, :item_string=>"Other General And Administrative Expense"},
|
10
|
+
{:klass=>:oe, :item_string=>"Depreciation Amortization And Accretion Net"},
|
11
|
+
{:klass=>:fibt, :item_string=>"Gain Loss On Disposition Of Assets"},
|
12
|
+
{:klass=>:fibt, :item_string=>"Gains Losses On Extinguishment Of Debt"},
|
13
|
+
{:klass=>:fibt, :item_string=>"Investment Income Interest"},
|
14
|
+
{:klass=>:fibt, :item_string=>"Interest Expense"},
|
15
|
+
{:klass=>:tax, :item_string=>"Income Tax Expense Benefit"},
|
16
|
+
{:klass=>:fiat, :item_string=>"Dividends Preferred Stock"},
|
17
|
+
{:klass=>:ooci_nci, :item_string=>"Comprehensive Income Net Of Tax Attributable To Noncontrolling Interest"},
|
18
|
+
|
19
|
+
# ALTR
|
20
|
+
{:klass=>:or, :item_string=>"Sales Revenue Net"},
|
21
|
+
{:klass=>:cogs, :item_string=>"Cost Of Goods And Services Sold"},
|
22
|
+
{:klass=>:oe, :item_string=>"Research And Development Expense"},
|
23
|
+
{:klass=>:oe, :item_string=>"Selling General And Administrative Expense"},
|
24
|
+
{:klass=>:oe, :item_string=>"Loss Gain On Deferred Compensation Plan Securities"},
|
25
|
+
{:klass=>:fibt, :item_string=>"Investment Income Interest"},
|
26
|
+
{:klass=>:fibt, :item_string=>"Foreign Currency Cash Flow Hedge Gain Loss Reclassified To Earnings Net"},
|
27
|
+
{:klass=>:fibt, :item_string=>"Interest Expense"},
|
28
|
+
{:klass=>:oibt, :item_string=>"Deferred Compensation Arrangement With Individual Compensation Expense"},
|
29
|
+
{:klass=>:tax, :item_string=>"Income Tax Expense Benefit"},
|
30
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Unrealized Gain Loss On Derivatives Arising During Period Net Of Tax"},
|
31
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Reclassification Adjustment On Derivatives Included In Net Income Net Of Tax"},
|
32
|
+
|
33
|
+
# This comes from ALTR. It was getting misclassified as foci, so I'm retraining it a bunch of times.
|
34
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
35
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
36
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
37
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
38
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
39
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
40
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
41
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
42
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
43
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
44
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
45
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
46
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
47
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
48
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
49
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
50
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
51
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
52
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
53
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
54
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
55
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
56
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
57
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
58
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
59
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
60
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
61
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
62
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
63
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
64
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
65
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
66
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
67
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
68
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
69
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
70
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
71
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
72
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
73
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
74
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
75
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
76
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
77
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
78
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
79
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
80
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
81
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
82
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
83
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
84
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
85
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
86
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
87
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
88
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
89
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
90
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
91
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
92
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
93
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
94
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
95
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
96
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
97
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income (Loss), Net of Tax"},
|
98
|
+
|
99
|
+
# BMC
|
100
|
+
{:klass=>:or, :item_string=>"Licenses Revenue"},
|
101
|
+
{:klass=>:or, :item_string=>"Maintenance Revenue"},
|
102
|
+
{:klass=>:or, :item_string=>"Technology Services Revenue"},
|
103
|
+
{:klass=>:cogs, :item_string=>"License Costs"},
|
104
|
+
{:klass=>:cogs, :item_string=>"Maintenance Costs"},
|
105
|
+
{:klass=>:cogs, :item_string=>"Technology Services Costs"},
|
106
|
+
{:klass=>:oe, :item_string=>"Selling And Marketing Expense"},
|
107
|
+
{:klass=>:oe, :item_string=>"Research And Development Expense Software Excluding Acquired In Process Cost"},
|
108
|
+
{:klass=>:oe, :item_string=>"General And Administrative Expense"},
|
109
|
+
{:klass=>:oe, :item_string=>"Amortization Of Intangible Assets"},
|
110
|
+
{:klass=>:fibt, :item_string=>"Other Interest And Dividend Income"},
|
111
|
+
{:klass=>:fibt, :item_string=>"Interest Expense"},
|
112
|
+
{:klass=>:fibt, :item_string=>"Gain Loss On Investments"},
|
113
|
+
{:klass=>:tax, :item_string=>"Income Tax Expense Benefit"},
|
114
|
+
|
115
|
+
# CHRW
|
116
|
+
{:klass=>:or, :item_string=>"Transportation Services Revenue"},
|
117
|
+
{:klass=>:or, :item_string=>"Sales Revenue Goods Net"},
|
118
|
+
{:klass=>:or, :item_string=>"Sales Revenue Services Net"},
|
119
|
+
{:klass=>:cogs, :item_string=>"Cost Of Purchased Transportation And Related Services"},
|
120
|
+
{:klass=>:cogs, :item_string=>"Cost Of Goods Sold"},
|
121
|
+
{:klass=>:oe, :item_string=>"Labor And Related Expense"},
|
122
|
+
{:klass=>:oe, :item_string=>"Other Selling General And Administrative Expense"},
|
123
|
+
{:klass=>:fibt, :item_string=>"Total Nonoperating Interest And Other Income Expense"},
|
124
|
+
{:klass=>:tax, :item_string=>"Income Tax Expense Benefit"},
|
125
|
+
|
126
|
+
# SIRI
|
127
|
+
{:klass=>:or, :item_string=>"Other Sales Revenue Net"},
|
128
|
+
{:klass=>:or, :item_string=>"Equipment Revenue"},
|
129
|
+
{:klass=>:or, :item_string=>"Advertising Revenue"},
|
130
|
+
{:klass=>:or, :item_string=>"Subscription Revenue"},
|
131
|
+
{:klass=>:cogs, :item_string=>"Revenue Share And Royalties"},
|
132
|
+
{:klass=>:cogs, :item_string=>"Programming And Content"},
|
133
|
+
{:klass=>:cogs, :item_string=>"Customer Service And Billing"},
|
134
|
+
{:klass=>:cogs, :item_string=>"Satellite And Transmission"},
|
135
|
+
{:klass=>:cogs, :item_string=>"Cost Of Goods Sold"},
|
136
|
+
{:klass=>:oe, :item_string=>"Subscriber Acquisition Costs"},
|
137
|
+
{:klass=>:oe, :item_string=>"Selling And Marketing Expense"},
|
138
|
+
{:klass=>:oe, :item_string=>"Technology Services Costs"},
|
139
|
+
{:klass=>:oe, :item_string=>"General And Administrative Expense"},
|
140
|
+
{:klass=>:oe, :item_string=>"Depreciation And Amortization"},
|
141
|
+
{:klass=>:fibt, :item_string=>"Interest And Investment Income Loss"},
|
142
|
+
{:klass=>:fibt, :item_string=>"Interest Expense"},
|
143
|
+
{:klass=>:fibt, :item_string=>"Gains Losses On Extinguishment Of Debt"},
|
144
|
+
{:klass=>:fibt, :item_string=>"Other Nonoperating Income Expense"},
|
145
|
+
{:klass=>:tax, :item_string=>"Income Tax Expense Benefit"},
|
146
|
+
{:klass=>:unkoci, :item_string=>"Realized Loss On Investment Foreign Currency Translation Adjustment"},
|
147
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Foreign Currency Transaction And Translation Adjustment Net Of Tax"},
|
148
|
+
|
149
|
+
# VRSN
|
150
|
+
{:klass=>:or, :item_string=>"Revenues"},
|
151
|
+
{:klass=>:cogs, :item_string=>"Cost Of Revenue"},
|
152
|
+
{:klass=>:oe, :item_string=>"Selling And Marketing Expense"},
|
153
|
+
{:klass=>:oe, :item_string=>"Research And Development Expense"},
|
154
|
+
{:klass=>:oe, :item_string=>"General And Administrative Expense"},
|
155
|
+
{:klass=>:oibt, :item_string=>"Restructuring Settlement And Impairment Provisions"},
|
156
|
+
{:klass=>:fibt, :item_string=>"Interest Expense"},
|
157
|
+
{:klass=>:fibt, :item_string=>"Nonoperating Gains Losses"},
|
158
|
+
{:klass=>:tax, :item_string=>"Income Tax Expense Benefit"},
|
159
|
+
{:klass=>:ooiat, :item_string=>"Income Loss From Discontinued Operations Net Of Tax"},
|
160
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Foreign Currency Transaction And Translation Adjustment Net Of Tax"},
|
161
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Unrealized Holding Gain Loss On Securities Arising During Period Net Of Tax"},
|
162
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Loss Reclassification Adjustment For Sale Of Securities Included In Net Income Net Of Tax"},
|
163
|
+
|
164
|
+
# ATVI
|
165
|
+
{:klass=>:ni, :item_string=>"Net Income Loss"},
|
166
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Period Increase Decrease"},
|
167
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Unrealized Holding Gain Loss On Securities Arising During Period Net Of Tax"},
|
168
|
+
|
169
|
+
# CTXS
|
170
|
+
{:klass=>:ni, :item_string=>"Profit Loss"},
|
171
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Foreign Currency Transaction And Translation Adjustment Net Of Tax"},
|
172
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Unrealized Holding Gain Loss On Securities Arising During Period Net Of Tax"},
|
173
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Loss Reclassification Adjustment For Sale Of Securities Included In Net Income Net Of Tax"},
|
174
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Unrealized Gain Loss On Derivatives Arising During Period Net Of Tax"},
|
175
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Reclassification Adjustment On Derivatives Included In Net Income Net Of Tax"},
|
176
|
+
{:klass=>:ooci_nci, :item_string=>"Comprehensive Income Net Of Tax Attributable To Noncontrolling Interest"},
|
177
|
+
|
178
|
+
# EXPE
|
179
|
+
{:klass=>:ni, :item_string=>"Profit Loss"},
|
180
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Gain Loss Arising During Period Net Of Tax"},
|
181
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Loss Available For Sale Securities Adjustment Net Of Tax"},
|
182
|
+
{:klass=>:ooci_nci, :item_string=>"Comprehensive Income Net Of Tax Attributable To Noncontrolling Interest"},
|
183
|
+
|
184
|
+
# GILD
|
185
|
+
{:klass=>:ni, :item_string=>"Profit Loss"},
|
186
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Unrealized Holding Gain Loss On Securities Arising During Period Net Of Tax"},
|
187
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Loss Reclassification Adjustment For Sale Of Securities Included In Net Income Net Of Tax"},
|
188
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Unrealized Gain Loss On Derivatives Arising During Period Net Of Tax"},
|
189
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Reclassification Adjustment On Derivatives Included In Net Income Net Of Tax"},
|
190
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Foreign Currency Transaction And Translation Adjustment Net Of Tax"},
|
191
|
+
{:klass=>:ooci_nci, :item_string=>"Net Income Loss Attributable To Noncontrolling Interest"},
|
192
|
+
|
193
|
+
# GMCR
|
194
|
+
{:klass=>:ni, :item_string=>"Profit Loss"},
|
195
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Unrealized Gain Loss On Derivatives Arising During Period Net Of Tax"},
|
196
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Reclassification Adjustment On Derivatives Included In Net Income Net Of Tax"},
|
197
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Foreign Currency Transaction And Translation Adjustment Net Of Tax"},
|
198
|
+
|
199
|
+
# INTC
|
200
|
+
{:klass=>:ni, :item_string=>"Net Income Loss"},
|
201
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Loss Available For Sale Securities Adjustment Including Other Than Temporary Impairments Net Of Tax"},
|
202
|
+
{:klass=>:ooci, :item_string=>"Other Comprehensive Income Change In Deferred Tax Asset Valuation Allowance Net Of Tax Before Reclassification Adjustments"},
|
203
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Derivatives Qualifying As Hedges Net Of Tax"},
|
204
|
+
{:klass=>:ooci, :item_string=>"Other Comprehensive Income Change In Prior Service Cost Net Of Tax"},
|
205
|
+
{:klass=>:ooci, :item_string=>"Other Comprehensive Income Change In Actuarial Gain Loss Net Of Tax"},
|
206
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Gain Loss Arising During Period Net Of Tax"},
|
207
|
+
|
208
|
+
# ISRG
|
209
|
+
{:klass=>:ni, :item_string=>"Net Income Loss"},
|
210
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Foreign Currency Transaction And Translation Adjustment Net Of Tax"},
|
211
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Loss Available For Sale Securities Adjustment Before Reclassification Adjustments Net Of Tax"},
|
212
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Loss Reclassification Adjustment For Sale Of Securities Included In Net Income Net Of Tax"},
|
213
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Unrealized Gain Loss On Derivatives Arising During Period Net Of Tax"},
|
214
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Reclassification Adjustment On Derivatives Included In Net Income Net Of Tax"},
|
215
|
+
|
216
|
+
# LIFE (10-k)
|
217
|
+
{:klass=>:ni, :item_string=>"Profit Loss"},
|
218
|
+
{:klass=>:ooci, :item_string=>"Other Comprehensive Income Defined Benefit Plans Net Unamortized Gain Loss Arising During Period Net Of Tax"},
|
219
|
+
{:klass=>:ooci, :item_string=>"Other Comprehensive Income Defined Benefit Plan Net Prior Service Costs Credit Arising During Period Net Of Tax"},
|
220
|
+
{:klass=>:ooci, :item_string=>"Other Comprehensive Income Loss Finalization Of Pension And Non Pension Postretirement Plan Valuation Net Of Tax"},
|
221
|
+
{:klass=>:ooci, :item_string=>"Other Comprehensive Income Loss Amortization Pension And Other Postretirement Benefit Plans Net Prior Service Cost Recognized In Net Periodic Pension Cost Net Of Tax"},
|
222
|
+
{:klass=>:unkoci, :item_string=>"Cash Flow Hedge Gain Loss Reclassified To Earnings Net"},
|
223
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Loss Foreign Currency Transaction And Translation Adjustment Net Of Tax"},
|
224
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Portion Attributable To Noncontrolling Interest"},
|
225
|
+
{:klass=>:ooci_nci, :item_string=>"Net Income Loss Attributable To Noncontrolling Interest"},
|
226
|
+
|
227
|
+
# XRAY
|
228
|
+
{:klass=>:ni, :item_string=>"Profit Loss"},
|
229
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Period Increase Decrease"},
|
230
|
+
{:klass=>:unkoci, :item_string=>"Other Comprehensive Income Unrealized Gain Loss On Derivatives Arising During Period Net Of Tax"},
|
231
|
+
{:klass=>:foci, :item_string=>"Other Comprehensive Income Available For Sale Securities Adjustment Net Of Tax Period Increase Decrease"},
|
232
|
+
{:klass=>:ooci, :item_string=>"Other Comprehensive Income Minimum Pension Liability Net Adjustment Net Of Tax"},
|
233
|
+
{:klass=>:ooci_nci, :item_string=>"Comprehensive Income Net Of Tax Attributable To Noncontrolling Interest"} ]
|
234
|
+
end
|
235
|
+
end
|
data/lib/finmodeling/config.rb
CHANGED
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module FinModeling
|
2
|
+
class DebtCostOfCapital
|
3
|
+
def self.calculate(opts)
|
4
|
+
case
|
5
|
+
when opts[:after_tax_cost] && !opts[:before_tax_cost] && !opts[:marginal_tax_rate]
|
6
|
+
Rate.new(opts[:after_tax_cost].value)
|
7
|
+
when !opts[:after_tax_cost] && opts[:before_tax_cost] && opts[:marginal_tax_rate]
|
8
|
+
Rate.new(opts[:before_tax_cost].value * (1.0 - (opts[:marginal_tax_rate].value)))
|
9
|
+
else
|
10
|
+
raise ArgumentError
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module FinModeling
|
2
|
+
|
3
|
+
class EquityChangeCalculation < CompanyFilingCalculation
|
4
|
+
include CanCacheClassifications
|
5
|
+
include CanCacheSummaries
|
6
|
+
include CanClassifyRows
|
7
|
+
|
8
|
+
BASE_FILENAME = File.join(FinModeling::BASE_PATH, "summaries/equity_change_")
|
9
|
+
|
10
|
+
ALL_STATES = [ :share_issue, :share_repurch, :minority_int, :common_div, :net_income, :oci, :preferred_div ]
|
11
|
+
NEXT_STATES = { nil => [ :share_issue, :share_repurch, :minority_int, :common_div, :net_income, :oci, :preferred_div ],
|
12
|
+
:share_issue => [ :share_issue, :share_repurch, :minority_int, :common_div, :net_income, :oci, :preferred_div ],
|
13
|
+
:share_repurch => [ :share_issue, :share_repurch, :minority_int, :common_div, :net_income, :oci, :preferred_div ],
|
14
|
+
:minority_int => [ :share_issue, :share_repurch, :minority_int, :common_div, :net_income, :oci, :preferred_div ],
|
15
|
+
:common_div => [ :share_issue, :share_repurch, :minority_int, :common_div, :net_income, :oci, :preferred_div ],
|
16
|
+
:net_income => [ :share_issue, :share_repurch, :minority_int, :common_div, :net_income, :oci, :preferred_div ],
|
17
|
+
:oci => [ :share_issue, :share_repurch, :minority_int, :common_div, :net_income, :oci, :preferred_div ],
|
18
|
+
:preferred_div => [ :share_issue, :share_repurch, :minority_int, :common_div, :net_income, :oci, :preferred_div ] }
|
19
|
+
|
20
|
+
def summary(args)
|
21
|
+
summary_cache_key = args[:period].to_pretty_s
|
22
|
+
summary = lookup_cached_summary(summary_cache_key)
|
23
|
+
return summary if !summary.nil? && false # FIXME: get rid of "and false"
|
24
|
+
|
25
|
+
mapping = Xbrlware::ValueMapping.new
|
26
|
+
mapping.policy[:unknown] = :no_action
|
27
|
+
mapping.policy[:credit] = :no_action
|
28
|
+
mapping.policy[:debit] = :flip
|
29
|
+
|
30
|
+
summary = super(:period => args[:period], :mapping => mapping)
|
31
|
+
if !lookup_cached_classifications(BASE_FILENAME, summary.rows) || true # FIXME: get rid of "or true"
|
32
|
+
lookahead = [2, summary.rows.length-1].min
|
33
|
+
classify_rows(ALL_STATES, NEXT_STATES, summary.rows, FinModeling::EquityChangeItem, lookahead)
|
34
|
+
save_cached_classifications(BASE_FILENAME, summary.rows)
|
35
|
+
end
|
36
|
+
|
37
|
+
save_cached_summary(summary_cache_key, summary)
|
38
|
+
|
39
|
+
return summary
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module FinModeling
|
2
|
+
class EquityChangeItem < String
|
3
|
+
include HasStringClassifier
|
4
|
+
|
5
|
+
BASE_FILENAME = File.join(FinModeling::BASE_PATH, "classifiers/eci_")
|
6
|
+
TYPES = [ :share_issue, :minority_int, :share_repurch, :common_div, # transactions with shareholders
|
7
|
+
:net_income, :oci, :preferred_div ] # comprehensive income
|
8
|
+
|
9
|
+
# Notes:
|
10
|
+
# 1. I need to go back to the EquityChangeCalculation and make sure that it's value mapping policy is accurate
|
11
|
+
|
12
|
+
# Questions:
|
13
|
+
# 1. what about transactions involving options, warrants, convertible debt?
|
14
|
+
# 2. what about transactions involving restricted stock?
|
15
|
+
# 3. what do I do with the stock-based compensation items?
|
16
|
+
# 4. I'm not tagging dividends here. Should I be?
|
17
|
+
# 5. None of these items has preferred stock. ... Find an example, so the classifier knows.
|
18
|
+
|
19
|
+
has_string_classifier(TYPES, EquityChangeItem)
|
20
|
+
|
21
|
+
def self.load_vectors_and_train
|
22
|
+
self._load_vectors_and_train(BASE_FILENAME, FinModeling::EquityChangeItem::TRAINING_VECTORS)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
module FinModeling
|
2
|
+
class EquityChangeItem < String
|
3
|
+
TRAINING_VECTORS = [ { :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Employee Stock Purchase Plan Options Exercised And Benefit Plans" },
|
4
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Tax Effect From Share Based Compensation" },
|
5
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Share Based Compensation" },
|
6
|
+
{ :klass=>:oci, :item_string=>"Noncontrolling Interest Increase From Business Combination" },
|
7
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Acquisitions" },
|
8
|
+
{ :klass=>:share_repurch, :item_string=>"Treasury Stock Value Acquired Cost Method" },
|
9
|
+
{ :klass=>:minority_int, :item_string=>"Minority Interest Increase From Stock Issuance" },
|
10
|
+
{ :klass=>:common_div, :item_string=>"Dividends Common Stock" },
|
11
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Period Increase Decrease" },
|
12
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Unrealized Gain Loss On Derivatives Arising During Period Net Of Tax" },
|
13
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Unrealized Holding Gain Loss On Securities Arising During Period Net Of Tax" },
|
14
|
+
{ :klass=>:net_income, :item_string=>"Profit Loss" },
|
15
|
+
|
16
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Share Based Compensation" },
|
17
|
+
{ :klass=>:share_repurch, :item_string=>"Stock Repurchased And Retired During Period Value" },
|
18
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Employee Stock Purchase Plan" },
|
19
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
20
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Income Tax Deficiency From Share Based Compensation" },
|
21
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Tax Effect From Share Based Compensation" },
|
22
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Other" },
|
23
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss Available To Common Stockholders Basic" },
|
24
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Availableforsale Securities Adjustment Net Of Tax Portion Attributable To Parent" },
|
25
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Portion Attributable To Parent" },
|
26
|
+
|
27
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss Available To Common Stockholders Basic" },
|
28
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Defined Benefit Plans Net Unamortized Gain Loss Arising During Period Net Of Tax" },
|
29
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Unrealized Holding Gain Loss On Securities Arising During Period Net Of Tax" },
|
30
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Recognition Of Cumulative Foreign Currency Translation Adjustment Net Of Tax Period Increase Decrease" },
|
31
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Portion Attributable To Parent" },
|
32
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
33
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Tax Effect From Share Based Compensation" },
|
34
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Stock Options Exercised" },
|
35
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Employee Stock Purchase Plan" },
|
36
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Stock Dividend" },
|
37
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Restricted Stock Award Net Of Forfeitures" },
|
38
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Performance Based Restricted Stock Award Net Of Forfeitures" },
|
39
|
+
{ :klass=>:share_issue, :item_string=>"Stock Withheld For Employee Taxes Value Related To Vested Restricted Stock Units" },
|
40
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Share Based Compensation" },
|
41
|
+
{ :klass=>:share_repurch, :item_string=>"Stock Repurchased During Period Value" },
|
42
|
+
|
43
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Share Based Compensation" },
|
44
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments Related To Tax Withholding For Share Based Compensation" },
|
45
|
+
{ :klass=>:common_div, :item_string=>"Adjustments To Additional Paid In Capital Dividends In Excess Of Retained Earnings" },
|
46
|
+
{ :klass=>:common_div, :item_string=>"Adjustments To Additional Paid In Capital Dividends Payable On Restricted Stock" },
|
47
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
48
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Acquisitions" },
|
49
|
+
{ :klass=>:oci, :item_string=>"Return Of Escrow Value" },
|
50
|
+
{ :klass=>:share_repurch, :item_string=>"Restricted Stock Units Assumed And Converted" },
|
51
|
+
{ :klass=>:oci, :item_string=>"Debt Instrument Decrease Repayments" },
|
52
|
+
{ :klass=>:oci, :item_string=>"Change In Deferred Tax Asset" },
|
53
|
+
{ :klass=>:share_repurch, :item_string=>"Treasury Stock Value Acquired Cost Method" },
|
54
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Reclassification Adjustment For Sale Of Securities Included In Net Income Net Of Tax" },
|
55
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss Available To Common Stockholders Basic" },
|
56
|
+
|
57
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Stock Options Exercised" },
|
58
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Period Increase Decrease" },
|
59
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
60
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss Available To Common Stockholders Basic" },
|
61
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Tax Effect From Share Based Compensation" },
|
62
|
+
{ :klass=>:share_repurch, :item_string=>"Stock Repurchased During Period Value" },
|
63
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments Related To Tax Withholding For Share Based Compensation" },
|
64
|
+
|
65
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss" },
|
66
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Unrealized Holding Gain Loss On Securities Arising During Period Net Of Tax" },
|
67
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Period Increase Decrease" },
|
68
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Defined Benefit Plans Adjustment Net Of Tax Period Increase Decrease" },
|
69
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Share Based Compensation" },
|
70
|
+
{ :klass=>:share_repurch, :item_string=>"Stock Repurchased And Retired During Period Value" },
|
71
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
72
|
+
{ :klass=>:oci, :item_string=>"New Accounting Pronouncement Or Change In Accounting Principle Cumulative Effect Of Change On Equity Or Net Assets" },
|
73
|
+
|
74
|
+
{ :klass=>:net_income, :item_string=>"Profit Loss" },
|
75
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Defined Benefit Plans Adjustment Net Of Tax Period Increase Decrease" },
|
76
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Unrealized Gain Loss On Derivatives Arising During Period Net Of Tax" },
|
77
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Period Increase Decrease" },
|
78
|
+
{ :klass=>:common_div, :item_string=>"Dividends Common Stock Cash" },
|
79
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Share Based Compensation" },
|
80
|
+
{ :klass=>:minority_int, :item_string=>"Minority Interest Decrease From Redemptions" },
|
81
|
+
{ :klass=>:share_repurch, :item_string=>"Treasury Stock Value Acquired Cost Method" },
|
82
|
+
|
83
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss Available To Common Stockholders Basic" },
|
84
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Unrealized Holding Gain Loss On Securities Arising During Period Net Of Tax" },
|
85
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Unrealized Gain Loss On Derivatives Arising During Period Net Of Tax" },
|
86
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
87
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Stock Options Exercised" },
|
88
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Share Based Compensation" },
|
89
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Employee Stock Purchase Plan" },
|
90
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value New Issues" },
|
91
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Share Based Compensation Stock Options Requisite Service Period Recognition" },
|
92
|
+
{ :klass=>:share_issue, :item_string=>"Adjustment To Additional Paid In Capital Income Tax Effect From Share Based Compensation Net" },
|
93
|
+
|
94
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss Available To Common Stockholders Basic" },
|
95
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Loss Net Of Tax Portion Attributable To Parent" },
|
96
|
+
{ :klass=>:share_repurch, :item_string=>"Stock Repurchased During Period Value" },
|
97
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
98
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Stock Options Exercised" },
|
99
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Employee Stock Purchase Plan" },
|
100
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Tax Effect From Share Based Compensation" },
|
101
|
+
|
102
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss Available To Common Stockholders Basic" },
|
103
|
+
{ :klass=>:oci, :item_string=>"Marketable Securities Unrealized Gain Loss" },
|
104
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Share Based Compensation" },
|
105
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value New Issues" },
|
106
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Equity Component Of Convertible Debt" },
|
107
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Acquisitions" },
|
108
|
+
{ :klass=>:share_repurch, :item_string=>"Adjustments To Additional Paid In Capital Increase In Carrying Amount Of Redeemable Common Stock" },
|
109
|
+
{ :klass=>:share_repurch, :item_string=>"Stock Repurchased And Retired During Period Value" },
|
110
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
111
|
+
|
112
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss Available To Common Stockholders Basic" },
|
113
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Unrealized Holding Gain Loss On Securities Arising During Period Net Of Tax" },
|
114
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Unrealized Gain Loss On Derivatives Arising During Period Net Of Tax" },
|
115
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Share Based Compensation" },
|
116
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Tax Effect From Share Based Compensation" },
|
117
|
+
{ :klass=>:share_repurch, :item_string=>"Stock Repurchased And Retired During Period Value" },
|
118
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
119
|
+
|
120
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
121
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Restricted Stock Award Net Of Forfeitures" },
|
122
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Stock Options Exercised" },
|
123
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Acquisitions" },
|
124
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value New Issues" },
|
125
|
+
{ :klass=>:share_issue, :item_string=>"Earn Out Shares Value Issuable" },
|
126
|
+
{ :klass=>:share_issue, :item_string=>"Issuance Value Of Earn Out Shares" },
|
127
|
+
{ :klass=>:share_repurch, :item_string=>"Stock Repurchased During Period Value" },
|
128
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss" },
|
129
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Gain Loss Arising During Period Net Of Tax" },
|
130
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Unrealized Holding Gain Loss On Securities Arising During Period Net Of Tax" },
|
131
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Tax Effect From Share Based Compensation" },
|
132
|
+
|
133
|
+
{ :klass=>:net_income, :item_string=>"Profit Loss" },
|
134
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Period Increase Decrease" },
|
135
|
+
{ :klass=>:oci, :item_string=>"Cumulative Effect Of Initial Adoption Of FIN48" },
|
136
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Stock Options Exercised" },
|
137
|
+
{ :klass=>:oci, :item_string=>"Purchase Of Call Options" },
|
138
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Warrant Issued" },
|
139
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
140
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Equity Component Of Convertible Debt" },
|
141
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Acquisitions" },
|
142
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Restricted Stock Award Net Of Forfeitures" },
|
143
|
+
{ :klass=>:share_issue, :item_string=>"Tax Effect Of Share Based Compensation Cancellation And Forfeiture" },
|
144
|
+
|
145
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Stock Options Exercised" },
|
146
|
+
{ :klass=>:share_issue, :item_string=>"Stock Issued During Period Value Employee Stock Purchase Plan" },
|
147
|
+
{ :klass=>:share_repurch, :item_string=>"Repurchase And Retirement Of Common Stock" },
|
148
|
+
{ :klass=>:common_div, :item_string=>"Dividends And Dividend Equivalents Paid On Shares Outstanding And Restricted Stock Units" },
|
149
|
+
{ :klass=>:common_div, :item_string=>"Dividend Equivalents Payable On Restricted Stock Units" },
|
150
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Sharebased Compensation Requisite Service Period Recognition Value" },
|
151
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Derivatives Qualifying As Cash Flow Hedges And Derivatives Qualifying As Net Investment Hedges Net Of Tax Portion Attributable To Parent" },
|
152
|
+
{ :klass=>:oci, :item_string=>"Other Comprehensive Income Foreign Currency Transaction And Translation Adjustment Net Of Tax Portion Attributable To Parent" },
|
153
|
+
{ :klass=>:share_issue, :item_string=>"Adjustments To Additional Paid In Capital Tax Effect From Share Based Compensation" },
|
154
|
+
{ :klass=>:net_income, :item_string=>"Net Income Loss" } ]
|
155
|
+
end
|
156
|
+
end
|
data/lib/finmodeling/factory.rb
CHANGED
File without changes
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module FinModeling
|
2
|
+
module FamaFrench
|
3
|
+
class MarketHistoricalData
|
4
|
+
URL = "http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/F-F_Research_Data_Factors.zip"
|
5
|
+
DATA_PATH = File.join(FinModeling::BASE_PATH, "fama-french/")
|
6
|
+
ZIP_FILE = File.join(DATA_PATH, "F-F_Research_Data_Factors.zip")
|
7
|
+
TXT_FILE = File.join(DATA_PATH, "F-F_Research_Data_Factors.txt")
|
8
|
+
CSV_FILE = File.join(DATA_PATH, "F-F_Research_Data_Factors.csv")
|
9
|
+
|
10
|
+
def self.download_data!
|
11
|
+
FileUtils.mkdir_p(DATA_PATH) if !File.exists?(DATA_PATH)
|
12
|
+
`rm #{ZIP_FILE} #{TXT_FILE} #{CSV_FILE} > /dev/null 2>&1`
|
13
|
+
`curl -s -o "#{ZIP_FILE}" "#{URL}"`
|
14
|
+
prev_pwd=`pwd`
|
15
|
+
` cd #{DATA_PATH};
|
16
|
+
unzip -q #{ZIP_FILE};
|
17
|
+
rm #{ZIP_FILE};
|
18
|
+
echo "date,RmRf,SMB,HML,Rf" > #{CSV_FILE};
|
19
|
+
grep '^[0-9][0-9][0-9][0-9][0-9][0-9]' #{TXT_FILE} | sed -e 's/ */,/g' | sed -e 's/
|
20
|
+
rm #{TXT_FILE};
|
21
|
+
cd #{prev_pwd} `
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
MarketHistoricalData.download_data! if !File.exists?(CSV_FILE)
|
26
|
+
@rows = CSV.read(CSV_FILE, headers: true)
|
27
|
+
raise RuntimeError.new("couldn't read fama-french data. try deleting #{CSV_FILE} and re-running") if @rows.length < 10
|
28
|
+
end
|
29
|
+
|
30
|
+
def year_and_month_strings
|
31
|
+
@rows.map{ |x| x["date"] }
|
32
|
+
end
|
33
|
+
|
34
|
+
def filter_by_date!(dates_to_keep)
|
35
|
+
@rows = @rows.select{ |x| dates_to_keep.include?(x["date"]) }
|
36
|
+
end
|
37
|
+
|
38
|
+
def rm_rf # mkt return - risk free rate
|
39
|
+
@rows.map{ |x| x["RmRf"].to_f / 100.0 }
|
40
|
+
end
|
41
|
+
|
42
|
+
def smb
|
43
|
+
@rows.map{ |x| x["SMB"].to_f / 100.0 }
|
44
|
+
end
|
45
|
+
|
46
|
+
def hml
|
47
|
+
@rows.map{ |x| x["HML"].to_f / 100.0 }
|
48
|
+
end
|
49
|
+
|
50
|
+
def rf
|
51
|
+
@rows.map{ |x| x["Rf"].to_f / 100.0 }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class EquityHistoricalData
|
56
|
+
def initialize(company_ticker, num_days)
|
57
|
+
daily_quotes = YahooFinance::get_HistoricalQuotes_days(URI::encode(company_ticker), num_days)
|
58
|
+
@monthly_quotes = daily_quotes.group_by{ |x| x.date.gsub(/-[0-9][0-9]$/, "") }
|
59
|
+
.values
|
60
|
+
.map{ |x| x.sort{ |x,y| x.date <=> y.date }.first }
|
61
|
+
.sort{ |x,y| x.date <=> y.date }[1..-1]
|
62
|
+
end
|
63
|
+
|
64
|
+
def year_and_month_strings
|
65
|
+
@monthly_quotes.map{ |x| x.date.gsub(/-[0-9][0-9]$/, "").gsub(/-/, "") }
|
66
|
+
end
|
67
|
+
|
68
|
+
def filter_by_date!(dates_to_keep)
|
69
|
+
@monthly_quotes = @monthly_quotes.select{ |x| dates_to_keep.include?(x.date.gsub(/-[0-9][0-9]$/, "").gsub(/-/, "")) }
|
70
|
+
end
|
71
|
+
|
72
|
+
def monthly_returns(dividends=[])
|
73
|
+
@monthly_quotes.each_cons(2)
|
74
|
+
.map { |pair|
|
75
|
+
div_entry = dividends.find{ |d| d[:ex_eff_date].strftime("%Y-%m") == pair[1].date.gsub(/-[0-9][0-9]$/, "") }
|
76
|
+
dividend = div_entry ? div_entry[:cash_amt] : 0.0
|
77
|
+
(pair[1].adjClose - pair[0].adjClose + dividend) / pair[0].adjClose
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
def monthly_excess_returns(rf, dividends=[])
|
82
|
+
@monthly_quotes.each_cons(2)
|
83
|
+
.map { |pair|
|
84
|
+
div_entry = dividends.find{ |d| d[:ex_eff_date].strftime("%Y-%m") == pair[1].date.gsub(/-[0-9][0-9]$/, "") }
|
85
|
+
dividend = div_entry ? div_entry[:cash_amt] : 0.0
|
86
|
+
(pair[1].adjClose - pair[0].adjClose + dividend) / pair[0].adjClose
|
87
|
+
}
|
88
|
+
.zip(rf).map{ |pair| pair[0] - pair[1] }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class EquityCostOfCapital
|
93
|
+
def self.from_ticker(company_ticker, num_days=6*365)
|
94
|
+
company_historical_data = EquityHistoricalData.new(company_ticker, num_days)
|
95
|
+
mkt_historical_data = MarketHistoricalData.new
|
96
|
+
|
97
|
+
common_dates = company_historical_data.year_and_month_strings & mkt_historical_data.year_and_month_strings
|
98
|
+
mkt_historical_data.filter_by_date!(common_dates)
|
99
|
+
company_historical_data.filter_by_date!(common_dates)
|
100
|
+
|
101
|
+
monthly_excess_returns = company_historical_data.monthly_excess_returns(mkt_historical_data.rf)
|
102
|
+
y = GSL::Vector.alloc(monthly_excess_returns)
|
103
|
+
x = GSL::Matrix.alloc([1.0]*y.length,
|
104
|
+
mkt_historical_data.rm_rf.first(y.length),
|
105
|
+
mkt_historical_data.smb .first(y.length),
|
106
|
+
mkt_historical_data.hml .first(y.length)).transpose
|
107
|
+
c, cov, chisq, status = GSL::MultiFit.linear(x, y)
|
108
|
+
|
109
|
+
avg_rm_rf = mkt_historical_data.rm_rf.inject(:+) / mkt_historical_data.rm_rf.length.to_f
|
110
|
+
avg_smb = mkt_historical_data.smb.inject(:+) / mkt_historical_data.smb.length.to_f
|
111
|
+
avg_hml = mkt_historical_data.hml.inject(:+) / mkt_historical_data.hml.length.to_f
|
112
|
+
|
113
|
+
monthly_cost_of_equity = mkt_historical_data.rf.last + (c[1] * avg_rm_rf) + (c[2] * avg_smb) + (c[3] * avg_hml)
|
114
|
+
annual_cost_of_equity = ((monthly_cost_of_equity+1.0)**12)-1.0
|
115
|
+
Rate.new(annual_cost_of_equity)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|