这是用户在 2024-6-6 13:49 为 https://zhuanlan.zhihu.com/p/701826617 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?

机器学习模拟投资者预期分歧

11 人赞同了该文章
发布于 2024-06-05 20:50・IP 属地上海 ,编辑于 2024-06-05 20:54・IP 属地上海
目录
收起
引言
研究设计
数据样本
实证分析
A股复现
结语
参考文献

最近刷到一篇比较有趣的working paper——《Machine Forecast Disagreement》,用机器学习模型模拟市场投资者的预期分歧,进而预测股票的横截面收益。读了之后我挺兴奋的,立马给好兄弟安利了一波,但可惜被拒绝了。既然如此,那咱就自己PY吧,以下是这篇论文的解读以及在A股市场的简单复现。

引言

信念分歧(Belief disagreement)是驱动投资交易的重要因素,对分歧的深入洞察对于理解金融市场的动态行为至关重要。在理论层面,学者们致力于探究投资者间意见差异如何塑造市场价格和交易量。Miller(1977)提出,当投资者对股票价值存在不同看法,特别是在悲观投资者受限于卖空约束时,股票价格往往会出现向上偏差。然而,鉴于投资者信念的难以量化,关于信仰分歧的实证研究相对较少。后来,Diether等(2002)利用股票分析师的收益预测数据,对投资者信念的异质性进行了开创性的实证分析,研究发现,在个股的横截面上,分析师预测离散度(AFD)较高时,往往预示着较低的未来收益。然而,Johnson(2004)对Dietheret al.(2002)的结论提出了质疑,他认为AFD实际上可能更多地反映了企业特有的风险。

本研究的内容主要包括三个方面。首先,提出了一种在资产层面上衡量投资者信念分歧的新方法。鉴于投资者信念的分布难以直接观测,因此设计了一个统计代理作为解决方案。在这个框架中,每个投资者被视作一个独立的预测模型,他们的信念基于对未来回报的预测而形成。这些假设的投资者共享一组通用的预测信息,但各自以不同的方式利用这些信息。为了模拟这种信念分布,为每个投资者分配了一个机器学习模型,并在投资者之间引入了模型的随机变化,通过随机化的模型,能够捕捉了投资者可能存在的先验信念、信息摩擦和偏见分布的差异。值得一提的是,尽管模型中的所有投资者都具备高度的复杂性和技巧性——每个模型都能够灵活且非线性地使用预测数据集——但它们并非完美无缺。因为现实中,没有哪个投资者能拥有完全准确的模型,他们的模型都是对真实数据生成过程的近似模拟,且不尽相同。每个投资者在给定其模型特性的前提下,利用可得数据来估计模型参数并形成预测。基于这种对投资者信念的构建,将股票层面的分歧量化为投资者回报预测的离散程度,并将其命名为“机器预测分歧”(MFD)。MFD的一个显著优点是,通过回避直接、可靠地调查投资者信念的难题,能够应用于任何时间点的所有股票,而不会受限于分析师预测的样本,因此在数据覆盖面上远超先前的文献。

第二是发现了具有较高MFD(机器预测分歧)的股票的未来收益显著低于其他股票。价值加权(等加权)的多空组合收益每月1.14% (1.32%),newey-west t统计量为4.33(5.61)。与其他衡量投资者分歧的代理指标相比,如分析师预测离散度(AFD),MFD展现出与投资者分歧更高的相关性。研究还发现,MFD的横截面收益预测能力能够扩展到国际股票市场。

第三是深入探究了MFD alpha(机器预测分歧的alpha值)背后的经济基础。发现高MFD股票的过高定价在卖空成本较高的股票中尤为显著,在卖空限制更为严格的情况下,投资者信念的分歧会导致资产被高估。高散户持股股票组合的MFD alpha更加显著,即散户投资者在面临较大分歧时更容易出现过度乐观的偏差。为了提供更充分的证据,依据Stambaugh et al.(2015)的股票水平错误定价(MISP)定义,分析了MFD溢价与高MFD股票的错误定价有关。通过观察收益公告期间的股价反应,为MFD alpha由股票水平错误定价驱动提供了额外支持。对于套利限制更为严重的股票,MFD alpha的显著性更强。

研究设计

简单来说,就是假设市场上有很多个投资者,每个投资者会利用市场上的部分信息,不同的投资者会利用市场上的部分信息进行股票预测,且投资者的水平良莠不齐,既有自称“堪比巴菲特”的投资大牛,也有投资业绩比不过大猩猩的基金经理,更不缺被套的韭菜们。所有投资者对于股票的预期的不一致,这就是投资者分歧。所以每个g()可以代表一个投资者,不同的g()输入的特征因子不完全相同,代表使用了不同的信息。由于使用的信息不同,所以g()的预测值也不同,有的g()预测效果比较好,同时也有的g()预测效果比较差。这些g()的预测值,就代表了投资者的分歧。构建的分歧度量MFD遵循了以下具体步骤。首先,将投资者数量设定为K=100,不完全信息的维度则固定为76,即对于所有K =1,2......100,其信息维度dk均为76。接着,选择了随机森林回归模型,为了模型性能与计算效率的平衡,参考Gu et al. (2020)和 Bali et al.(2023),设定了最大树深度为3,集合中树的个数为2000,并且设置了特征和样本的抽样比例为0.05,横截面收益缩尾1%。

数据样本

使用Jensen et al.(2022)的数据集,这是一个公开的股票收益和特征数据集基础收益数据来自证券价格研究中心(CRSP),会计数据来自Compustat。将样本限制为在纽约证券交易所、美国证券交易所和纳斯达克交易的普通股。不包括金融和公用事业公司。为了减少小型和非流动性股票的影响,还排除了交易价格低于每股5美元的低价股票。为了预测收益,使用153个股票特征作为完整的信息集。对所有股票特征逐期进行横截面排序,并根据Kelly et al.(2019)、Gu et al.(2020)和Freyberger et al.(2020)的方法,将这些排序映射至[-1, 1]的标准化区间。样本时间跨度从1966年7月至2022年12月,利用10年滚动窗口来估计随机森林回归量。使用前一个月(t−1)的特征计算了第t个月的MFD。随后,对1976年8月至2022年12月期间进行了样本外横断面资产定价测试。

实证分析

MFD排序的投资组合的超额收益和阿尔法从十分位数1到十分位数10递减。卖空MFD最高的第10个百分位(十分位数10)的股票,买入MFD最低的第10个百分位(十分位数1)的股票的多空组合,每月的价值加权(等加权)平均回报率为1.14% (1.32%),t统计量为4.33(5.61),换算成年化回报率为13.68% (15.84%)。对于大多数因子模型,控制风险并不会改变MFD投资组合的收益差的大小和统计显著性。在十分位数的股票中,alpha在统计上显著为负且绝对值较大。

随后进行了Fama-MacBeth回归分析,控制了市场beta、规模、账面市值比、动量、营业盈利能力、资产增长、盈利意外、短期回报逆转、非流动性、换手率、特殊波动率和彩票需求等变量。结果表明,MFD与未来一个月的收益之间存在显著的负相关关系。

为了探究MFD收益的经济来源,作者进行了一系列的检验。

高MFD股票的过高定价在卖空成本高的股票中尤为明显,即在存在更严格的卖空限制的情况下,分歧会导致资产被高估。

高散户持股股票组合的alpha价差显著大于主要由机构投资者持有的股票组合的alpha,进一步支持了Miller(1977)的假设。

通过Stambaughet al.(2015)的股票水平错误定价(MISP)指标,发现高MFD股票的错误定价得分显著高于低MFD股票。

通过检验收益公告周围的股价反应,收益公告期间的收益预测超过非收益期间的收益预测,为MFD alpha由股票水平错误定价驱动的解释提供了额外的支持。

对于套利限制更严重的股票,MFD alpha显著更强,这与套利限制加剧了资产错误定价一致。


A股复现

笔者选择2005至2022年的研究区间,样本池为全部A股,剔除了ST、停牌、上市不满一年的样本,选取了95个股票因子。设置K=100,dk=50。选择的模型为LightGBM(主要是因为这个比较快)。同样基于滚动窗口法进行研究,训练集长度为12个月,测试集为1个月(只是做个简单的研究,没有设置验证集调整超参数)。

# -*- coding: utf-8 -*-

import os
import numpy as np
import pandas as pd
import random
random.seed(42)
import warnings
warnings.filterwarnings("ignore")
import lightgbm as lgb

path = r'D:'
os.chdir(path)

# %% 主要代码

# 定义一个函数来随机选择50列
def extract_random_columns(dataframe, num_cols, num_iterations):
    # dataframe = ch.copy()
    all_columns = dataframe.columns.tolist()[3:]
    random_column_lists = []
    
    for _ in range(num_iterations):
        # 随机选择50列,确保每次选择不重复
        selected_columns = random.sample(all_columns, num_cols)
        random_column_lists.append(selected_columns)
    
    return random_column_lists

def calculate_mdf(ch,random_column_selections,trw,viw,tew,models='ols',param=None):
    # length为滑动窗口长度:取值{12}
    month_list = sorted(list(set(ch['month'])))
    
    mfd_temp = []

    for i in range(len(month_list)-trw-viw):
        # i = 0
        print(i)
        # month = month_list[i]
        month_train_start = month_list[i]
        month_train_end = month_list[i+trw-1]
        month_valid_start = month_list[i+trw]
        month_valid_end = month_list[i+trw+viw-1]        
        month_test = month_list[i+trw+viw]
        
        
        train_data = ch[(ch['month']>=month_train_start)&(ch['month']<=month_train_end)].iloc[:,2:]
        valid_data = ch[(ch['month']>=month_valid_start)&(ch['month']<=month_valid_end)].iloc[:,2:]
        test_data = ch[ch['month']==month_test].iloc[:,2:]
        
        stk_pool = ch[ch['month']==month_test]['stkcd'].to_list()
        
        predict = []

        for j in range(len(random_column_selections)):
            # j=0
            select_feature = random_column_selections[j]
        
            x_train = np.array(train_data[select_feature]) # 训练集 输入
            y_train = np.array(train_data['ret'])  # 训练集 输出
            
            x_valid = np.array(valid_data[select_feature]) # 验证集 输入
            y_valid = np.array(valid_data['ret'])  # 验证集 输出        
            
            x_test = np.array(test_data[select_feature])  # 测试集 输入
   
            lgb_train = lgb.Dataset(x_train, y_train) # 将数据保存到LightGBM二进制文件将使加载更快
            #lgb_eval = lgb.Dataset(x_test, y_test, reference=lgb_train)  # 创建验证数据
            
            params = {
                'task': 'train',
                'boosting_type': 'gbdt',  # 设置提升类型
                'objective': 'regression',  # 目标函数
                'metric':  'rmse',  # 评估函数#auc,mape,rmse,mae
                'n_jobs': 14,
                #'subsample': 0.5,
                #'subsample_freq': 1,
                'num_leaves': 31,   # 叶子节点数
                'learning_rate': param['learning_rate'],  # 学习速率
                'feature_fraction': 0.9,  # 建树的特征选择比例
                'bagging_fraction': 0.8,  # 建树的样本采样比例
                'bagging_freq': 5,  # k 意味着每 k 次迭代执行bagging
                'n_estimators': param['n_estimators'],  # 基学习器个数
                'verbose': -1,  # <0 显示致命的, =0 显示错误 (警告), >0 显示信息
            } #这里目前还没有验证集,之后可以考虑加入验证集进行训练
        
            model = lgb.train(params,lgb_train,verbose_eval = 5)
            y_pred = model.predict(x_test)

            predict.append(y_pred)
        
        y_pred = pd.DataFrame(predict, columns=stk_pool)
        y_pred_std = 1/y_pred.std(axis=0)

        mfd_temp.append(y_pred_std)
        
    mfd_df = pd.concat(mfd_temp, axis=1).T
    mfd_df.index = month_list[trw+viw:]

    return mfd_df

# %% 启动程序
if __name__ == '__main__':
    
    start_month = 200501 #回测开始年份
    end_month = 202212 #回测结束年份
    

    # 读取数据
    ch = pd.read_parquet(os.path.join(path, '过程数据', 'factor_ret.parquet'))
    ch = ch.sort_values(by=['month', 'stkcd'], ascending=True)
    ch = ch[(ch['month']>=start_month)&(ch['month']<=end_month)]

    # 随机选取特征
    feature_num = 50
    cycle_num = 100    
    random_feature = extract_random_columns(ch, feature_num, cycle_num)
    
    # 训练集、验证集、测试集的长度
    trw = 12
    viw = 0 #暂时未考虑验证集
    tew = 1
    
    mfd_df_lgb = calculate_mdf(ch,random_feature,trw,viw,tew,models='lgbm',param={'n_estimators':1000,'learning_rate':0.001})
    mfd_df_lgb.to_parquet(os.path.join(path,'mfd因子','mfd_lgb.parquet'))
    print('lgb finished') 

回测结果如下所示,可以看出,分层比较明显,且单调性比较好,结论与美国市场一致。即MFD与股票未来收益负相关。

分组月均收益NW-t夏普比率最大回撤ff3_aff3_t
12.502.790.82-0.700.422.57
22.262.660.74-0.690.211.39
32.052.500.70-0.680.090.73
42.002.420.68-0.680.040.30
51.882.340.65-0.69-0.03-0.23
61.742.220.62-0.70-0.10-0.87
71.672.130.59-0.70-0.18-1.58
81.632.130.58-0.69-0.17-1.55
91.281.730.47-0.67-0.45-3.98
100.841.120.31-0.70-0.78-5.91
high-low-1.66-5.88---1.20-6.19

FM回归的检验结果保持一致。

变量(1)(2)(3)(4)(5)
mfd-0.8294-0.531-0.5494-0.5038-0.464
(-4.27)(-4.98)(-4.69)(-4.47)(-4.09)
beta-0.2439-0.3893-0.25950.1707
(-0.7)(-1.02)(-0.7)(0.45)
size-0.3819-0.3866-0.4533-0.343
(-2.23)(-2.39)(-2.61)(-2.29)
bm0.14390.1380.15220.0518
(1.36)(1.73)(1.48)(0.73)
mom0.11660.7007
(0.45)(2.78)
ia-0.0355-0.027
(-1.4)(-1.15)
roe2.20091.9095
(2.53)(2.32)
idvol-0.5991
(-4.43)
illq10.822
(4.1)
intercept2.892110.845211.125412.398110.2644
(3.05)(2.64)(2.84)(2.99)(2.81)
adj_R20.00490.04640.05850.04910.0727
n28122766262326972545

基于错误定价指标分析收益的经济学解释,发现MFD溢价确实来源于错误定价。

指标错误定价程度lhh-lNW-t
sizehigh20.374.83-15.54-5.50
sizemiddle11.58-2.44-14.01-5.52
sizelow8.010.48-7.53-2.04
volumehigh14.00-13.65-27.65-6.46
volumemiddle14.458.89-5.56-1.90
volumelow13.894.25-9.64-2.93
idvolhigh12.85-7.80-20.65-4.41
idvolmiddle17.533.90-13.62-3.51
idvollow15.237.71-7.52-1.88

为了进一步提高策略的可投资性,进一步考虑了市值与流动性剔除、卖空限制、ST、停牌等因素,每月第一个交易日调仓,买入MFD指标最低的10%的股票,按照等权重买入,双边换手费用0.1%。扣除费用后的年化收益明显跑赢沪深300(全收益)等基准指数,证明了策略的有效性。


# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np
import glob
import os
import seaborn as sns
import matplotlib
# matplotlib.use("Agg") #不显示图片
import matplotlib.pyplot as plt
# import seaborn as sns
import warnings
warnings.filterwarnings('ignore')

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示坐标轴上的负数

path = r'F:'
os.chdir(path)

# %% 函数

# 最大回撤
def get_DD(ret):
    ret_acc = (1 + ret.fillna(0)).cumprod()
    ret_acc_max = np.maximum.accumulate(ret_acc)
    mdd_series = (ret_acc_max - ret_acc) / ret_acc_max
    mdd = mdd_series.max()

    return mdd, mdd_series


def get_benchmark_result(benchmark):

    result_benchmark = pd.DataFrame(
        columns=['年化收益', '年化波动率', '年化夏普比率', '最大回撤'], index=benchmark.columns)

    for i in range(benchmark.shape[1]):

        retport = benchmark.iloc[:, i]

        mean = np.mean(retport) * 12 * 100

        std = np.std(retport, ddof=1)*np.sqrt(12) * 100

        sr = mean/std

        mdd = get_DD(pd.Series(retport))[0] * 100

        result_benchmark.iloc[i, 0] = mean
        result_benchmark.iloc[i, 1] = std
        result_benchmark.iloc[i, 2] = sr
        result_benchmark.iloc[i, 3] = mdd

    return result_benchmark

# 换手率
def get_turnover(retn, weight):

    weight_lag = weight.mul(1+retn)
    weight_lag = weight_lag.div(weight_lag.sum(axis=1), axis=0)
    weight_lag = weight_lag.shift(1).fillna(0)

    turnover_series = np.sum(np.abs(weight-weight_lag), axis=1) / 2
    turnover_series.iloc[0] = 1

    turnover = np.mean(turnover_series) * 12

    return turnover, turnover_series

# 计算策略表现
def get_single_result(retn, weight, port_name, cost):
    # retn=ret.copy()
    turnover, turnover_series = get_turnover(retn, weight)

    retport = np.sum(weight*retn, axis=1)  # 组合收益率
    retport.name = port_name

    retport = retport - turnover_series * cost * 2  # 直接减去费用

    mean = np.mean(retport) * 12 * 100
    std = np.std(retport, ddof=1)*np.sqrt(12) * 100
    sr = mean/std

    mdd, mdd_series = get_DD(pd.Series(retport))

    res = [mean, std, sr, mdd*100, turnover]

    result = pd.DataFrame(res, columns=[port_name], index=[
                          '年化收益', '年化波动率', '年化夏普比率', '最大回撤', '年化换手率']).T
    return retport, result


# 获取结果
def get_all_result(factor, benchmark, cost, ret, stk_pool):

    result_benchmark = get_benchmark_result(benchmark)
    
    weight = factor * stk_pool
    weight = weight.rank(pct=True,axis=1)
    weight = pd.DataFrame(np.where(weight>=0.9,1,0),index=weight.index,columns=weight.columns)
    weight = weight.div(weight.sum(axis=1),axis=0)

    port_name = 'MFD策略'
    
    ret_series, result = get_single_result(ret, weight, port_name, cost)
    

    result_all = pd.concat([result, result_benchmark],
                           axis=0, join='outer') .astype(float)

    ret_series = pd.concat([ret_series, benchmark],
                           axis=1, join='inner') .astype(float)
    ret_series.columns = ['MFD策略', '沪深300', '中证500', '万得全A']

    return result_all, ret_series,weight

def figure_ret(ret_series):

    port_cumret = (1+ret_series).cumprod()

    port_cumret = port_cumret - 1

    port_cumret['MFD相对沪深300累计超额'] = port_cumret['MFD策略'] - port_cumret['沪深300']
    port_cumret.index = pd.to_datetime(
        port_cumret.index.astype(str), format='%Y%m')

    mdd_series = -get_DD(ret_series['MFD策略'])[1]
    mdd_series.index = pd.to_datetime(
        mdd_series.index.astype(str), format='%Y%m')

    # 画图
    fig = plt.figure(figsize=(15, 12))
    ax1 = fig.add_subplot(111)

    # 绘制折线图

    ax1.plot(port_cumret.index, port_cumret[
             'MFD策略'], color='red', label='MFD策略')
    ax1.plot(port_cumret.index, port_cumret[
             '沪深300'], color='aqua', label='沪深300')
    ax1.plot(port_cumret.index, port_cumret[
             '中证500'], color='gold', label='中证500')
    ax1.plot(port_cumret.index, port_cumret[
             '万得全A'], color='black', label='万得全A')

    ax1.fill_between(
        port_cumret.index, port_cumret['MFD相对沪深300累计超额'], color="skyblue", alpha=0.3, label='MFD相对沪深300累计超额')

    ax1.set_xlabel('年月')
    ax1.set_ylabel('累计收益率')
    ax1.tick_params(axis='y')
    ax1.legend(loc='upper left')  # 图标

    # 创建右边的 y 轴    # 绘制填充图
    ax2 = ax1.twinx()
    ax2.fill_between(mdd_series.index, mdd_series,
                     color='gray', alpha=0.3, label='回撤')

    ax2.set_ylabel('回撤')
    ax2.tick_params(axis='y')
    ax2.legend(loc='upper right')  # 图标
    ax2.set_ylim(-1, 0)  # y坐标轴的刻度范围
    ax2.set_title('策略表现')

    #plt.show()
    plt.savefig(os.path.join(path,  '检验结果', '累计收益.png'))
    plt.close()

    
# %% 运行程序
if __name__ == '__main__':
    
    start_month = 201101  # 回测开始年份
    end_month = 202212  # 回测结束年份
    
    # 读取基准指数数据
    benchmark = pd.read_parquet('benchmark.parquet')

    # 读取收益率数据
    ret = pd.read_parquet('ret.parquet')
    stk_pool = pd.read_parquet('stk_pool.parquet')
    
    # 读取因子
    factor = pd.read_parquet(os.path.join(path, 'mfd因子', 'mfd_lgb.parquet'))
    factor = factor[(factor.index>=start_month)&(factor.index<=end_month)]

    # 回测
    cost = 0.001  # 交易成本,双边千一
    
    result_all, ret_series,weight_final = get_all_result(factor
        , benchmark, cost, ret, stk_pool)

    figure_ret(ret_series)

通过风格归因图,可以发现,MFD策略在不同年份的风格暴露基本相同。总体上看,组合在小市值因子上暴露较大,在价值、盈利、成长等因子上的暴露接近0。

结语

这篇文章使用机器学习模型来模拟投资者预测股价时产生的分歧,构建了衡量投资者分歧的指标,不仅能够覆盖更多的股票,而且更好地刻画了投资者的分歧程度。利用该指标构建投资组合,可以获取显著的多空收益,即使在控制了一系列经典因子之后仍可预测未来收益。更加深入的检验表明,这种收益背后的经济来源是错误定价。

笔者在A股市场上进行了简单但不严谨的复现,发现这一规律在A股市场同样存在。如果进行更加严谨的检验步骤(比如增加因子数量、增加模型数量、设置验证集进行调参等等),应当能够进一步提高组合的表现。

用机器学习模拟投资者行为是一大亮点。要是往简单点想,假设每个投资者仅仅使用一个公司特征来预测股票未来的收益,似乎也可以衡量投资者的分歧,毕竟市场上非理性的投资者那么多,尤其A股市场上韭菜随处可见。要是往复杂了想,市场上既有专业投资者,又有个人投资者,很多投资者的交易逻辑其实都有点类似“黑箱”,也或多或少有点幸存者偏差,那么用不同的模型去刻画不同的投资者行为,也许会有新的发现。

参考文献

Bali, Turan G. and Kelly, Bryan T. and Moerke, Mathis and Rahman, Jamil A. (2023). Machine Forecast Disagreement. Available at SSRN 4537501.

Bali, T. G., Beckmeyer, H., Moerke, M., and Weigert, F. (2023). Option return predictability with machine learning and big data, forthcoming. Review of Financial Studies.

Diether, K. B., Malloy, C. J., and Scherbina, A. (2002). Differences of opinion and the cross section of stock returns. Journal of Finance, 57:2113–2141.

Freyberger, J., Neuhierl, A., and Weber, M. (2020). Dissecting characteristics nonparametrically. Review of Financial Studies, 33:2326–2377.

Gu, S., Kelly, B., and Xiu, D. (2020). Empirical asset pricing via machine learning. Review of Financial Studies, 33:2223–2273.

Jensen, T. I., Kelly, B. T., and Pedersen, L. H. (2022). Is there a replication crisis in finance?, forthcoming. Journal of Finance.

Johnson, T. C. (2004). Forecast dispersion and the cross section of expected returns. Journal of Finance, 59:1957–1978.

Kelly, B. T., Pruitt, S., and Su, Y. (2019). Characteristics are covariances: A unified model of risk and return. Journal of Financial Economics, 134:501–524.

Miller, E. M. (1977). Risk, uncertainty and divergence of opinion. Journal of finance, 32:1151–1168.

Stambaugh, R. F., Yu, J., and Yuan, Y. (2015). Arbitrage asymmetry and the idiosyncratic volatility puzzle. Journal of Finance, 70:1903–1948

发布于 2024-06-05 20:50・IP 属地上海 ,编辑于 2024-06-05 20:54・IP 属地上海
欢迎参与讨论

1 条评论
默认
最新
浅蓝
有意思,我之前类似的想法被老板怼,说凭什么认为机器的决策结果和人的决策类似……看见有类似人做出来,还挺兴奋的[赞同]
3 小时前 · IP 属地辽宁
想来知乎工作?请发送邮件到 jobs@zhihu.com