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

مصنف:گھاس, تخلیق: 2022-09-27 16:10:28, تازہ کاری: 2023-09-15 20:58:26

[TOC]

img

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

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

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

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

اسٹاک مارکیٹ یا ڈیجیٹل کرنسی مارکیٹ دونوں ایک پیچیدہ نظام ہیں ، اور کوئی بھی عنصر مستقبل کی واپسی کا مکمل طور پر اندازہ نہیں کرسکتا ہے ، لیکن پھر بھی اس میں ایک خاص حد تک پیش گوئی کی جاسکتی ہے۔ موثر الفا (سرمایہ کاری کے ماڈل) اور زیادہ فنڈز کی سرمایہ کاری کے ساتھ آہستہ آہستہ ناکام ہوجاتا ہے۔ لیکن اس عمل سے مارکیٹ میں دوسرے ماڈل پیدا ہوں گے ، جس سے نئے الفا پیدا ہوں گے۔ مارکیٹ ویلیو فیکٹر ایک بار اے اسٹاک مارکیٹ میں ایک بہت ہی موثر حکمت عملی تھی ، جس میں آسانی سے کم سے کم مارکیٹ ویلیو والے 10 اسٹاک خریدے گئے ، ہر دن ایک بار ایڈجسٹ کیا گیا ، اور 2007 سے دس سال کی مدت میں ، اس سے کہیں زیادہ 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

ذرائع

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

## 当前交易对
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

#获取任意周期K线的函数
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] #归一化
df_norm.mean(axis=1).plot(figsize=(15,6),grid=True);
#最终指数收益图

img

عوامل کی افادیت کا تعین

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

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

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

عملی ریگولیٹری کارروائی

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

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

اسٹاک مارکیٹوں میں اکثر 5، 10 اور ایک ماہ کے دورانیے ہوتے ہیں، لیکن ڈیجیٹل کرنسی مارکیٹوں کے لیے یہ دورانیہ بہت لمبا ہوتا ہے اور حقیقی وقت میں مارکیٹ کی نگرانی کی جاتی ہے، لہذا کسی مخصوص دورانیے پر دوبارہ تجارت کی ضرورت نہیں ہوتی۔ لہذا حقیقی وقت میں ہم حقیقی وقت یا مختصر مدت کے دورانیے پر تجارت کرتے ہیں۔

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

#回测引擎
class Exchange:
    
    def __init__(self, trade_symbols, fee=0.0004, initial_balance=10000):
        self.initial_balance = initial_balance #初始的资产
        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 #扣除手续费
        self.account['USDT']['fee'] += price*amount*self.fee
        self.account[symbol]['fee'] += price*amount*self.fee

        if cover_amount > 0: #先平仓
            self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount  #利润
            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): #对资产进行更新
        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)

#测试因子的函数
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)

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

ٹرانزیکشن فیکٹر: کم ٹرانزیکشن والی کرنسیوں کے ساتھ سادہ اور زیادہ ٹرانزیکشن والی کرنسیوں کے ساتھ بہت اچھا کارکردگی کا مظاہرہ کرنا ، جس سے یہ ظاہر ہوتا ہے کہ گرم کرنسیوں میں گرنے کا زیادہ رجحان ہے۔

ٹرانزیکشن کی قیمت کا عنصر: زیادہ قیمت والے کم کرنسیوں کو کرنا ، زیادہ قیمت والے کرنسیوں کو کرنا ، عام طور پر اثر۔

ٹرانزیکشن نمبر فیکٹر: کارکردگی اور ٹرانزیکشن کی مقدار میں بہت مماثلت ہے۔ یہ واضح طور پر نوٹ کیا جاسکتا ہے کہ ٹرانزیکشن فیکٹر اور ٹرانزیکشن نمبر فیکٹر کا تعلق بہت زیادہ ہے ، اور یہ حقیقت میں بھی ہے ، ان کی مختلف کرنسیوں میں اوسطا correlation تعلق 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 (()) ، یعنی حالیہ 1 دن کی تجارت کی مقدار اور حالیہ 3 دن کی تجارت کی مقدار کا تناسب ، ہر 8 گھنٹے میں ایک بار تجارت کو ایڈجسٹ کریں۔ retesting کے نتائج میں بہتر کارکردگی کا مظاہرہ ہوا ، اور retracement بھی کم تھا ، جس سے یہ ظاہر ہوتا ہے کہ تجارت فعال ہے لیکن اس میں زیادہ کمی کی طرف جاتا ہے۔

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

ایک ہی ٹرانزیکشن کی قیمت میں تبدیلی کے عوامل: - ((df_volume.rolling(24).mean() /df_count.rolling(24.mean()) /df_volume.rolling(24.mean() /df_count.rolling(96).mean()) یہ فیکٹر ٹرانزیکشن فیکٹر کے ساتھ بھی بہت متعلق ہے۔ یہ فیکٹر ٹرانزیکشن فیکٹر کے ساتھ بھی بہت وابستہ ہے۔

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

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

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

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

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

img

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

img

#成交笔数
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

#3小时动量因子
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

#24小时动量因子
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_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_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

#因子相关性
print(factor_4.corrwith(factor_3).mean())

0.9707239580854841

#单笔成交价值因子
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

#主动成交比例因子
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

#波动率因子
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

#成交量和收盘价相关性因子
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

کثیر عنصر کی ترکیب

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

مساوات کا قانون: تمام وزنوں کو جمع کرنے کے بعد ، ایک نیا پسماندگی عنصر ملتا ہے۔

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

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

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

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

جب ایک عنصر کی جانچ کی جاتی ہے تو ترتیب طے شدہ ہوتی ہے ، لیکن کثیر عنصر کی ترکیب میں مکمل طور پر مختلف اعداد و شمار کو اکٹھا کرنے کی ضرورت ہوتی ہے ، لہذا تمام عوامل کو معیاری طور پر سنبھالنے کی ضرورت ہوتی ہے ، عام طور پر انتہائی اور لاپتہ اقدار کو بھی سنبھالنا پڑتا ہے۔ یہاں ہمdf_volume\factor_1\factor_7\factor_6\factor_8 ترکیب کا استعمال کرتے ہیں۔

#标准化函数,去除缺失值和极值,并且进行标准化处理
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


متعلقہ

مزید

چانکنگبہت اچھی تحریر ہے

برن جانے والاگراسوان وائی وائی!!! حال ہی میں اس پر کام کر رہا ہوں

ہلکے بادلختم ہو گیا ہے۔۔۔۔۔۔میں بالکل سمجھ نہیں پا رہا ہوں۔۔۔۔۔۔

cjz140گراس دیوتا وائی وائی!!!

jmxjqr0302گراس دیوتا وائی وائی!!!

jmxjqr0302گراس دیوتا وائی وائی!!!

jmxjqr0302گراس دیوتا وائی وائی!!!

f_qگراس دیوتا وائی وائی!!!

بے شمار بادلگراس دیوتا وائی وائی!!!

ٹوٹوتو001گراس دیوتا وائی وائی!!!

زون فینگ91گراس دیوتا وائی وائی!!!