Model faktor mata wang digital

Penulis:Rumput, Dicipta: 2022-09-27 16:10:28, Dikemas kini: 2023-09-15 20:58:26

[TOC]

img

Kerangka Model Faktor

Laporan kajian model multi-faktor pasaran saham boleh dikatakan penuh dengan teori dan amalan yang kaya. Pasaran mata wang digital tidak kira jumlah wang, nilai pasaran keseluruhan, jumlah urus niaga, pasaran derivatif, dan lain-lain yang mencukupi untuk melakukan kajian faktor. Artikel ini terutama ditujukan kepada pemula strategi kuantitatif, tidak melibatkan prinsip matematik dan analisis statistik yang rumit.

Faktor boleh dilihat sebagai satu penunjuk, boleh ditulis sebagai ungkapan, faktor sentiasa berubah, mencerminkan maklumat pendapatan masa depan, dan biasanya faktor mewakili logik pelaburan.

Sebagai contoh: faktor harga penutupan dekat, asumsi di sebalik adalah bahawa harga saham dapat meramalkan pendapatan masa depan, harga saham yang lebih tinggi adalah lebih tinggi (atau mungkin lebih rendah), dan faktor ini sebenarnya merupakan model / strategi pelaburan yang membeli saham yang lebih tinggi secara berkala. Secara amnya, faktor-faktor yang dapat menghasilkan keuntungan yang berlebihan secara berterusan sering disebut sebagai alpha. Contohnya, faktor nilai pasaran, faktor daya tarikan dan lain-lain telah disahkan oleh kalangan akademik dan pelabur sebagai faktor yang pernah berkesan.

Sama ada pasaran saham atau pasaran mata wang digital, ia adalah sistem yang rumit, tidak ada faktor yang dapat meramalkan sepenuhnya hasil masa depan, tetapi masih mempunyai tahap yang dapat diramalkan. Alfa yang berkesan (model pelaburan) dan secara beransur-ansur gagal dengan lebih banyak dana yang dimasukkan. Tetapi proses ini akan menghasilkan model lain di pasaran, yang menghasilkan alfa baru. Faktor nilai pasaran pernah menjadi strategi yang sangat berkesan di pasaran saham A, dengan mudah membeli 10 saham dengan nilai pasaran terendah, disesuaikan setiap hari, dan mendapat hasil yang lebih daripada 400 kali lipat dari tahun 2007 yang jauh lebih baik.

Faktor yang dicari adalah asas untuk membina strategi, dan strategi yang lebih baik boleh dibina dengan menggabungkan beberapa faktor yang 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

Data K-Line dari awal tahun 2022 hingga kini, setakat ini, lebih daripada 150 mata wang. Seperti yang dinyatakan sebelumnya, model faktor adalah model mata wang pilihan yang ditujukan kepada semua mata wang dan bukan mata wang tertentu. Data K-Line mengandungi data mengenai harga awal yang tinggi dan rendah, jumlah urus niaga, jumlah urus niaga, pembelian aktif, dan lain-lain, yang tentu saja bukan sumber semua faktor, seperti indeks saham AS, jangkaan kenaikan faedah, data pada rantaian keuntungan, haba media sosial, dan lain-lain. Sumber data yang tidak terbuka juga mungkin menggali alpha yang berkesan, tetapi data harga asas 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)

Keluar:

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

Keluar:

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)

Keluar:

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

Permulaan adalah untuk mengekstrak data yang kami minat dari data K-line: harga penutupan, harga pembukaan, jumlah urus niaga, jumlah urus niaga, peratusan pembelian proaktif, dan berdasarkan data ini, kami 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')

Jika dilihat secara keseluruhan, indeks pasaran menunjukkan prestasi yang kurang baik, dengan penurunan 60% sejak awal tahun ini.

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

img

Penentuan keberkesanan faktor

  • Kaedah Kembali Pada peringkat berikut, kadar pulangan sebagai pembolehubah disebabkan, faktor yang perlu diuji sebagai pembolehubah sendiri, faktor yang dikembalikan ialah kadar pulangan faktor. Selepas membina persamaan regresi, biasanya merujuk kepada nilai mutlak rata-rata nilai t faktor, peratusan siri nilai mutlak nilai t faktor yang lebih besar daripada 2, kadar pulangan faktor tahunan, kadar fluktuasi keuntungan faktor tahunan, Sharpe keuntungan faktor untuk melihat kecekapan dan fluktuasi faktor.

  • Indikator IC, IR dan lain-lain IC ialah faktor yang berkaitan dengan kadar pulangan pada tempoh berikutnya, dan kini juga digunakan sebagai RANK_IC, iaitu faktor yang berkaitan dengan kadar pulangan saham pada tempoh berikutnya.

  • Kaedah Regresi Tingkat Artikel ini akan menggunakan kaedah ini, iaitu membahagikan mata wang kepada N kumpulan berdasarkan susunan faktor yang akan diuji, untuk melakukan pengkajian semula kumpulan, dan menggunakan kitaran tetap untuk melakukan operasi penempatan. Jika keadaan ideal, pulangan mata wang kumpulan N akan menunjukkan monoton yang lebih baik, naik atau turun secara monoton, dan selisih pulangan setiap kumpulan adalah lebih besar. Faktor ini ditunjukkan sebagai perbezaan yang lebih baik. Jika kumpulan pertama memberi pulangan tertinggi, kumpulan terakhir memberi pulangan minimum, maka buat kombinasi pertama dan buat kombinasi terakhir kosong, dan akhirnya hasil yang diperoleh adalah kadar, penanda rujukan untuk nisbah Sharpe.

Operasi pengukuran semula sebenar

Mengikut faktor dari kecil ke besar, anda boleh membahagikan mata wang yang dipilih ke dalam 3 kumpulan mengikut susunan, setiap kumpulan mata wang adalah kira-kira 1/3, jika satu faktor berkesan, lebih sedikit daripada setiap komponen sering kali lebih tinggi pulangan, tetapi juga bermakna lebih banyak dana yang diedarkan kepada setiap mata wang, jika banyak ruang masing-masing dua kali lebih tinggi, kumpulan pertama dan terakhir masing-masing 10 mata wang, maka perbandingan adalah 10%, jika satu mata wang yang kosong naik dua kali lebih tinggi, maka 20% ditarik balik; jika kumpulan pembahagian yang sesuai adalah 50, maka ditarik balik.

Keupayaan ramalan faktor biasanya boleh dinilai secara kasar berdasarkan kadar pulangan dan peratusan Sharp yang diulas semula pada akhir. Selain itu, perlu diperhatikan sama ada ungkapan faktor adalah mudah, tidak sensitif terhadap saiz kumpulan, tidak sensitif terhadap selang penyesuaian, tidak sensitif terhadap masa permulaan retest, dan lain-lain.

Mengenai kekerapan penyesuaian, pasaran saham biasanya berputar dalam tempoh 5 hari, 10 hari dan sebulan, tetapi untuk pasaran mata wang digital, kitaran seperti itu pasti terlalu lama dan pasaran dalam pasaran sebenar dipantau secara langsung, tidak perlu melakukan penyesuaian semula dalam satu kitaran tertentu, jadi dalam pasaran sebenar kita adalah pembaikan kitaran masa nyata atau jangka pendek.

Mengenai bagaimana untuk menyeimbangkan, mengikut kaedah tradisional, anda boleh menyeimbangkan semasa pemesanan seterusnya tidak berada dalam kumpulan; Tetapi dalam keadaan pemesanan masa nyata, beberapa mata wang mungkin berada di sempadan pembahagian, dan akan berlaku keadaan penyeimbangan balik. Oleh itu, strategi ini menggunakan menunggu perubahan pemesanan, perlu melakukan penyeimbangan semula apabila posisi arah bertukar, seperti kumpulan pertama, apabila mata wang yang berada dalam keadaan yang banyak dibahagi kepada kumpulan ketiga, maka melakukan penyeimbangan semula. Jika tempoh penyeimbangan tetap, seperti setiap hari atau setiap 8 jam, anda juga boleh menggunakan cara penyeimbangan yang tidak berada dalam kumpulan.

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

Factor Perdagangan: Mata wang yang mudah diperdagangkan dengan jumlah yang lebih rendah dan mata wang yang berdagang dengan jumlah yang lebih tinggi, menunjukkan bahawa mata wang popular lebih cenderung untuk jatuh.

Faktor harga urus niaga: buat banyak mata wang dengan harga rendah, buat mata wang dengan harga tinggi, kesan umumnya.

Faktor jumlah urus niaga: prestasi dan jumlah urus niaga sangat serupa. Ia dapat dilihat dengan jelas bahawa faktor jumlah urus niaga dan faktor jumlah urus niaga mempunyai kaitan yang sangat tinggi, dan sebenarnya, kaitan purata antara mata wang yang berbeza mencapai 0.97, yang menunjukkan bahawa kedua-dua faktor ini sangat dekat, dan faktor ini perlu dipertimbangkan ketika menyusun banyak faktor.

3h faktor momentum: ((df_close - df_close.shift)) 3)) /df_close.shift ((3)); iaitu kenaikan faktor selama 3 jam, hasil retesting menunjukkan kenaikan selama 3 jam mempunyai ciri regresi yang jelas, iaitu naik lebih mudah turun kemudian.

24h faktor momentum: 24h kitaran penyesuaian kedudukan adalah hasil yang baik, keuntungan yang hampir dengan 3h momentum, mundur yang lebih kecil.

Faktor perubahan jumlah dagangan:df_volume.rolling ((24).mean (() /df_volume.rolling ((96).mean ((), iaitu nisbah jumlah dagangan 1 hari terakhir kepada jumlah dagangan 3 hari terakhir, setiap 8 jam. Hasil retesting menunjukkan prestasi yang lebih baik, dan retracement juga lebih rendah, yang menunjukkan bahawa jumlah dagangan aktif lebih cenderung turun.

Faktor perubahan jumlah urus niaga:df_count.rolling ((24).mean (() /df_count.rolling ((96).mean ((), iaitu nisbah jumlah urus niaga 1 hari terakhir kepada jumlah urus niaga 3 hari terakhir, setiap 8 jam. Hasil pemeriksaan semula menunjukkan prestasi yang lebih baik, dan mundur juga lebih rendah, yang menunjukkan bahawa jumlah urus niaga yang lebih aktif cenderung menurun.

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()) Ini adalah nisbah nilai dagangan 1 hari terakhir kepada nilai dagangan 3 hari terakhir, setiap 8 jam. Faktor ini juga sangat berkaitan dengan faktor jumlah dagangan.

Faktor perubahan nisbah urus niaga aktif:df_buy_ratio.rolling ((24).mean (() /df_buy_ratio.rolling ((96).mean ((), iaitu nisbah jumlah pembelian aktif dan jumlah urus niaga keseluruhan dalam satu hari terakhir kepada nisbah nilai urus niaga dalam 3 hari terakhir, satu kali setiap 8 jam; faktor ini masih berfungsi, dan tidak banyak kaitan dengan faktor urus niaga.

Faktor kadar turun naik: ((df_close/df_open).rolling ((24)).std ((), membuat mata wang yang rendah turun naik, mempunyai kesan tertentu.

Df_close.rolling ((96).corr ((df_volume), harga penutupan 4 hari yang lalu mempunyai faktor perkaitan dengan jumlah transaksi, secara keseluruhan berjalan dengan baik.

Berikut adalah beberapa faktor berdasarkan kuantiti, tetapi sebenarnya kombinasi formula faktor boleh menjadi sangat rumit tanpa logik yang jelas. Cara pembinaan faktor ALPHA101 yang terkenal boleh dirujuk: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

Sintesis pelbagai faktor

Menggali faktor-faktor baru yang berkesan adalah bahagian yang paling penting dalam proses membina strategi, tetapi tanpa kaedah sintesis faktor yang baik, faktor alpha tunggal yang baik tidak dapat memainkan peranan yang paling baik. Kaedah sintesis multi-faktor yang biasa adalah:

Peraturan persamaan: Semua beban faktor sintetik ditambah, dan mendapat faktor selepas sintetik baru.

Kaedah pengimbangan kadar pulangan faktor sejarah: semua faktor yang akan disintesis ditambah dengan nilai purata aritmatika kadar pulangan faktor sejarah dalam tempoh terkini untuk mendapatkan faktor baru selepas sintesis. Kaedah ini menunjukkan berat faktor yang lebih tinggi.

Peningkatan maksimum IC_IR: dengan menggunakan nilai IC purata faktor komposit untuk tempoh sejarah sebagai anggaran nilai IC bagi tempoh komposit seterusnya, dengan menggunakan matriks perbezaan perpaduan nilai IC bersejarah sebagai anggaran kadar turun naik faktor komposit seterusnya, dengan nilai IC_IR sama dengan nilai jangkaan IC dibahagi dengan selisih standard IC, pembiakan kuasa teratas faktor komposit maksimum IC_IR dapat diperoleh.

Kaedah analisis komponen utama (PCA): PCA adalah kaedah yang biasa digunakan untuk pengurangan dimensi data, dan hubungan antara faktor mungkin lebih tinggi, menggunakan komponen utama selepas pengurangan dimensi sebagai faktor selepas sintesis.

Dalam artikel ini, kita akan merujuk kepada kuasa keberkesanan faktor secara manual. Kaedah yang dinyatakan di atas boleh digunakan:ae933a8c-5a94-4d92-8f33-d92b70c36119.pdf

Dalam ujian faktor tunggal, susunan adalah tetap, tetapi penggabungan faktor banyak memerlukan penggabungan data yang sama sekali berbeza, dan oleh itu semua faktor perlu diuruskan secara standard, biasanya juga perlu diuruskan dengan nilai maksimum dan nilai yang hilang. Di sini kita menggunakan penggabungandf_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

Ringkasan

Artikel ini membentangkan kaedah ujian faktor tunggal dan menguji faktor tunggal yang biasa, perkenalan awal mengenai kaedah sintesis faktor ganda, tetapi kajian faktor ganda sangat kaya, artikel ini menyebut bahawa setiap titik dapat berkembang dengan mendalam, mengubah kajian strategi yang pelbagai menjadi penemuan faktor alfa adalah satu jalan yang boleh dilakukan, menggunakan metodologi faktor, dapat sangat mempercepatkan pengesahan idea perdagangan, dan terdapat banyak bahan rujukan.

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


Berkaitan

Lebih lanjut

MenyokongMenulis dengan baik.

Yang pergi ke BernGrasshopper WWE!!! baru-baru ini sedang mengkaji ini juga

Awan ringanSudah selesai..... Saya tidak faham.....

cjz140Perjuangan Grasshopper!

Jmxjqr0302Perjuangan Grasshopper!

Jmxjqr0302Perjuangan Grasshopper!

Jmxjqr0302Perjuangan Grasshopper!

f_qPerjuangan Grasshopper!

Banyak sekali burung hantu.Perjuangan Grasshopper!

Tututu001Perjuangan Grasshopper!

xunfeng91Perjuangan Grasshopper!