最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

LGBRanker排序算法重構(gòu),29個行業(yè)輪動滾動回測長期年化11.1%(代碼與數(shù)據(jù)下載)

2023-07-05 14:47 作者:bili_29558546421  | 我要投稿

原創(chuàng)文章第262篇,專注“個人成長與財富自由、世界運作的邏輯與投資"。

聚焦目標,做有意義的事情。

之于當下而言,可能有兩件事:一是AI量化可以產(chǎn)出交付實盤的有效策略;二是如何有效切入AIGC。

今天先來看看因子分析。

代碼在這個位置:alphalens相對復雜,其實我們一般也僅看ic和ric兩個數(shù)值,我們就自己實現(xiàn)了。

from typing import Tuple

import pandas as pd


def calc_ic(pred: pd.Series, label: pd.Series, date_col="date", dropna=False) -> Tuple[pd.Series, pd.Series]:

? ?df = pd.DataFrame({"pred": pred, "label": label})
? ?ic = df.groupby(date_col).apply(lambda df: df["pred"].corr(df["label"]))
? ?ric = df.groupby(date_col).apply(lambda df: df["pred"].corr(df["label"], method="spearman"))
? ?if dropna:
? ? ? ?return ic.dropna(), ric.dropna()
? ?else:
? ? ? ?return ic, ric


if __name__ == '__main__':
? ?from engine.datafeed.dataloader import CSVDataloader
? ?from engine.config import etfs_indexes
? ?from engine.config import DATA_INDEX
? ?loader = CSVDataloader(DATA_INDEX.resolve(), etfs_indexes.values(), start_date="20120101")
? ?df = loader.load(fields=['ta("MACD",close)','shift(close,-5)/close-1'], names=['factor','label'])
? ?print(df)

? ?ic, ir = calc_ic(pred=df['label'], label=df['factor'],dropna=True)
? ?print(ic.mean(), ir.mean())
? ?ic.plot()
? ?import matplotlib.pyplot as plt
? ?plt.show()

5天的RSI值為未來5天收益的因子分析:ic/ric均值為0.04,是有相關(guān)性的。

目前看,即便0.04,0.05的因子,對于未來5天收益率的分類準確性,樣本外仍然是10%左右。如果是僅預測未來是上漲還是下跌的2分類,樣本外可以達到60%多。

因此,我們?nèi)匀话严M耐性谂判蛏稀?br>

投資無外乎選股、擇時。而擇時本身也是一種廣義的選股。

選擇本身就是一種排序,擇其優(yōu)者而選之。

大家最熟悉的分類算法,在AI量化也算一種排序。就是通過分類算法,預測未來股票上漲概率。然后按概率值排序——這里對應(yīng)的就是pointwise。這里有一個明顯的問題在于,我們對每一支股票的截面數(shù)據(jù)進行預測,但沒有關(guān)心股票與股票之間的相對關(guān)系,而我們知道,預測收益概率是非常難的事情,而判斷它們之間的相對優(yōu)劣則更為容易。

重構(gòu)GBMRanker

import numpy as np
from sklearn.model_selection import train_test_split
import lightgbm as lgb

from engine.datafeed.dataset import DataSet
import joblib, os

from engine.models.model_base import ModelBase


class LGBRanker(ModelBase):
? ?def __init__(self, name, load_model, feature_cols=None):
? ? ? ?super(LGBRanker, self).__init__(name, load_model)
? ? ? ?self.feature_cols = feature_cols
? ? ? ?self.label_col = 'label'

? ?def _prepare_groups(self, df):
? ? ? ?df['day'] = df.index
? ? ? ?group = df.groupby('day')['day'].count()
? ? ? ?print(group.values)
? ? ? ?return group.values

? ?def predict(self, data):
? ? ? ?data = data.copy(deep=True)
? ? ? ?if self.feature_cols:
? ? ? ? ? ?data = data[self.feature_cols]

? ? ? ?pred = self.ranker.predict(data)
? ? ? ?return pred

? ?def train(self, df, split_date):
? ? ? ?if split_date:
? ? ? ? ? ?df_train = df[df.index < split_date]
? ? ? ? ? ?df_val = df[df.index >= split_date]

? ? ? ?query_train = self._prepare_groups(df_train.copy(deep=True))
? ? ? ?query_val = self._prepare_groups(df_val.copy(deep=True))

? ? ? ?ranker = lgb.LGBMRanker()

? ? ? ?ranker.fit(df_train[self.feature_cols], df_train[self.label_col], group=query_train,
? ? ? ? ? ? ? ? ? eval_set=[(df_val[self.feature_cols], df_val[self.label_col])], eval_group=[query_val],
? ? ? ? ? ? ? ? ? eval_at=[1, 2, 5, 10, 20], early_stopping_rounds=50)

? ? ? ?self.ranker = ranker

? ? ? ?print(ranker.n_features_)
? ? ? ?print(ranker.feature_importances_)
? ? ? ?print(ranker.feature_name_)

? ? ? ?score, names = zip(*sorted(zip(ranker.feature_importances_, ranker.feature_name_), reverse=True))
? ? ? ?print(score)
? ? ? ?print(names)


if __name__ == '__main__':
? ?from engine.config import etfs_indexes
? ?from engine.datafeed.dataloader import CSVDataloader
? ?from engine.config import DATA_INDEX
? ?from engine.datafeed.alpha import AlphaLit

? ?loader = CSVDataloader(path=DATA_INDEX.resolve(), symbols=etfs_indexes.values())
? ?ds = DataSet("行業(yè)指數(shù)數(shù)據(jù)集", loader=loader, handler=AlphaLit(), cache=False)
? ?print(ds.data)

? ?df = ds.data
? ?df.dropna(inplace=True)
? ?print(df)

? ?LGBRanker('', feature_cols=ds.get_feature_names(), load_model=False).train(df, '2022-01-01')
? ?# lightgbm.plot_importance(ranker, figsize=(12, 8))


實證告訴我們一個結(jié)論:

因子不是越多越好,哪怕GBDT可以篩選因子,但因子之間是會沖突,不恰當?shù)募尤攵嘤嗟囊蜃?,會降低訓練的性?/strong>!這里就需要驗證因子之間的相關(guān)性,正效性?!裕灰噲D一股惱把一堆因子加到模型里,讓模型自己去篩選。——如果真這樣,那就太簡單了。

模型回測——滾動回測

from engine.config import etfs_indexes
from engine.datafeed.dataset import DataSet
from engine.env import Env

from engine.config import etfs_indexes
from engine.datafeed.dataloader import CSVDataloader
from engine.config import DATA_INDEX
from engine.datafeed.alpha import AlphaLit

loader = CSVDataloader(path=DATA_INDEX.resolve(), symbols=etfs_indexes.values())
ds = DataSet("行業(yè)指數(shù)數(shù)據(jù)集", loader=loader, handler=AlphaLit(), cache=False)
print(ds.data)

from engine.algo.algos import *
from engine.algo.algo_weights import *
from engine.algo.algo_model import ModelWFA
from engine.models.lgb_ranker import LGBRanker
from engine.env import Env

model = LGBRanker(name='滾動回測——排序',load_model=False, feature_cols=ds.get_feature_names())
# model.train(ds.data, '2022-01-01')

env = Env(ds.data)
env.set_algos([
? ?RunWeekly(),
? ?ModelWFA(model=model),
? ?SelectTopK(K=2, order_by='pred_score', b_ascending=False),
? ?WeightEqually()
])

env.backtest_loop()
env.show_results()


之于這第二件事,有效切入AIGC。當下很多自媒體,甚至很多技術(shù)人員,都是看熱鬧階段,或者在周邊用chatGPT的api或者作圖的api,所謂的prompt,生成一些文章或者一些圖片。真正有效參與到這個生產(chǎn)力提升的環(huán)節(jié),普通人或者創(chuàng)業(yè)公司,要從頭訓練大模型即不現(xiàn)實也不需要。把大模型看成傳統(tǒng)“預訓練”模型就好,傳統(tǒng)我們也不會去從零開始訓練bert或者GPT,而是在預訓練的基礎(chǔ)上進行微調(diào),對于通用大模型,邏輯類似。

而且我們切入的方向一定是垂直方向,專有知識解決領(lǐng)域問題。我想到最好落地的仍然是金融,與AI量化類似,F(xiàn)inGPT應(yīng)該也會很有意思。之有做FinRL的團隊開源了FinGPT,至少這個構(gòu)想是特別好的。后續(xù)會持續(xù)關(guān)注下。

明天的文章,講講finGPT的代碼。

代碼與數(shù)據(jù)已經(jīng)發(fā)布至星球,請大家請往下載。


LGBRanker排序算法重構(gòu),29個行業(yè)輪動滾動回測長期年化11.1%(代碼與數(shù)據(jù)下載)的評論 (共 條)

分享到微博請遵守國家法律
泽普县| 河南省| 峨边| 莒南县| 珲春市| 延川县| 德安县| 阿巴嘎旗| 五家渠市| 都昌县| 卢湾区| 邻水| 中卫市| 双桥区| 鸡西市| 和硕县| 吉木萨尔县| 中阳县| 习水县| 察哈| 岗巴县| 家居| 精河县| 慈溪市| 屯门区| 长宁区| 福清市| 浮梁县| 布尔津县| 靖宇县| 崇信县| 屯昌县| 德阳市| 吕梁市| 图木舒克市| 云南省| 安达市| 荣昌县| 高要市| 定结县| 柳江县|