Model faktor mata uang digital

Penulis:Rumput, Dibuat: 2022-09-27 16:10:28, Diperbarui: 2023-09-15 20:58:26

[TOC]

img

Kerangka model faktor

Laporan penelitian model multi-faktor pasar saham dapat dikatakan penuh dengan teori dan praktik yang kaya. Pasar mata uang digital tidak peduli jumlah koin, nilai pasar total, volume transaksi, pasar derivatif, dll. cukup untuk memenuhi penelitian faktor. Artikel ini terutama ditujukan untuk pemula strategi kuantifikasi, tidak melibatkan prinsip-prinsip matematika dan analisis statistik yang rumit.

Faktor dapat dianggap sebagai indikator, dapat ditulis sebagai ekspresi, faktor terus berubah, mencerminkan informasi laba masa depan, dan biasanya faktor mewakili logika investasi.

Sebagai contoh: faktor harga penutupan dekat, asumsi di baliknya adalah bahwa harga saham dapat memprediksi hasil masa depan, harga saham yang lebih tinggi akan menghasilkan hasil masa depan yang lebih tinggi (atau mungkin lebih rendah), dan membangun portofolio dengan faktor ini sebenarnya adalah model / strategi investasi untuk membeli saham dengan harga tinggi secara bergilir. Secara umum, faktor-faktor yang dapat menghasilkan keuntungan yang berlebihan secara berkelanjutan sering disebut sebagai alpha. Faktor-faktor seperti nilai pasar, faktor dorongan, dan lain-lain telah diverifikasi oleh akademisi dan komunitas investasi sebagai faktor yang pernah efektif.

Baik pasar saham maupun pasar mata uang digital adalah sistem yang kompleks, tidak ada faktor yang dapat sepenuhnya memprediksi hasil masa depan, tetapi tetap memiliki tingkat prediktifitas tertentu. Alfa yang efektif (model investasi) dan secara bertahap gagal dengan masuknya lebih banyak dana. Tetapi proses ini akan menghasilkan pola lain di pasar, sehingga alfa baru lahir. Faktor nilai pasar pernah menjadi strategi yang sangat efektif di pasar saham A, dengan membeli 10 saham dengan nilai pasar terendah, disesuaikan sekali sehari, dan mendapatkan hasil yang lebih dari 400 kali lipat dari tahun 2007 yang jauh lebih baik.

Faktor yang dicari adalah dasar untuk membangun strategi, dan strategi yang lebih baik dapat dibangun dengan menggabungkan beberapa faktor efektif yang tidak terkait.

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 per jam dari awal 2022 hingga saat ini, hingga saat ini, lebih dari 150 mata uang. Seperti yang telah disebutkan sebelumnya, model faktor adalah model mata uang pilihan yang ditujukan untuk semua mata uang dan bukan satu mata uang. Data K-line berisi data seperti harga awal yang tinggi dan rendah, volume transaksi, jumlah transaksi, jumlah pembelian aktif, dan lain-lain, yang tentu saja bukan sumber dari semua faktor, seperti indeks saham AS, ekspektasi kenaikan suku bunga, data pada rantai profitabilitas, panas media sosial, dan lain-lain.

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

Di luar:

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

Di luar:

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)

Di luar:

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

Untuk memulai, kita akan mengekstrak data yang menarik dari data K-line: harga penutupan, harga pembukaan, volume transaksi, jumlah transaksi, proporsi pembelian proaktif, dan berdasarkan data ini, kita akan memproses faktor-faktor yang dibutuhkan.

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

Pada awal tahun ini, indeks pasar turun sekitar 60 persen.

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

img

Efektivitas Faktor

  • Hukum Regresi Pada tahap berikut, tingkat pengembalian sebagai variabel karena, faktor yang harus diuji sebagai variabel sendiri, koefisien yang dikembalikan adalah tingkat pengembalian faktor. Setelah menyusun persamaan regresi, umumnya akan merujuk pada rata-rata nilai absolut dari nilai koefisien t, proporsi urutan nilai absolut koefisien t yang lebih besar dari 2, parameter seperti tingkat pengembalian faktor tahunan, tingkat fluktuasi keuntungan faktor tahunan, Sharpe dari keuntungan faktor untuk melihat efektivitas dan fluktuasi faktor.

  • Indikator IC, IR dan lainnya Yang disebut IC adalah koefisien faktor yang terkait dengan tingkat pengembalian periode berikutnya, sekarang juga umum digunakan dengan RANK_IC, yaitu koefisien faktor peringkat yang terkait dengan tingkat pengembalian saham periode berikutnya. IR umumnya adalah rata-rata dari urutan IC / selisih standar dari urutan IC.

  • Sistem Regresi Tingkat Artikel ini akan menggunakan metode ini, yaitu membagi mata uang menjadi N kelompok berdasarkan urutan faktor yang akan diuji, untuk melakukan re-grouping, dan menggunakan siklus tetap untuk melakukan operasi penyesuaian. Jika ideal, pengembalian mata uang N kelompok akan menunjukkan monotonitas yang lebih baik, monoton meningkat atau menurun, dan setiap kelompok memiliki kesenjangan pengembalian yang lebih besar. Faktor ini terwujud sebagai perbedaan yang lebih baik.

Operasi pengukuran kembali yang sebenarnya

Untuk mengurutkan mata uang yang akan dipilih ke dalam 3 kelompok berdasarkan urutan dari kecil ke besar, masing-masing kelompok mata uang sekitar 1/3, jika satu faktor efektif, semakin sedikit dari setiap komponen seringkali akan menghasilkan laba yang lebih tinggi, tetapi juga berarti bahwa dana yang dialokasikan untuk masing-masing koin relatif lebih besar, jika lebih banyak ruang masing-masing dua kali lebih besar, kelompok pertama dan terakhir masing-masing 10 koin, maka rasio berat adalah 10%, jika salah satu koin yang kosong naik dua kali lipat, maka 20% ditarik kembali; jika set poin yang sesuai adalah 50, maka ditarik kembali.

Kemampuan memprediksi faktor biasanya dapat dinilai secara kasar berdasarkan hasil pengulangan akhir dan rasio Sharpe. Selain itu, perlu diperhatikan apakah ekspresi faktor sederhana, tidak sensitif terhadap ukuran kelompok, tidak sensitif terhadap interval penyesuaian, tidak sensitif terhadap waktu awal pengulangan, dll.

Dalam hal frekuensi penyesuaian, pasar saham seringkali bersiklus 5 hari, 10 hari, dan sebulan, tetapi untuk pasar mata uang digital, siklus seperti itu jelas terlalu lama, dan pasar real-time dipantau, tidak perlu melakukan penyesuaian ulang untuk mengikuti siklus tertentu, jadi di real-time kita melakukan penyesuaian real-time atau jangka pendek.

Dalam hal pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan pertimbangan.

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

Tes faktor sederhana

Faktor transaksi: hanya melakukan banyak transaksi dengan koin yang bertransaksi rendah, melakukan kosong dengan koin yang bertransaksi tinggi, kinerja yang sangat baik, yang menunjukkan bahwa mata uang populer cenderung turun.

Faktor harga transaksi: melakukan banyak mata uang dengan harga rendah, melakukan mata uang dengan harga tinggi, efeknya umumnya.

Faktor jumlah transaksi: Performa dan jumlah transaksi sangat mirip. Hal ini jelas dapat dicatat bahwa korelasi antara faktor transaksi dan faktor jumlah transaksi sangat tinggi, dan memang demikian, dengan rata-rata korelasi antara mata uang yang berbeda mencapai 0.97, yang menunjukkan bahwa kedua faktor ini sangat dekat, dan faktor ini perlu dipertimbangkan ketika menyintesis multifaktor.

Faktor momentum 3h: ((df_close - df_close.shift)) 3)) /df_close.shift ((3)); yaitu kenaikan faktor selama 3 jam, hasil retesting menunjukkan kenaikan selama 3 jam memiliki sifat regresi yang jelas, yaitu naik lebih mudah turun selanjutnya.

Faktor Motivasi 24 jam: Hasil siklus penyesuaian posisi 24 jam juga bagus, keuntungan mendekati Motivasi 3 jam, mundur lebih kecil.

Faktor perubahan volume transaksi:df_volume.rolling ((24).mean (() /df_volume.rolling ((96).mean ((), yaitu rasio antara volume transaksi 1 hari terakhir dengan volume transaksi 3 hari terakhir, disesuaikan setiap 8 jam. Hasil retesting lebih baik, dan mundurnya juga lebih rendah, yang menunjukkan bahwa volume transaksi aktif cenderung turun.

Faktor perubahan jumlah transaksi:df_count.rolling ((24).mean (() /df_count.rolling ((96).mean ((), yaitu rasio jumlah transaksi 1 hari terakhir terhadap jumlah transaksi 3 hari terakhir, disesuaikan setiap 8 jam. Hasil retesting lebih baik, mundur juga lebih rendah, yang menunjukkan bahwa jumlah transaksi yang meningkat lebih cenderung menurun daripada yang 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()) Ini adalah rasio nilai transaksi 1 hari terakhir terhadap nilai transaksi 3 hari terakhir, setiap 8 jam. Faktor ini juga sangat terkait dengan faktor volume transaksi.

Faktor perubahan rasio transaksi aktif:df_buy_ratio.rolling ((24).mean (() /df_buy_ratio.rolling ((96).mean ((), yaitu rasio volume pembelian aktif dalam 1 hari terakhir terhadap total volume transaksi terhadap nilai transaksi dalam 3 hari terakhir, satu kali setiap 8 jam. Faktor ini masih terlihat, dan tidak banyak korelasi dengan faktor volume transaksi.

Faktor volatilitas: (df_close/df_open).rolling ((24)).std ((), membuat mata uang yang bervolatilitas rendah, memiliki efek tertentu.

Df_close.rolling ((96).corr ((df_volume), harga penutupan 4 hari terakhir memiliki faktor hubungan volume transaksi, kinerja keseluruhan baik.

Berikut adalah beberapa faktor yang didasarkan pada nilai kuantitatif, namun sebenarnya kombinasi rumus faktor dapat sangat rumit dan tidak dapat memiliki logika yang jelas.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 multifaktor

Menggali faktor baru yang efektif adalah bagian yang paling penting dari proses pembuatan strategi, tetapi tanpa metode sintesis faktor yang baik, faktor alfa tunggal yang baik tidak dapat memainkan peran maksimal.

Hukum ekuivalen: Semua beban faktor sintesis lainnya ditambahkan untuk mendapatkan faktor post-sintesis baru.

Faktor historis pengembalian ditimbang: semua faktor yang harus disintesis ditambahkan sebagai bobot berdasarkan rata-rata aritmatika dari tingkat pengembalian faktor historis dalam periode terakhir untuk mendapatkan faktor post-sintesis baru. Cara ini menunjukkan bobot faktor yang lebih tinggi.

Maksimalkan nilai IC_IR dengan menggunakan nilai IC rata-rata faktor kompleks dari periode historis sebagai perkiraan nilai IC periode berikutnya dari faktor kompleks, dengan menggunakan matriks perbandingan diferensial dari nilai IC sejarah sebagai perkiraan volatilitas periode berikutnya dari faktor kompleks, berdasarkan IC_IR sama dengan nilai yang diharapkan dari IC dibagi dengan selisih standar dari IC, maka dapat diperoleh reordering yang optimal dari faktor kompleks maksimum IC_IR.

Metode analisis komponen utama (PCA): PCA adalah metode umum untuk pengurangan dimensi data, dan korelasi antara faktor mungkin relatif tinggi, menggunakan komponen utama setelah pengurangan dimensi sebagai faktor setelah sintesis.

Dalam artikel ini, kita akan membahas tentang cara manual untuk memberikan keterangan tentang faktor efektifitas.ae933a8c-5a94-4d92-8f33-d92b70c36119.pdf

Sortasi adalah tetap saat pengujian faktor tunggal, tetapi sintesis multifaktor membutuhkan penggabungan data yang sama sekali berbeda, sehingga semua faktor harus ditangani secara standarisasi, biasanya juga perlu penanganan titik dan nilai hilang. Di sini kita menggunakan sintesisdf_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

Pengamatan

Artikel ini memperkenalkan metode pengujian faktor tunggal dan menguji faktor tunggal yang umum, memperkenalkan awal metode sintesis faktor ganda, tetapi penelitian faktor ganda sangat kaya, artikel ini menyebutkan bahwa setiap titik dapat dikembangkan secara mendalam, mengubah berbagai penelitian strategi menjadi penemuan faktor alfa adalah cara yang layak, menggunakan metodologi faktor, dapat sangat mempercepat pembuktian ide perdagangan, dan memiliki banyak bahan referensi.

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


Berkaitan

Lebih banyak

ChankingTulisan yang sangat bagus.

Yang pergi ke BernGrasshopper WWE!!! baru-baru ini juga melakukan penelitian tentang hal ini.

Awan ringan"Sudah selesai.....................................................................................................................

cjz140"Mengharukan!"

Jmxjqr0302"Mengharukan!"

Jmxjqr0302"Mengharukan!"

Jmxjqr0302"Mengharukan!"

f_q"Mengharukan!"

Banyak sekali badai"Mengharukan!"

Tututu001"Mengharukan!"

xunfeng91"Mengharukan!"