ডিজিটাল মুদ্রার ফ্যাক্টর মডেল

লেখক:ঘাস, সৃষ্টিঃ ২০২২-০৯-২৭ ১৬ঃ১০ঃ২৮, আপডেটঃ ২০২৩-০৯-১৫ ২০ঃ৫৮ঃ২৬

[TOC]

img

ফ্যাক্টর মডেল ফ্রেমওয়ার্ক

স্টক মার্কেটের মাল্টিফ্যাক্টর মডেলের গবেষণার রিপোর্টটি স্নেহের সাথে ভরা, ধনী তত্ত্ব এবং অনুশীলন রয়েছে। ডিজিটাল মুদ্রা বাজারটি মুদ্রার সংখ্যা, মোট বাজার মূল্য, লেনদেনের পরিমাণ, ডেরিভেটিভ বাজার ইত্যাদি যাই হোক না কেন ফ্যাক্টর গবেষণা করার জন্য পর্যাপ্ত। এই নিবন্ধটি মূলত পরিমাণগত কৌশল নতুনদের মুখোমুখি, জটিল গাণিতিক নীতি এবং পরিসংখ্যান বিশ্লেষণ জড়িত হবে না।

একটি ফ্যাক্টর একটি সূচক হিসাবে দেখা যেতে পারে, একটি এক্সপ্রেশন হিসাবে লেখা যেতে পারে, একটি ফ্যাক্টর যা ভবিষ্যতের উপার্জন সম্পর্কিত তথ্যকে প্রতিফলিত করে এবং সাধারণত একটি বিনিয়োগের যুক্তিকে উপস্থাপন করে।

উদাহরণস্বরূপঃ বন্ধের মূল্য বন্ধের কারণ, যার পিছনে অনুমান করা হয় যে শেয়ারের দাম ভবিষ্যতের আয় পূর্বাভাস দিতে পারে, শেয়ারের দাম যত বেশি হবে ভবিষ্যতের আয় তত বেশি হবে (এবং সম্ভবত কম হবে) । এই কারণের ভিত্তিতে পোর্টফোলিও তৈরি করা আসলে নিয়মিতভাবে উচ্চমূল্যের শেয়ার কেনার বিনিয়োগের মোড / কৌশল। সাধারণভাবে বলতে গেলে, যেসব কারণগুলি দীর্ঘস্থায়ী অতিরিক্ত আয় করতে পারে সেগুলিকে আলফা বলা হয়। উদাহরণস্বরূপ, বাজার মূল্যের কারণ, গতির কারণ ইত্যাদি একাডেমিক এবং বিনিয়োগকারী সম্প্রদায় দ্বারা প্রমাণিত হয়েছে যে এটি কার্যকর ছিল।

শেয়ার বা ডিজিটাল মুদ্রার বাজার উভয়ই একটি জটিল সিস্টেম, কোনও কারণই ভবিষ্যতের উপার্জন পুরোপুরি পূর্বাভাস দিতে পারে না, তবে এটি এখনও একটি নির্দিষ্ট পরিমাণে পূর্বাভাসযোগ্যতা রাখে; কার্যকর আলফা (বিনিয়োগের মডেল) এবং আরও তহবিলের সাথে সাথে ধীরে ধীরে ব্যর্থ হয়। তবে এই প্রক্রিয়াটি বাজারে অন্য মডেলগুলি উত্পাদন করবে, যার ফলে নতুন আলফা জন্মগ্রহণ করবে। বাজার মূল্যের কারণগুলি এ শেয়ার বাজারে একটি খুব কার্যকর কৌশল ছিল, যা সহজেই সর্বনিম্ন বাজার মূল্যের 10 টি শেয়ার কিনতে, প্রতিদিন একবার সংশোধন করে, ২০০ 2007 থেকে দশকের শুরুতে আরও বেশি 400 গুণ বেশি আয় অর্জন করবে, যা একটি বড় ব্যবধানের চেয়ে বেশি। তবে বিগ আলফা ২০১৭ সালের শীর্ষস্থানীয় শেয়ার বাজারের চিত্রটি ছোট বাজার ফ্যাক্টরের ব্যর্থতার প্রতিফলন, যার পরিবর্তে মান ফ্যাক্টরগুলি জনপ্রিয় হয়ে উঠেছে। তাই ক্রমাগত পরীক্ষা এবং আলফার মধ্যে ভারসাম্য এবং চেষ্টা করার প্রয়োজন।

অনুসন্ধান করা কারণগুলি কৌশল গঠনের ভিত্তি এবং একাধিক অপ্রাসঙ্গিক কার্যকর কারণগুলির সংমিশ্রণ দ্বারা আরও ভাল কৌশল তৈরি করা যেতে পারে।

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

তথ্যসূত্র

বিএনএ ইউএসডিটি চিরস্থায়ী ফিউচার ২০২২ সালের শুরু থেকে এখন পর্যন্ত ঘণ্টায় কে-লাইন ডেটা, এখন পর্যন্ত, ১৫০ টিরও বেশি মুদ্রা। আগে বলা হয়েছে যে, ফ্যাক্টর মডেলটি একটি বিকল্প মুদ্রা মডেল যা সমস্ত মুদ্রার দিকে দৃষ্টি নিবদ্ধ করে, কোনও মুদ্রার দিকে নয়। কে-লাইন ডেটাতে উচ্চ ও নিম্ন প্রাপ্তির দাম, লেনদেনের পরিমাণ, লেনদেনের সংখ্যা, সক্রিয় ক্রয়ের পরিমাণ ইত্যাদি অন্তর্ভুক্ত রয়েছে, যা অবশ্যই সমস্ত কারণের উত্স নয়, যেমন মার্কিন স্টক সূচক, সুদের বৃদ্ধি প্রত্যাশা, লাভজনকতা চেইন ডেটা, সামাজিক মিডিয়া উত্তাপ ইত্যাদি। শীতল উত্সগুলিও কার্যকর আলফা আবিষ্কার করতে পারে, তবে বেসিক মূল্যের ডেটা পুরোপুরি পর্যাপ্ত।

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

প্রাথমিকভাবে কে-লাইন ডেটা থেকে আমাদের আগ্রহের তথ্য বের করাঃ বন্ধের মূল্য, খোলা মূল্য, লেনদেনের পরিমাণ, লেনদেনের সংখ্যা, প্রারম্ভিক ক্রয়ের অনুপাত, এবং এই তথ্যের ভিত্তিতে প্রয়োজনীয় কারণগুলি প্রক্রিয়া করা।

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 এর সাথেও ব্যবহৃত হয়।

  • স্তরায়ন regression এই নিবন্ধটি এই পদ্ধতি ব্যবহার করবে, যা হ'ল পরীক্ষার জন্য ফ্যাক্টরগুলির ক্রমানুসারে কয়েনগুলিকে N গোষ্ঠীতে ভাগ করে নেওয়ার জন্য পুনরায় গোষ্ঠীভুক্ত করা, স্থির সময়কাল ব্যবহার করে ট্রেডিংয়ের অপারেশন। আদর্শ ক্ষেত্রে, N গোষ্ঠীর কয়েনগুলির আয়তন ভাল এককতা প্রদর্শন করে, এককভাবে বৃদ্ধি বা হ্রাস পায় এবং প্রতিটি গোষ্ঠীর আয়তনের ব্যবধান বড় হয়। এই কারণগুলি ভাল পার্থক্য হিসাবে প্রকাশিত হয়। যদি প্রথম গোষ্ঠীটি সর্বোচ্চ আয় করে এবং শেষ গোষ্ঠীটি আয় করে তবে প্রথমটি কমপ্লেক্স করুন এবং শেষটি খালি করুন।

বাস্তব পুনরায় পরীক্ষা অপারেশন

পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্টের ভিত্তিতে পয়েন্ট

ফ্যাক্টর পূর্বাভাসের ক্ষমতা সাধারণত চূড়ান্ত রিটার্নিংয়ের রিটার্ন এবং শার্প অনুপাতের উপর ভিত্তি করে মূল্যায়ন করা যেতে পারে। এছাড়াও ফ্যাক্টর এক্সপ্রেশনটি সহজ কিনা, সেলিব্রেশনের আকারের প্রতি সংবেদনশীল নয়, ডিলিংয়ের ব্যবধানের প্রতি সংবেদনশীল নয়, রিটার্নিংয়ের প্রাথমিক সময়ের প্রতি সংবেদনশীল নয় ইত্যাদি।

লেনদেনের ফ্রিকোয়েন্সি সম্পর্কে, স্টক মার্কেটগুলি প্রায়শই ৫ দিন, ১০ দিন এবং এক মাসের জন্য চক্রযুক্ত হয়, তবে ডিজিটাল মুদ্রার বাজারের জন্য, এই চক্রগুলি অবশ্যই খুব দীর্ঘ এবং বাস্তব বাজারে বাজারের বাস্তব সময়ে পর্যবেক্ষণ করা হয়, একটি নির্দিষ্ট চক্রের জন্য পুনরায় লেনদেনের প্রয়োজন হয় না, তাই বাস্তব বাজারে আমরা বাস্তব সময় বা স্বল্পমেয়াদী চক্রের লেনদেন করি।

কিভাবে সমতলকরণ করা যায়, ঐতিহ্যগত পদ্ধতি অনুসারে, পরবর্তী শ্রেণিবদ্ধকরণের সময় গ্রুপের বাইরেও সমতলকরণ করা যায়; তবে রিয়েল-টাইম ট্রেডিংয়ের ক্ষেত্রে, কিছু মুদ্রা ঠিক বিভাজনের দিকে থাকতে পারে এবং ফিরেও সমতলকরণের পরিস্থিতি দেখা দিতে পারে। অতএব, এই কৌশলটি প্যাকেজ পরিবর্তনের জন্য অপেক্ষা করে, যখন প্যাকেজ পরিবর্তন করার প্রয়োজন হয় তখন আবার সমতলকরণ করা হয়, যেমন প্রথম গ্রুপটি বেশি করে, যখন প্যাকেজটি তৃতীয় গ্রুপে বিভক্ত করা হয় তখন আবার সমতলকরণ করা হয়। যদি নির্দিষ্ট প্যাকেজিং চক্র থাকে, যেমন প্রতিদিন বা প্রতি 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)

সহজ ফ্যাক্টর টেস্ট

লেনদেনের ফ্যাক্টরঃ কম লেনদেনের মুদ্রা এবং উচ্চ লেনদেনের মুদ্রা খুব ভাল পারফরম্যান্স করে। এটি হট মুদ্রার আরও পতনের প্রবণতা দেখায়।

লেনদেনের মূল্যের কারণঃ কম দামের মুদ্রা তৈরি করা, উচ্চ মূল্যের মুদ্রা তৈরি করা, সাধারণ প্রভাব।

লেনদেনের সংখ্যা ফ্যাক্টরঃ পারফরম্যান্স এবং লেনদেনের পরিমাণ খুব অনুরূপ। এটি স্পষ্টভাবে লক্ষ্য করা যায় যে লেনদেনের সংখ্যা এবং লেনদেনের সংখ্যা ফ্যাক্টরগুলির মধ্যে সম্পর্ক খুব উচ্চ, এবং বাস্তবেও এটি সত্য, তাদের বিভিন্ন মুদ্রার মধ্যে গড় সম্পর্ক 0.97 এ পৌঁছেছে, যা দেখায় যে দুটি ফ্যাক্টর খুব কাছাকাছি, যা বহুগুণের সংমিশ্রণের সময় বিবেচনা করা দরকার।

৩ ঘন্টা গতিশীলতা ফ্যাক্টরঃ ((df_close - df_close.shift)))) /df_close.shift))); অর্থাৎ ফ্যাক্টরটির ৩ ঘন্টার বৃদ্ধি, রিটেলিংয়ের ফলাফল দেখায় যে ৩ ঘন্টার বৃদ্ধিতে সুস্পষ্ট প্রত্যাবর্তনের বৈশিষ্ট্য রয়েছে, অর্থাৎ উপরে উঠা পরবর্তী সময়ে আরও সহজেই হ্রাস পায়। সামগ্রিকভাবে পারফরম্যান্স ভাল, তবে আরও দীর্ঘ সময় প্রত্যাহার এবং দোলন সময়ও রয়েছে।

24 ঘন্টা গতির ফ্যাক্টরঃ 24 ঘন্টা স্থিতিস্থাপক চক্রের ফলাফল ভাল, 3 ঘন্টা গতির কাছাকাছি লাভ এবং ছোট প্রত্যাহার।

লেনদেনের পরিমাণ পরিবর্তনের ফ্যাক্টরঃdf_volume.rolling ((24) ।mean (() /df_volume.rolling ((96).mean ((), অর্থাৎ গত ১ দিনের লেনদেনের তুলনায় গত ৩ দিনের লেনদেনের অনুপাত, প্রতি ৮ ঘণ্টায় একবার লেনদেন পরিবর্তন করা হয়। রিট্রেসিংয়ের ফলাফল তুলনামূলকভাবে ভাল এবং রিট্র্যাক্টও কম। এটি নির্দেশ করে যে লেনদেন সক্রিয় হলে এটি হ্রাসের প্রবণতা বেশি।

লেনদেনের সংখ্যা পরিবর্তনের ফ্যাক্টরঃdf_count.rolling ((24) ।mean (() /df_count.rolling ((96) ।mean (())), অর্থাৎ গত ১ দিনের লেনদেনের সংখ্যা গত ৩ দিনের লেনদেনের সংখ্যার সাথে তুলনা করে প্রতি ৮ ঘণ্টায় লেনদেনের পরিমাণ পরিবর্তন করা হয়। রিটার্নিংয়ের ফলাফল তুলনামূলকভাবে ভাল এবং প্রত্যাহারও তুলনামূলকভাবে কম। এটি নির্দেশ করে যে লেনদেনের সংখ্যা বৃদ্ধি সক্রিয় পরিবর্তে হ্রাসের প্রবণতা বেশি।

একক লেনদেনের মূল্য পরিবর্তনের কারণঃ - ((df_volume.rolling(২৪).mean()/df_count.rolling(২৪.mean())/(df_volume.rolling(২৪.mean()/df_count.rolling(৯৬.mean()) এই ফ্যাক্টরটি ট্রেড পরিমাণের ফ্যাক্টরের সাথেও অত্যন্ত সম্পর্কিত।

সক্রিয় লেনদেনের অনুপাতের পরিবর্তনের ফ্যাক্টরঃdf_buy_ratio.rolling ((24).mean (() /df_buy_ratio.rolling ((96).mean ((), অর্থাৎ সর্বশেষ ১ দিনের সক্রিয় ক্রয় পরিমাণ এবং মোট লেনদেনের পরিমাণের সাথে সর্বশেষ ৩ দিনের লেনদেনের মূল্যের অনুপাত, প্রতি ৮ ঘন্টা পর পর একবার। এই ফ্যাক্টরটি এখনও প্রদর্শিত হয়, এবং লেনদেনের পরিমাণের সাথে সামান্য সম্পর্ক রয়েছে।

মুদ্রাটির ভোল্টেবিলিটি ফ্যাক্টরঃ ((df_close/df_open).rolling ((24)).std ((), যা অনেকগুলি অস্থিরতার সাথে ছোট মুদ্রা তৈরি করে, এর একটি নির্দিষ্ট প্রভাব রয়েছে।

লেনদেনের পরিমাণ এবং বন্ধের দামের সম্পর্কিত কারণঃdf_close.rolling ((96).corr ((df_volume), গত 4 দিনের বন্ধের দামের সাথে লেনদেনের পরিমাণের সম্পর্কিত কারণ, সামগ্রিকভাবে ভাল পারফর্ম করেছে।

এখানে তালিকাভুক্ত করা হয়েছে মাত্র কয়েকটি পরিমাণ-মূল্যের ভিত্তিতে ভিত্তিক কারণ, বাস্তবে কারণ সূত্রের সংমিশ্রণগুলি খুব জটিল হতে পারে এবং সুস্পষ্ট যুক্তি ছাড়াই হতে পারে। বিখ্যাত ALPHA101 এর কারণ নির্মাণ পদ্ধতির উল্লেখ করা যেতে পারেঃ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) পদ্ধতিঃ PCA হল ডেটা ডিমেনশন করার একটি সাধারণ পদ্ধতি, কারণগুলির মধ্যে সম্পর্ক তুলনামূলকভাবে উচ্চ হতে পারে, ডিমেনশন পরবর্তী প্রধান উপাদানগুলিকে সংশ্লেষের পরে কারণ হিসাবে ব্যবহার করে।

এই নিবন্ধটি ম্যানুয়ালি রেফারেন্স ফ্যাক্টর কার্যকারিতা ক্ষমতায়ন করে। উপরে বর্ণিত পদ্ধতিগুলি উল্লেখ করা যেতে পারেঃ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গ্রীস গড ওয়াই-ওয়াই!

চুংফেন ৯১গ্রীস গড ওয়াই-ওয়াই!