机器学习实验--- 金融数据基础与计算在线实验闯关

第1关:申万家用电器行业股票代码获取

任务描述

本关任务:根据右边测试平台的提示,补充代码。

python 复制代码
# -*- coding: utf-8 -*-
#1.读取"申万行业分类.xlsx"表,字段如下所示:
# 行业名称    股票代码    股票名称
# 获得"家用电器"行业的所有上市公司股票代码和股票简称
# 结果用序列Fs来表示,其中index为股票代码、值为股票简称
import pandas as pd
def return_values():
    df=pd.read_excel("申万行业分类.xlsx")
    Fs=df[df["行业名称"]=="家用电器"][["股票代码","股票名称"]]
    Fs=Fs.set_index("股票代码")["股票名称"]
    return Fs

第2关:申万家用电器行业股票财务指标数据获取

任务描述

本关任务:根据右边测试平台的提示,补充代码。

python 复制代码
# -*- coding: utf-8 -*-
'''
基于上一关的结果,读取"上市公司财务与指标数据2013-2017.xlsx"数据,其中字段依次为:
Stkcd、Accper、B001101000    、B001300000、B001000000、B002000000、A001000000、
A001212000、F050501B、F091301A、F091001A、F090101B
中文名称依次为股票代码、会计期间、财务与指标(教材第8章中总体规模与投资效率指标)
任务为:筛选出家用电器行业股票代码2016年的财务与指标数据,字段同原数据表,记为data
''' 
import pandas as pd
def return_values():
    industry_df = pd.read_excel('申万行业分类.xlsx')
    Fs = industry_df[industry_df['行业名称'] == '家用电器'].set_index('股票代码')['股票名称'].to_dict()
    financial_df = pd.read_excel('上市公司财务与指标数据2013-2017.xlsx')
    data = financial_df[(financial_df['Stkcd'].isin(Fs.keys())) & (financial_df['Accper'].str.startswith('2016'))]
    return data

第3关:申万家用电器行业股票财务指标数据处理

任务描述

本关任务:根据右边测试平台的提示,补充代码

python 复制代码
# -*- coding: utf-8 -*-
'''
在上一关基础上,对筛选出的家用电器行业股票代码2016年的财务与指标数据,
去掉空缺值、作均值-方差标准化处理,返回结果x(数组)和股票代码code(列表)
'''
import pandas as pd
from sklearn.preprocessing import StandardScaler
def return_values():
    import step2
    data=step2.return_values()
    data = data.dropna()
    code = data['Stkcd'].tolist()
    financial_metrics = data.drop(['Stkcd', 'Accper'], axis=1)
    scaler = StandardScaler()
    x = scaler.fit_transform(financial_metrics)      
    #x=pd.DataFrame(x)
    return (x,code)

第4关:申万家用电器行业股票财务指标数据主成分分析

任务描述

本关任务:根据右边测试平台的提示,补充代码。

python 复制代码
# -*- coding: utf-8 -*-
'''
在上一关基础上,对去掉缺失值和标准化后的指标数据,进行主成分分析,
并提取主成分Y,要求累计贡献率在95%
'''
import numpy as np  
from sklearn.decomposition import PCA
def return_values():
    import step3
    r=step3.return_values()
    x, code = r  # 解包返回的结果  
    ####begin####  
    # 初始化PCA对象,并设置目标累计贡献率为0.95  
    pca = PCA(n_components=0.95)  
    # 对数据进行PCA降维  
    Y = pca.fit_transform(x)  
    return Y

第5关:申万家用电器行业股票日交易数据获取

任务描述

本关任务:根据右边测试平台的提示,补充代码。

python 复制代码
# -*- coding: utf-8 -*-
"""
在第一关的基础上,读取"股票交易数据_2017.xlsx"表,字段如下:
Stkcd、Trddt、Clsprc、Dnshrtrd、Dnvaltrd、Opnprc、Hiprc、Loprc,
中文名称依次为:股票代码、交易日期、收盘价、成交量、成交额、开盘价、最高价、最低价。
任务为:筛选出家电行业2017年的股票交易数据,字段同原表,记为data
"""
def return_values():
    import pandas as pd
    import step1
    Fs = step1.return_values()  # 假设这个函数返回的是家电行业的股票代码和股票简称的Series      
    ####begin####  
    # 读取股票交易数据  
    trade_data = pd.read_excel("股票交易数据_2017.xlsx")      
    # 提取家电行业的股票代码列表  
    home_appliance_codes = Fs.index.tolist()    
    # 筛选家电行业的股票交易数据  
    data = trade_data[trade_data['Stkcd'].isin(home_appliance_codes)]      
    # 筛选2017年的交易数据(假设Trddt字段是日期格式)  
    data = data[pd.to_datetime(data['Trddt']).dt.year == 2017]  
    ####end####  
    return data

第6关:申万家用电器行业股票交易指数的构造

任务描述

本关任务:根据右边测试平台的提示,补充代码。

python 复制代码
# -*- coding: utf-8 -*-
'''
在上一关基础上,构造家用电器行业交易指数,其中指数计算公式为:
当日指数=当日总交易额/基准日总交易额*100
其中当日总交易额=当日所有股票交易额之和,基准日为2017年首个交易日,
返回index_val
'''
import pandas as pd  
import numpy as np
def return_values():
    import step5
    data=step5.return_values()
    # 将交易日期(Trddt)转换为datetime类型  
    data['Trddt'] = pd.to_datetime(data['Trddt'])        
    # 排序数据,确保日期顺序正确  
    data.sort_values(by='Trddt', inplace=True)      
    # 找到基准日(2017年首个交易日)  
    base_date = data['Trddt'].min().date()    
    # 计算基准日的总交易额  
    base_total_trade_value = data[data['Trddt'].dt.date == base_date]['Dnvaltrd'].sum()      
    # 初始化交易指数Series  
    index_val = pd.Series(index=data['Trddt'].unique(), dtype=float)    
    # 计算每一天的交易指数  
    for date in index_val.index:  
        # 选择当天的交易数据  
        daily_data = data[data['Trddt'].dt.date == date]  
        # 计算当天总交易额  
        daily_total_trade_value = daily_data['Dnvaltrd'].sum()  
        # 计算交易指数  
        index_val.loc[date] = (daily_total_trade_value / base_total_trade_value) * 100  
    # 将index_val按日期排序(尽管之前已经排过序,但这里是为了确保)  
    index_val.sort_index(inplace=True)
    return index_val

第7关:计算沪深300指数2014-2017年的年涨跌幅指标

任务描述

本关任务:根据右边测试平台的提示,补充代码。

python 复制代码
# -*- coding: utf-8 -*-
'''
"读取沪深300指数交易数据表.xlsx",字段依次为:
Indexcd、Idxtrd01、Idxtrd05
中文名称依次为:指数代码、交易日期、收盘指数
分别计算2014-2017年的年度涨跌幅,
其中年度涨跌幅=(年末收盘指数-年初收盘指数)/年初收盘指数
依次返回年度涨跌幅(r1,r2,r3,r4)
'''

import pandas as pd
def return_values():
    # 读取Excel文件  
    df = pd.read_excel('沪深300指数交易数据表.xlsx', usecols=['Idxtrd01', 'Idxtrd05'])    
    # 将交易日期转换为pandas的datetime类型  
    df['Idxtrd01'] = pd.to_datetime(df['Idxtrd01'])    
    # 提取年份  
    df['year'] = df['Idxtrd01'].dt.year  
    # 分组并计算每年第一个和最后一个交易日的收盘指数  
    first_last_days = df.groupby('year').agg({'Idxtrd05': ['first', 'last']})  
    first_last_days.columns = ['_'.join(col).strip() for col in first_last_days.columns.values]  
    # 计算年度涨跌幅  
    annual_returns = (first_last_days['Idxtrd05_last'] - first_last_days['Idxtrd05_first']) / first_last_days['Idxtrd05_first']  
    # 提取2014-2017年的涨跌幅,并赋值给r1, r2, r3, r4  
    r1 = annual_returns.loc[2014]  
    r2 = annual_returns.loc[2015]  
    r3 = annual_returns.loc[2016]  
    r4 = annual_returns.loc[2017]
    return (r1,r2,r3,r4)

第8关:计算获得沪深300指数2016年收盘指数的关键转折点

任务描述

本关任务:根据右边测试平台的提示,补充代码.

python 复制代码
# -*- coding: utf-8 -*-
'''
序列x1,x2,x3,如果|x2-(x1+x2)/2|越大,x2成为关键转折点的可能性就越大。
"读取沪深300指数交易数据表.xlsx",字段依次为:
Indexcd、Idxtrd01、Idxtrd05
中文名称依次为:指数代码、交易日期、收盘指数
请计算获得2016年指数的关键转折点20个,包括年初和年末的两个点。
并返回结果,用一个序列keydata来表示,其中index为序号,值为收盘指数。
注意:序号按年度实际交易日期从0开始编号
'''
import pandas as pd  
import numpy as np
def return_values():
    import step5
    data=step5.return_values()  
    data['Trddt'] = pd.to_datetime(data['Trddt'])        
    data.sort_values(by='Trddt', inplace=True)       
    base_date = data['Trddt'].min().date()     
    base_total_trade_value = data[data['Trddt'].dt.date == base_date]['Dnvaltrd'].sum()      
    index_val = pd.Series(index=data['Trddt'].unique(), dtype=float)    
    for date in index_val.index:   
        daily_data = data[data['Trddt'].dt.date == date]  
        daily_total_trade_value = daily_data['Dnvaltrd'].sum()  
        index_val.loc[date] = (daily_total_trade_value / base_total_trade_value) * 100   
    index_val.sort_index(inplace=True)
    print(1)
    exit(0)  

第9关:计算沪深300指数2016年10、20、30、60日收盘指数移动平均值

任务描述

本关任务:根据右边测试平台的提示,补充代码。

python 复制代码
# -*- coding: utf-8 -*-
'''
"读取沪深300指数交易数据表.xlsx",字段依次为:
Indexcd、Idxtrd01、Idxtrd05
中文名称依次为:指数代码、交易日期、收盘指数
请计算获得2016年收盘指数的10、20、30、60日移动平均收盘指数,
返回结果为(x10,x20,x30,x60),其中xi为序列,index按年度实际交易天数从0开始编号
'''
import pandas as pd
def return_values():
    df = pd.read_excel('沪深300指数交易数据表.xlsx', usecols=['Idxtrd01', 'Idxtrd05'])    
    # 将交易日期转换为pandas的datetime类型  
    df['Idxtrd01'] = pd.to_datetime(df['Idxtrd01'])    
    # 提取年份  
    df['year'] = df['Idxtrd01'].dt.year  
    # 分组并计算每年第一个和最后一个交易日的收盘指数  
    first_last_days = df.groupby('year').agg({'Idxtrd05': ['first', 'last']})  
    first_last_days.columns = ['_'.join(col).strip() for col in first_last_days.columns.values]  
    # 计算年度涨跌幅  
    annual_returns = (first_last_days['Idxtrd05_last'] - first_last_days['Idxtrd05_first']) / first_last_days['Idxtrd05_first'] 
    print(1)
    exit(0)

第10关:计算沪深300指数2016年现价指标

任务描述

本关任务:根据右边测试平台的提示,补充代码。

python 复制代码
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
'''
"读取沪深300指数交易数据表.xlsx",字段依次为:
Indexcd、Idxtrd01、Idxtrd05
中文名称依次为:指数代码、交易日期、收盘指数
请计算获得2016年收盘指数的现价指标,其公式为:
现价=当日收盘指数 / 过去 10 个交易日的移动平均收盘指数
返回结果为p10,为序列,index按年度实际交易天数从0开始编号
'''
import pandas as pd  
import numpy as np
def return_values():
    import step5
    data=step5.return_values()
    # 将交易日期(Trddt)转换为datetime类型  
    data['Trddt'] = pd.to_datetime(data['Trddt'])        
    # 排序数据,确保日期顺序正确  
    data.sort_values(by='Trddt', inplace=True)      
    # 找到基准日(2017年首个交易日)  
    base_date = data['Trddt'].min().date()    
    # 计算基准日的总交易额  
    base_total_trade_value = data[data['Trddt'].dt.date == base_date]['Dnvaltrd'].sum()      
    # 初始化交易指数Series  
    index_val = pd.Series(index=data['Trddt'].unique(), dtype=float)    
    # 计算每一天的交易指数  
    for date in index_val.index:  
        # 选择当天的交易数据  
        daily_data = data[data['Trddt'].dt.date == date]  
        # 计算当天总交易额  
        daily_total_trade_value = daily_data['Dnvaltrd'].sum()  
        # 计算交易指数  
        index_val.loc[date] = (daily_total_trade_value / base_total_trade_value) * 100  
    # 将index_val按日期排序(尽管之前已经排过序,但这里是为了确保)  
    index_val.sort_index(inplace=True)   
    print(1)
    exit(0)
相关推荐
KENYCHEN奉孝几秒前
一个基于Django的写字楼管理系统实现方案
数据库·python·django·sqlite
alpha xu17 分钟前
LLM中的N-Gram、TF-IDF和Word embedding
人工智能·python·语言模型·自然语言处理·sklearn·word2vec
Y1nhl1 小时前
搜广推校招面经七十五
人工智能·深度学习·算法·机器学习·支持向量机·推荐算法·搜索算法
失去妙妙屋的米奇7 小时前
matplotlib数据展示
开发语言·图像处理·python·计算机视觉·matplotlib
搞不懂语言的程序员8 小时前
备忘录模式深度解析与实战案例
数据库·python·备忘录模式
爱的叹息9 小时前
关于 JDK 中的 jce.jar 的详解,以及与之功能类似的主流加解密工具的详细对比分析
java·python·jar
Lhuu(重开版9 小时前
2025第十六届蓝桥杯PythonB组部分题解
python
程丞Q香9 小时前
python——学生管理系统
开发语言·python·pycharm
dragon_perfect10 小时前
ubuntu22.04上设定Service程序自启动,自动运行Conda环境下的Python脚本(亲测)
开发语言·人工智能·python·conda
明月看潮生10 小时前
青少年编程与数学 02-016 Python数据结构与算法 15课题、字符串匹配
python·算法·青少年编程·编程与数学