Skip to content
Hero Background Light

Using LinkedIn Data for Investing: Employee and Follower Metrics

Using LinkedIn Data for Investing: Employee and Follower Metrics

LinkedIn has become an unexpected goldmine for investors. Employee counts, hiring trends, and follower growth can reveal company health months before it shows up in quarterly reports.

Why LinkedIn Data Matters

LinkedIn is where companies and employees publicly signal their status:

  • Employee counts reflect hiring and layoffs in near real-time
  • Follower growth indicates market interest and brand momentum
  • Job postings reveal strategic priorities and expansion plans

This data often moves before official announcements.

The Information Advantage

Traditional SourceLinkedIn Alternative
Annual 10-K headcountWeekly employee count updates
Quarterly earnings callsReal-time hiring signals
Press release layoffsEarly detection of workforce changes
Brand surveysFollower growth as interest proxy

Key LinkedIn Metrics

1. Employee Count

The total number of employees listed on LinkedIn. Changes indicate:

TrendPotential Signal
Steady growthHealthy expansion, confidence
Rapid growthAggressive hiring, scaling up
PlateauHiring freeze, cautious outlook
DeclineLayoffs, restructuring, trouble

2. Follower Count

Total LinkedIn followers for the company page:

TrendPotential Signal
Growing followersIncreasing brand interest
Viral spikesNews event, product launch
Declining growthFading relevance

Accessing LinkedIn Data

from finbrain import FinBrainClient
fb = FinBrainClient(api_key="YOUR_API_KEY")
# Get LinkedIn metrics for Meta
df = fb.linkedin_data.ticker("S&P 500", "META", as_dataframe=True)
print(df.tail())
# employeeCount followersCount
# date
# 2024-01-15 67000 12500000
# 2024-01-14 67200 12480000
# Calculate changes
df["employee_change"] = df["employeeCount"].diff()
df["employee_pct"] = df["employeeCount"].pct_change() * 100
df["follower_change"] = df["followersCount"].diff()
print(f"\nRecent employee change: {df['employee_change'].iloc[-1]:+,.0f}")
print(f"Recent follower change: {df['follower_change'].iloc[-1]:+,.0f}")

Investment Use Cases

1. Detecting Layoffs Early

Layoffs often appear in LinkedIn data before press releases:

def detect_workforce_reduction(df, threshold_pct=-2, window=30):
"""Detect significant workforce reductions"""
df = df.copy()
# Calculate rolling change
df["employee_delta"] = df["employeeCount"].diff(periods=window)
df["employee_delta_pct"] = (df["employee_delta"] / df["employeeCount"].shift(window)) * 100
# Find significant reductions
reductions = df[df["employee_delta_pct"] < threshold_pct]
return reductions[["employeeCount", "employee_delta", "employee_delta_pct"]]
reductions = detect_workforce_reduction(df)
if not reductions.empty:
print("Warning: Significant workforce reduction detected")
print(reductions.tail())

2. Identifying Hiring Momentum

Strong hiring often precedes growth:

def analyze_hiring_momentum(df, short_window=7, long_window=30):
"""Analyze hiring momentum"""
df = df.copy()
# Calculate growth rates
df["short_growth"] = df["employeeCount"].pct_change(periods=short_window) * 100
df["long_growth"] = df["employeeCount"].pct_change(periods=long_window) * 100
latest = df.iloc[-1]
# Determine momentum
if latest["short_growth"] > latest["long_growth"] and latest["short_growth"] > 0:
momentum = "accelerating"
elif latest["short_growth"] < latest["long_growth"] and latest["short_growth"] > 0:
momentum = "decelerating"
elif latest["short_growth"] < 0:
momentum = "contracting"
else:
momentum = "stable"
return {
"current_employees": latest["employeeCount"],
"short_term_growth": latest["short_growth"],
"long_term_growth": latest["long_growth"],
"momentum": momentum
}
momentum = analyze_hiring_momentum(df)
print(f"Hiring momentum: {momentum['momentum']}")
print(f"Short-term growth: {momentum['short_term_growth']:.2f}%")
print(f"Long-term growth: {momentum['long_term_growth']:.2f}%")

3. Comparing Competitors

Compare workforce trends across competitors:

def compare_workforce(tickers, market="S&P 500"):
"""Compare workforce metrics across competitors"""
fb = FinBrainClient(api_key="YOUR_API_KEY")
results = []
for ticker in tickers:
try:
df = fb.linkedin_data.ticker(market, ticker, as_dataframe=True)
if df.empty or len(df) < 30:
continue
latest = df.iloc[-1]
month_ago = df.iloc[-30] if len(df) >= 30 else df.iloc[0]
monthly_change = latest["employeeCount"] - month_ago["employeeCount"]
monthly_pct = (monthly_change / month_ago["employeeCount"]) * 100
results.append({
"ticker": ticker,
"employees": latest["employeeCount"],
"followers": latest["followersCount"],
"monthly_change": monthly_change,
"monthly_pct": monthly_pct
})
except:
continue
return sorted(results, key=lambda x: x["monthly_pct"], reverse=True)
# Compare big tech
big_tech = ["AAPL", "MSFT", "GOOGL", "AMZN", "META", "NVDA"]
comparison = compare_workforce(big_tech)
print("=== Workforce Comparison (30-day) ===\n")
for c in comparison:
direction = "+" if c["monthly_change"] >= 0 else ""
print(f"{c['ticker']}: {c['employees']:,} employees ({direction}{c['monthly_change']:,.0f}, {c['monthly_pct']:+.1f}%)")

4. Follower Growth Analysis

Track brand momentum through follower growth:

def analyze_follower_growth(df):
"""Analyze follower growth trends"""
df = df.copy()
# Daily follower gains
df["new_followers"] = df["followersCount"].diff()
# Average daily gains
avg_daily = df["new_followers"].tail(30).mean()
# Recent vs historical
recent = df["new_followers"].tail(7).mean()
historical = df["new_followers"].tail(90).mean()
if recent > historical * 1.5:
trend = "viral growth"
elif recent > historical * 1.1:
trend = "accelerating"
elif recent < historical * 0.5:
trend = "declining"
else:
trend = "stable"
return {
"current_followers": df["followersCount"].iloc[-1],
"avg_daily_gain": avg_daily,
"recent_daily_gain": recent,
"trend": trend
}
growth = analyze_follower_growth(df)
print(f"Follower trend: {growth['trend']}")
print(f"Average daily new followers: {growth['avg_daily_gain']:,.0f}")

5. Building a Workforce Health Screen

Create a screen based on workforce metrics:

def workforce_health_screen(tickers, market="S&P 500"):
"""Screen stocks based on workforce health"""
fb = FinBrainClient(api_key="YOUR_API_KEY")
passed = []
for ticker in tickers:
try:
df = fb.linkedin_data.ticker(market, ticker, as_dataframe=True)
if df.empty or len(df) < 30:
continue
latest = df.iloc[-1]
month_ago = df.iloc[-30]
# Criteria
monthly_growth = (latest["employeeCount"] - month_ago["employeeCount"]) / month_ago["employeeCount"]
follower_growth = (latest["followersCount"] - month_ago["followersCount"]) / month_ago["followersCount"]
# Pass if:
# 1. Not shrinking workforce (> -1%)
# 2. Follower growth positive
if monthly_growth > -0.01 and follower_growth > 0:
passed.append({
"ticker": ticker,
"employees": latest["employeeCount"],
"employee_growth": monthly_growth * 100,
"follower_growth": follower_growth * 100
})
except:
continue
return sorted(passed, key=lambda x: x["employee_growth"], reverse=True)
# Screen tech stocks
tech_stocks = ["AAPL", "MSFT", "GOOGL", "AMZN", "META", "NVDA", "CRM", "ORCL"]
healthy = workforce_health_screen(tech_stocks)
print("=== Stocks Passing Workforce Health Screen ===\n")
for h in healthy:
print(f"{h['ticker']}: {h['employees']:,} employees ({h['employee_growth']:+.1f}% monthly)")

Sector Considerations

LinkedIn data is most valuable for:

SectorWhy It Matters
TechnologyTalent is the primary asset
Professional ServicesHeadcount drives revenue
HealthcareStaffing indicates capacity
FinanceHiring signals deal flow

Less relevant for:

  • Manufacturing (automation-heavy)
  • Retail (high turnover, seasonal)
  • Companies with mostly non-LinkedIn demographics

Combining with Other Signals

LinkedIn data works best combined with other metrics:

def combined_health_check(market, ticker):
"""Combine LinkedIn with other alternative data"""
fb = FinBrainClient(api_key="YOUR_API_KEY")
signals = []
# LinkedIn workforce
linkedin_df = fb.linkedin_data.ticker(market, ticker, as_dataframe=True)
if not linkedin_df.empty and len(linkedin_df) >= 30:
growth = (linkedin_df["employeeCount"].iloc[-1] - linkedin_df["employeeCount"].iloc[-30]) / linkedin_df["employeeCount"].iloc[-30]
if growth > 0.02:
signals.append(("linkedin", "bullish", f"Hiring +{growth*100:.1f}%"))
elif growth < -0.02:
signals.append(("linkedin", "bearish", f"Layoffs {growth*100:.1f}%"))
# Sentiment
sent_df = fb.sentiments.ticker(market, ticker, as_dataframe=True)
if not sent_df.empty:
if sent_df["sentiment"].iloc[-1] > 0.3:
signals.append(("sentiment", "bullish", "Positive news sentiment"))
elif sent_df["sentiment"].iloc[-1] < -0.3:
signals.append(("sentiment", "bearish", "Negative news sentiment"))
# Insider activity
insider_df = fb.insider_transactions.ticker(market, ticker, as_dataframe=True)
if not insider_df.empty:
purchases = insider_df[insider_df["transaction"].str.contains("Buy", na=False)]
if len(purchases) > 0:
signals.append(("insider", "bullish", "Insider buying detected"))
return signals
signals = combined_health_check("S&P 500", "META")
for source, direction, detail in signals:
print(f"[{source.upper()}] {direction}: {detail}")

Key Takeaways

  1. LinkedIn employee counts can reveal layoffs before official announcements
  2. Hiring acceleration often precedes revenue growth
  3. Follower growth indicates brand momentum and market interest
  4. Compare workforce trends against competitors for context
  5. Most valuable for knowledge-worker industries (tech, finance, professional services)

Track workforce trends with the LinkedIn Metrics Dataset and API Reference.