پانڈوں کے ساتھ پائیتھون میں ایس اینڈ پی 500 کے لئے پیش گوئی کی حکمت عملی کا بیک ٹیسٹنگ

مصنف:نیکی, تخلیق: 2019-03-29 14:24:50, تازہ کاری:

پختہ پائیتھون لائبریریاں جیسے میٹ پلٹلب ، پانڈا اور اسکیٹ لرن بھی بوائلر پلیٹ کوڈ لکھنے یا مشہور الگورتھم کے اپنے نفاذ کے ساتھ آنے کی ضرورت کو کم کرتی ہیں۔

پیش گوئی کی حکمت عملی

پیش گوئی کی حکمت عملی خود مشینی سیکھنے کی تکنیک پر مبنی ہے جسے ایک مربع امتیاز تجزیہ کار کہا جاتا ہے ، جو ایک لکیری امتیاز تجزیہ کار سے قریب سے متعلق ہے۔ ان دونوں ماڈلز کی تفصیلات مالی وقت کی سیریز کی پیش گوئی کے مضمون میں بیان کی گئی ہیں۔

پیش گوئی کرنے والا اسٹاک مارکیٹ کی آج کی سمت کی پیش گوئی کرنے کے لئے عوامل کے ایک سیٹ کے طور پر پچھلے دو روزانہ منافع کا استعمال کرتا ہے۔ اگر دن کے up ہونے کا امکان 50٪ سے زیادہ ہے تو ، حکمت عملی SPY ETF کے 500 حصص خریدتی ہے اور دن کے آخر میں اسے فروخت کرتی ہے۔ اگر دن کے نیچے دن کا امکان 50٪ سے زیادہ ہے تو ، حکمت عملی SPY ETF کے 500 حصص فروخت کرتی ہے اور پھر بند ہونے پر واپس خریدتی ہے۔ اس طرح یہ ایک انٹرا ڈے ٹریڈنگ حکمت عملی کی ہماری پہلی مثال ہے۔

نوٹ کریں کہ یہ خاص طور پر حقیقت پسندانہ تجارتی حکمت عملی نہیں ہے! بہت سے عوامل جیسے زیادہ افتتاحی اتار چڑھاؤ ، بروکرج کے ذریعہ آرڈر روٹنگ اور کھلی / بند کے ارد گرد ممکنہ لیکویڈیٹی کے مسائل کی وجہ سے ہم کبھی بھی افتتاحی یا بند ہونے کی قیمت حاصل کرنے کا امکان نہیں رکھتے ہیں۔ اس کے علاوہ ہم نے لین دین کے اخراجات کو شامل نہیں کیا ہے۔ یہ ممکنہ طور پر واپسی کا ایک اہم فیصد ہوگا کیونکہ ہر روز گول ٹریڈ کی جاتی ہے۔ اس طرح ہمارے پیش گوئی کرنے والے کو روزانہ واپسی کی پیش گوئی کرنے میں نسبتا accurate درست ہونے کی ضرورت ہے ، ورنہ لین دین کے اخراجات ہماری تمام تجارتی واپسی کو کھا جائیں گے۔

نفاذ

دیگر پطرون / پانڈا سے متعلق سبق کے ساتھ میں نے مندرجہ ذیل لائبریریوں کا استعمال کیا ہے:

  • پائیتھون - 2.7.3
  • NumPy - 1.8.0
  • پانڈا - 0.12.0
  • میٹپلوٹلیب - 1.1.0
  • scikit-learn - 0.14.1

ذیل میں snp_forecast.py کے نفاذ کی ضرورت ہوتی ہےbacktest.pyاس پچھلے سبق سے. اس کے علاوہforecast.py(جس میں بنیادی طور پر فنکشن شامل ہے create_lagged_series) اس پچھلے ٹیوٹوریل سے بنایا گیا ہے۔ پہلا قدم ضروری ماڈیولز اور اشیاء کو درآمد کرنا ہے۔

# snp_forecast.py

import datetime
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn

from pandas.io.data import DataReader
from sklearn.qda import QDA

from backtest import Strategy, Portfolio
from forecast import create_lagged_series

ایک بار جب تمام متعلقہ لائبریریاں اور ماڈیول شامل ہوجائیں تو اب وقت آگیا ہے کہ اسٹریٹیجی تجریدی بیس کلاس کو سب کلاس کریں ، جیسا کہ ہم نے پچھلے سبق میں کیا ہے۔ ایس این پی فوریکاسٹنگ اسٹریٹیجی کو اس کی مستقبل کی قیمت کی پیش گوئی کے لئے ایس اینڈ پی 500 اسٹاک انڈیکس میں ایک کواڈریٹک امتیازی تجزیہ کار کو فٹ کرنے کے لئے ڈیزائن کیا گیا ہے۔ ماڈل کی فٹنگ نیچے fit_model طریقہ کار میں کی جاتی ہے ، جبکہ اصل سگنل generate_signals طریقہ کار سے تیار کیے جاتے ہیں۔ یہ حکمت عملی کلاس کے انٹرفیس سے مماثل ہے۔

ایک مربع امتیاز تجزیہ کار کے کام کرنے کی تفصیلات ، نیز ذیل میں پائیتھون کی نفاذ ، مالی وقت کی سیریز کی پیش گوئی کے بارے میں پچھلے مضمون میں تفصیل سے بیان کی گئی ہے۔ ذیل میں سورس کوڈ میں تبصرے میں اس پروگرام کے بارے میں وسیع پیمانے پر تبادلہ خیال کیا گیا ہے:

# snp_forecast.py

class SNPForecastingStrategy(Strategy):
    """    
    Requires:
    symbol - A stock symbol on which to form a strategy on.
    bars - A DataFrame of bars for the above symbol."""

    def __init__(self, symbol, bars):
        self.symbol = symbol
        self.bars = bars
        self.create_periods()
        self.fit_model()

    def create_periods(self):
        """Create training/test periods."""
        self.start_train = datetime.datetime(2001,1,10)
        self.start_test = datetime.datetime(2005,1,1)
        self.end_period = datetime.datetime(2005,12,31)

    def fit_model(self):
        """Fits a Quadratic Discriminant Analyser to the
        US stock market index (^GPSC in Yahoo)."""
        # Create a lagged series of the S&P500 US stock market index
        snpret = create_lagged_series(self.symbol, self.start_train, 
                                      self.end_period, lags=5) 

        # Use the prior two days of returns as 
        # predictor values, with direction as the response
        X = snpret[["Lag1","Lag2"]]
        y = snpret["Direction"]

        # Create training and test sets
        X_train = X[X.index < self.start_test]
        y_train = y[y.index < self.start_test]

        # Create the predicting factors for use 
        # in direction forecasting
        self.predictors = X[X.index >= self.start_test]

        # Create the Quadratic Discriminant Analysis model
        # and the forecasting strategy
        self.model = QDA()
        self.model.fit(X_train, y_train)

    def generate_signals(self):
        """Returns the DataFrame of symbols containing the signals
        to go long, short or hold (1, -1 or 0)."""
        signals = pd.DataFrame(index=self.bars.index)
        signals['signal'] = 0.0       

        # Predict the subsequent period with the QDA model
        signals['signal'] = self.model.predict(self.predictors)

        # Remove the first five signal entries to eliminate
        # NaN issues with the signals DataFrame
        signals['signal'][0:5] = 0.0
        signals['positions'] = signals['signal'].diff() 

        return signals

اب جب پیشن گوئی کرنے والے انجن نے سگنل تیار کیے ہیں ، تو ہم ایک مارکیٹ انٹراڈے پورٹ فولیو تشکیل دے سکتے ہیں۔ یہ پورٹ فولیو آبجیکٹ موونگ ایوریج کراس اوور بیک ٹسٹ آرٹیکل میں دی گئی مثال سے مختلف ہے کیونکہ یہ دن کے اندر تجارت کرتا ہے۔

اس پورٹ فولیو کو ڈیزائن کیا گیا ہے کہ اگر سگنل یہ بتاتا ہے کہ ایک اپ ڈے واقع ہوگا تو افتتاحی قیمت پر SPY کے 500 حصص کو طویل (خرید) کریں اور پھر بند ہونے پر فروخت کریں۔ اس کے برعکس ، پورٹ فولیو کو ڈیزائن کیا گیا ہے کہ اگر سگنل یہ بتاتا ہے کہ ڈاؤن ڈے واقع ہوگا تو SPY کے 500 حصص مختصر (فروخت) کریں اور بعد میں بند ہونے کی قیمت پر بند کریں۔

اس مقصد کو حاصل کرنے کے لئے ، مارکیٹ کی کھلی اور بند ہونے والی قیمتوں کے درمیان قیمت کا فرق ہر دن طے کیا جاتا ہے ، جس کی وجہ سے 500 خریدے یا فروخت شدہ حصص پر روزانہ منافع کا حساب لگایا جاتا ہے۔ اس کے بعد قدرتی طور پر ہر دن کے منافع / نقصان کو مجموعی طور پر جمع کرکے ایکوئٹی وکر کا باعث بنتا ہے۔ اس کا فائدہ یہ بھی ہے کہ ہمیں ہر دن کے لئے منافع / نقصان کے اعدادوشمار کا حساب لگانے کی اجازت دیتا ہے۔

مارکیٹ انٹراڈے پورٹ فولیو کی فہرست یہ ہے:

# snp_forecast.py

class MarketIntradayPortfolio(Portfolio):
    """Buys or sells 500 shares of an asset at the opening price of
    every bar, depending upon the direction of the forecast, closing 
    out the trade at the close of the bar.

    Requires:
    symbol - A stock symbol which forms the basis of the portfolio.
    bars - A DataFrame of bars for a symbol set.
    signals - A pandas DataFrame of signals (1, 0, -1) for each symbol.
    initial_capital - The amount in cash at the start of the portfolio."""

    def __init__(self, symbol, bars, signals, initial_capital=100000.0):
        self.symbol = symbol        
        self.bars = bars
        self.signals = signals
        self.initial_capital = float(initial_capital)
        self.positions = self.generate_positions()
        
    def generate_positions(self):
        """Generate the positions DataFrame, based on the signals
        provided by the 'signals' DataFrame."""
        positions = pd.DataFrame(index=self.signals.index).fillna(0.0)

        # Long or short 500 shares of SPY based on 
        # directional signal every day
        positions[self.symbol] = 500*self.signals['signal']
        return positions
                    
    def backtest_portfolio(self):
        """Backtest the portfolio and return a DataFrame containing
        the equity curve and the percentage returns."""

        # Set the portfolio object to have the same time period
        # as the positions DataFrame
        portfolio = pd.DataFrame(index=self.positions.index)
        pos_diff = self.positions.diff()

        # Work out the intraday profit of the difference
        # in open and closing prices and then determine
        # the daily profit by longing if an up day is predicted
        # and shorting if a down day is predicted        
        portfolio['price_diff'] = self.bars['Close']-self.bars['Open']
        portfolio['price_diff'][0:5] = 0.0
        portfolio['profit'] = self.positions[self.symbol] * portfolio['price_diff']

        # Generate the equity curve and percentage returns
        portfolio['total'] = self.initial_capital + portfolio['profit'].cumsum()
        portfolio['returns'] = portfolio['total'].pct_change()
        return portfolio

آخری مرحلہ حکمت عملی اور پورٹ فولیو کے مقاصد کو ایک ساتھ جوڑنا ہےاہمفنکشن۔ فنکشن SPY آلہ کے لئے اعداد و شمار حاصل کرتا ہے اور پھر خود S&P500 انڈیکس پر سگنل پیدا کرنے کی حکمت عملی تیار کرتا ہے۔ یہ ^GSPC ٹکر کے ذریعہ فراہم کیا جاتا ہے۔ پھر ایک مارکیٹ انٹراڈے پورٹ فولیو تیار کیا جاتا ہے جس میں ابتدائی سرمایہ 100،000 امریکی ڈالر ہوتا ہے (جیسے پچھلے سبق میں) ۔ آخر میں ، منافع کا حساب لگایا جاتا ہے اور ایکویٹی وکر کو پلاٹ کیا جاتا ہے۔

نوٹ کریں کہ اس مرحلے میں کتنا کم کوڈ درکار ہے کیونکہ تمام بھاری حساب کتاب حکمت عملی اور پورٹ فولیو ذیلی کلاسوں میں کی جاتی ہے۔ اس سے نئی تجارتی حکمت عملی بنانے اور حکمت عملی پائپ لائن میں استعمال کے ل them ان کی تیزی سے جانچ کرنا انتہائی آسان ہوجاتا ہے۔

if __name__ == "__main__":
    start_test = datetime.datetime(2005,1,1)
    end_period = datetime.datetime(2005,12,31)

    # Obtain the bars for SPY ETF which tracks the S&P500 index    
    bars = DataReader("SPY", "yahoo", start_test, end_period)
    
    # Create the S&P500 forecasting strategy
    snpf = SNPForecastingStrategy("^GSPC", bars)
    signals = snpf.generate_signals()

    # Create the portfolio based on the forecaster
    portfolio = MarketIntradayPortfolio("SPY", bars, signals,              
                                        initial_capital=100000.0)
    returns = portfolio.backtest_portfolio()

    # Plot results
    fig = plt.figure()
    fig.patch.set_facecolor('white')

    # Plot the price of the SPY ETF
    ax1 = fig.add_subplot(211,  ylabel='SPY ETF price in $')
    bars['Close'].plot(ax=ax1, color='r', lw=2.)

    # Plot the equity curve
    ax2 = fig.add_subplot(212, ylabel='Portfolio value in $')
    returns['total'].plot(ax=ax2, lw=2.)

    fig.show()

پروگرام کی آؤٹ پٹ ذیل میں دی گئی ہے۔ اس عرصے میں اسٹاک مارکیٹ نے 4٪ (مکمل طور پر سرمایہ کاری کی خریداری اور برقرار رکھنے کی حکمت عملی کا فرض کرتے ہوئے) کی واپسی کی ، جبکہ الگورتھم نے خود بھی 4٪ کی واپسی کی۔ نوٹ کریں کہ اس بیک ٹیسٹنگ سسٹم میں لین دین کے اخراجات (جیسے کمیشن فیس) شامل نہیں کیے گئے ہیں۔ چونکہ حکمت عملی روزانہ ایک بار گول سفر کی تجارت کرتی ہے ، لہذا ان فیسوں سے واپسی کو نمایاں طور پر کم کرنے کا امکان ہے۔

ایس اینڈ پی 500 پیشن گوئی کی حکمت عملی کارکردگی 2005-01-01 سے 2006-12-31 تک

بعد کے مضامین میں ہم حقیقت پسندانہ لین دین کے اخراجات شامل کریں گے، اضافی پیشن گوئی کے انجن کا استعمال کریں گے، کارکردگی کی پیمائش کا تعین کریں گے اور پورٹ فولیو کی اصلاح کے اوزار فراہم کریں گے.


مزید