Market Sentiment: The Price Probability Distribution

Original (English)

Market Sentiment: What's the price next month?

Suppose a stock trades at $250. You want to know its price in 30 days. Or rather, which price is expected in 30 days by most market participants. For this purpose, Zorro analyzes the chain of 30-day options contracts and calculates a price probability distribution. The result is the probability of any future price between $200 and $300 at the option expiration day, based on the expectations of option buyers and sellers. The most likely price is at the top of the distribution. The underlying algorithm and usage examples are described on financial-hacker.com/the-mechanical-turk.
 
The following functions estimate a future price from the current ask, bid, and strike prices of all option contracts at a determined expiration date. They generate a distribution of the cumulative price probability at their expiration. The height of a bar in the image below is the probability that the underlying price will end up at or below the given price level on the x axis, in the implied opinion of option traders.


SPY January 2018, cumulative price probability distribution 

contractCPD (int Days): int

Generates a cumulative probabililty distribution of the current asset price at the given number of days in the future, and stores it internally. Returns the number of option contracts used for the distribution. The contractUpdate function must be called before.  

cpd(var Price): var

Returns the cumulative probability of the given price in 0..100 range. The future price will be at or below the given value with the returned probability in percent. The contractCPD function must be called before.

cpdv(var Percentile): var

Returns the price at the given percentile of the distribution. F.i. cpdv(50) returns the median of the price distribution, with equal probability of a higher or lower price. The contractCPD function must be called before.

Parameters:

Days Minimum number of calendar days for which the price distribution is estimated. Determines the expiration date of the used options.
Price Underlying asset price to be estimated.
Percentile Probability that the future price is at or below the returned value.

Remarks:

  • For comparing price predictions with the current price in the backtest, make sure to use the unadjusted price. If in doubt, use underlying prices from the historical options chain by setting History = ".t8"; before selecting the asset.
  • contractCPD loads the prices of all contract with the given expiration and can be very slow with some brokers (up to 30 minutes with IB). For speeding up price requests, call brokerCommand(SET_PRICETYPE,8); when supported by the broker.

Example:

void main() 
    {
      StartDate = 20170101;
      BarPeriod = 1440;
      PlotScale = 10;
    
      assetList("AssetsIB");
      assetHistory("SPY",FROM_STOOQ|UNADJUSTED);
      asset("SPY");
      Multiplier = 100;
    
    // load today's contract chain
      contractUpdate(Stock,0,CALL|PUT);
      var PriceCurrent = Contracts->fUnl;
      printf("\nCurrent price %.2f",PriceCurrent);
    
    // what's the SPY price in 45 days?
      contractCPD(45);
      var Price = 0.;
      int i;
      for(i = 0; i < 150; i++) {
        Price += 0.01*PriceCurrent;
        plotBar("CPD",i,Price,cpd(Price),BARS|LBL2,RED);
      }
      printf(", projected price %.2f",cpdv(50));
    }

See also:

contract, cdf ► latest version online

Übersetzung (Deutsch)

Marktstimmung: Wie ist der Preis nächsten Monats?

Angenommen, eine Aktie wird bei $250 gehandelt. Du möchtest ihren Preis in 30 Tagen wissen. Oder genauer gesagt, welchen Preis die meisten Marktteilnehmer in 30 Tagen erwarten. Zu diesem Zweck analysiert Zorro die Kette von 30-Tage-Optionskontrakten und berechnet eine Preiswahrscheinlichkeitsverteilung. Das Ergebnis ist die Wahrscheinlichkeit eines zukünftigen Preises zwischen $200 und $300 am Verfallsdatum der Option, basierend auf den Erwartungen der Optionskäufer und -verkäufer. Der wahrscheinlichste Preis liegt an der Spitze der Verteilung. Der zugrunde liegende Algorithmus und Anwendungsbeispiele werden auf financial-hacker.com/the-mechanical-turk beschrieben.
 
Die folgenden Funktionen schätzen einen zukünftigen Preis aus den aktuellen Ask-, Bid- und Strike-Preisen aller Optionskontrakte zu einem bestimmten Verfallsdatum. Sie erzeugen eine Verteilung der kumulativen Preiswahrscheinlichkeit bei ihrem Verfall. Die Höhe eines Balkens im untenstehenden Bild ist die Wahrscheinlichkeit, dass der Basiswertpreis am oder unterhalb des angegebenen Preisniveaus auf der x-Achse endet, basierend auf der impliziten Meinung der Optionshändler.


SPY Januar 2018, kumulative Preiswahrscheinlichkeitsverteilung 

contractCPD (int Days): int

Erzeugt eine kumulative Wahrscheinlichkeitsverteilung des aktuellen Asset-Preises zum angegebenen Zeitpunkt in der Zukunft und speichert sie intern. Gibt die Anzahl der verwendeten Optionskontrakte für die Verteilung zurück. Die contractUpdate Funktion muss vorher aufgerufen werden.  

cpd(var Price): var

Gibt die kumulative Wahrscheinlichkeit des angegebenen Preises im Bereich 0..100 zurück. Der zukünftige Preis wird mit der zurückgegebenen Wahrscheinlichkeit in Prozent am oder unterhalb des angegebenen Wertes liegen. Die contractCPD Funktion muss vorher aufgerufen werden.

cpdv(var Percentile): var

Gibt den Preis zum angegebenen Perzentil der Verteilung zurück. Zum Beispiel gibt cpdv(50) das Median der Preisverteilung zurück, mit gleicher Wahrscheinlichkeit für einen höheren oder niedrigeren Preis. Die contractCPD Funktion muss vorher aufgerufen werden.

Parameter:

Days Mindestanzahl an Kalendertagen, für die die Preisverteilung geschätzt wird. Bestimmt das Verfallsdatum der verwendeten Optionen.
Price Zu schätzender Basiswertpreis.
Percentile Wahrscheinlichkeit, dass der zukünftige Preis am oder unterhalb des zurückgegebenen Wertes liegt.

Bemerkungen:

  • Um Preisvorhersagen mit dem aktuellen Preis im Backtest zu vergleichen, stelle sicher, dass du den unbereinigten Preis verwendest. Im Zweifel nutze Basiswertpreise aus der historischen Optionskette, indem du History = ".t8"; setzt, bevor du das Asset auswählst.
  • contractCPD lädt die Preise aller Kontrakte mit dem angegebenen Verfallsdatum und kann bei einigen Brokern sehr langsam sein (bis zu 30 Minuten mit IB). Um Preisabfragen zu beschleunigen, rufe brokerCommand(SET_PRICETYPE,8); auf, wenn es vom Broker unterstützt wird.

Beispiel:

void main() 
    {
      StartDate = 20170101;
      BarPeriod = 1440;
      PlotScale = 10;
    
      assetList("AssetsIB");
      assetHistory("SPY",FROM_STOOQ|UNADJUSTED);
      asset("SPY");
      Multiplier = 100;
    
    // lade die heutige Kontraktkette
      contractUpdate(Stock,0,CALL|PUT);
      var PriceCurrent = Contracts->fUnl;
      printf("\nCurrent price %.2f",PriceCurrent);
    
    // wie ist der SPY-Preis in 45 Tagen?
      contractCPD(45);
      var Price = 0.;
      int i;
      for(i = 0; i < 150; i++) {
        Price += 0.01*PriceCurrent;
        plotBar("CPD",i,Price,cpd(Price),BARS|LBL2,RED);
      }
      printf(", projected price %.2f",cpdv(50));
    }

Siehe auch:

contract, cdf ► neueste Version online