3
fokus pada
1444
Pengikut

Model Faktor Cryptocurrency

Dicipta dalam: 2022-09-27 16:10:28, dikemas kini pada: 2024-12-02 21:31:13
comments   12
hits   12085

[TOC]

Model Faktor Cryptocurrency

Rangka kerja model faktor

Terdapat banyak laporan penyelidikan mengenai model pelbagai faktor pasaran saham, dengan teori dan amalan yang kaya. Pasaran mata wang digital adalah mencukupi untuk penyelidikan faktor dari segi bilangan mata wang, jumlah nilai pasaran, volum urus niaga, dan pasaran derivatif pasaran niaga hadapan sebagai sumber data, rangka kerja penyelidikan faktor mudah dibina untuk memudahkan penilaian penunjuk faktor.

Faktor boleh dilihat sebagai penunjuk dan boleh ditulis sebagai ungkapan Faktor berubah secara berterusan dan mencerminkan maklumat pulangan masa hadapan Biasanya, faktor mewakili logik pelaburan.

Sebagai contoh, faktor harga penutup adalah berdasarkan andaian bahawa harga saham boleh meramalkan pulangan masa hadapan Semakin tinggi harga saham, semakin tinggi pulangan masa hadapan (atau semakin rendah pulangan berdasarkan faktor ini sebenarnya adalah pelaburan model/strategi kedudukan yang kerap berputar untuk membeli saham berharga tinggi . Secara umumnya, faktor yang boleh menjana pulangan berlebihan secara konsisten sering dipanggil Alpha. Sebagai contoh, faktor permodalan pasaran dan faktor momentum telah disahkan oleh ahli akademik dan komuniti pelaburan sebagai faktor yang berkesan.

Sama ada pasaran saham atau pasaran mata wang digital, ia adalah sistem yang kompleks Tiada faktor dapat meramalkan pulangan masa depan sepenuhnya, tetapi ia masih mempunyai tahap kebolehramalan tertentu. Alfa (model pelaburan) berkesan secara beransur-ansur menjadi tidak berkesan apabila lebih banyak dana dilaburkan. Tetapi proses ini akan menjana model lain dalam pasaran, melahirkan alfa baharu. Faktor permodalan pasaran pernah menjadi strategi yang sangat berkesan dalam pasaran A-share Hanya membeli 10 saham dengan permodalan pasaran terendah dan menyesuaikannya sekali sehari Ujian belakang sepuluh tahun dari 2007 akan memperoleh lebih daripada 400 kali ganda pulangan melebihi pasaran keseluruhan. Bagaimanapun, pasaran saham mewah pada 2017 mencerminkan ketidakberkesanan faktor permodalan pasaran yang kecil, manakala faktor nilai menjadi popular sebaliknya. Oleh itu, adalah perlu untuk sentiasa mengimbangi dan mencuba antara pengesahan dan penggunaan alfa.

Faktor yang kami cari adalah asas untuk menetapkan strategi Strategi yang lebih baik boleh dibina dengan menggabungkan pelbagai faktor berkesan yang tidak berkaitan.

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

Sumber Data

Setakat ini, data K-line setiap jam bagi niaga hadapan kekal Binance USDT dari awal 2022 hingga sekarang telah melebihi 150 mata wang. Seperti yang dinyatakan sebelum ini, model faktor ialah model pemilihan mata wang yang menyasarkan semua mata wang dan bukannya mata wang tertentu sahaja. Data K-line termasuk data seperti harga pembukaan tinggi dan penutupan rendah, volum dagangan, bilangan urus niaga, volum belian aktif, dsb. Data ini sememangnya bukan sumber semua faktor, seperti indeks saham AS, jangkaan kenaikan kadar faedah , keuntungan, data dalam rantaian, perhatian Media sosial, dsb. Sumber data yang kurang popular juga mungkin mendedahkan alfa yang berkesan, tetapi data volum asas dan harga juga mencukupi.

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

Out:

['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))

Out:

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)

Out:

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

Kami pada mulanya mengekstrak data minat daripada data K-line: harga penutup, harga pembukaan, volum dagangan, bilangan urus niaga dan nisbah belian aktif, dan menggunakan data ini sebagai asas untuk memproses faktor yang diperlukan.

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')

Melihat kepada prestasi indeks pasaran, ia boleh dikatakan agak suram, iaitu penurunan sebanyak 60% sejak awal tahun.

df_norm = df_close/df_close.fillna(method='bfill').iloc[0] #归一化
df_norm.mean(axis=1).plot(figsize=(15,6),grid=True);
#最终指数收益图

Model Faktor Cryptocurrency

Penentuan kesahihan faktor

  • Kaedah regresi Kadar pulangan tempoh seterusnya diambil sebagai pembolehubah bersandar, faktor yang akan diuji diambil sebagai pembolehubah bebas, dan pekali yang diperolehi oleh regresi ialah kadar pulangan faktor. Selepas membina persamaan regresi, kita biasanya merujuk kepada min mutlak nilai t pekali, bahagian jujukan nilai mutlak nilai t pekali lebih besar daripada 2, pulangan faktor tahunan, turun naik faktor pulangan tahunan, nisbah Sharpe bagi pulangan faktor dan parameter lain faktor keberkesanan dan turun naik. Anda boleh mengundur berbilang faktor sekaligus, rujuk dokumentasi barra untuk butiran.

  • IC, IR dan penunjuk lain Apa yang dipanggil IC ialah pekali korelasi antara faktor dan kadar pulangan tempoh berikutnya biasanya digunakan sekarang, iaitu pekali korelasi antara kedudukan faktor dan kadar pulangan saham tempoh berikutnya. IR secara amnya ialah min bagi jujukan IC/sisihan piawai bagi jujukan IC.

  • Regresi hierarki Artikel ini akan menggunakan kaedah ini, iaitu untuk mengisih faktor yang akan diuji, membahagikan mata wang kepada kumpulan N untuk ujian belakang kumpulan, dan menggunakan tempoh tetap untuk melaraskan kedudukan. Jika keadaan adalah ideal, hasil N kumpulan mata wang akan menunjukkan monotonisitas yang baik, monotonik meningkat atau menurun, dan jurang hasil antara setiap kumpulan akan menjadi besar. Faktor sedemikian dicerminkan dalam diskriminasi yang lebih baik. Jika kumpulan pertama mempunyai pulangan tertinggi dan kumpulan terakhir mempunyai pulangan paling rendah, maka pergi long pada kumpulan pertama dan pendek pada kumpulan terakhir Kadar pulangan akhir ialah penunjuk rujukan nisbah Sharpe.

Operasi ujian belakang sebenar

Mengikut faktor, mata wang yang dipilih dibahagikan kepada 3 kumpulan mengikut penyisihan daripada kecil kepada besar Setiap kumpulan mata wang menyumbang kira-kira 13 Jika satu faktor berkesan, semakin kecil bahagian setiap kumpulan, semakin tinggi hasil, tetapi ia juga bermakna Dana yang diperuntukkan kepada setiap mata wang adalah agak besar Jika kedudukan panjang dan pendek masing-masing 1x leverage, dan kumpulan pertama dan terakhir masing-masing adalah 10 mata wang, maka setiap mata wang yang kenaikan pendek, Jika jumlah pelaburan meningkat sebanyak 2 kali, anjakan akan menjadi 20%, jika bilangan kumpulan adalah 50, anjakan akan menjadi 4%. Mempelbagaikan mata wang boleh mengurangkan risiko angsa hitam. Pergi panjang pada kumpulan pertama (dengan nilai faktor terkecil) dan pendek pada kumpulan ketiga. Jika lebih besar faktor, lebih tinggi pulangan, anda boleh membalikkan kedudukan panjang dan pendek atau hanya menjadikan faktor negatif atau songsang.

Kuasa ramalan sesuatu faktor biasanya boleh dinilai secara kasar berdasarkan pulangan ujian belakang akhir dan nisbah Sharpe. Di samping itu, adalah perlu juga untuk merujuk sama ada ungkapan faktor adalah mudah, tidak sensitif kepada saiz kumpulan, tidak sensitif kepada selang pelarasan kedudukan, tidak sensitif kepada masa awal ujian belakang, dsb.

Mengenai kekerapan pelarasan kedudukan, pasaran saham selalunya mempunyai kitaran 5 hari, 10 hari dan satu bulan, tetapi untuk pasaran mata wang digital, kitaran sedemikian sudah pasti terlalu lama, dan keadaan pasaran dalam pasaran sebenar dipantau dalam masa sebenar, jadi sukar untuk berpegang kepada kitaran tertentu Tidak perlu melaraskan kedudukan semula, jadi dalam perdagangan sebenar kami melaraskan kedudukan dalam masa nyata atau dalam tempoh masa yang singkat.

Mengenai cara menutup kedudukan, mengikut kaedah tradisional, anda boleh menutup kedudukan jika ia tidak berada dalam kumpulan semasa pengisihan seterusnya. Walau bagaimanapun, dalam kes pelarasan kedudukan masa nyata, sesetengah mata wang mungkin berada di garis pemisah dan kedudukan mungkin ditutup berulang-alik. Oleh itu, strategi ini mengamalkan pendekatan menunggu perubahan kumpulan dan menutup kedudukan apabila perlu membuka kedudukan dalam arah yang bertentangan Contohnya, jika anda pergi membeli dalam kumpulan pertama, apabila mata wang dalam kedudukan panjang dibahagikan kepada kumpulan ketiga, anda boleh menutup kedudukan dan pergi pendek. Jika anda menutup kedudukan pada tempoh tetap, seperti setiap hari atau setiap 8 jam, anda juga boleh menutup kedudukan tanpa berada dalam kumpulan. Anda boleh mencuba lebih banyak lagi.

#回测引擎
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)

Ujian faktor mudah

Faktor Kelantangan: Hanya membuat panjang pada syiling dengan volum rendah dan shorting pada syiling dengan volum tinggi menunjukkan prestasi yang sangat baik, yang menunjukkan bahawa syiling popular lebih berkemungkinan jatuh.

Faktor harga urus niaga: mata wang berharga rendah lama, mata wang berharga tinggi pendek, kesannya adalah purata.

Faktor bilangan urus niaga: Prestasi hampir sama dengan volum. Jelas sekali bahawa korelasi antara faktor volum dan faktor bilangan urus niaga adalah sangat tinggi. Malah, korelasi purata antara mereka dalam mata wang yang berbeza ialah 0.97, yang menunjukkan bahawa kedua-dua faktor ini adalah sangat serupa kira.

Faktor momentum 3j: (df_close - df_close.shift(3))/df_close.shift(3). Iaitu, peningkatan 3 jam faktor Keputusan ujian belakang menunjukkan bahawa peningkatan 3 jam mempunyai ciri regresi yang jelas, iaitu peningkatan lebih cenderung untuk jatuh pada tempoh berikutnya. Prestasi keseluruhan adalah baik, tetapi terdapat juga tempoh penarikan balik dan ayunan yang lebih lama.

Faktor Momentum 24j: Keputusan kitaran pengimbangan semula 24j cukup baik, dengan pulangan yang serupa dengan momentum 3j dan pengeluaran yang lebih kecil.

Faktor perubahan pusing ganti: df_volume.rolling(24).mean() / df_volume.rolling(96).mean(), iaitu nisbah pusing ganti hari terkini kepada pusing ganti tiga hari terkini Kedudukan dilaraskan setiap 8 jam. Keputusan backtest adalah agak baik dan anjakan adalah agak rendah, yang menunjukkan bahawa saham dengan volum dagangan aktif lebih berkemungkinan jatuh.

Faktor perubahan nombor transaksi: df_count.rolling(24).mean() / df_count.rolling(96).mean(), iaitu nisbah bilangan urus niaga pada hari terakhir kepada bilangan urus niaga dalam tiga hari terakhir . Kedudukan dilaraskan setiap 8 jam. Keputusan backtest adalah agak baik dan anjakan adalah agak rendah, yang menunjukkan bahawa apabila bilangan urus niaga meningkat, pasaran cenderung jatuh dengan lebih aktif.

Faktor perubahan nilai transaksi tunggal: -(df_volume.rolling(24).mean()/df_count.rolling(24).mean())/(df_volume.rolling(24).mean()/df_count.rolling(96).mean()) , iaitu nisbah nilai transaksi hari terbaharu kepada nilai transaksi tiga hari terbaharu, dan kedudukan diselaraskan setiap 8 jam. Faktor ini juga sangat berkorelasi dengan faktor isipadu.

Faktor perubahan nisbah transaksi aktif: df_buy_ratio.rolling(24).mean()/df_buy_ratio.rolling(96).mean(), iaitu nisbah volum belian aktif kepada jumlah volum transaksi pada hari terakhir kepada urus niaga nilai dalam tiga hari lepas , laraskan kedudukan setiap 8 jam. Faktor ini berfungsi dengan baik dan mempunyai sedikit korelasi dengan faktor isipadu.

Faktor turun naik: (df_close/df_open).rolling(24).std(), yang mempunyai kesan tertentu apabila nilai mata wang yang tinggi dengan turun naik yang rendah.

Faktor korelasi antara volum dagangan dan harga tutup: df_close.rolling(96).corr(df_volume), faktor korelasi antara harga tutup dan volum dagangan dalam 4 hari lepas, prestasi keseluruhan adalah baik.

Disenaraikan di sini hanyalah beberapa faktor berdasarkan kuantiti dan harga Sebenarnya, gabungan formula faktor boleh menjadi sangat kompleks dan mungkin tidak mempunyai logik yang jelas. Anda boleh merujuk kepada kaedah pembinaan faktor ALPHA101 yang terkenal: 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);

Model Faktor Cryptocurrency

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

Model Faktor Cryptocurrency

#成交笔数
factor_count = df_count
factor_count_res = Test(factor_count, symbols, period=8)
factor_count_res.total.plot(figsize=(15,6),grid=True);

Model Faktor Cryptocurrency

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);

Model Faktor Cryptocurrency

#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);

Model Faktor Cryptocurrency

#成交量因子
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);

Model Faktor Cryptocurrency

#成交笔数因子
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);

Model Faktor Cryptocurrency

#因子相关性
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);

Model Faktor Cryptocurrency

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);

Model Faktor Cryptocurrency

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);

Model Faktor Cryptocurrency

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

Model Faktor Cryptocurrency

Sintesis pelbagai faktor

Menemukan faktor berkesan baharu secara berterusan sememangnya merupakan bahagian terpenting dalam proses pembinaan strategi, tetapi tanpa kaedah sintesis faktor yang baik, faktor Alpha tunggal yang sangat baik tidak dapat memainkan peranan maksimumnya. Kaedah sintesis berbilang faktor yang biasa termasuk:

Kaedah sama berat: Semua faktor yang hendak disintesis ditambah dengan pemberat yang sama untuk mendapatkan faktor tersintesis baharu.

Kaedah wajaran pulangan faktor sejarah: Semua faktor yang akan disintesis ditambah bersama mengikut min aritmetik pulangan faktor sejarah dalam tempoh terkini sebagai pemberat untuk mendapatkan faktor tersintesis baharu. Kaedah ini memberikan pemberat yang lebih tinggi kepada faktor yang berprestasi baik.

Memaksimumkan kaedah berwajaran IC_IR: Purata nilai IC faktor komposit sepanjang tempoh sejarah digunakan sebagai anggaran nilai IC faktor komposit dalam tempoh seterusnya, dan matriks kovarians nilai IC sejarah digunakan sebagai anggaran daripada kemeruapan faktor komposit dalam tempoh seterusnya Ia adalah sama dengan nilai jangkaan IC dibahagikan dengan sisihan piawai IC, dan penyelesaian berat optimum untuk memaksimumkan faktor komposit IC_IR boleh diperolehi.

Kaedah analisis komponen utama (PCA): PCA ialah kaedah yang biasa digunakan untuk pengurangan dimensi data Kolerasi antara faktor mungkin agak tinggi, dan komponen utama selepas pengurangan dimensi digunakan sebagai faktor yang disintesis.

Artikel ini secara manual akan merujuk kepada pemberat kesahan faktor. Kaedah yang diterangkan di atas boleh merujuk kepada:ae933a8c-5a94-4d92-8f33-d92b70c36119.pdf

Apabila menguji satu faktor, susunannya tetap, tetapi sintesis berbilang faktor memerlukan penggabungan data yang sama sekali berbeza, jadi semua faktor perlu diseragamkan, dan secara amnya nilai ekstrem dan nilai yang hilang perlu dialih keluar. Di sini kami menggunakan df_volume\factor_1\factor_7\factor_6\factor_8 untuk sintesis.

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

Model Faktor Cryptocurrency

ringkaskan

Artikel ini memperkenalkan kaedah ujian faktor tunggal dan menguji faktor tunggal biasa, dan secara awal memperkenalkan kaedah sintesis berbilang faktor Walau bagaimanapun, kandungan penyelidikan berbilang faktor adalah sangat kaya . Ia adalah pendekatan yang boleh dilaksanakan untuk mengubah penyelidikan strategi tersebut kepada penemuan faktor alfa Menggunakan metodologi faktor boleh mempercepatkan pengesahan idea perdagangan, dan terdapat banyak bahan rujukan yang tersedia.

Alamat sebenar: https://www.fmz.com/robot/486605