**Dataset**: analyst45
**Region**: EUR
**Delay**: 1

# analyst45 Feature Engineering Analysis Report

**Dataset**: analyst45
**Category**: analyst
**Region**: EUR
**Analysis Date**: 2024-01-15
**Fields Analyzed**: 48

---

## Executive Summary

**Primary Question Answered by Dataset**: What does this dataset fundamentally measure?
This dataset captures the complete lifecycle and performance attribution of analyst-generated investment ideas, tracking realized and unrealized profit/loss, risk-adjusted returns (Jensen's alpha), conviction levels (probability scores), and benchmark-relative performance. It provides granular visibility into active portfolio construction decisions including entry/exit pricing, position scaling, duration management, and multi-currency exposure decomposition.

**Key Insights from Analysis**:
- Dataset uniquely distinguishes between realized (hard) and unrealized (paper) returns, enabling analysis of position closure discipline versus open risk exposure
- Contains explicit analyst conviction quantification (probability) allowing meta-analysis of analyst calibration (do high conviction ideas outperform?)
- Provides risk-adjusted performance metrics (Jensen's alpha, beta) separating market beta from idiosyncratic alpha generation
- Captures currency decomposition (tot_ret vs tot_ret_wo_fx) isolating FX P&L from stock selection skill
- Tracks idea aging (avg_dur) enabling time-decay analysis of analyst edge

**Critical Field Relationships Identified**:
- tot_ret = real_ret + unreal_ret (accounting identity for total P&L decomposition)
- Jensen's alpha connects raw returns (tot_ret_per) with systematic risk exposure (beta) to isolate pure stock-picking skill
- ret_per_today and prc_change_per_today capture daily mark-to-market dynamics versus price action
- current_inv vs initial_inv reveals position scaling behavior (pyramiding/de-risking)
- target_prc versus prev_close_prc quantifies remaining upside conviction

**Most Promising Feature Concepts**:
1. **Realization Ratio** (real_ret/tot_ret) - because it measures analyst discipline in taking profits versus letting winners run; high values indicate conviction in closing positions, low values indicate open risk tolerance
2. **Alpha Velocity** (jensensalpha/avg_dur) - because it normalizes risk-adjusted returns by time, revealing which ideas generate excess returns fastest rather than just cumulative performance
3. **Conviction-Weighted Alpha** (probability * jensensalpha) - because it aligns analyst sizing signals with risk-adjusted outcomes; identifies whether analysts correctly allocate capital to their best ideas
4. **Daily Return Anomaly** (ret_per_today vs ad_ret_per) - because it detects acceleration/deceleration in performance versus historical averages, signaling potential inflection points

---

## Dataset Deep Understanding

### Dataset Description
analyst45 is a comprehensive analyst idea tracking dataset capturing individual investment recommendations from initiation to closure. It measures absolute and relative performance against customizable benchmarks, decomposes returns into stock selection, FX, and transaction cost components, and quantifies analyst conviction through probability scores. The dataset enables analysis of idea aging effects, position scaling behaviors, and the efficacy of price targeting.

### Field Inventory
| Field ID | Description | Data Type | Update Frequency | Coverage |
|----------|-------------|-----------|------------------|----------|
| anl45_tot_ret | Sum of realised and unrealised returns | Vector | Daily | 100% |
| anl45_real_ret | The realised return on an idea (closed portions) | Vector | Daily | 100% |
| anl45_unreal_ret | The unrealised return on an open idea | Vector | Daily | 100% |
| anl45_tot_ret_per | Total return as a percentage of average investment | Vector | Daily | 100% |
| anl45_ad_ret_per | Average daily percent return over lifetime of idea | Vector | Daily | 100% |
| anl45_ret_per_today | Percentage return since last market close | Vector | Daily | 100% |
| anl45_prc_change_per_today | Percent change in stock price since previous close | Vector | Daily | 100% |
| anl45_jensensalpha | Risk-adjusted performance (excess return over CAPM) | Vector | Monthly | 100% |
| anl45_probability | Quantitative measure of analyst conviction | Vector | Varies | 85% |
| anl45_avg_dur | Average age/duration of the idea in days | Vector | Daily | 100% |
| anl45_target_prc | Analyst's estimated exit price for the idea | Vector | Varies | 80% |
| anl45_current_inv | Current investment amount (including partial closures) | Vector | Daily | 100% |
| anl45_initial_inv | Initial capital committed to the idea | Vector | Daily | 100% |
| anl45_real_value | Value of realised (closed) parts | Vector | Daily | 100% |
| anl45_unreal_value | Unrealised value of open position | Vector | Daily | 100% |
| anl45_rel_index_ret_per | Difference in return % versus comparative index | Vector | Daily | 100% |
| anl45_stock_ret_per_relative | Return had all investments been in relative index | Vector | Daily | 100% |
| anl45_tot_ret_wo_fx | Return ignoring FX considerations | Vector | Daily | 100% |
| anl45_transaction_charge | Transaction fee charged | Vector | Per trade | 100% |
| anl45_net_market_exposure | Difference between long and short fractional value | Vector | Daily | 100% |

*(Additional fields include price levels, currency codes, and benchmark metrics)*

### Field Deconstruction Analysis

#### anl45_tot_ret: Total Economic Return
- **What is being measured?**: The complete mark-to-market profit or loss of an investment idea since inception, combining both realized cash flows and unrealized open positions.
- **How is it measured?**: Sum of all realized gains/losses from closed portions plus current unrealized value of open portions, calculated in performance currency.
- **Time dimension**: Cumulative from idea inception to current date; permanent record of value creation/destruction.
- **Business context**: Fundamental measure of idea success; ultimate scorecard for analyst recommendations.
- **Generation logic**: Accounting identity: real_ret + unreal_ret; updated daily with market prices.
- **Reliability considerations**: Unrealized component subject to volatility; realized component is permanent but may miss future reversals.

#### anl45_real_ret: Realized (Hard) Returns
- **What is being measured?**: Locked-in profits or losses from portions of the idea that have been closed out.
- **How is it measured?**: Difference between closed_prc and avg_initial_prc multiplied by closed shares, net of fees.
- **Time dimension**: Cumulative and permanent; once realized cannot be reversed by future price movements.
- **Business context**: Measures analyst's ability to time exits and take profits/cut losses decisively.
- **Generation logic**: Based on actual trade executions; represents completed decisions.
- **Reliability considerations**: High reliability as it reflects actual cash flows; however, early realization may forgo future gains.

#### anl45_unreal_ret: Unrealized (Paper) Returns
- **What is being measured?**: Mark-to-market gains or losses on the remaining open position.
- **How is it measured?**: Current market value minus cost basis of open shares.
- **Time dimension**: Fluctuating daily with market prices; at risk of future volatility.
- **Business context**: Exposes analyst to future risk/reward; measures comfort with open risk.
- **Generation logic**: Based on current market prices (prev_close_prc) versus avg_initial_prc.
- **Reliability considerations**: Vulnerable to gap risk and overnight moves; may never be realized if position changes.

#### anl45_jensensalpha: Risk-Adjusted Excess Return
- **What is being measured?**: Average return earned above the expected return given the idea's systematic risk (beta).
- **How is it measured?**: Actual portfolio return minus (risk_free_rate + beta * (market_return - risk_free_rate)).
- **Time dimension**: Calculated over the life of the idea; updated monthly based on 20-month rolling beta.
- **Business context**: Isolates pure stock-picking skill by removing market beta contribution.
- **Generation logic**: Regression-based residual; positive values indicate outperformance per unit of risk.
- **Reliability considerations**: Beta estimate (20-month lookback) may not capture current risk profile; assumes CAPM holds.

#### anl45_probability: Analyst Conviction Score
- **What is being measured?**: Quantitative expression of the analyst's confidence in the idea's success.
- **How is it measured?**: Ordinal or cardinal scale assigned by analyst (likely 0-1 or 0-100).
- **Time dimension**: Point-in-time estimate; may be updated via new_value/old_value fields.
- **Business context**: Meta-signal about idea quality; should correlate with risk-adjusted returns if analyst is calibrated.
- **Generation logic**: Subjective assessment converted to numerical value.
- **Reliability considerations**: Potential overconfidence bias; may not be consistently applied across analysts.

#### anl45_avg_dur: Idea Aging
- **What is being measured?**: Time-weighted average holding period of the idea.
- **How is it measured?**: Sum of (position_size * holding_days) / average_position_size.
- **Time dimension**: Accumulating; increases as position ages.
- **Business context**: Captures time-decay of analyst edge; older ideas may have stale catalysts.
- **Generation logic**: Automatic calculation based on inception date and position changes.
- **Reliability considerations**: Accurate measure of time exposure; useful for velocity calculations.

### Field Relationship Mapping

**The Story This Data Tells**:
The dataset narrates the journey of investment ideas from conception to closure. It begins with initial_inv and a target_prc, tracking how the idea evolves through time (avg_dur) while generating returns via stock appreciation (tot_ret_wo_fx) and currency movements (FX components). Along the way, the analyst expresses conviction (probability) while managing risk (beta, net_market_exposure). The story culminates in either full realization (real_ret) or continued speculation (unreal_ret), with Jensen's alpha determining whether the journey created value after adjusting for the market ride.

**Key Relationships Identified**:
1. **Return Decomposition**: tot_ret = real_ret + unreal_ret = tot_ret_wo_fx + FX_component. This allows attribution of performance to stock selection versus currency timing.
2. **Risk-Return Efficiency**: jensensalpha correlates with probability (conviction) and avg_dur (time). High alpha with low duration indicates efficient idea generation; high probability with low alpha indicates overconfidence.
3. **Scaling Behavior**: current_inv versus initial_inv reveals whether analysts add to winners (current_inv > initial_inv) or cut losers.
4. **Target Achievement**: target_prc versus period_end_prc measures the remaining gap to analyst's expected value, indicating upside remaining or target revision needs.

**Missing Pieces That Would Complete the Picture**:
- Sector/industry classification to enable relative value analysis within groups
- Analyst identifier to track individual skill persistence and calibration
- Catalyst/event dates to align return jumps with specific announcements
- Short interest or borrow costs for short ideas to complete cost analysis

---

## Feature Concepts by Question Type

### Q1: "What is stable?" (Invariance Features)

**Concept**: Return Consistency Regime
- **Sample Fields Used**: ad_ret_per
- **Definition**: Rolling 20-day standard deviation of average daily returns to identify periods of stable versus volatile performance generation
- **Why This Feature**: Low volatility in daily returns suggests consistent edge application; high volatility suggests event-driven or noisy performance. Stable return generation indicates repeatable process.
- **Logical Meaning**: Measures the reliability of the analyst's return stream. Invariant (low) values suggest the idea is performing as expected without erratic moves.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Lower values indicate more stable, predictable return generation (positive for risk management); higher values indicate erratic performance.
- **Boundary Conditions**: Near-zero values suggest linear/predictable drift; extreme spikes indicate binary events or liquidity shocks.
- **Implementation Example**: `ts_std_dev(vec_avg({ad_ret_per}), 20)`

**Concept**: Realization Stability Ratio
- **Sample Fields Used**: real_ret, tot_ret
- **Definition**: Proportion of total returns that have been realized versus remaining unrealized, indicating position closure stability
- **Why This Feature**: Values near 1.0 indicate the analyst has captured most gains (conservative/disciplined); near 0 indicates high open risk. Stability in this ratio over time suggests consistent risk management philosophy.
- **Logical Meaning**: Invariant toward 1.0 suggests profit-taking discipline; oscillating values suggest indecision or conviction swings.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Higher values (closer to 1) indicate lower remaining risk exposure; negative values indicate realized losses with unrealized recovery attempts.
- **Boundary Conditions**: 1.0 = fully realized; 0.0 = entirely unrealized; >1 (possible if unrealized negative) suggests realized profits exceed total (realized gains + unrealized losses).
- **Implementation Example**: `vec_avg({real_ret}) / vec_avg({tot_ret})`

---

### Q2: "What is changing?" (Dynamics Features)

**Concept**: Return Momentum Divergence
- **Sample Fields Used**: ret_per_today, ad_ret_per
- **Definition**: Difference between today's return and the historical average daily return, capturing acceleration or deceleration in performance
- **Why This Feature**: Positive divergence indicates momentum acceleration (catalyst working); negative divergence suggests fading momentum. Detects inflection points in idea efficacy.
- **Logical Meaning**: Change in the rate of return generation. Sustained positive values suggest improving fundamentals or expanding valuation multiples.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Positive values indicate today's performance exceeds historical average (acceleration); negative indicates deceleration.
- **Boundary Conditions**: Large positive spikes indicate catalyst realization; large negative values indicate profit-taking or negative news.
- **Implementation Example**: `vec_avg({ret_per_today}) - vec_avg({ad_ret_per})`

**Concept**: Unrealized Erosion Velocity
- **Sample Fields Used**: unreal_ret_today, unreal_ret
- **Definition**: Daily change in unrealized returns as a fraction of total unrealized value, measuring how quickly paper profits are eroding or accumulating
- **Why This Feature**: Rapid erosion (high negative values) suggests the analyst is holding through drawdowns (stubbornness); positive values suggest mark-to-market gains. Measures the "bleed" rate of open positions.
- **Logical Meaning**: Rate of change in unrealized wealth. Persistent negative values indicate aging ideas losing momentum.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Negative values indicate unrealized losses accelerating (dangerous); positive values indicate unrealized gains growing.
- **Boundary Conditions**: -1.0 would mean total wipeout of unrealized value in one day (rare); values near 0 suggest stability.
- **Implementation Example**: `vec_avg({unreal_ret_today}) / abs(vec_avg({unreal_ret}))`

---

### Q3: "What is anomalous?" (Deviation Features)

**Concept**: Price-Return Divergence Gap
- **Sample Fields Used**: ret_per_today, prc_change_per_today
- **Definition**: Difference between total return percentage and pure price change percentage, isolating non-price return contributions (dividends, FX, fees)
- **Why This Feature**: Large divergences indicate significant FX or dividend events; persistent gaps suggest currency translation effects dominating stock performance. Detects when returns are "artificial" versus fundamental.
- **Logical Meaning**: Anomaly detection for return composition. Expected to be near zero for equity ideas; deviations reveal hidden factors.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Positive values indicate return sources beyond price appreciation (dividends, favorable FX); negative values indicate fees or adverse FX eroding price gains.
- **Boundary Conditions**: Extreme values indicate currency crises or special dividends; near-zero values indicate pure price-driven returns.
- **Implementation Example**: `vec_avg({ret_per_today}) - vec_avg({prc_change_per_today})`

**Concept**: Benchmark Deviation Shock
- **Sample Fields Used**: rel_index_ret_per, jensensalpha
- **Definition**: Absolute deviation of relative index return from the expected Jensen's alpha, capturing unexplained benchmark divergence
- **Why This Feature**: Large deviations suggest market stress or idiosyncratic events causing temporary dislocation from normal beta-adjusted expectations. Identifies when ideas behave "strangely" relative to their risk profile.
- **Logical Meaning**: Magnitude of surprise in relative performance. High values indicate the idea is decoupling from its benchmark relationship.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Higher absolute values indicate greater anomaly; sign indicates direction of surprise (positive = outperforming expectations).
- **Boundary Conditions**: Extreme outliers indicate earnings surprises or M&A activity; clustered values indicate normal tracking error.
- **Implementation Example**: `abs(vec_avg({rel_index_ret_per})) - abs(vec_avg({jensensalpha}))`

---

### Q4: "What is combined?" (Interaction Features)

**Concept**: Conviction-Weighted Alpha Score
- **Sample Fields Used**: probability, jensensalpha
- **Definition**: Multiplicative interaction between analyst conviction and risk-adjusted return, aligning sizing decisions with quality outcomes
- **Why This Feature**: High values occur when analysts correctly allocate high conviction to high-alpha ideas; low values with high conviction indicate miscalibration. Measures the "wisdom" of position sizing.
- **Logical Meaning**: Synthesis of qualitative judgment (probability) and quantitative outcome (alpha). Captures whether analysts know their own skill.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Positive values indicate conviction justified by alpha; negative values with high probability indicate overconfidence (high conviction, negative alpha).
- **Boundary Conditions**: Maximum when perfect calibration occurs; minimum when high conviction meets large negative alpha.
- **Implementation Example**: `multiply(vec_avg({probability}), vec_avg({jensensalpha}))`

**Concept**: FX Contribution Spread
- **Sample Fields Used**: tot_ret, tot_ret_wo_fx
- **Definition**: Difference between total return and FX-neutral return, isolating pure currency translation P&L from stock selection
- **Why This Feature**: Quantifies how much of the "story" is currency timing versus stock picking. Large values indicate FX trading overlay; near-zero indicates pure equity focus.
- **Logical Meaning**: Interaction between local asset performance and exchange rate movements. Separates two distinct alpha sources.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Positive values indicate currency tailwinds enhancing returns; negative values indicate FX headwinds detracting from stock performance.
- **Boundary Conditions**: Equal to tot_ret when stock is flat (pure FX play); zero when FX rate unchanged.
- **Implementation Example**: `vec_avg({tot_ret}) - vec_avg({tot_ret_wo_fx})`

---

### Q5: "What is structural?" (Composition Features)

**Concept**: Realization Ratio Structure
- **Sample Fields Used**: real_ret, tot_ret
- **Definition**: Proportion of total P&L derived from realized (closed) positions versus unrealized (open) marks
- **Why This Feature**: Reveals structural approach to risk: high ratios indicate "bird in hand" philosophy; low ratios indicate "let winners run" approach. Critical for understanding tail risk exposure.
- **Logical Meaning**: Composition of returns by certainty. Realized is certain; unrealized is speculative.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Higher values indicate conservative/skeptical structure; lower values indicate aggressive/growth-oriented structure.
- **Boundary Conditions**: 1.0 = fully closed (no risk); 0.0 = fully open (maximum risk); negative values indicate realized losses with open recovery attempts.
- **Implementation Example**: `divide(vec_avg({real_ret}), vec_avg({tot_ret}))`

**Concept**: Fee Drag Coefficient
- **Sample Fields Used**: transaction_charge, initial_inv
- **Definition**: Transaction costs as a percentage of initial capital deployed, measuring structural cost burden of the strategy
- **Why This Feature**: High values indicate high-turnover or high-cost execution; low values indicate efficient execution. Structural drag on compounding.
- **Logical Meaning**: Proportion of capital consumed by friction. Persistent high values indicate structural disadvantage.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Lower values indicate efficient capital deployment; higher values indicate excessive trading or expensive execution.
- **Boundary Conditions**: Near-zero for buy-and-hold; >0.10 (10%) for high-frequency trading strategies.
- **Implementation Example**: `divide(vec_avg({transaction_charge}), vec_avg({initial_inv}))`

---

### Q6: "What is cumulative?" (Accumulation Features)

**Concept**: Capital Scaling Multiplier
- **Sample Fields Used**: current_inv, initial_inv
- **Definition**: Ratio of current investment to initial investment, tracking cumulative position sizing decisions over the life of the idea
- **Why This Feature**: Values >1 indicate pyramiding (adding to position); <1 indicate de-risking. Cumulative measure of analyst confidence evolution.
- **Logical Meaning**: Accumulation of capital commitment. Increasing values indicate growing conviction; decreasing values indicate doubt or risk management.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Values >1 indicate accumulation; <1 indicate distribution; =1 indicates static sizing.
- **Boundary Conditions**: 0 = full exit; very high values (5+) indicate aggressive pyramiding or compounding gains into larger positions.
- **Implementation Example**: `divide(vec_avg({current_inv}), vec_avg({initial_inv}))`

**Concept**: Duration-Weighted Return Efficiency
- **Sample Fields Used**: tot_ret_per, avg_dur
- **Definition**: Total return percentage normalized by average duration, measuring the velocity of wealth creation (return per unit time)
- **Why This Feature**: Distinguishes between slow, grinding returns and rapid alpha generation. High values indicate efficient time usage; low values indicate capital tied up too long for the return generated.
- **Logical Meaning**: Cumulative return intensity. Annualizes performance without assuming 365-day constant exposure.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Higher values indicate faster capital turnover and return generation; near-zero indicates stale positions with minimal return.
- **Boundary Conditions**: Infinite as duration approaches 0 (day trades); approaches 0 as duration extends with flat returns.
- **Implementation Example**: `divide(vec_avg({tot_ret_per}), vec_avg({avg_dur}))`

---

### Q7: "What is relative?" (Comparison Features)

**Concept**: Target Achievement Gap
- **Sample Fields Used**: target_prc, period_end_prc
- **Definition**: Percentage distance remaining to reach the analyst's stated price target, indicating relative upside remaining
- **Why This Feature**: Small gaps suggest targets nearly achieved (time to exit); large negative gaps suggest significant underperformance versus expectations. Measures remaining alpha potential.
- **Logical Meaning**: Relative position in the journey from entry to target. Indicates how much of the thesis has played out.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Positive values indicate upside remaining to target; negative values indicate target exceeded (analyst too conservative) or price fallen below target.
- **Boundary Conditions**: 0 = target reached; +100% = double to reach target; -50% = price half of target (missed).
- **Implementation Example**: `divide(subtract(vec_avg({target_prc}), vec_avg({period_end_prc})), vec_avg({period_end_prc}))`

**Concept**: Benchmark Opportunity Cost Capture
- **Sample Fields Used**: stock_ret_per_relative, ad_ret_per
- **Definition**: Difference between the benchmark alternative return and the idea's actual average daily return, quantifying the cost/benefit of active selection over passive indexing
- **Why This Feature**: Positive values indicate successful active management (beating the bench); negative values indicate underperformance. Relative skill validation.
- **Logical Meaning**: Comparison against the counterfactual (what if indexed?). Captures the value of the analyst's work.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Positive values indicate outperformance versus benchmark alternative; negative values indicate opportunity cost of active selection.
- **Boundary Conditions**: Large positive = strong alpha; large negative = would have been better in index; zero = parity with benchmark.
- **Implementation Example**: `subtract(vec_avg({stock_ret_per_relative}), vec_avg({ad_ret_per}))`

---

### Q8: "What is essential?" (Essence Features)

**Concept**: Pure Alpha Velocity
- **Sample Fields Used**: jensensalpha, avg_dur
- **Definition**: Risk-adjusted excess return (Jensen's alpha) divided by holding duration, extracting the essential rate of stock-picking skill independent of time exposure
- **Why This Feature**: Strips away time factor to reveal the speed of alpha generation. Captures the essence of "good ideas fast" versus "good ideas slowly."
- **Logical Meaning**: Essential productivity of the analyst. High values indicate rapid insight capture; low values indicate correct but slow-developing ideas.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Higher values indicate more efficient alpha generation per unit time; negative values indicate destruction of value even after risk adjustment.
- **Boundary Conditions**: Infinite for instant alpha (day trades with high returns); approaches zero for long-duration marginal alphas.
- **Implementation Example**: `divide(vec_avg({jensensalpha}), vec_avg({avg_dur}))`

**Concept**: Exposure-Efficiency Ratio
- **Sample Fields Used**: tot_ret_per, net_market_exposure
- **Definition**: Total return percentage generated per unit of net market exposure, measuring the purity of return generation relative to directional risk taken
- **Why This Feature**: Essential measure of market-neutrality efficacy. High values indicate high return with low net exposure (pure alpha); low values indicate returns driven by market beta.
- **Logical Meaning**: Efficiency of converting market risk into return. Ideal market-neutral ideas have high values with zero exposure.
- **is filling nan necessary**: we have some operators to fill nan value like ts_backfill() or group_mean() etc. however, in some cases, if the nan value itself has some meaning, then we should not fill it blindly since it may introduce some bias. so before filling nan value, we should think about whether the nan value has some meaning in the specific scenario. If yes, do use appropriate method to fill nan value in the following implementation example.
- **Directionality**: Higher values indicate efficient use of risk capital; negative values indicate losses amplified by exposure.
- **Boundary Conditions**: Undefined at zero exposure (pure alpha); high values with low exposure indicate true skill.
- **Implementation Example**: `divide(vec_avg({tot_ret_per}), vec_avg({net_market_exposure}))`

---

## Implementation Considerations

### Data Quality Notes
- **Coverage**: Probability and target_prc fields show ~80-85% coverage, suggesting optional analyst inputs; other fields appear complete.
- **Timeliness**: Daily updates for price and return fields; monthly for beta and Jensen's alpha (20-month lookback introduces lag in risk calculations).
- **Accuracy**: Realized returns based on trade executions are highly accurate; unrealized returns subject to end-of-day pricing availability.
- **Potential Biases**: Survivorship bias toward open ideas with positive unrealized returns (losers may be closed quickly, inflating avg_dur for winners); analyst probability scores subject to overconfidence bias.

### Computational Complexity
- **Lightweight features**: Realization Ratio, FX Spread, Fee Drag (single division operations on vector averages)
- **Medium complexity**: Return Consistency Regime (requires ts_std_dev over 20 days), Capital Scaling (simple division but requires state tracking)
- **Heavy computation**: Features requiring cross-sectional ranking or complex time series regression; current set avoids heavy operators

### Recommended Prioritization

**Tier 1 (Immediate Implementation)**:
1. **Realization Ratio** - Critical for risk management; simple calculation; high interpretability
2. **Pure Alpha Velocity** - Core metric for analyst skill assessment; directly uses key value-added fields (jensensalpha)
3. **Conviction-Weighted Alpha** - Tests analyst calibration; high business value for process improvement

**Tier 2 (Secondary Priority)**:
1. **Return Momentum Divergence** - Useful for timing but noisy; requires careful interpretation
2. **Target Achievement Gap** - Valuable for exit timing but dependent on target_prc coverage
3. **Fee Drag Coefficient** - Important for cost analysis but transaction_charge may be sparse for old ideas

**Tier 3 (Requires Further Validation)**:
1. **Exposure-Efficiency Ratio** - Requires validation that net_market_exposure is calculated consistently across long/short ideas
2. **Unrealized Erosion Velocity** - Highly volatile; may generate false signals during normal market noise

---

## Critical Questions for Further Exploration

### Unanswered Questions:
1. How does the avg_dur calculation handle partial closures? Does it weight by time or by capital?
2. What is the exact calculation methodology for probability - is it a formal confidence interval or subjective 0-1 scale?
3. How are dividends handled in tot_ret_wo_fx versus tot_ret? Are they included in both or excluded from FX-neutral?

### Recommended Additional Data:
- Analyst identifier/team to enable persistence and calibration analysis across time
- Entry/exit timestamps to analyze intraday versus close timing skill
- Sector classifications to enable relative ranking within industries
- Stop-loss trigger prices to analyze risk management discipline

### Assumptions to Challenge:
- That Jensen's alpha with 20-month beta is current enough for short-duration ideas (<3 months)
- That probability scores are consistently applied across different analysts and asset classes
- That target_prc represents a static estimate rather than a moving target (check new_value/old_value usage)

---

## Methodology Notes

**Analysis Approach**: This report was generated by:
1. Deep field deconstruction to understand data essence (realized vs unrealized, risk-adjusted vs raw, absolute vs relative)
2. Question-driven feature generation (8 fundamental questions applied to analyst performance domain)
3. Logical validation of each feature concept against investment management theory
4. Transparent documentation of reasoning and edge cases

**Design Principles**:
- Focus on logical meaning over conventional technical indicators (e.g., prioritizing realization ratio over simple moving averages)
- Every feature must answer a specific question about analyst behavior or idea quality
- Emphasis on risk-adjusted and time-normalized metrics appropriate for active management
- Clear documentation of "why" for each suggestion linking to behavioral finance concepts

---

*Report generated: 2024-01-15*
*Analysis depth: Comprehensive field deconstruction + 8-question framework*
*Next steps: Implement Tier 1 features, validate assumptions regarding beta timeliness, gather additional data on analyst identifiers*