Rajandran R Creator of OpenAlgo - OpenSource Algo Trading framework for Indian Traders. Building GenAI Applications. Telecom Engineer turned Full-time Derivative Trader. Mostly Trading Nifty, Banknifty, High Liquid Stock Derivatives. Trading the Markets Since 2006 onwards. Using Market Profile and Orderflow for more than a decade. Designed and published 100+ open source trading systems on various trading tools. Strongly believe that market understanding and robust trading frameworks are the key to the trading success. Building Algo Platforms, Writing about Markets, Trading System Design, Market Sentiment, Trading Softwares & Trading Nuances since 2007 onwards. Author of Marketcalls.in

Gold Performance After VIX Spikes Above 30: A Comprehensive Analysis

12 min read

When market fear intensifies and the VIX (the “fear index”) spikes above 30, investors often rush to gold as a perceived safe haven. But is this strategy supported by historical data? I’ve conducted a thorough analysis of what happens to gold prices 1 week, 1 month, and 3 months after such fear events, and compared this performance to the S&P 500.

Gold’s Performance After Extreme Market Fear Events

Based on historical data from 2008 to 2025, I identified 48 distinct instances when the VIX crossed above 30, indicating periods of significant market fear. Here’s how gold performed following these events:

The analysis reveals:

  • 1 Week After: Gold delivered an average return of +0.43%
  • 1 Month After: Gold delivered an average return of +0.33%
  • 3 Months After: Gold delivered an average return of +1.54%

While these returns are positive, they’re relatively modest, especially in the 1-week and 1-month timeframes. Additionally, gold only produced positive returns in 52.1% of cases across all timeframes, meaning it declined in nearly half of the instances following VIX spikes above 30.

Is Gold Really a Better Safe Haven Than Stocks?

To determine if gold truly serves as a superior safe haven during market fear, I compared its performance to the S&P 500 during the same periods:

The comparison yields surprising results:

TimeframeGold Average ReturnS&P 500 Average ReturnDifference
1 Week+0.43%+1.44%-1.01%
1 Month+0.33%+1.78%-1.45%
3 Months+1.54%+5.91%-4.37%

Contrary to conventional wisdom, the S&P 500 significantly outperformed gold in all three timeframes following VIX spikes above 30. Not only were the average returns higher for the S&P 500, but the stock market also delivered positive returns more consistently:

  • S&P 500 had positive returns in 72.9% of cases after 1 week
  • S&P 500 had positive returns in 68.8% of cases after 1 month
  • S&P 500 had positive returns in 81.2% of cases after 3 months

These figures starkly contrast with gold’s 52.1% positive return rate across all timeframes.

Individual Return Comparison

When examining individual instances of VIX crossing above 30, gold outperformed the S&P 500 in only:

  • 29.2% of cases after 1 week
  • 37.5% of cases after 1 month
  • 29.2% of cases after 3 months

The scatter plot above shows 3-month returns after VIX exceeded 30, with each point representing a specific event. Points above the diagonal line indicate instances where gold outperformed the S&P 500 – and as we can see, there are relatively few such cases.

Distribution of Returns

The distribution of returns also reveals important insights:

The S&P 500 shows a wider range of returns but with a strong positive bias, particularly for 3-month returns. Gold, meanwhile, displays a more compressed range of outcomes but with less positive skew.

Gold’s Historical Outperformance Over Time

Has gold’s effectiveness as a safe haven during fear periods changed over time? The analysis suggests it has:

This chart shows the difference between gold and S&P 500 returns following VIX spikes above 30 over time. Values above zero indicate gold outperformance, while values below zero indicate S&P 500 outperformance. The trend suggests that gold has become less effective as a fear hedge in more recent years.

Python Source Code

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
import datetime
import seaborn as sns
from typing import List

# Global variable to store image titles
_mfajlsdf98q21_image_title_list = []

def fetch_data():
    """Fetch historical data for Gold (GLD ETF), VIX index, and S&P 500"""
    # Set the date range - use a relatively long period to capture various market conditions
    start_date = '2008-01-01'
    end_date = datetime.datetime.now().strftime('%Y-%m-%d')
    
    # Download data
    print("Downloading Gold (GLD), VIX, and S&P 500 data...")
    gld_data = yf.download('GLD', start=start_date, end=end_date)
    vix_data = yf.download('^VIX', start=start_date, end=end_date)
    spy_data = yf.download('SPY', start=start_date, end=end_date)  # S&P 500 ETF
    
    # Make sure all datasets have the same index (dates)
    common_dates = gld_data.index.intersection(vix_data.index).intersection(spy_data.index)
    gld_data = gld_data.loc[common_dates]
    vix_data = vix_data.loc[common_dates]
    spy_data = spy_data.loc[common_dates]
    
    # Create a DataFrame with the closing prices
    df = pd.DataFrame()
    df['Gold'] = gld_data['Close']
    df['VIX'] = vix_data['Close']
    df['SPY'] = spy_data['Close']  # S&P 500
    
    # Calculate returns
    df['Gold_Return'] = df['Gold'].pct_change()
    df['VIX_Change'] = df['VIX'].pct_change()
    df['SPY_Return'] = df['SPY'].pct_change()
    
    # Drop rows with NA values
    df = df.dropna()
    
    print(f"Data retrieved from {df.index.min().date()} to {df.index.max().date()}")
    print(f"Total data points: {len(df)}")
    
    return df

def analyze_vix_above_30(df):
    """
    Analyze Gold and S&P 500 performance when VIX crosses above 30, 
    looking at returns 1 week, 1 month, and 3 months later
    """
    print("\nAnalyzing Gold and S&P 500 Performance After VIX Exceeds 30")
    print("=" * 70)
    
    # Identify dates when VIX is above 30
    vix_above_30 = df['VIX'] >= 30
    
    # Create a shifted series (previous day's value)
    vix_above_30_prev = df['VIX'].shift(1) >= 30
    
    # Find crossings (current day is above 30, but previous day wasn't)
    # Using boolean logic instead of ~ operator
    crossings = vix_above_30 & (~vix_above_30_prev.fillna(False))
    
    # Get the dates where crossings occurred
    crossing_dates = df[crossings].index
    
    # For each crossing, calculate forward returns for both Gold and SPY
    results = []
    for date in crossing_dates:
        idx = df.index.get_loc(date)
        
        # Skip if too close to the end of dataframe for 3-month analysis
        if idx + 60 >= len(df):
            continue
            
        # Get future indices for different time periods
        week_idx = min(idx + 5, len(df) - 1)  # 1 week (5 trading days)
        month_idx = min(idx + 21, len(df) - 1)  # 1 month (21 trading days)
        three_month_idx = min(idx + 63, len(df) - 1)  # 3 months (63 trading days)
        
        # Calculate cumulative returns for Gold
        gold_week_return = (df.iloc[week_idx]['Gold'] / df.iloc[idx]['Gold'] - 1) * 100
        gold_month_return = (df.iloc[month_idx]['Gold'] / df.iloc[idx]['Gold'] - 1) * 100
        gold_three_month_return = (df.iloc[three_month_idx]['Gold'] / df.iloc[idx]['Gold'] - 1) * 100
        
        # Calculate cumulative returns for S&P 500
        spy_week_return = (df.iloc[week_idx]['SPY'] / df.iloc[idx]['SPY'] - 1) * 100
        spy_month_return = (df.iloc[month_idx]['SPY'] / df.iloc[idx]['SPY'] - 1) * 100
        spy_three_month_return = (df.iloc[three_month_idx]['SPY'] / df.iloc[idx]['SPY'] - 1) * 100
        
        result = {
            'Date': date.date(),
            'VIX_Value': df.iloc[idx]['VIX'],
            'Gold_Price': df.iloc[idx]['Gold'],
            'SPY_Price': df.iloc[idx]['SPY'],
            'Gold_Week_Return': gold_week_return,
            'Gold_Month_Return': gold_month_return,
            'Gold_Three_Month_Return': gold_three_month_return,
            'SPY_Week_Return': spy_week_return,
            'SPY_Month_Return': spy_month_return,
            'SPY_Three_Month_Return': spy_three_month_return
        }
        results.append(result)
    
    # Convert to DataFrame for analysis
    spike_df = pd.DataFrame(results)
    
    if len(spike_df) > 0:
        print(f"Number of VIX crossings above 30 identified: {len(spike_df)}")
        
        # Calculate summary statistics for Gold
        gold_week_avg = spike_df['Gold_Week_Return'].mean()
        gold_month_avg = spike_df['Gold_Month_Return'].mean()
        gold_three_month_avg = spike_df['Gold_Three_Month_Return'].mean()
        
        gold_week_median = spike_df['Gold_Week_Return'].median()
        gold_month_median = spike_df['Gold_Month_Return'].median()
        gold_three_month_median = spike_df['Gold_Three_Month_Return'].median()
        
        gold_week_pos = (spike_df['Gold_Week_Return'] > 0).sum()
        gold_month_pos = (spike_df['Gold_Month_Return'] > 0).sum()
        gold_three_month_pos = (spike_df['Gold_Three_Month_Return'] > 0).sum()
        
        # Calculate summary statistics for S&P 500
        spy_week_avg = spike_df['SPY_Week_Return'].mean()
        spy_month_avg = spike_df['SPY_Month_Return'].mean()
        spy_three_month_avg = spike_df['SPY_Three_Month_Return'].mean()
        
        spy_week_median = spike_df['SPY_Week_Return'].median()
        spy_month_median = spike_df['SPY_Month_Return'].median()
        spy_three_month_median = spike_df['SPY_Three_Month_Return'].median()
        
        spy_week_pos = (spike_df['SPY_Week_Return'] > 0).sum()
        spy_month_pos = (spike_df['SPY_Month_Return'] > 0).sum()
        spy_three_month_pos = (spike_df['SPY_Three_Month_Return'] > 0).sum()
        
        # Calculate outperformance metrics
        gold_outperform_week = (spike_df['Gold_Week_Return'] > spike_df['SPY_Week_Return']).sum()
        gold_outperform_month = (spike_df['Gold_Month_Return'] > spike_df['SPY_Month_Return']).sum()
        gold_outperform_three_month = (spike_df['Gold_Three_Month_Return'] > spike_df['SPY_Three_Month_Return']).sum()
        
        # Print summary statistics
        print("\nGold vs S&P 500 Performance After VIX Exceeds 30:")
        print("-" * 70)
        
        print(f"AVERAGE RETURNS:")
        print(f"                   | Gold        | S&P 500     | Difference")
        print(f"-------------------+-------------+-------------+------------")
        print(f"1 Week             | {gold_week_avg:+.2f}%     | {spy_week_avg:+.2f}%     | {gold_week_avg-spy_week_avg:+.2f}%")
        print(f"1 Month            | {gold_month_avg:+.2f}%     | {spy_month_avg:+.2f}%     | {gold_month_avg-spy_month_avg:+.2f}%")
        print(f"3 Months           | {gold_three_month_avg:+.2f}%     | {spy_three_month_avg:+.2f}%     | {gold_three_month_avg-spy_three_month_avg:+.2f}%")
        
        print(f"\nMEDIAN RETURNS:")
        print(f"                   | Gold        | S&P 500     | Difference")
        print(f"-------------------+-------------+-------------+------------")
        print(f"1 Week             | {gold_week_median:+.2f}%     | {spy_week_median:+.2f}%     | {gold_week_median-spy_week_median:+.2f}%")
        print(f"1 Month            | {gold_month_median:+.2f}%     | {spy_month_median:+.2f}%     | {gold_month_median-spy_month_median:+.2f}%")
        print(f"3 Months           | {gold_three_month_median:+.2f}%     | {spy_three_month_median:+.2f}%     | {gold_three_month_median-spy_three_month_median:+.2f}%")
        
        print(f"\nPOSITIVE RETURNS:")
        print(f"                   | Gold              | S&P 500           ")
        print(f"-------------------+------------------+------------------")
        print(f"1 Week             | {gold_week_pos}/{len(spike_df)} ({gold_week_pos/len(spike_df)*100:.1f}%)  | {spy_week_pos}/{len(spike_df)} ({spy_week_pos/len(spike_df)*100:.1f}%)")
        print(f"1 Month            | {gold_month_pos}/{len(spike_df)} ({gold_month_pos/len(spike_df)*100:.1f}%)  | {spy_month_pos}/{len(spike_df)} ({spy_month_pos/len(spike_df)*100:.1f}%)")
        print(f"3 Months           | {gold_three_month_pos}/{len(spike_df)} ({gold_three_month_pos/len(spike_df)*100:.1f}%)  | {spy_three_month_pos}/{len(spike_df)} ({spy_three_month_pos/len(spike_df)*100:.1f}%)")
        
        print(f"\nGOLD OUTPERFORMANCE FREQUENCY:")
        print(f"1 Week: {gold_outperform_week}/{len(spike_df)} ({gold_outperform_week/len(spike_df)*100:.1f}%)")
        print(f"1 Month: {gold_outperform_month}/{len(spike_df)} ({gold_outperform_month/len(spike_df)*100:.1f}%)")
        print(f"3 Months: {gold_outperform_three_month}/{len(spike_df)} ({gold_outperform_three_month/len(spike_df)*100:.1f}%)")
        
        # Visualize average returns comparison
        plt.figure(figsize=(12, 7))
        
        x = np.arange(3)
        width = 0.35
        
        gold_avg_returns = [gold_week_avg, gold_month_avg, gold_three_month_avg]
        spy_avg_returns = [spy_week_avg, spy_month_avg, spy_three_month_avg]
        
        bars1 = plt.bar(x - width/2, gold_avg_returns, width, label='Gold', color='gold', alpha=0.8)
        bars2 = plt.bar(x + width/2, spy_avg_returns, width, label='S&P 500', color='navy', alpha=0.8)
        
        plt.axhline(y=0, color='r', linestyle='-', alpha=0.3)
        plt.title('Gold vs S&P 500: Average Returns After VIX Exceeds 30')
        plt.ylabel('Average Return (%)')
        plt.xticks(x, ['1 Week', '1 Month', '3 Months'])
        plt.legend()
        plt.grid(True, alpha=0.3)
        
        # Add data labels on the bars
        for bar, value in zip(bars1, gold_avg_returns):
            height = bar.get_height()
            plt.text(bar.get_x() + bar.get_width()/2., 
                     height + (0.5 if height > 0 else -1.5),
                     f'{value:.2f}%', 
                     ha='center', va='bottom', color='black')
                     
        for bar, value in zip(bars2, spy_avg_returns):
            height = bar.get_height()
            plt.text(bar.get_x() + bar.get_width()/2., 
                     height + (0.5 if height > 0 else -1.5),
                     f'{value:.2f}%', 
                     ha='center', va='bottom', color='black')
        
        _mfajlsdf98q21_image_title_list.append('Gold vs S&P 500: Average Returns After VIX Exceeds 30')
        plt.tight_layout()
        plt.show()
        
        # Create a scatter plot comparing Gold vs S&P 500 monthly returns
        plt.figure(figsize=(10, 10))
        plt.scatter(spike_df['SPY_Month_Return'], spike_df['Gold_Month_Return'], 
                   alpha=0.7, s=60, c=spike_df['VIX_Value'], cmap='viridis')
        
        plt.colorbar(label='VIX Value When Crossing Above 30')
        
        # Add diagonal line (y=x)
        min_val = min(spike_df['SPY_Month_Return'].min(), spike_df['Gold_Month_Return'].min()) - 5
        max_val = max(spike_df['SPY_Month_Return'].max(), spike_df['Gold_Month_Return'].max()) + 5
        plt.plot([min_val, max_val], [min_val, max_val], 'r--', alpha=0.6)
        
        # Add quadrant lines
        plt.axvline(x=0, color='gray', linestyle='-', alpha=0.3)
        plt.axhline(y=0, color='gray', linestyle='-', alpha=0.3)
        
        # Add labels for quadrants
        plt.text(max_val-5, max_val-5, "Both Positive\nGold Outperforming", ha='right', va='top', alpha=0.7)
        plt.text(min_val+5, max_val-5, "S&P 500 Negative\nGold Positive", ha='left', va='top', alpha=0.7)
        plt.text(max_val-5, min_val+5, "S&P 500 Positive\nGold Negative", ha='right', va='bottom', alpha=0.7)
        plt.text(min_val+5, min_val+5, "Both Negative\nS&P 500 Outperforming", ha='left', va='bottom', alpha=0.7)
        
        plt.title('Gold vs S&P 500: 1-Month Returns After VIX Exceeds 30')
        plt.xlabel('S&P 500 Return (%)')
        plt.ylabel('Gold Return (%)')
        plt.grid(True, alpha=0.3)
        
        _mfajlsdf98q21_image_title_list.append('Gold vs S&P 500: 1-Month Returns After VIX Exceeds 30')
        plt.tight_layout()
        plt.show()
        
        # Create a similar scatter plot for 3-month returns
        plt.figure(figsize=(10, 10))
        plt.scatter(spike_df['SPY_Three_Month_Return'], spike_df['Gold_Three_Month_Return'], 
                   alpha=0.7, s=60, c=spike_df['VIX_Value'], cmap='viridis')
        
        plt.colorbar(label='VIX Value When Crossing Above 30')
        
        # Add diagonal line (y=x)
        min_val = min(spike_df['SPY_Three_Month_Return'].min(), spike_df['Gold_Three_Month_Return'].min()) - 5
        max_val = max(spike_df['SPY_Three_Month_Return'].max(), spike_df['Gold_Three_Month_Return'].max()) + 5
        plt.plot([min_val, max_val], [min_val, max_val], 'r--', alpha=0.6)
        
        # Add quadrant lines
        plt.axvline(x=0, color='gray', linestyle='-', alpha=0.3)
        plt.axhline(y=0, color='gray', linestyle='-', alpha=0.3)
        
        # Add labels for quadrants
        plt.text(max_val-5, max_val-5, "Both Positive\nGold Outperforming", ha='right', va='top', alpha=0.7)
        plt.text(min_val+5, max_val-5, "S&P 500 Negative\nGold Positive", ha='left', va='top', alpha=0.7)
        plt.text(max_val-5, min_val+5, "S&P 500 Positive\nGold Negative", ha='right', va='bottom', alpha=0.7)
        plt.text(min_val+5, min_val+5, "Both Negative\nS&P 500 Outperforming", ha='left', va='bottom', alpha=0.7)
        
        plt.title('Gold vs S&P 500: 3-Month Returns After VIX Exceeds 30')
        plt.xlabel('S&P 500 Return (%)')
        plt.ylabel('Gold Return (%)')
        plt.grid(True, alpha=0.3)
        
        _mfajlsdf98q21_image_title_list.append('Gold vs S&P 500: 3-Month Returns After VIX Exceeds 30')
        plt.tight_layout()
        plt.show()
        
        # Create box plots to compare distributions
        plt.figure(figsize=(12, 7))
        
        # Combine data for box plots
        boxplot_data = [
            spike_df['Gold_Week_Return'], 
            spike_df['SPY_Week_Return'],
            spike_df['Gold_Month_Return'], 
            spike_df['SPY_Month_Return'],
            spike_df['Gold_Three_Month_Return'], 
            spike_df['SPY_Three_Month_Return']
        ]
        
        labels = ['Gold\n1 Week', 'S&P 500\n1 Week', 
                 'Gold\n1 Month', 'S&P 500\n1 Month', 
                 'Gold\n3 Months', 'S&P 500\n3 Months']
        
        colors = ['gold', 'navy', 'gold', 'navy', 'gold', 'navy']
        
        # Create box plots with custom colors
        boxprops = dict(linewidth=2)
        flierprops = dict(marker='o', markersize=4)
        
        bplot = plt.boxplot(boxplot_data, labels=labels, patch_artist=True,
                           boxprops=boxprops, flierprops=flierprops)
        
        # Fill boxes with colors
        for box, color in zip(bplot['boxes'], colors):
            box.set(color='black', linewidth=1.5)
            box.set(facecolor=color, alpha=0.8)
        
        plt.title('Distribution of Returns After VIX Exceeds 30: Gold vs S&P 500')
        plt.ylabel('Return (%)')
        plt.axhline(y=0, color='r', linestyle='-', alpha=0.3)
        plt.grid(True, axis='y', alpha=0.3)
        
        _mfajlsdf98q21_image_title_list.append('Distribution of Returns After VIX Exceeds 30: Gold vs S&P 500')
        plt.tight_layout()
        plt.show()
        
        # Calculate relative performance over time
        spike_df['Outperform_Week'] = spike_df['Gold_Week_Return'] - spike_df['SPY_Week_Return']
        spike_df['Outperform_Month'] = spike_df['Gold_Month_Return'] - spike_df['SPY_Month_Return']
        spike_df['Outperform_Three_Month'] = spike_df['Gold_Three_Month_Return'] - spike_df['SPY_Three_Month_Return']
        
        # Sort by date
        spike_df = spike_df.sort_values('Date')
        
        # Plot gold outperformance over time
        plt.figure(figsize=(14, 7))
        
        plt.plot(range(len(spike_df)), spike_df['Outperform_Week'], 'o-', 
                label='1 Week Outperformance', alpha=0.7)
        plt.plot(range(len(spike_df)), spike_df['Outperform_Month'], 's-', 
                label='1 Month Outperformance', alpha=0.7)
        plt.plot(range(len(spike_df)), spike_df['Outperform_Three_Month'], '^-', 
                label='3 Month Outperformance', alpha=0.7)
        
        plt.axhline(y=0, color='r', linestyle='-', alpha=0.5, 
                   label='Equal Performance')
        
        # Add event years for context
        years = [str(date.year) for date in spike_df['Date']]
        unique_years_idx = []
        unique_years = []
        
        for i, year in enumerate(years):
            if year not in unique_years:
                unique_years.append(year)
                unique_years_idx.append(i)
        
        plt.xticks(unique_years_idx, unique_years)
        
        plt.title("Gold's Outperformance vs S&P 500 After VIX Exceeds 30 (Over Time)")
        plt.xlabel('Event Year')
        plt.ylabel('Gold Return - S&P 500 Return (%)')
        plt.legend()
        plt.grid(True, alpha=0.3)
        
        _mfajlsdf98q21_image_title_list.append("Gold's Outperformance vs S&P 500 After VIX Exceeds 30 (Over Time)")
        plt.tight_layout()
        plt.show()
        
    else:
        print("No VIX crossings above 30 found in the dataset.")
    
    return spike_df

def main():
    """Main function to run the analysis"""
    print("Analyzing Gold vs S&P 500 Performance After VIX Spikes Above 30")
    print("=" * 70)
    
    # Fetch data
    df = fetch_data()
    
    # Analyze what happens when VIX crosses above 30
    spike_df = analyze_vix_above_30(df)
    
    # Print summary findings
    print("\nSummary of Key Findings")
    print("=" * 60)
    print("1. We identified periods when the VIX index crossed above 30, signaling high market fear")
    print("2. For each crossing, we compared gold and S&P 500 performance after 1 week, 1 month, and 3 months")
    print("3. We calculated average and median returns, as well as the frequency of gold outperformance")
    print("4. We visualized the relationship between gold and S&P 500 returns during these high-fear periods")
    print("5. We examined whether gold truly serves as a superior hedge during market fear periods")

if __name__ == "__main__":
    main()

Why This Matters for Investors

These findings challenge the conventional wisdom about gold as a superior investment during periods of market fear. Several factors may explain these results:

  1. Market Mean Reversion: When the VIX spikes above 30, markets are often oversold and tend to rebound relatively quickly, benefiting equities more than gold.
  2. Central Bank Responses: Modern monetary policy often responds aggressively to market stress, which can boost equity values while providing less direct benefit to gold.
  3. Risk Premium: Equities inherently carry a risk premium that compensates investors for volatility, while gold lacks this premium.
  4. Investor Behavior: When the VIX crosses above 30, many investors have already fled to gold, potentially creating a “buy the rumor, sell the news” effect where gold prices plateau or decline after the fear event materializes.

Conclusion: Rethinking Gold as a Fear Hedge

The data strongly suggests that automatically investing in gold when the VIX spikes above 30 is not an optimal strategy based on historical performance. In fact, investors who purchased the S&P 500 during these extreme fear events would have significantly outperformed those who bought gold over the subsequent 1-week, 1-month, and 3-month periods.

This doesn’t mean gold has no place in a portfolio, but it challenges the notion that gold is the best asset to own during and immediately after periods of market fear. The evidence indicates that for investors with the fortitude to invest during frightening market conditions, equities have historically provided superior returns in the aftermath of fear spikes.

Rather than following the conventional wisdom to “buy gold when afraid,” long-term investors might be better served by viewing market fear as an opportunity to purchase quality equities at discounted prices.

Rajandran R Creator of OpenAlgo - OpenSource Algo Trading framework for Indian Traders. Building GenAI Applications. Telecom Engineer turned Full-time Derivative Trader. Mostly Trading Nifty, Banknifty, High Liquid Stock Derivatives. Trading the Markets Since 2006 onwards. Using Market Profile and Orderflow for more than a decade. Designed and published 100+ open source trading systems on various trading tools. Strongly believe that market understanding and robust trading frameworks are the key to the trading success. Building Algo Platforms, Writing about Markets, Trading System Design, Market Sentiment, Trading Softwares & Trading Nuances since 2007 onwards. Author of Marketcalls.in

Get Notifications, Alerts on Market Updates, Trading Tools, Automation & More