ڈیجیٹل کرنسی فیکٹر ماڈل

مصنف:لیدیہ, تخلیق: 2022-10-24 17:37:50, تازہ کاری: 2023-09-15 20:59:38

img

فیکٹر ماڈل فریم ورک

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

فیکٹر کو ایک اشارے کے طور پر سمجھا جاسکتا ہے اور ایک اظہار لکھا جاسکتا ہے۔ فیکٹر مستقل طور پر تبدیل ہوتا ہے ، جو مستقبل کی آمدنی کی معلومات کی عکاسی کرتا ہے۔ عام طور پر ، فیکٹر سرمایہ کاری کے منطق کی نمائندگی کرتا ہے۔

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

اسٹاک مارکیٹ اور ڈیجیٹل کرنسی مارکیٹ دونوں پیچیدہ نظام ہیں۔ ایسا کوئی عنصر نہیں ہے جو مستقبل کے منافع کی مکمل پیش گوئی کرسکتا ہے ، لیکن ان کی ابھی بھی ایک خاص پیش گوئی ہے۔ موثر الفا (سرمایہ کاری کا طریقہ) آہستہ آہستہ زیادہ سرمایہ کاری کے ساتھ غیر فعال ہوجائے گا۔ تاہم ، اس عمل سے مارکیٹ میں دوسرے ماڈل پیدا ہوں گے ، اس طرح ایک نیا الفا پیدا ہوگا۔ مارکیٹ ویلیو فیکٹر اے شیئر مارکیٹ میں ایک بہت ہی موثر حکمت عملی تھا۔ صرف کم سے کم مارکیٹ ویلیو والے 10 اسٹاک خریدیں ، اور انہیں دن میں ایک بار ایڈجسٹ کریں۔ 2007 کے بعد سے ، 10 سالہ بیک ٹسٹ مجموعی مارکیٹ سے کہیں زیادہ ، منافع کا 400 گنا زیادہ حاصل کرے گا۔ تاہم ، 2017 میں وائٹ ہارس اسٹاک مارکیٹ ٹیسٹ نے چھوٹے مارکیٹ ویلیو فیکٹر کی ناکامی کی عکاسی کی ، اور اس کی بجائے ویلیو فیکٹر مقبول ہوا۔ لہذا ، ہمیں مستقل طور پر توازن کی جانچ پڑتال کرنے اور الفا کو استعمال کرنے کی ضرورت ہے۔

مطلوبہ عوامل حکمت عملیوں کے قیام کی بنیاد ہیں۔ متعدد غیر متعلقہ موثر عوامل کو جوڑ کر بہتر حکمت عملی تیار کی جاسکتی ہے۔

import requests
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import requests, zipfile, io
%matplotlib inline

ڈیٹا وسائل

اب تک ، بائننس یو ایس ڈی ٹی دائمی فیوچر کے 2022 کے آغاز سے لے کر اب تک کے گھنٹہ-کے لائن ڈیٹا نے 150 کرنسیوں سے تجاوز کرلیا ہے۔ جیسا کہ ہم نے پہلے ذکر کیا ہے ، فیکٹر ماڈل کرنسی کے انتخاب کا ایک ماڈل ہے ، جو کسی خاص کرنسی کے بجائے تمام کرنسیوں پر مبنی ہے۔ کے لائن ڈیٹا میں اعلی اور بند ہونے والی کم قیمتیں ، تجارتی حجم ، لین دین کی تعداد ، لینے والے کی خریداری کا حجم اور دیگر اعداد و شمار شامل ہیں۔ یہ اعداد و شمار یقینی طور پر تمام عوامل کا ذریعہ نہیں ہیں ، جیسے امریکی اسٹاک انڈیکس ، سود کی شرح میں اضافے کی توقع ، منافع بخش ، چین پر ڈیٹا ، سوشل میڈیا کی مقبولیت وغیرہ۔ غیر معمولی اعداد و شمار کے ذرائع بھی موثر الفا تلاش کرسکتے ہیں ، لیکن بنیادی قیمت کا حجم بھی کافی ہے۔

## Current trading pair
Info = requests.get('https://fapi.binance.com/fapi/v1/exchangeInfo')
symbols = [s['symbol'] for s in Info.json()['symbols']]
symbols = list(filter(lambda x: x[-4:] == 'USDT', [s.split('_')[0] for s in symbols]))
print(symbols)

باہر:

['BTCUSDT', 'ETHUSDT', 'BCHUSDT', 'XRPUSDT', 'EOSUSDT', 'LTCUSDT', 'TRXUSDT', 'ETCUSDT', 'LINKUSDT',
'XLMUSDT', 'ADAUSDT', 'XMRUSDT', 'DASHUSDT', 'ZECUSDT', 'XTZUSDT', 'BNBUSDT', 'ATOMUSDT', 'ONTUSDT',
'IOTAUSDT', 'BATUSDT', 'VETUSDT', 'NEOUSDT', 'QTUMUSDT', 'IOSTUSDT', 'THETAUSDT', 'ALGOUSDT', 'ZILUSDT',
'KNCUSDT', 'ZRXUSDT', 'COMPUSDT', 'OMGUSDT', 'DOGEUSDT', 'SXPUSDT', 'KAVAUSDT', 'BANDUSDT', 'RLCUSDT',
'WAVESUSDT', 'MKRUSDT', 'SNXUSDT', 'DOTUSDT', 'DEFIUSDT', 'YFIUSDT', 'BALUSDT', 'CRVUSDT', 'TRBUSDT',
'RUNEUSDT', 'SUSHIUSDT', 'SRMUSDT', 'EGLDUSDT', 'SOLUSDT', 'ICXUSDT', 'STORJUSDT', 'BLZUSDT', 'UNIUSDT',
'AVAXUSDT', 'FTMUSDT', 'HNTUSDT', 'ENJUSDT', 'FLMUSDT', 'TOMOUSDT', 'RENUSDT', 'KSMUSDT', 'NEARUSDT',
'AAVEUSDT', 'FILUSDT', 'RSRUSDT', 'LRCUSDT', 'MATICUSDT', 'OCEANUSDT', 'CVCUSDT', 'BELUSDT', 'CTKUSDT',
'AXSUSDT', 'ALPHAUSDT', 'ZENUSDT', 'SKLUSDT', 'GRTUSDT', '1INCHUSDT', 'CHZUSDT', 'SANDUSDT', 'ANKRUSDT',
'BTSUSDT', 'LITUSDT', 'UNFIUSDT', 'REEFUSDT', 'RVNUSDT', 'SFPUSDT', 'XEMUSDT', 'BTCSTUSDT', 'COTIUSDT',
'CHRUSDT', 'MANAUSDT', 'ALICEUSDT', 'HBARUSDT', 'ONEUSDT', 'LINAUSDT', 'STMXUSDT', 'DENTUSDT', 'CELRUSDT',
'HOTUSDT', 'MTLUSDT', 'OGNUSDT', 'NKNUSDT', 'SCUSDT', 'DGBUSDT', '1000SHIBUSDT', 'ICPUSDT', 'BAKEUSDT',
'GTCUSDT', 'BTCDOMUSDT', 'TLMUSDT', 'IOTXUSDT', 'AUDIOUSDT', 'RAYUSDT', 'C98USDT', 'MASKUSDT', 'ATAUSDT',
'DYDXUSDT', '1000XECUSDT', 'GALAUSDT', 'CELOUSDT', 'ARUSDT', 'KLAYUSDT', 'ARPAUSDT', 'CTSIUSDT', 'LPTUSDT',
'ENSUSDT', 'PEOPLEUSDT', 'ANTUSDT', 'ROSEUSDT', 'DUSKUSDT', 'FLOWUSDT', 'IMXUSDT', 'API3USDT', 'GMTUSDT',
'APEUSDT', 'BNXUSDT', 'WOOUSDT', 'FTTUSDT', 'JASMYUSDT', 'DARUSDT', 'GALUSDT', 'OPUSDT', 'BTCUSDT',
'ETHUSDT', 'INJUSDT', 'STGUSDT', 'FOOTBALLUSDT', 'SPELLUSDT', '1000LUNCUSDT', 'LUNA2USDT', 'LDOUSDT',
'CVXUSDT']

print(len(symbols))

باہر:

153

#Function to obtain any period of K-line
def GetKlines(symbol='BTCUSDT',start='2020-8-10',end='2021-8-10',period='1h',base='fapi',v = 'v1'):
    Klines = []
    start_time = int(time.mktime(datetime.strptime(start, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000
    end_time =  min(int(time.mktime(datetime.strptime(end, "%Y-%m-%d").timetuple()))*1000 + 8*60*60*1000,time.time()*1000)
    intervel_map = {'m':60*1000,'h':60*60*1000,'d':24*60*60*1000}
    while start_time < end_time:
        mid_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
        url = 'https://'+base+'.binance.com/'+base+'/'+v+'/klines?symbol=%s&interval=%s&startTime=%s&endTime=%s&limit=1000'%(symbol,period,start_time,mid_time)
        res = requests.get(url)
        res_list = res.json()
        if type(res_list) == list and len(res_list) > 0:
            start_time = res_list[-1][0]+int(period[:-1])*intervel_map[period[-1]]
            Klines += res_list
        if type(res_list) == list and len(res_list) == 0:
            start_time = start_time+1000*int(period[:-1])*intervel_map[period[-1]]
        if mid_time >= end_time:
            break
    df = pd.DataFrame(Klines,columns=['time','open','high','low','close','amount','end_time','volume','count','buy_amount','buy_volume','null']).astype('float')
    df.index = pd.to_datetime(df.time,unit='ms')
    return df
start_date = '2022-1-1'
end_date = '2022-09-14'
period = '1h'
df_dict = {}
for symbol in symbols:
    df_s = GetKlines(symbol=symbol,start=start_date,end=end_date,period=period,base='fapi',v='v1')
    if not df_s.empty:
        df_dict[symbol] = df_s
symbols = list(df_dict.keys())
print(df_s.columns)

باہر:

Index(['time', 'open', 'high', 'low', 'close', 'amount', 'end_time', 'volume',
       'count', 'buy_amount', 'buy_volume', 'null'],
      dtype='object')

ہمیں دلچسپی رکھنے والے اعداد و شمار: اختتامی قیمت ، افتتاحی قیمت ، تجارتی حجم ، لین دین کی تعداد ، اور ٹیکر خریدنے والے تناسب پہلے K لائن کے اعداد و شمار سے نکالے جاتے ہیں۔ ان اعداد و شمار کی بنیاد پر ، مطلوبہ عوامل پر کارروائی کی جاتی ہے۔

df_close = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
df_open = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
df_volume = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
df_buy_ratio = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
df_count = pd.DataFrame(index=pd.date_range(start=start_date, end=end_date, freq=period),columns=df_dict.keys())
for symbol in df_dict.keys():
    df_s = df_dict[symbol]
    df_close[symbol] = df_s.close
    df_open[symbol] = df_s.open
    df_volume[symbol] = df_s.volume
    df_count[symbol] = df_s['count']
    df_buy_ratio[symbol] = df_s.buy_amount/df_s.amount
df_close = df_close.dropna(how='all')
df_open = df_open.dropna(how='all')
df_volume = df_volume.dropna(how='all')
df_count = df_count.dropna(how='all')
df_buy_ratio = df_buy_ratio.dropna(how='all')

مارکیٹ انڈیکس کی مجموعی کارکردگی تاریک ہے، جو سال کے آغاز سے حالیہ دنوں تک 60 فیصد گر گئی ہے۔

df_norm = df_close/df_close.fillna(method='bfill').iloc[0] #normalization
df_norm.mean(axis=1).plot(figsize=(15,6),grid=True);
#Final index profit chart

img

عنصر کی موزونیت کا فیصلہ

  • رجعت کا طریقہ مندرجہ ذیل مدت کی پیداوار منحصر متغیر ہے ، اور جانچنے والا عنصر آزاد متغیر ہے۔ رجعت کے ذریعہ حاصل ہونے والا گتانک بھی عنصر کی پیداوار ہے۔ رجعت کے مساوات کی تعمیر کے بعد ، عوامل کی موزونیت اور اتار چڑھاؤ کو عام طور پر گتانک t قدر کی مطلق اوسط قیمت ، گتانک t قدر کی مطلق قدر ترتیب کا تناسب 2 سے زیادہ ، سالانہ فیکٹر واپسی ، سالانہ فیکٹر منافع کی اتار چڑھاؤ ، اور فیکٹر منافع کا شارپ تناسب کے حوالہ سے دیکھا جاتا ہے۔ ایک وقت میں متعدد عوامل کو رجعت دی جاسکتی ہے۔ تفصیلات کے لئے براہ کرم بارہ دستاویز کا حوالہ دیں۔

  • آئی سی، آئی آر اور دیگر اشارے نام نہاد آئی سی فیکٹر اور اگلے دور کی واپسی کی شرح کے مابین ارتباط کا گتانک ہے۔ اب ، RANK_ IC عام طور پر بھی استعمال ہوتا ہے ، یہ فیکٹر رینکنگ اور اگلے اسٹاک کی واپسی کی شرح کے مابین ارتباط کا گتانک ہے۔ آئی آر عام طور پر آئی سی ترتیب / آئی سی ترتیب کے معیاری انحراف کی اوسط قیمت ہے۔

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

اصل بیک ٹسٹ آپریشن

منتخب کیے جانے والے سککوں کو عوامل کی درجہ بندی کے مطابق چھوٹے سے بڑے تک 3 گروپوں میں تقسیم کیا جاتا ہے۔ کرنسیوں کا ہر گروپ کل کے تقریبا 1/3 حصے کا حامل ہے۔ اگر کوئی عنصر موثر ہے تو ، ہر گروپ میں پوائنٹس کی تعداد جتنی کم ہوگی ، منافع کی شرح اتنی ہی زیادہ ہوگی ، لیکن اس کا یہ مطلب بھی ہے کہ ہر کرنسی میں نسبتا more زیادہ فنڈز مختص کیے جائیں گے۔ اگر لمبی اور مختصر پوزیشنیں بالترتیب ڈبل لیوریج ہیں ، اور پہلا گروپ اور آخری گروپ بالترتیب 10 کرنسیاں ہیں تو ، ایک کرنسی کل کا 10٪ ہے۔ اگر ایک کرنسی جو مختصر ہے دوگنی ہوجاتی ہے تو ، 20٪ واپس لے لی جاتی ہے۔ اگر گروپوں کی تعداد 50 ہے تو ، 4٪ واپس لے لیا جائے گا۔ متنوع کرنسیوں سے بلیک سوان کے خطرے کو کم کیا جاسکتا ہے۔ پہلے گروپ (کم سے کم قدر عنصر) کو طویل کریں ، تیسرے گروپ میں جائیں۔ عنصر جتنا بڑا ہوگا ، اور رقم زیادہ ہوگی ، آپ آسانی سے اس عنصر کو تبدیل کرسکتے ہیں اور مختصر پوزیشن کو منفی یا منفی یا منفی منافع میں تبدیل کرسکتے ہیں۔

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

پوزیشن ایڈجسٹمنٹ کی تعدد کے سلسلے میں ، اسٹاک مارکیٹ میں عام طور پر 5 دن ، 10 دن اور ایک ماہ کی مدت ہوتی ہے۔ تاہم ، ڈیجیٹل کرنسی مارکیٹ کے ل such ، اس طرح کی مدت بلا شبہ بہت لمبی ہے ، اور حقیقی بوٹ میں مارکیٹ کو حقیقی وقت میں مانیٹر کیا جاتا ہے۔ پوزیشنوں کو دوبارہ ایڈجسٹ کرنے کے لئے کسی خاص مدت پر قائم رہنا ضروری نہیں ہے۔ لہذا ، حقیقی بوٹ میں ، ہم حقیقی وقت میں یا مختصر مدت میں پوزیشنوں کو ایڈجسٹ کرتے ہیں۔

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

#Backtest engine
class Exchange:
    
    def __init__(self, trade_symbols, fee=0.0004, initial_balance=10000):
        self.initial_balance = initial_balance #Initial assets
        self.fee = fee
        self.trade_symbols = trade_symbols
        self.account = {'USDT':{'realised_profit':0, 'unrealised_profit':0, 'total':initial_balance, 'fee':0, 'leverage':0, 'hold':0}}
        for symbol in trade_symbols:
            self.account[symbol] = {'amount':0, 'hold_price':0, 'value':0, 'price':0, 'realised_profit':0,'unrealised_profit':0,'fee':0}
            
    def Trade(self, symbol, direction, price, amount):
        
        cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
        open_amount = amount - cover_amount
        self.account['USDT']['realised_profit'] -= price*amount*self.fee #Net of fees
        self.account['USDT']['fee'] += price*amount*self.fee
        self.account[symbol]['fee'] += price*amount*self.fee

        if cover_amount > 0: #Close position first
            self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount  #Profits
            self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
            
            self.account[symbol]['amount'] -= -direction*cover_amount
            self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
            
        if open_amount > 0:
            total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
            total_amount = direction*self.account[symbol]['amount']+open_amount
            
            self.account[symbol]['hold_price'] = total_cost/total_amount
            self.account[symbol]['amount'] += direction*open_amount
                    
    
    def Buy(self, symbol, price, amount):
        self.Trade(symbol, 1, price, amount)
        
    def Sell(self, symbol, price, amount):
        self.Trade(symbol, -1, price, amount)
        
    def Update(self, close_price): #Update assets
        self.account['USDT']['unrealised_profit'] = 0
        self.account['USDT']['hold'] = 0
        for symbol in self.trade_symbols:
            if not np.isnan(close_price[symbol]):
                self.account[symbol]['unrealised_profit'] = (close_price[symbol] - self.account[symbol]['hold_price'])*self.account[symbol]['amount']
                self.account[symbol]['price'] = close_price[symbol]
                self.account[symbol]['value'] = abs(self.account[symbol]['amount'])*close_price[symbol]
                self.account['USDT']['hold'] += self.account[symbol]['value']
                self.account['USDT']['unrealised_profit'] += self.account[symbol]['unrealised_profit']
        self.account['USDT']['total'] = round(self.account['USDT']['realised_profit'] + self.initial_balance + self.account['USDT']['unrealised_profit'],6)
        self.account['USDT']['leverage'] = round(self.account['USDT']['hold']/self.account['USDT']['total'],3)

#Function of test factor
def Test(factor, symbols, period=1, N=40, value=300):
    e = Exchange(symbols, fee=0.0002, initial_balance=10000)
    res_list = []
    index_list = []
    factor = factor.dropna(how='all')
    for idx, row in factor.iterrows():
        if idx.hour % period == 0:
            buy_symbols =  row.sort_values().dropna()[0:N].index
            sell_symbols = row.sort_values().dropna()[-N:].index
            prices = df_close.loc[idx,]
            index_list.append(idx)
            for symbol in symbols:
                if symbol in buy_symbols and e.account[symbol]['amount'] <= 0:
                    e.Buy(symbol,prices[symbol],value/prices[symbol]-e.account[symbol]['amount'])
                if symbol in sell_symbols and e.account[symbol]['amount'] >= 0:
                    e.Sell(symbol,prices[symbol], value/prices[symbol]+e.account[symbol]['amount'])
            e.Update(prices)
            res_list.append([e.account['USDT']['total'],e.account['USDT']['hold']])
    return pd.DataFrame(data=res_list, columns=['total','hold'],index = index_list)

سادہ فیکٹر ٹیسٹ

ٹریڈنگ حجم فیکٹر: کم ٹریڈنگ حجم کے ساتھ سادہ لمبی کرنسیاں اور اعلی ٹریڈنگ حجم کے ساتھ مختصر کرنسیاں ، جو بہت اچھی کارکردگی کا مظاہرہ کرتی ہیں ، جس سے یہ ظاہر ہوتا ہے کہ مقبول کرنسیوں میں کمی کا رجحان ہے۔

تجارتی قیمت کا عنصر: کم قیمتوں کے ساتھ طویل کرنسیوں اور اعلی قیمتوں کے ساتھ مختصر کرنسیوں کے جانے کا اثر دونوں عام ہیں۔

ٹرانزیکشن نمبر فیکٹر: کارکردگی ٹرانزیکشن حجم سے بہت ملتی جلتی ہے۔ یہ واضح ہے کہ ٹرانزیکشن حجم فیکٹر اور ٹرانزیکشن نمبر فیکٹر کے مابین ارتباط بہت زیادہ ہے۔ در حقیقت ، مختلف کرنسیوں میں ان کے مابین اوسطا تعلق 0.97 تک پہنچ گیا ہے ، جس سے یہ ظاہر ہوتا ہے کہ دونوں عوامل بہت ملتے جلتے ہیں۔ متعدد عوامل کو ترکیب کرتے وقت اس عنصر کو مدنظر رکھنے کی ضرورت ہے۔

3h رفتار کا عنصر: (df_close - df_close. shift (3)) /df_ close. shift(3). یعنی ، عنصر کا 3 گھنٹے کا اضافہ۔ بیک ٹیسٹ کے نتائج سے پتہ چلتا ہے کہ 3 گھنٹے کے اضافے میں رجعت کی واضح خصوصیات ہیں ، یعنی ، بعد میں گرنا آسان ہے۔ مجموعی کارکردگی ٹھیک ہے ، لیکن پیچھے ہٹنے اور دوڑ دوڑ کا ایک طویل عرصہ بھی ہے۔

24h رفتار فیکٹر: 24h پوزیشن ایڈجسٹمنٹ کی مدت کا نتیجہ اچھا ہے، پیداوار 3h رفتار سے ملتی جلتی ہے، اور واپس لینے چھوٹا ہے.

ٹرانزیکشن حجم کا تبدیلی کا عنصر: df_ volume.rolling(24).mean() /df_ volume.rolling (96).mean() ، یعنی ، آخری دن میں ٹرانزیکشن حجم کا تناسب آخری تین دنوں میں ٹرانزیکشن حجم سے۔ پوزیشن کو ہر 8h میں ایڈجسٹ کیا جاتا ہے۔ بیک ٹسٹنگ کے نتائج اچھے تھے ، اور انخلا بھی نسبتا low کم تھا ، جس سے یہ ظاہر ہوتا ہے کہ فعال ٹرانزیکشن حجم رکھنے والوں میں کمی کا زیادہ امکان تھا۔

ٹرانزیکشن نمبر کا تبدیلی کا عنصر: df_ count.rolling ((24).mean() /df_ count.rolling ((96). mean () ، یعنی ، آخری دن میں ٹرانزیکشن نمبر کا تناسب آخری تین دن میں ٹرانزیکشن نمبر سے۔ پوزیشن کو ہر 8h میں ایڈجسٹ کیا جاتا ہے۔ بیک ٹسٹنگ کے نتائج اچھے تھے ، اور انخلا بھی نسبتا low کم ہے ، جس سے یہ ظاہر ہوتا ہے کہ فعال ٹرانزیکشن حجم رکھنے والوں میں کمی کا امکان زیادہ تھا۔

ایک ٹرانزیکشن کی قیمت کا تبدیلی کا عنصر: - ((df_volume.rolling(24).mean() /df_count.rolling(24.mean()) /(df_volume.rolling(24.mean() /df_count.rolling(96.mean()) ، یعنی آخری دن کے ٹرانزیکشن ویلیو کا تناسب آخری تین دنوں کے ٹرانزیکشن ویلیو کا اور پوزیشن کو ہر 8 گھنٹے میں ایڈجسٹ کیا جائے گا۔ یہ عنصر ٹرانزیکشن حجم فیکٹر کے ساتھ بھی بہت وابستہ ہے۔

ٹرانزیکشن تناسب کے لحاظ سے ٹیکر کا تبدیلی فیکٹر: df_buy_ratio.rolling(24).mean() /df_buy_ratio.rolling(96).mean() ، یعنی ، آخری دن میں ٹرانزیکشن کے کل حجم سے لے کر آخری تین دنوں میں ٹرانزیکشن کی قیمت تک حجم کے لحاظ سے ٹیکر کا تناسب ، اور پوزیشن کو ہر 8 گھنٹوں میں ایڈجسٹ کیا جائے گا۔ یہ عنصر کافی اچھی کارکردگی کا مظاہرہ کرتا ہے اور اس کا ٹرانزیکشن کے حجم فیکٹر سے بہت کم تعلق ہے۔

اتار چڑھاؤ عنصر: (df_close/df_open).rolling(24).std() ، کم اتار چڑھاؤ کے ساتھ طویل کرنسیوں کو جانا، اس کا ایک خاص اثر ہے.

ٹرانزیکشن حجم اور اختتامی قیمت کے مابین ارتباط کا عنصر: df_close.rolling ((96).corr ((df_volume) ، آخری چار دن میں اختتامی قیمت میں ٹرانزیکشن حجم کا تعلق ہے ، جس نے مجموعی طور پر اچھی کارکردگی کا مظاہرہ کیا ہے۔

یہاں درج عوامل قیمت کے حجم پر مبنی ہیں۔ در حقیقت ، فیکٹر فارمولوں کا امتزاج واضح منطق کے بغیر بہت پیچیدہ ہوسکتا ہے۔ آپ مشہور الفا 101 فیکٹر تعمیراتی طریقہ کا حوالہ دے سکتے ہیں:https://github.com/STHSF/alpha101.

#transaction volume
factor_volume = df_volume
factor_volume_res = Test(factor_volume, symbols, period=4)
factor_volume_res.total.plot(figsize=(15,6),grid=True);

img

#transaction price
factor_close = df_close
factor_close_res = Test(factor_close, symbols, period=8)
factor_close_res.total.plot(figsize=(15,6),grid=True);

img

#transaction count
factor_count = df_count
factor_count_res = Test(factor_count, symbols, period=8)
factor_count_res.total.plot(figsize=(15,6),grid=True);

img

print(df_count.corrwith(df_volume).mean())

0.9671246744996017

#3h momentum factor
factor_1 =  (df_close - df_close.shift(3))/df_close.shift(3)
factor_1_res = Test(factor_1,symbols,period=1)
factor_1_res.total.plot(figsize=(15,6),grid=True);

img

#24h momentum factor
factor_2 =  (df_close - df_close.shift(24))/df_close.shift(24)
factor_2_res = Test(factor_2,symbols,period=24)
tamenxuanfactor_2_res.total.plot(figsize=(15,6),grid=True);

img

#factor of transaction volume
factor_3 = df_volume.rolling(24).mean()/df_volume.rolling(96).mean()
factor_3_res = Test(factor_3, symbols, period=8)
factor_3_res.total.plot(figsize=(15,6),grid=True);

img

#factor of transaction number
factor_4 = df_count.rolling(24).mean()/df_count.rolling(96).mean()
factor_4_res = Test(factor_4, symbols, period=8)
factor_4_res.total.plot(figsize=(15,6),grid=True);

img

#factor correlation
print(factor_4.corrwith(factor_3).mean())

0.9707239580854841

#single transaction value factor
factor_5 = -(df_volume.rolling(24).mean()/df_count.rolling(24).mean())/(df_volume.rolling(24).mean()/df_count.rolling(96).mean())
factor_5_res = Test(factor_5, symbols, period=8)
factor_5_res.total.plot(figsize=(15,6),grid=True);

img

print(factor_4.corrwith(factor_5).mean())

0.861206620552479

#proportion factor of taker by transaction
factor_6 = df_buy_ratio.rolling(24).mean()/df_buy_ratio.rolling(96).mean()
factor_6_res = Test(factor_6, symbols, period=4)
factor_6_res.total.plot(figsize=(15,6),grid=True);

img

print(factor_3.corrwith(factor_6).mean())

0.1534572192503726

#volatility factor
factor_7 = (df_close/df_open).rolling(24).std()
factor_7_res = Test(factor_7, symbols, period=2)
factor_7_res.total.plot(figsize=(15,6),grid=True);

img

#correlation factor between transaction volume and closing price
factor_8 = df_close.rolling(96).corr(df_volume)
factor_8_res = Test(factor_8, symbols, period=4)
factor_8_res.total.plot(figsize=(15,6),grid=True);

img

ملٹی فیکٹر ترکیب

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

برابر وزن کا طریقہ: سنتھیز کے بعد نئے عوامل حاصل کرنے کے لئے تمام عوامل کو برابر وزن کے ساتھ شامل کیا جاتا ہے۔

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

زیادہ سے زیادہ آئی سی_آئی آر وزن کرنے کا طریقہ: تاریخ کی ایک مدت کے دوران جامع عنصر کی اوسط آئی سی قدر کو اگلی مدت میں جامع عنصر کی آئی سی قدر کے تخمینے کے طور پر استعمال کیا جاتا ہے ، اور تاریخی آئی سی قدر کی کوویریئنس میٹرکس کو اگلی مدت میں جامع عنصر کی اتار چڑھاؤ کے تخمینے کے طور پر استعمال کیا جاتا ہے۔ آئی سی_آئی آر کے مطابق آئی سی کی متوقع قیمت کو آئی سی کے معیاری انحراف سے تقسیم کرنے کے برابر ہے تاکہ زیادہ سے زیادہ جامع عنصر آئی سی_آئی آر کا زیادہ سے زیادہ وزن حل حاصل کیا جاسکے۔

اہم اجزاء کا تجزیہ (پی سی اے): پی سی اے ڈیٹا جہتی کو کم کرنے کا ایک عام طریقہ ہے ، اور عوامل کے مابین ارتباط زیادہ ہوسکتا ہے۔ جہتی کو کم کرنے کے بعد اہم اجزاء کو مصنوعی عوامل کے طور پر استعمال کیا جاتا ہے۔

یہ کاغذ فیکٹر موزونیت تفویض دستی طور پر حوالہ دے گا. مندرجہ بالا بیان کردہ طریقوں کا حوالہ دیا جا سکتا ہے:ae933a8c-5a94-4d92-8f33-d92b70c36119.pdf

جب واحد عوامل کی جانچ کرتے ہیں تو ، چھنٹائی طے شدہ ہوتی ہے ، لیکن ملٹی فیکٹر ترکیب کو مکمل طور پر مختلف اعداد و شمار کو جوڑنے کی ضرورت ہوتی ہے ، لہذا تمام عوامل کو معیاری بنانے کی ضرورت ہے ، اور انتہائی قدر اور لاپتہ قدر کو عام طور پر ہٹانے کی ضرورت ہے۔ یہاں ہم ترکیب کے لئے df_ حجم \ عنصر_ 1 \ عنصر_ 7 \ عنصر_ 6 \ عنصر_ 8 استعمال کرتے ہیں۔

#standardize functions, remove missing values and extreme values, and standardize
def norm_factor(factor):
    factor = factor.dropna(how='all')
    factor_clip = factor.apply(lambda x:x.clip(x.quantile(0.2), x.quantile(0.8)),axis=1)
    factor_norm = factor_clip.add(-factor_clip.mean(axis=1),axis ='index').div(factor_clip.std(axis=1),axis ='index')
    return factor_norm


df_volume_norm = norm_factor(df_volume)
factor_1_norm = norm_factor(factor_1)
factor_6_norm = norm_factor(factor_6)
factor_7_norm = norm_factor(factor_7)
factor_8_norm = norm_factor(factor_8)
factor_total = 0.6*df_volume_norm + 0.4*factor_1_norm + 0.2*factor_6_norm + 0.3*factor_7_norm + 0.4*factor_8_norm
factor_total_res = Test(factor_total, symbols, period=8)
factor_total_res.total.plot(figsize=(15,6),grid=True);

img

خلاصہ

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

اصلی روبوٹ سے:https://www.fmz.com/robot/486605


متعلقہ

مزید