沪深300成份股300支股票日线数据大宽表(数据+代码下载)

我们使用alphalens分析了alpha-006这个因子【Alpha101因子分析系列】之Alpha006”价量背离“(代码+沪深300成份股全量数据集下载),这个因子比较简单,但看起来效果还不错,今天我们来具体就使用单因子对沪深300成份股进行回测看看。

年化63.9%,夏普1.4,交易出乎意料,我们还在持续的挖掘因子,这个开局效果不错。

图片

图片

代码在工程这个位置:(欢迎大家找问题),代码和数据已经在星球更新:知识星球与开源项目:万物之中,希望至美

需要说明的事,没有考虑成本与滑点,只为演示因子效果,因为这还不是我们的最终策略,最终一定是一组多因子合成的效果,回撤会比这个好,才可以交付实盘验证。

图片

import pandas as pd

# 把昨天的文件包,放在ailabx/data下的hist_hs300_20230813下,使用duckdb直接访问
from engine.config import CSVS_DIR

from engine.datafeed.dataloader import Duckdbloader

symbols = ['000001.SZ', '000002.SZ']
loader = Duckdbloader(symbols=None, columns=['close', 'open', 'volume'],
                      start_date="20100101")
fields = ["-1 * correlation(open, volume, 10)", "close/shift(close,1)-1"]
names = ["量价背离_10", 'return_0']

df = loader.load(fields=fields, names=names)
df.dropna(inplace=True)
print(df)

from engine.env import Env
from engine.algo.algo_weights import *
from engine.algo.algos import *

e = Env(df)
e.set_algos([
    #RunDays(5),
    # SelectBySignal(buy_rules=['ind(roc_20)>0.02'], sell_rules=['ind(roc_20)<-0.02']),
    SelectTopK(K=1, order_by='量价背离_10'),
    WeightEqually()
])
e.backtest_loop()
e.show_results()

 

继续搞因子:Alpha015: (-1 * sum(rank(correlation(rank(high), rank(volume), 3)), 3))

涉及几个函数:sum, rank,还有昨天我们用过的correlation。

def sum(se: pd.Series, N):
    se = se.groupby('symbol', group_keys=False).apply(rolling, N, 'sum')
    return se

# index.name = 'date',默认都是序列内部,序列间的需要合并df后来计算。
def rank(se: pd.Series):
    rank_result = se.groupby('date').rank(pct=True)
    return rank_result

sum是N个序列值求和,比如简单。

rank是按date来groupby,也就是某一天的截面数据计算百分位。

图片

图片

图片

本质上说,alpha015与昨天的alpha006类似,都是“价量背离”,只是选取最高价与成交量的负相关关系,这里进行了组内的排名,求和等复杂运算。但结果显示,alpha015的ic值要差一些。

复杂就不一定就是好的。

这个单回子回测的年化收益是26%。

图片

因子是无穷多的,因子并不是越多越好,效果差的因子合成进来,对总体结果会有影响。

我们也无法指望机器学习模型能够“自动”甚至“智能”的去拟合这个结果,导致的结果要么不拟合,要么过拟合。

一些感悟:

今天发现自己的手机号有快递,结果查询状态,没有发件人信息,只有物流的揽件信息,然后快递在运送途中,另外目的地也没有说送到哪。

有没有朋友知道这个什么情况。

之前有收到过类似的”测试件“,里边是一张类似答谢,可以扫码抽奖之类的,当然直接就给扔了。不知道是个啥。

【Alpha101因子分析系列】之Alpha006”价量背离“(代码+沪深300成份股全量数据集下载)

知识星球与开源项目:万物之中,希望至美

闲庭独坐对闲花,
轻煮时光慢煮茶,
不问人间烟火事,
任凭岁月染霜华。

财富自由的生活

人工智能现还不能自主参与投资,但若你本身会投资,又懂得借力人工智能,你将无往而不利。

做知识星球的初心:以实战、盈利为导向,开发可持续的策略和平台。

市场覆盖:ETF、可转债、股票、期货和数字货币

项目100%对星友开源,持续维护和升级。

目前加入星球的的收益: 

1、A股高质量价量数据、估值数据、基本面指标数据打包下载,每日更新。(已经预处理成大宽表,可直接用于数据分析或AI量化)。

2、十几个年化超过20%的量化策略源代码与实现思路文章。

3、一个已经成熟的完全自主研发的可视化AI量化系统,全部源代码

4、星球内部交流群:400+多位星友,有私募基金,券商研究员,职业投资人,算法工程师等。

5、几乎做到日更一篇文章与系统升级代码同步。

星友画像:

1、主观交易者,希望学习AI量化赋能投资。

2、工程师,对投资理财感兴趣。

3、有量化交易经验,想了解前沿人工智能技术如何赋能量化。

每新增100人,星球价格涨100元提前续费折扣更高

所以,如果大家理念一致,或者有任何问题,意见或建议,可以到星球找我,每天都在。

在这里希望你学会投资,而且学会人工智能技术

图片

小结

七年之约,只是开始。

践行长期主义。

万物之中,希望至美。

人工智能与金融投资,都是长坡厚雪,且还是为数不多,可以满足个人英雄主义情结的地方。

走,一起赶路吧。

原创文章第295篇,专注“个人成长与财富自由、世界运作的逻辑与投资“。

战略聚焦。好的资源永远是稀缺,包括我们的注意力,开发力量等,有限的资源,要聚焦解决“症结性难题”。

之于AI量化投资,这个挑战在于“因子挖掘”。

因子评估,传统的IC/IR分析:qlib因子分析之alphalens源码解读

更具挑战的事情是,传统的方法依靠的是线性关系,这个被挖掘得很充分了。机器学习能不能找到高维的非线性的关系,这个存疑。另外就是找“另类数据“。

当然战略就找重要的,且可解决的。利用自己的信息优势,资源优势,整合方案优势等等,这才是一个好战略。

前面花了不少笔墨解决gui的问题,似乎并不是一个好战略。

粉丝重要的诉求是策略,可以指导交易的策略,是赚钱。

昨天的文章,我们整理的沪深300的基础数据,有星球成员在群里问,不知道这个数据怎么用。沪深300成份股300支股票日线数据大宽表(数据+代码下载)。这里包含了2005年以来,因子的宽表数据,我们要进行因子分析。

把昨天的文件包,放在ailabx/data下的hist_hs300_20230813下,使用duckdb直接访问:

请大家从星球更新代码后,把数据搁到这个位置:知识星球与开源项目:万物之中,希望至美

图片

90万条历史记录秒出:

图片

图片

改造后的dataloader,我去除了CsvLoader和HdfLoader,后面统一使用DuckdbLoader,这个大家注意一下,性能要好很多。

import pandas as pd
import os
from datetime import datetime
from loguru import logger
import duckdb

from tqdm import tqdm
import abc
from engine.config import CSVS_DIR
from engine.datafeed.expr import calc_expr


class Dataloader:

    def __init__(self, path, symbols, start_date='20100101', end_date=datetime.now().strftime('%Y%m%d')):
        self.symbols = symbols
        self.path = path
        self.start_date = start_date
        if not end_date or end_date == '':
            end_date = datetime.now().strftime('%Y%m%d')
        self.end_date = end_date

    @abc.abstractmethod
    def _load_df(self):
        pass

    def _reset_index(self, df: pd.DataFrame):
        trade_calendar = list(set(df.index))
        trade_calendar.sort()

        def _ffill_df(sub_df: pd.DataFrame):
            df_new = sub_df.reindex(trade_calendar, method='ffill')
            return df_new

        df = df.groupby('symbol',group_keys=False).apply(lambda sub_df: _ffill_df(sub_df))
        return df

    def load(self, fields=None, names=None):
        df = self._load_df()
        df = self._reset_index(df)

        if not fields or not names or len(fields) != len(names):
            return df
        else:
            df.set_index(['symbol', df.index], inplace=True)
            #print(df)
            for field, name in tqdm(zip(fields, names)):
                df[name] = calc_expr(df, field)
            df.reset_index(level='symbol', inplace=True)
            df.sort_index(inplace=True)
            return df


class Duckdbloader(Dataloader):
    def __init__(self, symbols, columns, start_date='20100101',
                 end_date=datetime.now().strftime('%Y%m%d')):
        super().__init__(None, symbols, start_date, end_date)
        self.columns = columns
        self.columns.extend(['symbol','date'])

    def _load_df(self):

        if self.columns:
            cols_str = ','.join(self.columns)
            #cols_str += ',' + "CAST('date' AS VARCHAR)"
        symbols_str = None
        if self.symbols and len(self.symbols):
            symbols = ["'{}'".format(s) for s in self.symbols]
            symbols_str = ",".join(symbols)

        query_str = """
    select {} from '{}/*/*.csv'
    where date >= '{}' and date <= '{}'
    """.format(cols_str, CSVS_DIR.resolve(), self.start_date, self.end_date)
        if symbols_str:
            query_str += ' and symbol IN ({})'.format(symbols_str)

        df = duckdb.query(
            query_str
        ).df()

        df.set_index('date', inplace=True)

        return df


if __name__ == '__main__':
    from engine.datafeed.dataloader import Duckdbloader

    loader = Duckdbloader(symbols=['000001.SZ', '000002.SZ'], columns=['close', 'open', 'volume'],
                          start_date="20100101")
    fields = ["-1 * correlation(open, volume, 10)"]
    names = ["量价背离_10"]

    df = loader.load(fields=fields, names=names)
    df.dropna(inplace=True)
    print(df)

直接pip install alphalens即可。

我们找一个因子:alpha101里第6个因子,比较简单但有效:

-1 * correlation(open, volume, 10):这个因子的逻辑是”价量背离“。

近10天的开盘价与成交量呈现”负“的相关关系。

图片

整理成alphalens需要的格式:使用pandas dataframe的pivot_table:

图片

图片

图片

从IC/IR来看,10天/20的”预测效果“还行:

图片

图片

后续所有的因子列表,可能按IC/IR来排序,然后组合成一个新的有效因子!

本notebook包含的数据与代码,请前往星球更新下载:

沪深300成份股300支股票日线数据大宽表(数据+代码下载)

读晚读了一本书——“好战略,坏战略2”。

战略这个词似乎有点听烂了,每年年初或者年终总结时,就会拿出来秀一下,然后该干嘛干嘛。

目标之上还要加愿景、使命、价值观。

其实长期目标很好定,但很容易流于形式。比如你要财务自由,我说七年实现财富自由,比如10倍目标,量化出来是“半个小目标”等,之于你个人,这就是一个愿景,或者一个中长期目标。高中生要考上985或者211,这也是一个具体的中期目标。

那战略呢,战略是不确定时代,奔向目标的导航仪。之于长期目标,我们甚至连方向都没有,那怎么定战略?

这本书给了一个方向——基于挑战制定目标, 解决”症结性“难题

我们社群的目标是“让前沿技术赋能投资,让投资更简单,帮大家轻松安全科学赚到钱”。——那么“症结性难题”是什么呢?

有效的因子挖掘!

不是gui,也不是论坛bbs,不是高频,不是选dophindb还是clickhouse。

不是说研究wxpython或者duckdb,还是dagster不重要,而是什么是卡点,什么最重要,什么更重要。

发现了关键的“症结性的难题”,就是专注,聚焦,采取协调一致的行动去解决,去攻克,推动事情往前走。

1、从股票市场开始,股票市场的数据比较丰富,受众也比较广。整理出数据大宽表,并进行日更。(基本完成了,可持续补充数据源)

历史数据打包一次(除非有数据源新增),增量数据每天收盘后打包。

图片

沪深300指数的300支成份股的历史数据(从20050101开始,更早之前的没有意义了)打包:(已经上传到星球),后续收盘后的增量包,会开放网址下载。

图片

图片

包括后复级价格,真实价格,pe/pb等,后续会加入财务指标,每个symbol一个csv,多列的大宽表:

图片

使用duckdb可以对这300个csv, 80多万条数据秒查

图片

ef query():
    df = duckdb.query(
        """
        select symbol,date,pe_ttm,close from '{}/*.csv'
        
        """.format('D:/ailabx/data/hist_hs300_20230813')
    )
    df = df.df()
    df.sort_values(by='date', ascending=True, inplace=True)
    print(df)

2、单因子分析,结果alphalens等;因子合成(合成规则或者机器学习合成)。

一些思考

关于量化以及AI量化,之前有过一些分析,量化需要懂编程,更需要懂金融投资,对二者感兴趣,这样的交集人有多少。做星球这两年,有了更直观的感受。

真的懂代码价值,能用起来的人,少,这个空间有限。

大家是来找直接可以实盘的策略,最好填一个股票账号,自己交易最好。

本意是授人以渔,投资这个东西,本来就是自己的事情。

曾经跟一个朋友聊过这个命题,朋友问,如果AI真够智能,那岂不是存在一个最优策略,那大家都用这个策略交易,会发生什么呢?————这个问题很深奥。其实交易不同于其他,还真没有所谓唯一最优。

因为这与持仓周期有关,如果你给定一个期限,是半年,如果开启上帝视角,你就持有这段时间涨幅最大的那支。但只要这个期限一变,结果就随时在变化。投资又是一个无限游戏,它是连续的,没有一个确定的期限,因此它的可能性无穷多。我们更关心是过程中的波动、最大回撤,这关乎持股体系。

这里有点微积分的味道,就是你拿任何一个切面,是有唯一解的,但它是连续的,一切皆有可能

那量化以及AI量化的努力方向是什么呢?——信息处理与增值

做长期有价值有积累的事情,交付服务和解决方案

 

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/103990
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 2024 年 7 月 29 日
下一篇 2024 年 7 月 29 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注