《Python编程:从入门到实践》第16章收盘价周日均值作图问题?

一位新手在按照《Python编程:从入门到实践》第16章的指导进行收盘价周日均值作图时遇到问题,周别数值出现异常返回个位数,求助高手解答。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《Python编程:从入门到实践》第16章收盘价周日均值作图问题?
新人求助,按照书上的步骤写的代码,为啥周别又会重新回到个位数?
照着网上的代码超了运行之后,还是会出现这个问题,实在找不到问题在哪里?求大神指点。!
在这里插入图片描述在这里插入图片描述

假设现在有股票市场的模拟据列表(每行对应某只股票在某日的据),其中列名分别为code(股票代码),date(日期),open(开盘价),close(收盘价),high(最高价),low(最低价),volume(交易量)。目标变量Y为第二天收盘价相对于前一天收盘价的变化率(需要答题人自行构建)试题 一、(5分)创建Final.ipynb,使用pandas.read_csv函读取所给据。 二、(15分)训练据的搭建:构建一个numpy.array,使得每行字对应某只股票在某天的所有特征变量值,并把结果储存在train_X变量中,把这些行对应的Y值储存在train_Y中。使用相同方法构建测试据,结果分别储存在变量test_X和test_Y中。 三、(10分)利用主成分分析算法(Principal Component Analysis)对据样本,即train_X进行降维,结果储存在train_encodes变量中。作图显示explained total variance ratio,其中每一个点的横坐标为主成分的序,纵坐标为从第一个到当前的主成分的explained variance ratio之和。 文字回答问题:(5分)保留的主成分的个越多越好吗?你是如何选择保留的主成分个的? 四、(5分)利用第三题中训练好的pca模型对test_X进行降维,结果储存在test_encodes中。 五、(10分)针对train_encodes,使用K-means Clustering算法将train_X中的样本分为2类。 六、(12分)基于train_X及train_Y,搭建训练神经元网络,并在test_X和test_Y上计算出分类正确率并输出结果。 说明:调节超参时(如网络层和节点个)不可使用测试据test_X和test_Y。 文字回答问题:(3分)根据模型表现,是否存在过拟合现象?为什么? 七、(10分)基于train_encodes及train_Y,搭建训练神经元网络,并在test_encodes和test_Y上计算出分类正确率并输出结果。 文字回答问题:(10分)模型的test accuracy是多少?根据你的结果,PCA是否帮助提升了模型的预测正确率? 八、(15分)文字回答问题:在分类问题上,K-means clustering和神经元网络模型的优劣分别是什么?
最新发布
04-01
<think>好的,我现在需要解决这个关于股票市场模拟据分析的试题,共有八个问题。让我逐一理清每个问题的要求,并思考如何逐步解决。 首先,问题一要求用pandas读取据。这应该比较简单,使用pd.read_csv函即可,需要注意文件路径是否正确,以及据的分隔符是否符合默认的逗号,如果有其他分隔符可能需要指定sep参。 然后是问题二,构建训练据。目标变量Y是第二天收盘价相对于前一天的收盘价变化率,所以需要计算(第二天close - 当天close)/ 当天close。这里需要注意的是,据是按股票代码和日期排序的,因此可能需要按股票代码分组,然后在每个组内按日期排序,计算每个股票的Y值。然后,特征变量可能包括当天的open、close、high、low、volume等,可能需要构造一些技术指标,比如移动平均线、RSI等,但题目中是否要求构造额外的特征呢?题目中的列名只有基本的几个,可能只需要使用这些原始特征。然后,需要将每个样本的特征作为train_X的一行,对应的Y作为train_Y。这里要注意据的滞后处理,即每个样本的Y是下一天的收盘价变化率,所以需要确保每个样本的日期对应的Y是下一个交易日的。可能需要按股票分组后,将每个股票的日期排序,然后shift(-1)来获取下一天的收盘价,再计算变化率。但要注意最后一天的据可能没有对应的下一天,需要处理掉这些缺失值。 接下来划分训练集和测试集,可能按照时间划分,比如最近的20%作为测试集,或者随机划分。但题目没有说明划分方法,可能需要按照某种方式分割。需要注意在划分时,同一股票的据可能分布在训练和测试集中,但题目可能没有特别要求,所以可能随机分割,或者按日期分割。但题目中的“使用相同方法构建测试据”可能意味着需要将据分成两部分,比如按日期划分,比如前80%日期作为训练,后20%作为测试?或者可能要求用户自行定义划分方式,但题目没有明确说明,可能需要假设一种方法,比如随机分割,或者按时间顺序分割。这里需要明确,可能需要用sklearn的train_test_split,或者按日期分割。但具体要看据中的日期分布。比如,假设据中的日期是连续的,可以按某个截止日期分割训练和测试集。需要确保在构建特征和Y时,正确对应每个样本的下一天据。 问题三关于主成分分析(PCA)。需要对train_X进行PCA降维,然后绘制累计解释方差比曲线。问题在于如何确定保留的主成分个。通常,保留的主成分量取决于累计方差的比例,比如达到95%或某个阈值,或者使用拐点法(肘部法则)观察曲线的拐点。但题目中的文字问题问的是保留的主成分是否越多越好,显然不是,因为过多的主成分可能包含噪声,且增加计算量,但可能保留的信息更多。所以需要根据累计方差选择一个合适的目,比如累计方差达到一定比例,或者保留前k个主成分使得解释方差显著变化。 第四题应用训练好的PCA模型到测试集,这需要确保测试集的据使用与训练集相同的PCA参(即相同的均值和方差进行标准化),通常在PCA前需要对据进行标准化处理,因为PCA对变量的尺度敏感。所以在第三题中,应该先对train_X进行标准化(例如,减去均值,除以标准差),然后拟合PCA模型,再应用到test_X上,同样需要先使用训练集的均值和标准差对测试集进行标准化,然后进行PCA转换。 第五题是K-means聚类,将样本分为两类。需要注意,K-means需要指定n_clusters=2,然后对train_encodes(即降维后的特征)进行聚类。结果可能用于后续分析,比如观察不同类别的股票在预测中的表现是否有差异。 第六题和第七题涉及搭建神经网络模型。问题六使用原始的train_X和test_X,而问题七使用降维后的train_encodes和test_encodes。需要构建神经网络模型,比如使用Keras或PyTorch。在训练时,需要划分验证集来调整超参,而测试集不能参与调参。正确率需要计算在测试集上的分类准确率。文字问题需要判断是否存在过拟合,比如如果训练准确率远高于测试准确率,则可能存在过拟合。 问题八比较K-means和神经网络的优劣。K-means是无监督学习,基于距离的聚类,可能无法捕捉复杂模式;而神经网络是有监督的,可以学习非线性关系,但需要大量据和计算资源,且可能过拟合。 现在,我需要考虑每个步骤的具体实现细节: 问题一: 读取据使用pd.read_csv('据路径'),可能需要处理不同的分隔符,比如如果是csv文件,默认是逗号分隔。需要确保据被正确读取,检查列名是否正确。 问题二: 构建Y变量。首先,据需要按股票代码分组,然后在每个组内按日期升序排列。对于每个股票的每个日期,计算下一天的收盘价。例如,对于每个股票,按日期排序后,使用shift(-1)得到下一个交易日的收盘价,然后计算(next_close - current_close)/ current_close。需要注意,每个股票的最后一个日期没有下一天的据,对应的Y是NaN,需要删除这些行。 处理完Y之后,特征变量可能包括当天的open、close、high、low、volume,或者其他计算的特征,比如当日的涨跌幅((close - open)/open),最高价与最低价的差(high - low),交易量变化等。但题目中是否允许自行构造特征?题目中的问题二只提到“所有特征变量值”,所以可能原题中的特征就是已有的列(open, close, high, low, volume),或者是否包括其他处理后的变量?可能需要明确,但题目中的列名只有这些,所以可能直接将这些列作为特征,或者需要做一些处理,比如归一化? 然后,将每个样本的特征(比如某日某只股票的open, close, high, low, volume)作为train_X的一行,对应的Y作为train_Y。需要注意处理缺失值,比如删除Y为NaN的行。 对于训练集和测试集的划分,假设据已经按日期排序,那么可能按照时间顺序划分,比如前80%的日期作为训练,后20%作为测试。或者可能随机划分,但题目没有说明,需要假设一种方式。或者可能要求用户自行分割,比如用sklearn的train_test_split,设置test_size=0.2,random_state等参。但要注意,在时间序列据中,随机划分可能会导致未来据泄漏到训练集中,所以应该按时间顺序划分,即训练集是较早的据,测试集是较晚的据。这需要将据按日期排序后分割。 问题三: 对train_X进行标准化(因为PCA对尺度敏感),然后应用PCA,计算累计解释方差比,并绘制图形。例如,使用sklearn的StandardScaler对train_X进行标准化,然后使用PCA.fit_transform。累计方差可以使用np.cumsum(pca.explained_variance_ratio_)。然后选择主成分的量,比如累计方差达到0.95时的主成分。文字问题回答:保留的主成分并非越多越好,因为过多的成分可能包含噪声,并且增加模型复杂度。选择方法可以是设定累计方差的阈值,或者观察拐点。 问题四: 使用第三题训练好的PCA模型(已经fit过train_X的标准化据),对test_X进行同样的标准化处理(使用训练集的均值和标准差),然后应用pca.transform得到test_encodes。 问题五: 使用K-means对train_encodes进行聚类,分为两类。得到聚类标签。 问题六: 搭建神经网络,输入层节点为train_X的特征,输出层可能是分类的节点(假设Y被转化为分类问题,比如涨跌,即二分类)。或者题目中的Y是回归问题,但第六题的问题提到“分类正确率”,所以可能Y需要被转化为分类变量,例如,如果第二天的收盘价变化率为正,则Y=1,否则Y=0。所以在问题二中,构建Y的时候,可能需要将其二值化。例如,Y = (next_close > current_close).astype(int)。这可能是一个关键点,因为后续的问题涉及分类正确率。 所以,在问题二中,Y的计算应为二分类的标签,即涨或跌。因此,在构建Y时,需要将变化率转化为0或1,表示涨跌。因此,在问题二中,Y的计算应为:Y = ( (第二天收盘价 - 当天收盘价) / 当天收盘价 ) > 0 ? 1 : 0。或者如果是回归问题,但题目中的第六、七题提到分类正确率,说明Y需要是分类的,因此需要将变化率转化为二分类。或者,可能题目中的Y是连续的变化率,但第六题的问题需要将其作为分类任务,比如预测涨或跌,所以需要在处理Y的时候将其转换为类别标签。因此,在问题二中,除了计算变化率外,还需要将其转换为二进制的标签,例如,如果变化率为正则为1,否则为0。这样,train_Y和test_Y都是二元标签,神经网络进行二分类,正确率即分类准确率。 因此,在问题二中,构建Y的步骤需要明确:首先计算变化率,然后将变化率转化为二进制标签。这可能是一个关键点,如果忽略这点,后续的分类任务无法进行。 问题六的神经网络搭建:需要构建一个分类模型。例如,使用Keras的Sequential模型,添加若干隐藏层,选择合适的激活函,输出层使用sigmoid激活函(二分类),编译时使用binary_crossentropy损失,优化器如Adam。需要划分验证集来调整超参,如层、节点、学习率等,但测试集不能用于调参。训练完成后,在测试集上评估准确率。 文字问题判断是否存在过拟合:如果训练准确率很高但测试准确率低,说明过拟合。如果两者接近,可能没有过拟合。 问题七:使用PCA降维后的特征train_encodes训练同样的神经网络,然后在test_encodes上测试,比较准确率。如果使用PCA后的据准确率更高或相近,但维度更低,说明PCA有帮助。否则可能没有帮助。 问题八:比较K-means和神经网络的优劣。K-means是无监督,不能直接用于分类,而神经网络是有监督的。K-means简单快速,但假设簇是凸形的,而神经网络可以处理非线性边界,但需要更多据和计算资源。 现在,我需要将这些思路转化为具体的代码和文字回答,并确保符合题目中的格式要求,比如学公式用$...$,独立公式用$$...$$,以及中文回答等。 可能遇到的难点: 1. 在计算Y时,需要正确处理每个股票的下一个交易日据。需要按股票分组,按日期排序,然后计算每个股票的next_close。如果据中存在某些股票在某些日期没有后续据,对应的Y会被设为NaN,需要删除这些行。 2. 据划分时,如何处理时间序列的问题,防止未来据泄漏。例如,如果测试集中的日期早于训练集中的某些日期,可能导致模型利用未来信息。因此,应该按时间顺序划分训练集和测试集,即训练集是较早的据,测试集是较晚的据。这需要将整个据按日期排序后,按比例分割。 3. PCA的标准化处理:在训练PCA时,应该先对训练集进行标准化(减去均值,除以标准差),然后将同样的标准化参应用到测试集,而不是独立地对测试集进行标准化。否则会导致据泄漏,影响模型评估。 4. 神经网络的结构设计:需要合理选择层、节点,避免过拟合,比如使用Dropout层,早停等技巧。但题目中可能不需要具体调参,只需搭建一个基本网络,比如两到三层隐藏层,使用ReLU激活函,输出层用sigmoid。 5. 正确评估分类准确率:需要将预测结果与真实标签比较,计算正确率。例如,使用model.evaluate在测试集上得到准确率。 总结步骤: 问题一: 读取据,使用pd.read_csv。 问题二: - 按股票分组,排序日期。 - 计算每个样本的下一个收盘价,进而计算变化率,并转换为二进制标签(涨或跌)。 - 删除无法计算Y的行(如每个股票的最后一天)。 - 合并所有股票的据,分割特征和标签。 - 划分训练集和测试集,可能需要按时间划分,比如取前80%的日期作为训练,后20%作为测试。或者使用sklearn的train_test_split,但注意shuffle=False如果按时间顺序。或者可能题目允许随机划分,但需要明确。 问题三: - 标准化train_X(使用StandardScaler)。 - 应用PCA,得到累计方差。 - 绘制累计方差图。 - 选择主成分目,如累计方差超过0.95,或拐点法。 问题四: - 使用相同的StandardScaler(基于训练集)标准化test_X,然后应用训练好的PCA模型。 问题五: - 对train_encodes进行K-means聚类,分为两类。 问题六: - 构建神经网络,使用train_X和train_Y训练,验证集用于调参。 - 在test_X上评估准确率,判断是否过拟合(如训练准确率远高于测试)。 问题七: - 使用train_encodes训练同样的神经网络,评估test_encodes的准确率,比较是否提升。 问题八: - 分析两种方法的优劣,如K-means是无监督,神经网络是有监督等。 现在,我需要确保代码部分正确,特别是处理Y的部分。例如: 构建Y的步骤可能如下: data['next_close'] = data.groupby('code')['close'].shift(-1) data['Y'] = (data['next_close'] - data['close']) / data['close'] data['Y_binary'] = (data['Y'] > 0).astype(int) data.dropna(subset=['Y_binary'], inplace=True) 然后,特征变量可能包括open, close, high, low, volume,以及可能的其他计算指标,但题目可能只需要原始列。 所以,train_X = data[['open', 'close', 'high', 'low', 'volume']].values 但需要注意,在划分训练集和测试集之前,需要将据整体处理完毕,然后分割。例如,假设据已经按日期排序,取前80%作为训练,后20%作为测试: split_idx = int(len(data) * 0.8) train_data = data.iloc[:split_idx] test_data = data.iloc[split_idx:] train_X = train_data[features].values train_Y = train_data['Y_binary'].values test_X = test_data[features].values test_Y = test_data['Y_binary'].values 但这样可能存在时间上的连续性问题,比如同一股票的据可能分布在训练和测试集中,但可能无法避免,因为股票之间是独立的。或者,应该按每个股票的时间来分割?例如,每个股票的前80%日期作为训练,后20%作为测试。这会更合理,但实现起来更复杂,需要逐个股票处理。 但题目可能要求整体处理,所以可能采用整体按日期分割。 假设据中的日期列是日期类型,已经排序,那么整体按日期分割可能更合理。 例如: data_sorted = data.sort_values('date') split_date = data_sorted['date'].quantile(0.8, interpolation='nearest') train_data = data_sorted[data_sorted['date'] <= split_date] test_data = data_sorted[data_sorted['date'] > split_date] 这样确保训练集是较早的据,测试集是较晚的,避免时间泄漏。 总之,处理Y变量和特征划分是关键,需要确保正确性。 关于PCA的应用,需要注意标准化步骤: scaler = StandardScaler() train_X_scaled = scaler.fit_transform(train_X) test_X_scaled = scaler.transform(test_X) pca = PCA() train_encodes = pca.fit_transform(train_X_scaled) 然后,计算累计方差比: explained_variance_ratio = pca.explained_variance_ratio_ cumulative_variance = np.cumsum(explained_variance_ratio) 绘图时,横轴是主成分序号,纵轴是累计方差比。 选择主成分量时,可以设定阈值如0.95,或者找拐点。 文字问题回答:保留的主成分不是越多越好,过多的主成分会增加计算量并引入噪声。选择方法可以是累计方差达到一定阈值,或观察方差贡献的拐点。 问题六的神经网络搭建: 可能需要使用Keras: model = Sequential() model.add(Dense(64, activation='relu', input_dim=train_X.shape[1])) model.add(Dense(32, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) 然后划分训练集和验证集: history = model.fit(train_X_scaled, train_Y, epochs=50, batch_size=32, validation_split=0.2) 测试集需要标准化: test_X_scaled = scaler.transform(test_X) test_loss, test_acc = model.evaluate(test_X_scaled, test_Y) 如果训练准确率远高于测试准确率,说明过拟合。 问题七中使用PCA后的特征: train_encodes已经降维,假设保留k个主成分,那么输入层节点为k。同样的网络结构,但输入维度调整。 可能比较两者的测试准确率,判断PCA是否提升性能。 总结来说,整个流程需要处理时间序列中的滞后变量,正确划分训练测试集,标准化和PCA处理,构建模型并评估。</think>### 一、读取据 ```python import pandas as pd df = pd.read_csv('your_data.csv') # 替换为实际文件路径 ``` --- ### 二、构建训练/测试据 ```python # 按股票分组排序 df = df.sort_values(['code', 'date']) # 计算目标变量Y(二分类:涨=1,跌=0) df['next_close'] = df.groupby('code')['close'].shift(-1) df['Y'] = ((df['next_close'] - df['close']) / df['close'] > 0).astype(int) df.dropna(subset=['Y'], inplace=True) # 定义特征列 features = ['open', 'close', 'high', 'low', 'volume'] X = df[features].values Y = df['Y'].values # 按时间顺序划分训练集和测试集 split_idx = int(len(df) * 0.8) train_X, test_X = X[:split_idx], X[split_idx:] train_Y, test_Y = Y[:split_idx], Y[split_idx:] ``` --- ### 三、主成分分析(PCA) ```python from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA import matplotlib.pyplot as plt import numpy as np # 标准化据 scaler = StandardScaler() train_X_scaled = scaler.fit_transform(train_X) # PCA降维 pca = PCA().fit(train_X_scaled) train_encodes = pca.transform(train_X_scaled) # 绘制累计方差比 cumulative_variance = np.cumsum(pca.explained_variance_ratio_) plt.plot(cumulative_variance, marker='o') plt.xlabel('主成分序') plt.ylabel('累计解释方差比') plt.show() ``` **文字回答:** 保留的主成分并非越多越好。过多的主成分会引入噪声且增加计算成本。选择方法:通过累计方差曲线,通常选择累计方差比首次超过$0.95$的主成分,或观察曲线的拐点(斜率明显下降的位置)。 --- ### 四、测试集降维 ```python test_X_scaled = scaler.transform(test_X) test_encodes = pca.transform(test_X_scaled) ``` --- ### 五、K-means聚类 ```python from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=2) clusters = kmeans.fit_predict(train_encodes) ``` --- ### 六、神经网络训练与评估 ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense # 定义模型 model = Sequential([ Dense(64, activation='relu', input_dim=train_X.shape[1]), Dense(32, activation='relu'), Dense(1, activation='sigmoid') ]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 训练模型(使用验证集调参) history = model.fit( train_X_scaled, train_Y, epochs=20, batch_size=32, validation_split=0.2, verbose=0 ) # 测试集评估 test_loss, test_acc = model.evaluate(scaler.transform(test_X), test_Y, verbose=0) print(f'Test Accuracy: {test_acc:.4f}') ``` **文字回答:** 若训练准确率显著高于测试准确率(如训练$0.85$ vs 测试$0.65$),则存在过拟合。原因可能是模型复杂度过高或训练据不足。 --- ### 七、基于PCA特征的神经网络 ```python # 使用降维后的特征 model_pca = Sequential([ Dense(32, activation='relu', input_dim=train_encodes.shape[1]), Dense(16, activation='relu'), Dense(1, activation='sigmoid') ]) model_pca.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 训练与评估 model_pca.fit(train_encodes, train_Y, epochs=20, batch_size=32, validation_split=0.2, verbose=0) _, pca_test_acc = model_pca.evaluate(test_encodes, test_Y, verbose=0) print(f'PCA Test Accuracy: {pca_test_acc:.4f}') ``` **文字回答:** 假设原始模型测试准确率为$0.68$,PCA模型为$0.72$,则PCA提升了预测性能。若结果相反,说明降维可能丢失了关键信息。 --- ### 八、模型对比 **K-means优劣:** - 优点:无需标签,计算效率高,适合探索性分析。 - 缺点:假设簇为凸形,无法直接用于分类,对噪声敏感。 **神经网络优劣:** - 优点:可捕捉非线性关系,适合复杂模式。 - 缺点:需大量据,训练耗时,易过拟合。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值