Module: SecID::CFI::Tables Private
- Defined in:
- lib/sec_id/cfi/tables.rb
Overview
This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.
ISO 10962:2021 CFI code tables: the 14 categories, 78 groups, and the per-position attribute matrix — each cell carrying both a symbol and the authoritative ISO/SIX label string.
Single source of truth for CFI validation, decoding, labels, predicates, and generation. Transcribed from docs/research/iso-10962-2021-cfi-tables.md (iotafinance's 2021 rendering; derivative tables single-sourced per R11).
Shape:
CATEGORIES[letter] => [symbol, label]
GROUPS[cat_letter][grp_letter] => { symbol:, label:, attributes: [p3, p4, p5, p6] }
Each of the four position entries is either NA (a pure not-applicable
position — accepts only X, omitted from decode) or a
[meaning_symbol, { letter => [value_symbol, value_label] }] pair. The
letter X is universally accepted in every position and decodes to
:not_applicable, so it is never listed in a value map.
rubocop:disable Metrics/ModuleLength
Constant Summary collapse
- NA =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Marker for a pure not-applicable attribute position (accepts only
X). nil- FORM =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Equity form (position 6 across E/D/R/M form positions).
{ 'B' => [:bearer, 'Bearer'], 'R' => [:registered, 'Registered'], 'N' => [:bearer_registered, 'Bearer/Registered'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- VOTING =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Equity voting right (position 3 across E share groups).
{ 'V' => [:voting, 'Voting'], 'N' => [:non_voting, 'Non-voting'], 'R' => [:restricted_voting, 'Restricted voting'], 'E' => [:enhanced_voting, 'Enhanced voting'] }.freeze
- OWNERSHIP =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Ownership/transfer/sales restrictions.
{ 'T' => [:restrictions, 'Restrictions'], 'U' => [:free_of_restrictions, 'Free of restrictions'] }.freeze
- PAYMENT =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Equity payment status.
{ 'F' => [:fully_paid, 'Fully paid'], 'O' => [:nil_paid, 'Nil paid'], 'P' => [:partly_paid, 'Partly paid'] }.freeze
- PREF_REDEMPTION =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Preference-share redemption (EP/EF position 4).
{ 'R' => [:redeemable, 'Redeemable'], 'E' => [:extendible, 'Extendible'], 'T' => [:redeemable_extendible, 'Redeemable/Extendible'], 'G' => [:exchangeable, 'Exchangeable'], 'A' => [:redeemable_exchangeable_extendible, 'Redeemable/Exchangeable/Extendible'], 'C' => [:redeemable_exchangeable, 'Redeemable/Exchangeable'], 'N' => [:perpetual, 'Perpetual'] }.freeze
- PREF_INCOME =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Preference-share income (EP/EF position 5).
{ 'F' => [:fixed_rate, 'Fixed rate'], 'C' => [:cumulative_fixed_rate, 'Cumulative, fixed rate'], 'P' => [:participating, 'Participating'], 'Q' => [:cumulative_participating, 'Cumulative, participating'], 'A' => [:adjustable_rate, 'Adjustable/Variable rate'], 'N' => [:normal_rate, 'Normal rate'], 'U' => [:auction_rate, 'Auction rate'] }.freeze
- DEBT_GUARANTEE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Debt guarantee (position 4 across most D groups).
{ 'T' => [:government_guarantee, 'Government/State guarantee'], 'G' => [:joint_guarantee, 'Joint guarantee'], 'S' => [:secured, 'Secured'], 'U' => [:unsecured, 'Unsecured/Unguaranteed'], 'P' => [:negative_pledge, 'Negative pledge'], 'N' => [:senior, 'Senior'], 'O' => [:senior_subordinated, 'Senior subordinated'], 'Q' => [:junior, 'Junior'], 'J' => [:junior_subordinated, 'Junior subordinated'], 'C' => [:supranational, 'Supranational'] }.freeze
- DEBT_REDEMPTION =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Debt redemption/reimbursement (position 5 across most D groups).
{ 'F' => [:fixed_maturity, 'Fixed maturity'], 'G' => [:fixed_maturity_with_call, 'Fixed maturity with call'], 'C' => [:fixed_maturity_with_put, 'Fixed maturity with put'], 'D' => [:fixed_maturity_with_put_and_call, 'Fixed maturity with put and call'], 'A' => [:amortization_plan, 'Amortization plan'], 'B' => [:amortization_with_call, 'Amortization plan with call'], 'T' => [:amortization_with_put, 'Amortization plan with put'], 'L' => [:amortization_with_put_and_call, 'Amortization plan with put and call'], 'P' => [:perpetual, 'Perpetual'], 'Q' => [:perpetual_with_call, 'Perpetual with call'], 'R' => [:perpetual_with_put, 'Perpetual with put'], 'E' => [:extendible, 'Extendible'] }.freeze
- DEBT_INTEREST_FZVK =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Debt type of interest — DC/DW/DT/DY (F/Z/V/K, no cash payment).
{ 'F' => [:fixed_rate, 'Fixed rate'], 'Z' => [:zero_rate, 'Zero rate/discounted'], 'V' => [:variable, 'Variable'], 'K' => [:payment_in_kind, 'Payment in kind'] }.freeze
- DEBT_INTEREST_FZV =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Debt type of interest — DG/DA/DN (F/Z/V only).
{ 'F' => [:fixed_rate, 'Fixed rate'], 'Z' => [:zero_rate, 'Zero rate/discounted'], 'V' => [:variable, 'Variable'] }.freeze
- STRUCTURED_DISTRIBUTION =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Structured-product distribution (DS/DE position 4).
{ 'F' => [:fixed_interest, 'Fixed interest'], 'D' => [:dividend, 'Dividend'], 'V' => [:variable_interest, 'Variable interest'], 'Y' => [:no_payments, 'No payments'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- STRUCTURED_UNDERLYING =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Structured-product underlying assets (DS/DE position 6).
{ 'B' => [:baskets, 'Baskets'], 'S' => [:equities, 'Equities'], 'D' => [:debt_instruments, 'Debt instruments'], 'T' => [:commodities, 'Commodities'], 'C' => [:currencies, 'Currencies'], 'I' => [:indices, 'Indices'], 'N' => [:interest_rates, 'Interest rates'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- WARRANT_UNDERLYING =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Warrant/mini-future underlying assets (RW/RF position 3).
{ 'B' => [:baskets, 'Baskets'], 'S' => [:equities, 'Equities'], 'D' => [:debt_instruments, 'Debt instruments/Interest rates'], 'T' => [:commodities, 'Commodities'], 'C' => [:currencies, 'Currencies'], 'I' => [:indices, 'Indices'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- EXERCISE_STYLE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Exercise option style with Others (RW/RF position 6).
{ 'A' => [:american, 'American'], 'E' => [:european, 'European'], 'B' => [:bermudan, 'Bermudan'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- CIV_CLOSED_OPEN =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Collective investment: closed/open-end (position 3).
{ 'O' => [:open_end, 'Open-end'], 'C' => [:closed_end, 'Closed-end'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- CIV_DISTRIBUTION =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Collective investment: distribution policy (position 4).
{ 'I' => [:income_funds, 'Income funds'], 'G' => [:accumulation_funds, 'Accumulation funds'], 'J' => [:mixed_funds, 'Mixed funds'] }.freeze
- CIV_ASSETS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Collective investment: assets (position 5).
{ 'R' => [:real_estate, 'Real estate'], 'B' => [:debt_instruments, 'Debt instruments'], 'E' => [:equities, 'Equities'], 'V' => [:convertible_securities, 'Convertible securities'], 'L' => [:mixed, 'Mixed'], 'C' => [:commodities, 'Commodities'], 'D' => [:derivatives, 'Derivatives'], 'F' => [:referential_instruments, 'Referential instruments'], 'K' => [:credits, 'Credits'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- CIV_SECURITY_FULL =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Collective investment: security type & investor restrictions (S/Q/U/Y).
{ 'S' => [:shares, 'Shares'], 'Q' => [:shares_for_qualified_investors, 'Shares for qualified investors'], 'U' => [:units, 'Units'], 'Y' => [:units_for_qualified_investors, 'Units for qualified investors'] }.freeze
- CIV_SECURITY_SHORT =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Collective investment: security type (S/U only).
{ 'S' => [:shares, 'Shares'], 'U' => [:units, 'Units'] }.freeze
- OPTION_STYLE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Listed-option exercise style (A/E/B, no Others).
{ 'A' => [:american, 'American'], 'E' => [:european, 'European'], 'B' => [:bermudan, 'Bermudan'] }.freeze
- OPTION_UNDERLYING =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Listed-option underlying assets (OC/OP position 4).
{ 'B' => [:baskets, 'Baskets'], 'S' => [:equities, 'Stock-Equities'], 'D' => [:debt_instruments, 'Debt instruments'], 'T' => [:commodities, 'Commodities'], 'C' => [:currencies, 'Currencies'], 'I' => [:indices, 'Indices'], 'O' => [:options, 'Options'], 'F' => [:futures, 'Futures'], 'W' => [:swaps, 'Swaps'], 'N' => [:interest_rates, 'Interest rates'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- STANDARDIZED =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Standardized flag (S/N).
{ 'S' => [:standardized, 'Standardized'], 'N' => [:non_standardized, 'Non-standardized'] }.freeze
- COMMODITY_ASSETS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Commodity underlying — extraction/agriculture form (FC/TT position 3).
{ 'E' => [:extraction_resources, 'Extraction resources'], 'A' => [:agriculture, 'Agriculture'], 'I' => [:industrial_products, 'Industrial products'], 'S' => [:services, 'Services'], 'N' => [:environmental, 'Environmental'], 'P' => [:polypropylene_products, 'Polypropylene products'], 'H' => [:generated_resources, 'Generated resources'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- RETURN_TRIGGER =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Swap return/payout trigger (ST/SE position 4).
{ 'P' => [:price, 'Price'], 'D' => [:dividend, 'Dividend'], 'V' => [:variance, 'Variance'], 'L' => [:volatility, 'Volatility'], 'T' => [:total_return, 'Total return'], 'C' => [:contract_for_difference, 'Contract for difference'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- H_OPTION_STYLE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Non-listed option style and type (H position 4).
{ 'A' => [:european_call, 'European call'], 'B' => [:american_call, 'American call'], 'C' => [:bermudan_call, 'Bermudan call'], 'D' => [:european_put, 'European put'], 'E' => [:american_put, 'American put'], 'F' => [:bermudan_put, 'Bermudan put'], 'G' => [:european_chooser, 'European chooser'], 'H' => [:american_chooser, 'American chooser'], 'I' => [:bermudan_chooser, 'Bermudan chooser'] }.freeze
- H_VALUATION =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Non-listed option valuation method or trigger (H position 5).
{ 'V' => [:vanilla, 'Vanilla'], 'A' => [:asian, 'Asian'], 'D' => [:digital, 'Digital (binary)'], 'B' => [:barrier, 'Barrier'], 'G' => [:digital_barrier, 'Digital barrier'], 'L' => [:lookback, 'Lookback'], 'P' => [:other_path_dependent, 'Other path-dependent'], 'M' => [:others, 'Others (miscellaneous)'] }.freeze
- DELIVERY_CP =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Delivery variants.
{ 'C' => [:cash, 'Cash'], 'P' => [:physical, 'Physical'] }.freeze
- DELIVERY_PN =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Delivery variants: physical or non-deliverable.
{ 'P' => [:physical, 'Physical'], 'N' => [:non_deliverable, 'Non-deliverable'] }.freeze
- DELIVERY_P =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Delivery variant: physical only.
{ 'P' => [:physical, 'Physical'] }.freeze
- DELIVERY_PCN =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Delivery variants: physical, cash, or non-deliverable.
{ 'P' => [:physical, 'Physical'], 'C' => [:cash, 'Cash'], 'N' => [:non_deliverable, 'Non-deliverable'] }.freeze
- DELIVERY_CPE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Delivery variants: cash, physical, or elect-at-settlement.
{ 'C' => [:cash, 'Cash'], 'P' => [:physical, 'Physical'], 'E' => [:elect_at_settlement, 'Elect at settlement'] }.freeze
- H_DELIVERY =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Non-listed option delivery variants: cash, physical, or elect-at-exercise.
{ 'C' => [:cash, 'Cash'], 'P' => [:physical, 'Physical'], 'E' => [:elect_at_exercise, 'Elect at exercise'] }.freeze
- H_DELIVERY_N =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
H_DELIVERY variants plus non-deliverable.
H_DELIVERY.merge('N' => [:non_deliverable, 'Non-deliverable']).freeze
- H_DELIVERY_NA =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
H_DELIVERY_N variants plus auction.
H_DELIVERY_N.merge('A' => [:auction, 'Auction']).freeze
- FWD_TRIGGER_CSF =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Forward return/payout trigger variants.
{ 'C' => [:contract_for_difference, 'Contract for difference'], 'S' => [:spread_bet, 'Spread-bet'], 'F' => [:forward_price, 'Forward price of underlying'] }.freeze
- FWD_TRIGGER_SF =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Forward trigger variants: spread-bet or forward price.
{ 'S' => [:spread_bet, 'Spread-bet'], 'F' => [:forward_price, 'Forward price of underlying'] }.freeze
- FWD_TRIGGER_CF =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Forward trigger variants: contract-for-difference or forward price.
{ 'C' => [:contract_for_difference, 'Contract for difference'], 'F' => [:forward_price, 'Forward price of underlying'] }.freeze
- CATEGORIES =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
--- Categories (position 1) --------------------------------------------
{ 'E' => [:equity, 'Equities'], 'C' => [:collective_investment_vehicles, 'Collective investment vehicles'], 'D' => [:debt_instruments, 'Debt instruments'], 'R' => [:entitlements, 'Entitlements (rights)'], 'O' => [:listed_options, 'Listed options'], 'F' => [:futures, 'Futures'], 'S' => [:swaps, 'Swaps'], 'H' => [:non_listed_options, 'Non-listed and complex listed options'], 'I' => [:spot, 'Spot'], 'J' => [:forwards, 'Forwards'], 'K' => [:strategies, 'Strategies'], 'L' => [:financing, 'Financing'], 'T' => [:referential_instruments, 'Referential instruments'], 'M' => [:miscellaneous, 'Others (miscellaneous)'] }.freeze
- GROUPS =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
--- Groups + attribute matrix (positions 2-6) --------------------------
{ 'E' => { 'S' => { symbol: :common_shares, label: 'Common/Ordinary shares', attributes: [[:voting_right, VOTING], [:ownership_restrictions, OWNERSHIP], [:payment_status, PAYMENT], [:form, FORM]] }, 'P' => { symbol: :preferred_shares, label: 'Preferred/Preference shares', attributes: [[:voting_right, VOTING], [:redemption, PREF_REDEMPTION], [:income, PREF_INCOME], [:form, FORM]] }, 'C' => { symbol: :convertible_common_shares, label: 'Common/Ordinary convertible shares', attributes: [[:voting_right, VOTING], [:ownership_restrictions, OWNERSHIP], [:payment_status, PAYMENT], [:form, FORM]] }, 'F' => { symbol: :convertible_preferred_shares, label: 'Preferred/Preference convertible shares', attributes: [[:voting_right, VOTING], [:redemption, PREF_REDEMPTION], [:income, PREF_INCOME], [:form, FORM]] }, 'L' => { symbol: :limited_partnership_units, label: 'Limited partnership units', attributes: [[:voting_right, VOTING], [:ownership_restrictions, OWNERSHIP], [:payment_status, PAYMENT], [:form, FORM]] }, 'D' => { symbol: :depositary_receipts, label: 'Depositary receipts on equities', attributes: [[:underlying, { 'S' => [:common_shares, 'Common/Ordinary shares'], 'P' => [:preferred_shares, 'Preferred/Preference shares'], 'C' => [:convertible_common_shares, 'Common/Ordinary convertible shares'], 'F' => [:convertible_preferred_shares, 'Preferred/Preference convertible shares'], 'L' => [:limited_partnership_units, 'Limited partnership units'], 'M' => [:others, 'Others (miscellaneous)'] }], [:redemption, { 'R' => [:redeemable, 'Redeemable'], 'N' => [:perpetual, 'Perpetual'], 'B' => [:convertible, 'Convertible'], 'D' => [:convertible_redeemable, 'Convertible/Redeemable'] }], [:income, PREF_INCOME.merge('D' => [:dividends, 'Dividends'])], [:form, FORM]] }, 'Y' => { symbol: :structured_instruments, label: 'Structured instruments (participation)', attributes: [[:type, { 'A' => [:tracker_certificate, 'Tracker certificate'], 'B' => [:outperforming_certificate, 'Outperforming certificate'], 'C' => [:bonus_certificate, 'Bonus certificate'], 'D' => [:outperformance_bonus_certificate, 'Outperformance bonus certificate'], 'E' => [:twin_win_certificate, 'Twin-win certificate'], 'M' => [:others, 'Others (miscellaneous)'] }], [:distribution, { 'D' => [:dividend_payments, 'Dividend payments'], 'Y' => [:no_payments, 'No payments'], 'M' => [:others, 'Others (miscellaneous)'] }], [:repayment, { 'F' => [:cash_repayment, 'Cash repayment'], 'V' => [:physical_repayment, 'Physical repayment'], 'E' => [:elect_at_settlement, 'Elect at settlement'], 'M' => [:others, 'Others (miscellaneous)'] }], [:underlying_assets, { 'B' => [:baskets, 'Baskets'], 'S' => [:equities, 'Equities'], 'D' => [:debt_instruments, 'Debt instruments'], 'G' => [:derivatives, 'Derivatives'], 'T' => [:commodities, 'Commodities'], 'C' => [:currencies, 'Currencies'], 'I' => [:indices, 'Indices'], 'N' => [:interest_rates, 'Interest rates'], 'M' => [:others, 'Others (miscellaneous)'] }]] }, 'M' => { symbol: :miscellaneous, label: 'Others (miscellaneous)', attributes: [NA, NA, NA, [:form, FORM]] } }, 'C' => { 'I' => { symbol: :standard_investment_funds, label: 'Standard (vanilla) funds', attributes: [[:closed_open, CIV_CLOSED_OPEN], [:distribution_policy, CIV_DISTRIBUTION], [:assets, CIV_ASSETS], [:security_type, CIV_SECURITY_FULL]] }, 'H' => { symbol: :hedge_funds, label: 'Hedge funds', attributes: [[:investment_strategy, { 'D' => [:directional, 'Directional'], 'R' => [:relative_value, 'Relative value'], 'S' => [:security_selection, 'Security selection'], 'E' => [:event_driven, 'Event-driven'], 'A' => [:arbitrage, 'Arbitrage'], 'N' => [:multi_strategy, 'Multi-strategy'], 'L' => [:asset_based_lending, 'Asset-based lending'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, NA] }, 'B' => { symbol: :real_estate_investment_trusts, label: 'Real estate investment trusts (REITs)', attributes: [[:closed_open, CIV_CLOSED_OPEN], [:distribution_policy, CIV_DISTRIBUTION], NA, [:security_type, CIV_SECURITY_FULL]] }, 'E' => { symbol: :exchange_traded_funds, label: 'Exchange-traded funds (ETFs)', attributes: [[:closed_open, CIV_CLOSED_OPEN], [:distribution_policy, CIV_DISTRIBUTION], [:assets, CIV_ASSETS], [:security_type, CIV_SECURITY_SHORT]] }, 'S' => { symbol: :pension_funds, label: 'Pension funds', attributes: [[:closed_open, CIV_CLOSED_OPEN], [:strategy_style, { 'B' => [:balanced_conservative, 'Balanced/Conservative'], 'G' => [:growth, 'Growth'], 'L' => [:life_style, 'Life style'], 'M' => [:others, 'Others (miscellaneous)'] }], [:type, { 'R' => [:defined_benefit, 'Defined benefit'], 'B' => [:defined_contribution, 'Defined contribution'], 'M' => [:others, 'Others (miscellaneous)'] }], [:security_type, CIV_SECURITY_SHORT]] }, 'F' => { symbol: :funds_of_funds, label: 'Funds of funds', attributes: [[:closed_open, CIV_CLOSED_OPEN], [:distribution_policy, CIV_DISTRIBUTION], [:underlying_fund_type, { 'I' => [:standard_funds, 'Standard (vanilla)'], 'H' => [:hedge_funds, 'Hedge funds'], 'B' => [:reit, 'REIT'], 'E' => [:etf, 'ETF'], 'P' => [:private_equity, 'Private equity'], 'M' => [:others, 'Others (miscellaneous)'] }], [:security_type, CIV_SECURITY_FULL]] }, 'P' => { symbol: :private_equity_funds, label: 'Private equity funds', attributes: [[:closed_open, CIV_CLOSED_OPEN], [:distribution_policy, CIV_DISTRIBUTION], [:assets, CIV_ASSETS], [:security_type, CIV_SECURITY_FULL]] }, 'M' => { symbol: :miscellaneous, label: 'Others (miscellaneous)', attributes: [NA, NA, NA, [:security_type, CIV_SECURITY_FULL]] } }, 'D' => { 'B' => { symbol: :bonds, label: 'Bonds', attributes: [[:interest_type, { 'F' => [:fixed_rate, 'Fixed rate'], 'Z' => [:zero_rate, 'Zero rate/discounted'], 'V' => [:variable, 'Variable'], 'C' => [:cash_payment, 'Cash payment'], 'K' => [:payment_in_kind, 'Payment in kind'] }], [:guarantee, DEBT_GUARANTEE], [:redemption, DEBT_REDEMPTION], [:form, FORM]] }, 'C' => { symbol: :convertible_bonds, label: 'Convertible bonds', attributes: [[:interest_type, DEBT_INTEREST_FZVK], [:guarantee, DEBT_GUARANTEE], [:redemption, DEBT_REDEMPTION], [:form, FORM]] }, 'W' => { symbol: :bonds_with_warrants, label: 'Bonds with warrants attached', attributes: [[:interest_type, DEBT_INTEREST_FZVK], [:guarantee, DEBT_GUARANTEE], [:redemption, DEBT_REDEMPTION], [:form, FORM]] }, 'T' => { symbol: :medium_term_notes, label: 'Medium-term notes', attributes: [[:interest_type, DEBT_INTEREST_FZVK], [:guarantee, DEBT_GUARANTEE], [:redemption, DEBT_REDEMPTION], [:form, FORM]] }, 'S' => { symbol: :structured_products_with_protection, label: 'Structured products (with capital protection)', attributes: [[:type, { 'A' => [:capital_protection_with_participation, 'Capital protection certificate with participation'], 'B' => [:capital_protection_convertible, 'Capital protection convertible certificate'], 'C' => [:barrier_capital_protection, 'Barrier capital protection certificate'], 'D' => [:capital_protection_with_coupons, 'Capital protection certificate with coupons'], 'M' => [:others, 'Others (miscellaneous)'] }], [:distribution, STRUCTURED_DISTRIBUTION], [:repayment, { 'F' => [:fixed_cash_repayment, 'Fixed cash repayment (protected level only)'], 'V' => [:variable_cash_repayment, 'Variable cash repayment'], 'M' => [:others, 'Others (miscellaneous)'] }], [:underlying_assets, STRUCTURED_UNDERLYING]] }, 'E' => { symbol: :structured_products_without_protection, label: 'Structured products (without capital protection)', attributes: [[:type, { 'A' => [:discount_certificate, 'Discount certificate'], 'B' => [:barrier_discount_certificate, 'Barrier discount certificate'], 'C' => [:reverse_convertible, 'Reverse convertible'], 'D' => [:barrier_reverse_convertible, 'Barrier reverse convertible'], 'E' => [:express_certificate, 'Express certificate'], 'M' => [:others, 'Others (miscellaneous)'] }], [:distribution, STRUCTURED_DISTRIBUTION], [:repayment, { 'R' => [:repayment_in_cash, 'Repayment in cash'], 'S' => [:repayment_in_assets, 'Repayment in assets'], 'C' => [:repayment_in_assets_and_cash, 'Repayment in assets and cash'], 'T' => [:repayment_in_assets_or_cash, 'Repayment in assets or cash'], 'M' => [:others, 'Others (miscellaneous)'] }], [:underlying_assets, STRUCTURED_UNDERLYING]] }, 'G' => { symbol: :mortgage_backed_securities, label: 'Mortgage-backed securities (MBS)', attributes: [[:interest_type, DEBT_INTEREST_FZV], [:guarantee, DEBT_GUARANTEE], [:redemption, DEBT_REDEMPTION], [:form, FORM]] }, 'A' => { symbol: :asset_backed_securities, label: 'Asset-backed securities (ABS)', attributes: [[:interest_type, DEBT_INTEREST_FZV], [:guarantee, DEBT_GUARANTEE], [:redemption, DEBT_REDEMPTION], [:form, FORM]] }, 'N' => { symbol: :municipal_bonds, label: 'Municipal bonds', attributes: [[:interest_type, DEBT_INTEREST_FZV], [:guarantee, DEBT_GUARANTEE], [:redemption, DEBT_REDEMPTION], [:form, FORM]] }, 'D' => { symbol: :depositary_receipts, label: 'Depositary receipts on debt instruments', attributes: [[:underlying, { 'B' => [:bonds, 'Bonds'], 'C' => [:convertible_bonds, 'Convertible bonds'], 'W' => [:bonds_with_warrants, 'Bonds with warrants attached'], 'T' => [:medium_term_notes, 'Medium-term notes'], 'Y' => [:money_market, 'Money-market instruments'], 'G' => [:mortgage_backed, 'Mortgage-backed securities (MBS)'], 'Q' => [:asset_backed, 'Asset-backed securities (ABS)'], 'N' => [:municipal_bonds, 'Municipal bonds'], 'M' => [:others, 'Others (miscellaneous)'] }], [:interest_type, { 'F' => [:fixed_rate, 'Fixed rate'], 'Z' => [:zero_rate, 'Zero rate/discounted'], 'V' => [:variable, 'Variable'], 'C' => [:cash_payment, 'Cash payment'] }], [:guarantee, DEBT_GUARANTEE], [:redemption, DEBT_REDEMPTION]] }, 'M' => { symbol: :miscellaneous, label: 'Others (miscellaneous)', attributes: [[:type, { 'B' => [:bank_loan, 'Bank loan'], 'P' => [:promissory_note, 'Promissory note'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, [:form, FORM]] }, 'Y' => { symbol: :money_market_instruments, label: 'Money-market instruments', attributes: [[:interest_type, DEBT_INTEREST_FZVK], [:guarantee, DEBT_GUARANTEE], NA, [:form, FORM]] } }, 'R' => { 'A' => { symbol: :allotment_rights, label: 'Allotments (bonus rights)', attributes: [NA, NA, NA, [:form, FORM]] }, 'S' => { symbol: :subscription_rights, label: 'Subscription rights', attributes: [[:underlying_assets, { 'S' => [:common_shares, 'Common/Ordinary shares'], 'P' => [:preferred_shares, 'Preferred/Preference shares'], 'C' => [:convertible_common_shares, 'Common/Ordinary convertible shares'], 'F' => [:convertible_preferred_shares, 'Preferred/Preference convertible shares'], 'B' => [:bonds, 'Bonds'], 'I' => [:combined_instruments, 'Combined instruments'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, [:form, FORM]] }, 'P' => { symbol: :purchase_rights, label: 'Purchase rights', attributes: [[:underlying_assets, { 'S' => [:common_shares, 'Common/Ordinary shares'], 'P' => [:preferred_shares, 'Preferred/Preference shares'], 'C' => [:convertible_common_shares, 'Common/Ordinary convertible shares'], 'F' => [:convertible_preferred_shares, 'Preferred/Preference convertible shares'], 'B' => [:bonds, 'Bonds'], 'I' => [:combined_instruments, 'Combined instruments'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, [:form, FORM]] }, 'W' => { symbol: :warrants, label: 'Warrants', attributes: [[:underlying_assets, WARRANT_UNDERLYING], [:warrant_type, { 'T' => [:traditional, 'Traditional'], 'N' => [:naked, 'Naked'], 'C' => [:covered, 'Covered'] }], [:call_put, { 'C' => [:call, 'Call'], 'P' => [:put, 'Put'], 'B' => [:call_and_put, 'Call and put'] }], [:exercise_style, EXERCISE_STYLE]] }, 'F' => { symbol: :mini_future_certificates, label: 'Mini-future / constant-leverage certificates', attributes: [[:underlying_assets, WARRANT_UNDERLYING], [:barrier_dependency, { 'T' => [:barrier_underlying_based, 'Barrier underlying based'], 'N' => [:barrier_instrument_based, 'Barrier instrument based'], 'M' => [:others, 'Others (miscellaneous)'] }], [:long_short, { 'C' => [:long, 'Long'], 'P' => [:short, 'Short'], 'M' => [:others, 'Others (miscellaneous)'] }], [:exercise_style, EXERCISE_STYLE]] }, 'D' => { symbol: :depositary_receipts, label: 'Depositary receipts on entitlements', attributes: [[:underlying, { 'A' => [:allotment_rights, 'Allotment (bonus) rights'], 'S' => [:subscription_rights, 'Subscription rights'], 'P' => [:purchase_rights, 'Purchase rights'], 'W' => [:warrants, 'Warrants'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, [:form, FORM]] }, 'M' => { symbol: :miscellaneous, label: 'Others (miscellaneous)', attributes: [NA, NA, NA, NA] } }, 'O' => { 'C' => { symbol: :call_options, label: 'Call options', attributes: [[:exercise_style, OPTION_STYLE], [:underlying_assets, OPTION_UNDERLYING], [:delivery, { 'P' => [:physical, 'Physical'], 'C' => [:cash, 'Cash'], 'N' => [:non_deliverable, 'Non-deliverable'], 'E' => [:elect_at_exercise, 'Elect at exercise'] }], [:standardized, STANDARDIZED]] }, 'P' => { symbol: :put_options, label: 'Put options', attributes: [[:exercise_style, OPTION_STYLE], [:underlying_assets, OPTION_UNDERLYING], [:delivery, { 'P' => [:physical, 'Physical'], 'C' => [:cash, 'Cash'], 'N' => [:non_deliverable, 'Non-deliverable'], 'E' => [:elect_at_exercise, 'Elect at exercise'] }], [:standardized, STANDARDIZED]] }, 'M' => { symbol: :miscellaneous, label: 'Others (miscellaneous)', attributes: [NA, NA, NA, NA] } }, 'F' => { 'F' => { symbol: :financial_futures, label: 'Financial futures', attributes: [[:underlying_assets, { 'B' => [:baskets, 'Baskets'], 'S' => [:equities, 'Stock-Equities'], 'D' => [:debt_instruments, 'Debt instruments'], 'C' => [:currencies, 'Currencies'], 'I' => [:indices, 'Indices'], 'O' => [:options, 'Options'], 'F' => [:futures, 'Futures'], 'W' => [:swaps, 'Swaps'], 'N' => [:interest_rates, 'Interest rates'], 'V' => [:stock_dividend, 'Stock dividend'], 'M' => [:others, 'Others (miscellaneous)'] }], [:delivery, DELIVERY_PCN], [:standardized, STANDARDIZED], NA] }, 'C' => { symbol: :commodities_futures, label: 'Commodities futures', attributes: [[:underlying_assets, COMMODITY_ASSETS], [:delivery, DELIVERY_PCN], [:standardized, STANDARDIZED], NA] } }, 'S' => { 'R' => { symbol: :rates, label: 'Rates', attributes: [[:underlying_assets, { 'A' => [:basis_swap, 'Basis swap'], 'C' => [:fixed_floating, 'Fixed-floating'], 'D' => [:fixed_fixed, 'Fixed-fixed'], 'G' => [:inflation_rate_index, 'Inflation rate index'], 'H' => [:overnight_index_swap, 'Overnight index swap (OIS)'], 'Z' => [:zero_coupon, 'Zero coupon'], 'M' => [:others, 'Others (miscellaneous)'] }], [:notional, { 'C' => [:constant, 'Constant'], 'D' => [:accreting, 'Accreting'], 'I' => [:amortizing, 'Amortizing'], 'Y' => [:custom, 'Custom'] }], [:currency, { 'S' => [:single_currency, 'Single-currency'], 'C' => [:cross_currency, 'Cross-currency'] }], [:delivery, DELIVERY_CP]] }, 'T' => { symbol: :commodities, label: 'Commodities', attributes: [[:underlying_assets, { 'J' => [:energy, 'Energy'], 'K' => [:metals, 'Metals'], 'A' => [:agriculture, 'Agriculture'], 'N' => [:environmental, 'Environmental'], 'G' => [:freight, 'Freight'], 'P' => [:polypropylene_products, 'Polypropylene products'], 'S' => [:fertilizer, 'Fertilizer'], 'T' => [:paper, 'Paper'], 'I' => [:index, 'Index'], 'Q' => [:multi_commodity, 'Multi-commodity'], 'M' => [:others, 'Others (miscellaneous)'] }], [:return_trigger, RETURN_TRIGGER], NA, [:delivery, DELIVERY_CPE]] }, 'E' => { symbol: :equity, label: 'Equity', attributes: [[:underlying_assets, { 'S' => [:single_stock, 'Single stock'], 'I' => [:index, 'Index'], 'B' => [:basket, 'Basket'], 'M' => [:others, 'Others (miscellaneous)'] }], [:return_trigger, RETURN_TRIGGER], NA, [:delivery, DELIVERY_CPE]] }, 'C' => { symbol: :credit, label: 'Credit', attributes: [[:underlying_assets, { 'U' => [:single_name, 'Single name'], 'V' => [:index_tranche, 'Index tranche'], 'I' => [:index, 'Index'], 'B' => [:basket, 'Basket'], 'M' => [:others, 'Others (miscellaneous)'] }], [:return_trigger, { 'C' => [:credit_default, 'Credit default'], 'T' => [:total_return, 'Total return'], 'M' => [:others, 'Others (miscellaneous)'] }], [:issuer_type, { 'C' => [:corporate, 'Corporate'], 'S' => [:sovereign, 'Sovereign'], 'L' => [:local, 'Local'] }], [:delivery, { 'C' => [:cash, 'Cash'], 'P' => [:physical, 'Physical'], 'A' => [:auction, 'Auction'] }]] }, 'F' => { symbol: :foreign_exchange, label: 'Foreign exchange', attributes: [[:underlying_assets, { 'A' => [:spot_forward_swap, 'Spot-forward swap'], 'C' => [:forward_forward_swap, 'Forward-forward swap'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, [:delivery, DELIVERY_PN]] }, 'M' => { symbol: :miscellaneous, label: 'Others (miscellaneous)', attributes: [[:underlying_assets, { 'P' => [:commercial_property, 'Commercial property (property derivative)'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, [:delivery, DELIVERY_CP]] } }, 'H' => { 'R' => { symbol: :rates, label: 'Rates', attributes: [[:underlying_assets, { 'A' => [:basis_swap, 'Basis swap'], 'C' => [:fixed_floating, 'Fixed-floating'], 'D' => [:fixed_fixed, 'Fixed-fixed'], 'G' => [:inflation_rate_index, 'Inflation rate index'], 'H' => [:overnight_index_swap, 'Overnight index swap (OIS)'], 'O' => [:options, 'Options'], 'R' => [:forwards, 'Forwards'], 'F' => [:futures, 'Futures'], 'M' => [:others, 'Others (miscellaneous)'] }], [:option_style, H_OPTION_STYLE], [:valuation, H_VALUATION], [:delivery, H_DELIVERY]] }, 'T' => { symbol: :commodities, label: 'Commodities', attributes: [[:underlying_assets, { 'J' => [:energy, 'Energy'], 'K' => [:metals, 'Metals'], 'A' => [:agriculture, 'Agriculture'], 'N' => [:environmental, 'Environmental'], 'G' => [:freight, 'Freight'], 'P' => [:polypropylene_products, 'Polypropylene products'], 'S' => [:fertilizer, 'Fertilizer'], 'T' => [:paper, 'Paper'], 'I' => [:index, 'Index'], 'Q' => [:multi_commodity, 'Multi-commodity'], 'O' => [:options, 'Options'], 'R' => [:forwards, 'Forwards'], 'F' => [:futures, 'Futures'], 'W' => [:swaps, 'Swaps'], 'M' => [:others, 'Others (miscellaneous)'] }], [:option_style, H_OPTION_STYLE], [:valuation, H_VALUATION], [:delivery, H_DELIVERY]] }, 'E' => { symbol: :equity, label: 'Equity', attributes: [[:underlying_assets, { 'S' => [:single_stock, 'Single stock'], 'I' => [:index, 'Index'], 'B' => [:basket, 'Basket'], 'O' => [:options, 'Options'], 'R' => [:forwards, 'Forwards'], 'F' => [:futures, 'Futures'], 'M' => [:others, 'Others (miscellaneous)'] }], [:option_style, H_OPTION_STYLE], [:valuation, H_VALUATION], [:delivery, H_DELIVERY]] }, 'C' => { symbol: :credit, label: 'Credit', attributes: [[:underlying_assets, { 'U' => [:cds_single_name, 'CDS on a single name'], 'V' => [:cds_index_tranche, 'CDS on an index tranche'], 'I' => [:cds_index, 'CDS on an index'], 'W' => [:swaps, 'Swaps'], 'M' => [:others, 'Others (miscellaneous)'] }], [:option_style, H_OPTION_STYLE], [:valuation, H_VALUATION], [:delivery, H_DELIVERY]] }, 'F' => { symbol: :foreign_exchange, label: 'Foreign exchange', attributes: [[:underlying_assets, { 'R' => [:forwards, 'Forwards'], 'F' => [:futures, 'Futures'], 'T' => [:spot_forward_swap, 'Spot-forward swap'], 'V' => [:volatility, 'Volatility'], 'M' => [:others, 'Others (miscellaneous)'] }], [:option_style, H_OPTION_STYLE], [:valuation, H_VALUATION], [:delivery, H_DELIVERY_N]] }, 'M' => { symbol: :miscellaneous, label: 'Others (miscellaneous)', attributes: [[:underlying_assets, { 'P' => [:commercial_property, 'Commercial property'], 'M' => [:others, 'Others (miscellaneous)'] }], [:option_style, H_OPTION_STYLE], [:valuation, H_VALUATION], [:delivery, H_DELIVERY_NA]] } }, 'I' => { 'F' => { symbol: :foreign_exchange, label: 'Foreign exchange', attributes: [NA, NA, NA, [:delivery, DELIVERY_P]] }, 'T' => { symbol: :commodities, label: 'Commodities', attributes: [[:underlying_assets, { 'A' => [:agriculture, 'Agriculture'], 'J' => [:energy, 'Energy'], 'K' => [:metals, 'Metals'], 'N' => [:environmental, 'Environmental'], 'P' => [:polypropylene_products, 'Polypropylene products'], 'S' => [:fertilizer, 'Fertilizer'], 'T' => [:paper, 'Paper'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, NA] } }, 'J' => { 'E' => { symbol: :equity, label: 'Equity', attributes: [[:underlying_assets, { 'S' => [:single_stock, 'Single stock'], 'I' => [:index, 'Index'], 'B' => [:basket, 'Basket'], 'O' => [:options, 'Options'], 'F' => [:futures, 'Futures'] }], NA, [:return_trigger, FWD_TRIGGER_CSF], [:delivery, DELIVERY_CP]] }, 'F' => { symbol: :foreign_exchange, label: 'Foreign exchange', attributes: [[:underlying_assets, { 'T' => [:spot, 'Spot'], 'R' => [:forward, 'Forward'], 'O' => [:options, 'Options'], 'F' => [:futures, 'Futures'] }], NA, [:return_trigger, FWD_TRIGGER_CSF], [:delivery, DELIVERY_PCN]] }, 'C' => { symbol: :credit, label: 'Credit', attributes: [[:underlying_assets, { 'A' => [:single_name, 'Single name'], 'I' => [:index, 'Index'], 'B' => [:basket, 'Basket'], 'C' => [:cds_single_name, 'CDS on a single name'], 'D' => [:cds_index, 'CDS on an index'], 'G' => [:cds_basket, 'CDS on a basket'], 'O' => [:options, 'Options'] }], NA, [:return_trigger, FWD_TRIGGER_SF], [:delivery, DELIVERY_PCN]] }, 'R' => { symbol: :rates, label: 'Rates', attributes: [[:underlying_assets, { 'I' => [:interest_rate_index, 'Interest rate index'], 'O' => [:options, 'Options'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, [:return_trigger, FWD_TRIGGER_SF], [:delivery, DELIVERY_PCN]] }, 'T' => { symbol: :commodities, label: 'Commodities', attributes: [[:underlying_assets, { 'A' => [:agriculture, 'Agriculture'], 'B' => [:basket, 'Basket'], 'G' => [:freight, 'Freight'], 'I' => [:index, 'Index'], 'J' => [:energy, 'Energy'], 'K' => [:metals, 'Metals'], 'N' => [:environmental, 'Environmental'], 'P' => [:polypropylene_products, 'Polypropylene products'], 'S' => [:fertilizer, 'Fertilizer'], 'T' => [:paper, 'Paper'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, [:return_trigger, FWD_TRIGGER_CF], [:delivery, DELIVERY_PCN]] } }, 'K' => { 'R' => { symbol: :rates, label: 'Rates', attributes: [NA, NA, NA, NA] }, 'T' => { symbol: :commodities, label: 'Commodities', attributes: [NA, NA, NA, NA] }, 'E' => { symbol: :equity, label: 'Equity', attributes: [NA, NA, NA, NA] }, 'C' => { symbol: :credit, label: 'Credit', attributes: [NA, NA, NA, NA] }, 'F' => { symbol: :foreign_exchange, label: 'Foreign exchange', attributes: [NA, NA, NA, NA] }, 'Y' => { symbol: :mixed, label: 'Mixed assets', attributes: [NA, NA, NA, NA] }, 'M' => { symbol: :miscellaneous, label: 'Others (miscellaneous)', attributes: [NA, NA, NA, NA] } }, 'L' => { 'L' => { symbol: :loan_lease, label: 'Loan-lease', attributes: [[:underlying_assets, { 'A' => [:agriculture, 'Agriculture'], 'B' => [:baskets, 'Baskets'], 'J' => [:energy, 'Energy'], 'K' => [:metals, 'Metals'], 'N' => [:environmental, 'Environmental'], 'P' => [:polypropylene_products, 'Polypropylene products'], 'S' => [:fertilizer, 'Fertilizer'], 'T' => [:paper, 'Paper'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, [:delivery, DELIVERY_PCN]] }, 'R' => { symbol: :repurchase_agreements, label: 'Repurchase agreements', attributes: [[:underlying_assets, { 'G' => [:general_collateral, 'General collateral'], 'S' => [:specific_security_collateral, 'Specific security collateral'], 'C' => [:cash_collateral, 'Cash collateral'] }], [:termination, { 'F' => [:flexible, 'Flexible'], 'N' => [:overnight, 'Overnight'], 'O' => [:open, 'Open'], 'T' => [:term, 'Term'] }], NA, [:delivery, { 'D' => [:delivery_versus_payment, 'Delivery versus payment'], 'H' => [:hold_in_custody, 'Hold-in-custody'], 'T' => [:tri_party, 'Tri-party'] }]] }, 'S' => { symbol: :securities_lending, label: 'Securities lending', attributes: [[:underlying_assets, { 'C' => [:cash_collateral, 'Cash collateral'], 'G' => [:government_bonds, 'Government bonds'], 'P' => [:corporate_bonds, 'Corporate bonds'], 'T' => [:convertible_bonds, 'Convertible bonds'], 'E' => [:equity, 'Equity'], 'L' => [:letter_of_credit, 'Letter of credit'], 'D' => [:certificate_of_deposit, 'Certificate of deposit'], 'W' => [:warrants, 'Warrants'], 'K' => [:money_market_instruments, 'Money-market instruments'], 'M' => [:others, 'Others (miscellaneous)'] }], [:termination, { 'N' => [:overnight, 'Overnight'], 'O' => [:open, 'Open'], 'T' => [:term, 'Term'] }], NA, [:delivery, { 'D' => [:delivery_versus_payment, 'Delivery versus payment'], 'F' => [:free_of_payment, 'Free of payment'], 'H' => [:hold_in_custody, 'Hold-in-custody'], 'T' => [:tri_party, 'Tri-party'] }]] } }, 'T' => { 'C' => { symbol: :currencies, label: 'Currencies', attributes: [[:type, { 'N' => [:national_currency, 'National currency'], 'L' => [:legacy_currency, 'Legacy currency'], 'C' => [:bullion_coins, 'Bullion coins'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, NA] }, 'T' => { symbol: :commodities, label: 'Commodities', attributes: [[:underlying_assets, COMMODITY_ASSETS], NA, NA, NA] }, 'R' => { symbol: :interest_rates, label: 'Interest rates', attributes: [[:interest_rate_type, { 'N' => [:nominal, 'Nominal'], 'V' => [:variable, 'Variable'], 'F' => [:fixed, 'Fixed'], 'R' => [:real, 'Real'], 'M' => [:others, 'Others (miscellaneous)'] }], [:calculation_frequency, { 'D' => [:daily, 'Daily'], 'W' => [:weekly, 'Weekly'], 'N' => [:monthly, 'Monthly'], 'Q' => [:quarterly, 'Quarterly'], 'S' => [:semi_annually, 'Semi-annually'], 'A' => [:annually, 'Annually'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA] }, 'I' => { symbol: :indices, label: 'Indices', attributes: [[:asset_class, { 'E' => [:equities, 'Equities'], 'D' => [:debt, 'Debt'], 'F' => [:collective_investment_vehicles, 'Collective investment vehicles'], 'R' => [:real_estate, 'Real estate'], 'T' => [:commodities, 'Commodities'], 'C' => [:currencies, 'Currencies'], 'M' => [:others, 'Others (miscellaneous)'] }], [:weighting, { 'P' => [:price_weighted, 'Price weighted'], 'C' => [:capitalization_weighted, 'Capitalization weighted'], 'E' => [:equal_weighted, 'Equal weighted'], 'F' => [:modified_market_cap_weighted, 'Modified market-cap weighted'], 'M' => [:others, 'Others (miscellaneous)'] }], [:return_type, { 'P' => [:price_return, 'Price return'], 'N' => [:net_total_return, 'Net total return'], 'G' => [:gross_total_return, 'Gross total return'], 'M' => [:others, 'Others (miscellaneous)'] }], NA] }, 'B' => { symbol: :baskets, label: 'Baskets', attributes: [[:composition, { 'E' => [:equities, 'Equities'], 'D' => [:debt, 'Debt'], 'F' => [:collective_investment_vehicles, 'Collective investment vehicles'], 'I' => [:indices, 'Indices'], 'T' => [:commodities, 'Commodities'], 'C' => [:currencies, 'Currencies'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, NA] }, 'D' => { symbol: :stock_dividends, label: 'Stock dividends', attributes: [[:equity_type, { 'S' => [:common_shares, 'Common/Ordinary shares'], 'P' => [:preferred_shares, 'Preferred/Preference shares'], 'C' => [:convertible_common_shares, 'Common/Ordinary convertible shares'], 'F' => [:convertible_preferred_shares, 'Preferred/Preference convertible shares'], 'L' => [:limited_partnership_units, 'Limited partnership units'], 'K' => [:collective_investment_vehicles, 'Collective investment vehicles'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, NA] }, 'M' => { symbol: :miscellaneous, label: 'Others (miscellaneous)', attributes: [NA, NA, NA, NA] } }, 'M' => { 'C' => { symbol: :combined_instruments, label: 'Combined instruments', attributes: [[:components, { 'S' => [:combination_of_shares, 'Combination of shares'], 'B' => [:combination_of_bonds, 'Combination of bonds'], 'H' => [:share_and_bond, 'Share and bond'], 'A' => [:share_and_warrant, 'Share and warrant'], 'W' => [:warrant_and_warrant, 'Warrant and warrant'], 'U' => [:fund_unit_and_other, 'Fund unit and other components'], 'M' => [:others, 'Others (miscellaneous)'] }], [:ownership_restrictions, OWNERSHIP], NA, [:form, FORM]] }, 'M' => { symbol: :other_assets, label: 'Other assets', attributes: [[:further_grouping, { 'R' => [:real_estate_deeds, 'Real estate deeds'], 'I' => [:insurance_policies, 'Insurance policies'], 'E' => [:escrow_receipts, 'Escrow receipts'], 'T' => [:trade_finance_instruments, 'Trade finance instruments'], 'N' => [:carbon_credit, 'Carbon credit'], 'P' => [:precious_metal_receipts, 'Precious metal receipts'], 'S' => [:other_otc_derivatives, 'Other OTC derivative products'], 'M' => [:others, 'Others (miscellaneous)'] }], NA, NA, NA] } } }.freeze
- ED_REDEMPTION_RULE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
Cross-position rule for group ED (depositary receipts on equities): when the underlying instrument (position 3) is common/ordinary shares (S) or limited partnership units (L), the redemption/conversion position (position 4) accepts only N (perpetual) or X.
{ category: 'E', group: 'D', underlying_position: 0, redemption_position: 1, restricted_underlyings: %w[S L].freeze, allowed_redemptions: %w[N X].freeze }.freeze
Class Method Summary collapse
-
.ed_rule_applies?(category_code, group_code, letters) ⇒ Boolean
private
Whether the ED (depositary receipts on equities) cross-position redemption rule applies to the given group and attribute letters — i.e.
-
.group(category_code, group_code) ⇒ Hash?
private
The group definition, or nil if unknown.
Class Method Details
.ed_rule_applies?(category_code, group_code, letters) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Whether the ED (depositary receipts on equities) cross-position redemption rule applies to the given group and attribute letters — i.e. this is an E/D code whose underlying triggers the redemption restriction, so the redemption position must hold one of ED_REDEMPTION_RULE's allowed values. Shared by generation (enforcement) and validation so the two never drift.
1015 1016 1017 1018 1019 |
# File 'lib/sec_id/cfi/tables.rb', line 1015 def self.ed_rule_applies?(category_code, group_code, letters) rule = ED_REDEMPTION_RULE category_code == rule[:category] && group_code == rule[:group] && rule[:restricted_underlyings].include?(letters[rule[:underlying_position]]) end |
.group(category_code, group_code) ⇒ Hash?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns the group definition, or nil if unknown.
1027 1028 1029 |
# File 'lib/sec_id/cfi/tables.rb', line 1027 def self.group(category_code, group_code) GROUPS.dig(category_code, group_code) end |