finmodeling 0.1 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|