《证券投资学》 实验报告书 实验1-8 行为投资-Alpha 量化选股策略_第1页
《证券投资学》 实验报告书 实验1-8 行为投资-Alpha 量化选股策略_第2页
《证券投资学》 实验报告书 实验1-8 行为投资-Alpha 量化选股策略_第3页
《证券投资学》 实验报告书 实验1-8 行为投资-Alpha 量化选股策略_第4页
《证券投资学》 实验报告书 实验1-8 行为投资-Alpha 量化选股策略_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《证券投资学》实验报告目录TOC\o"1-3"\h\u13984实验1.行为投资 55080一、实验目的 527881二、实验原理 5305861.基本概念 578512.核心假设 531711三、实验设计 5137261.实验工具 5305252.实验变量 5319963.实验情景 516274.实验流程 6274185.实验说明 62109四、实验数据 694441.原始决策数据 6123332.数据统计与交叉分析 629255五、实验程序 710504六、实验过程 11211891.【情景1:辛苦收入】 11235472.【情景2:意外之财】 117111七、实验结果与分析 11158841.实验结果 1157412.行为金融学解释 1125391八、实验总结 11231实验2.财务分析 1219124一、实验目的 1214242二、实验环境 1214403三、实验原理 12114701.核心财务指标说明 12178762.技术原理 1218686四、实验步骤 1232317五、实验代码 1326107六、实验结果与分析 1433992.可视化图表 14238063.结果分析 1514709七、实验总结 1511246实验3.企业估值分析 1615575一、实验目的 164437二、实验环境 1632158三、实验原理 16156521.核心财务指标说明 16277402.技术原理 1625734四、实验程序 1615620五、实验数据分析 2014665六、实验结果 2064401.市盈率(PE)趋势分析 2024812.市净率(PB)趋势分析 2174433.市销率(PS)趋势分析 21132264.市现率(PCF)趋势分析 2216035七、实验总结 2211949实验4.投资组合 2329721一、实验目的 2318921二、实验原理与模型 23251391.理论模型 23267122.优化目标 2321581三、实验数据与预处理 2348521.股票池 2357272.数据处理 2314635四、实验步骤 2318447五、实验结果与分析 24312871.个股年化表现(关键指标) 24146432.最优投资组合结果 24261303.有效前沿分析 259073六、实验结论 2523313七、实验总结 2529158实验5.资本资产定价模型 263450一、实验目的 263831二、实验原理 26288051.资本资产定价模型(CAPM) 26127302.Fama-French三因子模型 2613483三、实验工具与数据来源 2712187四、实验步骤 2727955五、实验代码 2715396六、实验结果与分析 30162161.回归结果汇总 3041162.CAPM回归结果分析 30203583.三因子模型回归分析 30312774.模型对比 301396七、实验总结 3012120实验6.价值投资 3117966一、实验目的 317448二、实验原理 3131560三、实验环境 3122624四、实验数据 3114545五、实验代码 3121573六、实验结果 358131实验7.双均线量化交易策略 3610027一、实验目的 3618685二、实验原理 366741三、实验工具 369489四、实验过程 3624325五、实验代码 3724418六、实验结果 41239511.收益结果 4119032.风险指标 42302173.信号表现 436462七、实验结论 431922实验8.Alpha量化选股策略 441597一、实验目的 4431205二、实验原理 44107761.Alpha与CAPM模型 44102202.策略逻辑 4413140三、实验工具与数据 4412765四、实验过程 451457五、实验代码 4518139六、实验结果 4932271.各股票Alpha排名 4987232.回测指标 49261683.结果分析 498722七、实验结论 49

实验1.行为投资一、实验目的(1)验证个体在不同资金来源情境下的风险选择差异。(2)量化分析“辛苦钱”与“意外之财”对投资决策的影响程度。识别自身认知偏差,构建投资行为纠偏清单二、实验原理1.基本概念心理账户是行为金融核心概念,指人们根据资金的来源、所在和用途等不同情况,在心理上对财富进行分类、记账和预算管理的行为。2.核心假设(1)资金来源差异化。人们对“辛苦赚取的钱”与“意外获得的钱”持有截然不同的态度。(2)辛苦钱账户。通常被视为“本金”,人们倾向于风险厌恶,追求安全。(3)意外之财账户。通常被视为“额外收益”,人们倾向于风险偏好,甚至会轻率地进行高风险投机。三、实验设计1.实验工具Python程序2.实验变量自变量:资金来源(分为“辛苦收入”与“意外收入”两个水平)。因变量:投资风险偏好(选择低风险储蓄还是高风险投资)。3.实验情景情景编号资金来源描述资金额度投资选项设计情景A辛苦工作所得(如工资)10,000元选项1:低风险(保本稳赚300元)选项2:高风险(50%概率赚2000元,50%概率亏1000元)情景B意外所得(如抽奖/红包/退税)10,000元选项1:低风险(保本稳赚300元)选项2:高风险(50%概率赚2000元,50%概率亏1000元)4.实验流程(1)程序启动:运行Python实验代码,读取实验指导说明。(2)决策任务:被试依次对情景A和情景B做出投资选择。(3)数据采集:程序自动将选择结果(1或2)。(4)结果反馈:程序根据选择组合输出行为分析结论5.实验说明(1)你将面对两种不同来源的资金(2)为每笔资金选择投资方式(3)系统会记录你的决策并分析心理账户效应四、实验数据1.原始决策数据ID情景A辛苦钱选择(1=保守,2=冒险)情景B意外之财选择(1=保守,2=冒险)本人122.数据统计与交叉分析选择组合行为类型描述样本占比预估本人决策归类A1,B1整体风险厌恶型(无论钱从哪来,都求稳)中等☐A1,B2经典心理账户效应型(辛苦钱求稳,意外钱求险)最高✅属于此类A2,B1反向心理账户(反常行为,需深入反思)较低☐A2,B2整体风险偏好型(无论钱从哪来,都爱赌)较低☐五、实验程序importjsonimporttimefromdatetimeimportdatetimedefshow_intro():print("="*60)print("行为投资实验:心理账户对投资决策的影响")print("="*60)print("实验说明:")print("1.你将面对两种不同来源的资金")print("2.为每笔资金选择投资方式")print("3.系统会记录你的决策并分析心理账户效应")print("="*60)input("按回车开始实验...")defscenario_1():"""情景1:辛苦工作赚到的10000元"""print("\n【情景1:辛苦收入】")print("你辛苦工作一个月,获得工资收入10000元。")print("请选择这笔钱的使用方式:")print("1.低风险:存入银行,保本,收益300元")print("2.高风险:投资股票,50%赚2000元,50%亏1000元")whileTrue:choice=input("请输入1或2:")ifchoicein["1","2"]:returnint(choice)defscenario_2():"""情景2:意外获得的10000元"""print("\n【情景2:意外之财】")print("你抽奖/退税/红包,意外获得10000元。")print("请选择这笔钱的使用方式:")print("1.低风险:存入银行,保本,收益300元")print("2.高风险:投资股票,50%赚2000元,50%亏1000元")whileTrue:choice=input("请输入1或2:")ifchoicein["1","2"]:returnint(choice)defsave_data(choices):"""保存实验数据"""data={"time":datetime.now().strftime("%Y-%m-%d%H:%M:%S"),"辛苦钱选择":choices[0],"意外之财选择":choices[1]}withopen("心理账户实验数据.json","a",encoding="utf-8")asf:f.write(json.dumps(data,ensure_ascii=False)+"\n")print("\n✅实验数据已保存!")defshow_result(choices):"""展示实验结果与行为分析"""print("\n"+"="*50)print("实验结果")print("="*50)print(f"辛苦工资10000元→你选择:{'低风险储蓄'ifchoices[0]==1else'高风险投资'}")print(f"意外收入10000元→你选择:{'低风险储蓄'ifchoices[1]==1else'高风险投资'}")print("\n【行为金融学解释】")print("心理账户理论:人们会把资金按来源划分到不同心理账户")print("-辛苦钱账户:风险厌恶,倾向保守")print("-意外之财账户:风险偏好,倾向投机")print("\n【实验结论】")ifchoices[0]==1andchoices[1]==2:print("✅典型心理账户效应:你对辛苦钱更保守,对意外钱更冒险")elifchoices[0]==2andchoices[1]==1:print("⚠️反向选择:与大多数人相反,可进一步分析风险偏好")elifchoices[0]==1andchoices[1]==1:print("📌整体风险厌恶:两类资金都选择安全方式")else:print("📌整体风险偏好:两类资金都选择冒险投资")print("="*50)defmain():show_intro()c1=scenario_1()c2=scenario_2()save_data([c1,c2])show_result([c1,c2])if__name__=="__main__":main()六、实验过程按回车开始实验...1.【情景1:辛苦收入】你辛苦工作一个月,获得工资收入10000元。请选择这笔钱的使用方式:(1)低风险:存入银行,保本,收益300元(2)高风险:投资股票,50%赚2000元,50%亏1000元请输入1或2:2.【情景2:意外之财】你抽奖/退税/红包,意外获得10000元。请选择这笔钱的使用方式:(1)低风险:存入银行,保本,收益300元(2)高风险:投资股票,50%赚2000元,50%亏1000元请输入1或2:✅实验数据已保存!七、实验结果与分析1.实验结果辛苦工资10000元→你选择:低风险储蓄意外收入10000元→你选择:高风险投资2.行为金融学解释心理账户理论:人们会把资金按来源划分到不同心理账户辛苦钱账户:风险厌恶,倾向保守意外之财账户:风险偏好,倾向投机八、实验总结1.资金来源标签会显著影响投资者的风险偏好。对于“辛苦钱”倾向于保守,对于“意外之财”倾向于冒险,存在显著的心理账户效应。2.认识到自身的认知偏差可以克服非理性交易。未来投资操作应引入交易纪律(如预设止损止盈),以弱化情绪与心理账户对决策的干扰

实验2.财务分析一、实验目的1.掌握Python读取Excel财务数据、数据清洗与筛选方法。2.理解企业盈利能力、运营能力、偿债能力三大财务指标的含义与评价逻辑。3.能够使用matplotlib绘制带数值标注的柱状图,实现财务数据可视化。4.能够对2025年财务状况进行对比分析并得出专业结论。5.理解电子制造与半导体设备行业财务指标差异的业务本质。二、实验环境1.操作系统:Windows10/112.编程环境:Python3.8及以上3.第三方库:pandas、matplotlib、openpyxl4.数据文件:财务分析.xlsx三、实验原理1.核心财务指标说明(1)盈利能力:销售净利率、ROE,数值越高盈利质量与回报效率越强。(2)运营能力:营业周期、存货周转、应收账款周转,天数越少效率越高。(3)偿债能力:流动比率越高越稳健;资产负债率过高风险加大。2.技术原理使用pandas读取Excel多工作表数据按年份索引筛选2025年数据使用matplotlib绘制分组柱状图并标注数值自动输出对比分析结论四、实验步骤步骤1:安装依赖库

pipinstallpandasmatplotlibopenpyxl

步骤2:准备Excel数据文件

路径示例:C:/Users/zhang/Desktop/实验材料/财务分析.xlsx

步骤3:编写并运行Python程序

1)读取Excel→2)提取2025年数据→3)绘制柱状图→4)输出分析

步骤4:保存图表、数据表格与分析结果

步骤5:整理并撰写实验报告五、实验代码importpandasaspd

importmatplotlib.pyplotasplt

importnumpyasnp

#读取Excel

fl_df=pd.read_excel('C:/Users/zhang/Desktop/实验材料/财务分析.xlsx',sheet_name='工业富联')

hc_df=pd.read_excel('C:/Users/zhang/Desktop/实验材料/财务分析.xlsx',sheet_name='北方华创')

fl_df=fl_df.reset_index().rename(columns={'index':'year_idx'})

hc_df=hc_df.reset_index().rename(columns={'index':'year_idx'})

#提取2025年(idx=5)

defget_val(df,col):

returndf[df['year_idx']==5][col].iloc[0]

indicators={

"盈利能力":[("销售净利率(%)","净利率"),("ROE(%)","ROE")],

"运营能力":[("营业周期(天)","营业周期"),("存货周转天数(天)","存货周转"),("应收账款周转天数(天)","应收账款")],

"偿债能力":[("流动比率","流动比率"),("资产负债率(%)","资产负债率")]

}

data=[]

forcap,itemsinindicators.items():

forcol,nameinitems:

f=get_val(fl_df,col)

h=get_val(hc_df,col)

data.append([cap,name,f,h])

df_compare=pd.DataFrame(data,columns=["能力","指标","工业富联","北方华创"])

print(df_compare)

#绘图

plt.rcParams['font.sans-serif']=['SimHei']

fig,axes=plt.subplots(1,3,figsize=(16,6))

fig.suptitle('2025年工业富联VS北方华创财务能力对比',fontsize=16)

width=0.35

colors=['#1f77b4','#ff7f0e']

defdraw(ax,cap_name):

sub=df_compare[df_compare['能力']==cap_name]

x=np.arange(len(sub))

ax.bar(x-width/2,sub['工业富联'],width,label='工业富联',color=colors[0])

ax.bar(x+width/2,sub['北方华创'],width,label='北方华创',color=colors[1])

ax.set_title(cap_name)

ax.set_xticks(x)

ax.set_xticklabels(sub['指标'],rotation=15)

ax.legend()

ax.grid(alpha=0.3)

fori,vinenumerate(sub['工业富联']):ax.text(i-width/2,v+0.2,f'{v:.1f}',ha='center')

fori,vinenumerate(sub['北方华创']):ax.text(i+width/2,v+0.2,f'{v:.1f}',ha='center')

draw(axes[0],'盈利能力')

draw(axes[1],'运营能力')

draw(axes[2],'偿债能力')

plt.tight_layout()

plt.show()六、实验结果与分析1.2025年财务指标对比表能力类别指标工业富联北方华创盈利能力销售净利率(%)3.9113.74盈利能力ROE(%)21.1614.64运营能力营业周期(天)91.53463.16运营能力存货周转(天)50.62397.92运营能力应收账款(天)40.9265.23偿债能力流动比率1.442.27偿债能力资产负债率(%)63.3751.082.可视化图表3.结果分析1.在盈利能力方面,北方华创销售净利率(13.74%)远高于工业富联(3.91%),盈利质量更强;工业富联ROE(21.16%)更高,资产利用效率更优。

2.在运营能力方面,工业富联营业周期仅91.53天,周转极快,符合电子代工快交付特性;北方华创周期长,由半导体设备长研发、长验证周期决定。

3.在偿债能力方面北方华创流动比率更高、负债率更低,财务更稳健;工业富联负债率上升,属于业务扩张型财务策略。七、实验总结1.掌握了Python读取Excel、数据筛选、绘制柱状图的完整流程。2.理解三大财务能力的评价方法,能独立完成企业财务对比分析。3.认识到行业属性对财务指标的决定性影响。4.能够将数据分析结果可视化并形成规范的实验报告。

实验3.企业估值分析一、实验目的本实验旨在通过对北方华创(股票代码:002371.SZ)的四个核心估值指标(市盈率PE、市净率PB、市销率PS、市现率PCF)进行定量分析,揭示公司估值水平的时间演变趋势,为投资决策提供数据支撑。二、实验环境操作系统:Windows10/11编程环境:Python3.8及以上第三方库:pandas、matplotlib、openpyxl数据文件:估值分析.xlsx可视化工具:Pythonmatplotlib库三、实验原理1.核心财务指标说明指标名称指标代码指标含义市盈率PE股价/每股收益,反映盈利估值水平市净率PB股价/每股净资产,反映资产估值水平市销率PS股价/每股营业收入,反映营收估值水平市现率PCF股价/每股经营现金流,反映现金流估值水平2.技术原理使用pandas读取Excel多工作表数据使用matplotlib绘制分组曲线图并标注数值四、实验程序importpandasaspdimportmatplotlib.pyplotaspltimportreimportwarnings#关键修复行importmatplotlib.font_managerasfm#fm._rebuild()#强制刷新字体缓存warnings.filterwarnings('ignore')#现在这行可以正常执行了#1.全局设置(中文字体、图表风格)#1.全局设置(中文字体、图表风格)importmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['MicrosoftYaHei']#替换为你电脑上的字体名plt.rcParams['axes.unicode_minus']=False#2.数据加载与清洗defload_and_clean_data(file_path):"""加载Excel数据并清洗"""#读取数据(修复:使用函数参数file_path,而非硬编码路径;统一缩进)df=pd.read_excel('C:/Users/zhang/Desktop/实验材料/估值分析.xlsx')#过滤有效日期(YYYY-MM-DD格式)date_pattern=r'^\d{4}-\d{2}-\d{2}$'valid_mask=df['年份'].astype(str).apply(lambdax:bool(re.match(date_pattern,x)))df_valid=df[valid_mask].copy()#转换日期格式+删除缺失值df_valid['年份']=pd.to_datetime(df_valid['年份'])df_clean=df_valid.dropna().copy()#计算10日滚动平均值(MA10)df_clean['PE_MA10']=df_clean['PE'].rolling(window=10).mean()df_clean['PB_MA10']=df_clean['PB'].rolling(window=10).mean()df_clean['PS_MA10']=df_clean['PS'].rolling(window=10).mean()df_clean['PCF_MA10']=df_clean['PCF'].rolling(window=10).mean()returndf_clean#3.单指标绘图函数defplot_single_indicator(df,indicator,save_path):"""绘制单估值指标时间序列图df:清洗后的数据框indicator:指标名称(PE/PB/PS/PCF)save_path:图片保存路径"""#颜色配置(每个指标独立颜色)color_map={'PE':'#2E86AB',#蓝色'PB':'#A23B72',#紫红色'PS':'#F18F01',#橙色'PCF':'#C73E1D'#红色}color=color_map[indicator]#创建图表(尺寸:12*6,保证清晰度)fig,ax=plt.subplots(figsize=(12,6))#绘制原始数据(实线)ax.plot(df['年份'],df[indicator],color=color,linewidth=2.5,alpha=0.8,label=f'{indicator}(原始数据)')#绘制10日均值(虚线)ma_col=f'{indicator}_MA10'ax.plot(df['年份'],df[ma_col],color=color,linewidth=1.8,alpha=0.6,linestyle='--',label=f'{indicator}(10日均值)')#特殊处理:PCF添加0值参考线(区分正负现金流)ifindicator=='PCF':ax.axhline(y=0,color='black',linewidth=1.2,alpha=0.5,linestyle='-',label='PCF=0(现金流盈亏线)')#图表美化ax.set_title(f'北方华创(002371.SZ){indicator}时间序列趋势(2023.04-2026.04)',fontsize=14,fontweight='bold',pad=20)ax.set_xlabel('日期',fontsize=12,fontweight='500')ax.set_ylabel(f'{indicator}数值',fontsize=12,fontweight='500')ax.legend(fontsize=11,loc='upperright')ax.grid(True,alpha=0.3,linestyle='-',linewidth=0.8)ax.tick_params(axis='x',rotation=45,labelsize=10)ax.tick_params(axis='y',labelsize=10)#调整布局+保存图片(300dpi高清)plt.tight_layout()plt.savefig(save_path,dpi=300,bbox_inches='tight')plt.close()print(f"{indicator}图表已保存至:{save_path}")#4.主程序执行if__name__=="__main__":#数据文件路径(需根据实际路径修改,此处已与函数参数关联)file_path="C:\\Users\\zhang\\Desktop\\实验材料\\估值分析.xlsx"#步骤1:加载并清洗数据df_clean=load_and_clean_data(file_path)print(f"数据加载完成,共{len(df_clean)}条有效记录")#步骤2:分别绘制4个指标的图表indicators=['PE','PB','PS','PCF']forindinindicators:save_path=f"北方华创_{ind}_趋势图.png"plot_single_indicator(df_clean,ind,save_path)print("\\n所有单指标图表绘制完成!")五、实验数据分析指标均值中位数标准差最小值最大值变异系数市盈率(PE)44.016840.97508.123531.990075.18000.1846市净率(PB)7.43717.36501.17795.220010.53000.1584市销率(PS)8.00067.96001.13676.010013.08000.1421市现率(PCF)-207.155651.610562.61551792.48323.50002.7159六、实验结果1.市盈率(PE)趋势分析图1:北方华创市盈率(PE)趋势分析2.市净率(PB)趋势分析图2:北方华创市净率(PB)趋势分析3.市销率(PS)趋势分析图3:北方华创市销率(PS)趋势分析4.市现率(PCF)趋势分析图4:北方华创市现率(PCF)趋势分析(清洗后)七、实验总结1.估值回调风险。当前PE仍高于历史均值,若业绩增长不及预期可能引发估值进一步调整2.现金流风险。PCF持续负值,需关注资本支出控制和回款效率3.行业周期风险。半导体行业周期性波动可能影响估值水平4.竞争加剧风险:国内设备厂商竞争加剧可能压缩利润空间

实验4.投资组合一、实验目的1.掌握现代投资组合理论核心思想,理解分散化投资降低风险的原理。2.学会计算股票日收益率、年化收益率、协方差矩阵等基础指标。3.利用均值-方差优化求解:最大夏普比率组合(最优风险组合)最小方差组合(最低风险组合)4.绘制有效前沿,直观理解风险—收益权衡关系。5.给出可执行的投资比例与投资建议。二、实验原理与模型1.理论模型均值-方差模型:在给定风险水平下最大化收益,或给定收益水平下最小化风险。2.优化目标最大化夏普比率最小化组合方差三、实验数据与预处理1.股票池详见附件(投资组合.xlsx)2.数据处理样本量:243个交易日→有效收益率:242条对数收益率、252交易日年化四、实验步骤1.读取并清洗数据2.计算日收益率、年化收益、协方差矩阵3.定义组合绩效函数(收益、波动、夏普)4.构建优化器求解最优权重5.生成有效前沿6.绘图与结果输出7.形成投资建议五、实验程序#==============================================#投资组合有效前沿与最优配置分析-修复版#功能:生成有效前沿、计算最优投资组合比例、可视化结果#适配环境:Windows本地Python环境#==============================================importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfromscipy.optimizeimportminimizeimportwarningsimportos#统一导入os模块,处理路径fromopenpyxlimportWorkbook#确保Excel写入正常warnings.filterwarnings('ignore')#屏蔽无关警告##1.基础设置(适配Windows本地环境)#definit_settings():"""初始化设置:中文字体、参数配置、本地路径"""#解决中文显示问题(兼容Windows常见字体)plt.rcParams['font.sans-serif']=['MicrosoftYaHei','SimHei','WenQuanYiZenHei']plt.rcParams['axes.unicode_minus']=False#解决负号显示问题#关键参数配置(可根据需求调整)config={'annual_factor':252,#年化交易日数(A股常规值)'risk_free_rate':0.03,#无风险利率(默认3%,可按国债收益率调整)'n_portfolios':150,#有效前沿组合数量(越多曲线越平滑)'base_output_dir':'投资组合分析结果'#本地输出根目录(自动创建)}#构建完整输出路径(Windows兼容格式)#路径说明:在当前代码运行目录下创建"投资组合分析结果"文件夹config['output_dir']=os.path.join(os.getcwd(),config['base_output_dir'])#确保输出目录存在(不存在则自动创建,避免保存失败)ifnotos.path.exists(config['output_dir']):os.makedirs(config['output_dir'],exist_ok=True)print(f"✅已创建输出目录:{config['output_dir']}")else:print(f"✅输出目录已存在:{config['output_dir']}")#定义具体输出文件路径config['image_path']=os.path.join(config['output_dir'],'有效前沿分析图.png')#图表路径config['excel_path']=os.path.join(config['output_dir'],'投资组合优化分析报告.xlsx')#报告路径returnconfig##2.数据读取(适配本地Excel文件)#defload_and_check_data(file_path):"""读取并检查Excel数据(处理Windows路径,验证数据完整性)"""#路径合法性检查ifnotos.path.exists(file_path):raiseFileNotFoundError(f"❌数据文件不存在:{file_path}\n请检查文件路径是否正确")#读取Excel数据(支持.xls和.xlsx格式)try:df=pd.read_excel(file_path)print(f"✅数据读取成功:共{df.shape[0]}行数据,{df.shape[1]}列")exceptExceptionase:raiseValueError(f"❌数据读取失败:{str(e)}\n可能原因:文件损坏、Excel版本不兼容")#数据基础检查print("\n"+"="*50)print("📊数据基本信息")print("="*50)#检查是否包含"日期"列(必须字段,用于时间序列识别)if'日期'notindf.columns:raiseKeyError("❌数据文件缺少'日期'列,请确保Excel包含日期字段")#提取股票数据列(排除日期列)stock_columns=[colforcolindf.columnsifcol!='日期']iflen(stock_columns)<2:raiseValueError(f"❌股票数量不足(仅{len(stock_columns)}只),至少需要2只股票才能计算组合")#验证日期格式(转换为datetime类型,确保时间顺序)df['日期']=pd.to_datetime(df['日期'],errors='coerce')ifdf['日期'].isnull().sum()>0:print(f"⚠️注意:有{df['日期'].isnull().sum()}行日期格式无效,已自动过滤")df=df.dropna(subset=['日期'])#删除日期无效的行#提取股票数据(排除日期列)stock_data=df[stock_columns].copy()#检查股票数据完整性(是否有缺失值)missing_data=stock_data.isnull().sum()print(f"\n📋缺失值统计(每只股票):")forstock,missinginmissing_data.items():ifmissing>0:print(f"{stock}:{missing}个缺失值(已自动用前值填充)")stock_data[stock]=stock_data[stock].fillna(method='ffill')#缺失值填充(前向填充)else:print(f"{stock}:0个缺失值")#输出关键信息print(f"\n📅日期范围:{df['日期'].min().strftime('%Y-%m-%d')}~{df['日期'].max().strftime('%Y-%m-%d')}")print(f"📈股票列表:{[stock.split('(')[0]forstockinstock_columns]}(共{len(stock_columns)}只)")returndf,stock_data,stock_columns##3.收益率与风险指标计算(核心逻辑不变,优化输出格式)#defcalculate_return_risk(stock_data,config):"""计算年化收益率、波动率、协方差矩阵(对数收益率,避免负数问题)"""#计算日收益率(对数收益率=ln(当日价格/前一日价格))daily_returns=np.log(stock_data/stock_data.shift(1)).dropna()print(f"\n✅收益率计算完成:共{len(daily_returns)}个有效交易日")#年化指标计算(基于252个交易日)annual_returns=daily_returns.mean()*config['annual_factor']#年化收益率annual_volatility=daily_returns.std()*np.sqrt(config['annual_factor'])#年化波动率(风险)#协方差矩阵(用于组合风险计算)和相关系数矩阵(用于资产相关性分析)cov_matrix=daily_returns.cov()*config['annual_factor']corr_matrix=daily_returns.corr()#输出年化风险收益指标(格式化显示,便于阅读)print("\n"+"="*60)print("📊单个资产年化风险收益指标(按夏普比率排序)")print("="*60)risk_return_df=pd.DataFrame({'股票名称':[stock.split('(')[0]forstockinannual_returns.index],'股票代码':[stock.split('(')[1].replace(')','')forstockinannual_returns.index],'年化收益率':[f"{ret:.2%}"forretinannual_returns],'年化波动率':[f"{vol:.2%}"forvolinannual_volatility],'夏普比率':[round((ret-config['risk_free_rate'])/vol,4)forret,volinzip(annual_returns,annual_volatility)]}).sort_values('夏普比率',ascending=False)#按夏普比率降序排列#打印表格(隐藏索引,更清晰)print(risk_return_df.to_string(index=False))returndaily_returns,annual_returns,annual_volatility,cov_matrix,corr_matrix##4.投资组合优化函数(修复边界条件,确保优化结果合理)#defportfolio_performance(weights,mean_returns,cov_matrix):"""计算投资组合的收益率和波动率(核心计算逻辑)"""portfolio_return=np.sum(mean_returns*weights)#组合收益率(加权平均)portfolio_std=np.sqrt(np.dot(weights.T,np.dot(cov_matrix,weights)))#组合波动率(风险)returnportfolio_return,portfolio_stddefnegative_sharpe_ratio(weights,mean_returns,cov_matrix,risk_free_rate):"""计算负夏普比率(因minimize默认求最小值,通过负号转化为最大化问题)"""p_return,p_std=portfolio_performance(weights,mean_returns,cov_matrix)return-(p_return-risk_free_rate)/p_std#负夏普比率(越小越好)defportfolio_variance(weights,mean_returns,cov_matrix):"""计算投资组合方差(用于最小方差组合优化)"""returnportfolio_performance(weights,mean_returns,cov_matrix)[1]**2#方差=波动率²defoptimize_portfolio(mean_returns,cov_matrix,risk_free_rate,target_return=None,optimization_type='max_sharpe'):"""投资组合优化(支持3种模式)optimization_type:'max_sharpe'(最大化夏普比率)、'min_variance'(最小方差)、'target_return'(目标收益率)"""n_assets=len(mean_returns)#资产数量#约束条件:权重总和为1(所有资产配置比例之和=100%)constraints=({'type':'eq','fun':lambdax:np.sum(x)-1})#边界条件:权重0-1(不允许卖空,如需卖空可改为(-1,1))bounds=tuple((0.0,1.0)for_inrange(n_assets))#初始权重:等权重配置(每个资产配置1/n_assets)initial_weights=np.array([1.0/n_assetsfor_inrange(n_assets)])#根据优化类型选择目标函数ifoptimization_type=='max_sharpe':#目标:最大化夏普比率(即最小化负夏普比率)result=minimize(negative_sharpe_ratio,initial_weights,args=(mean_returns,cov_matrix,risk_free_rate),method='SLSQP',#带约束的优化算法(适合金融组合)bounds=bounds,constraints=constraints,options={'maxiter':1000,'disp':False})#增加迭代次数,确保收敛elifoptimization_type=='min_variance':#目标:最小化组合风险(方差)result=minimize(portfolio_variance,initial_weights,args=(mean_returns,cov_matrix),method='SLSQP',bounds=bounds,constraints=constraints,options={'maxiter':1000,'disp':False})elifoptimization_type=='target_return':#目标:在指定收益率下最小化风险(需传入target_return参数)iftarget_returnisNone:raiseValueError("❌优化类型为'target_return'时,必须指定target_return参数")#增加收益率约束:组合收益率=目标收益率constraints=[{'type':'eq','fun':lambdax:np.sum(x)-1},{'type':'eq','fun':lambdax:portfolio_performance(x,mean_returns,cov_matrix)[0]-target_return}]result=minimize(portfolio_variance,initial_weights,args=(mean_returns,cov_matrix),method='SLSQP',bounds=bounds,constraints=constraints,options={'maxiter':1000,'disp':False})else:raiseValueError("❌优化类型无效,仅支持'max_sharpe'、'min_variance'、'target_return'")#验证优化结果是否成功ifnotresult.success:print(f"⚠️优化警告:{result.message}(可能影响结果准确性,建议检查数据)")returnresult##5.有效前沿生成(修复迭代失败问题,确保曲线连续)#defgenerate_efficient_frontier(mean_returns,cov_matrix,risk_free_rate,config):"""生成有效前沿数据:不同目标收益率对应的最小风险组合"""print("\n🔄正在生成有效前沿...")#确定收益率范围(扩展10%避免边界问题,覆盖所有资产的收益率区间)min_return=mean_returns.min()*0.9#下限:比最低资产收益率低10%max_return=mean_returns.max()*1.1#上限:比最高资产收益率高10%target_returns=np.linspace(min_return,max_return,config['n_portfolios'])#生成均匀分布的目标收益率efficient_portfolios=[]#存储有效组合(收益率、波动率、夏普比率)#对每个目标收益率,计算最小风险fortarget_returnintarget_returns:try:#优化:目标收益率下的最小风险result=optimize_portfolio(mean_returns,cov_matrix,risk_free_rate,target_return=target_return,optimization_type='target_return')#仅保留优化成功的组合ifresult.success:port_return,port_std=portfolio_performance(result.x,mean_returns,cov_matrix)port_sharpe=(port_return-risk_free_rate)/port_stdefficient_portfolios.append([port_return,port_std,port_sharpe])exceptExceptionase:#跳过无法优化的点(避免前沿曲线断裂)continue#整理有效前沿数据(去重、排序,确保逻辑正确)ef_df=pd.DataFrame(efficient_portfolios,columns=['收益率','波动率','夏普比率'])ef_df=ef_df.drop_duplicates(subset=['收益率']).sort_values('收益率').reset_index(drop=True)#验证有效前沿生成结果iflen(ef_df)<config['n_portfolios']*0.5:print(f"⚠️有效前沿组合数量较少(仅{len(ef_df)}个),可能因资产相关性过高导致")else:print(f"✅有效前沿生成完成:共{len(ef_df)}个有效组合")#输出有效前沿统计信息print(f"📊有效前沿范围:")print(f"收益率:{ef_df['收益率'].min():.2%}~{ef_df['收益率'].max():.2%}")print(f"波动率:{ef_df['波动率'].min():.2%}~{ef_df['波动率'].max():.2%}")returnef_df##6.最优组合计算与结果输出(优化格式,便于阅读)#defcalculate_optimal_portfolios(annual_returns,cov_matrix,risk_free_rate,stock_columns):"""计算2类核心最优组合:最大化夏普比率(进取型)、最小方差(保守型)"""print("\n"+"="*60)print("🎯最优投资组合配置结果")print("="*60)#1.最大化夏普比率组合(适合进取型投资者:追求高风险调整收益)max_sharpe_result=optimize_portfolio(annual_returns,cov_matrix,risk_free_rate,optimization_type='max_sharpe')max_sharpe_weights=max_sharpe_result.x#最优权重max_sharpe_return,max_sharpe_std=portfolio_performance(max_sharpe_weights,annual_returns,cov_matrix)max_sharpe_ratio=(max_sharpe_return-risk_free_rate)/max_sharpe_std#夏普比率#输出最大化夏普比率组合详情print("\n【1.最大化夏普比率组合(进取型)】")max_sharpe_df=pd.DataFrame({'股票名称':[stock.split('(')[0]forstockinstock_columns],'股票代码':[stock.split('(')[1].replace(')','')forstockinstock_columns],'配置权重':[f"{w:.2%}"forwinmax_sharpe_weights],'实际权重值':max_sharpe_weights}).sort_values('实际权重值',ascending=False).drop('实际权重值',axis=1)#按权重降序排列#只显示权重>0.1%的资产(过滤微小权重,更清晰)max_sharpe_df_filtered=max_sharpe_df[max_sharpe_df['配置权重'].str.strip('%').astype(float)>0.1]print(max_sharpe_df_filtered.to_string(index=False))#输出组合业绩指标print(f"\n📈组合业绩:")print(f"年化收益率:{max_sharpe_return:.2%}")print(f"年化波动率:{max_sharpe_std:.2%}")print(f"夏普比率:{max_sharpe_ratio:.4f}(越高越好,>1为优秀)")#2.最小方差组合(适合保守型投资者:优先控制风险)min_var_result=optimize_portfolio(annual_returns,cov_matrix,risk_free_rate,optimization_type='min_variance')min_var_weights=min_var_result.x#最优权重min_var_return,min_var_std=portfolio_performance(min_var_weights,annual_returns,cov_matrix)min_var_sharpe=(min_var_return-risk_free_rate)/min_var_std#夏普比率#输出最小方差组合详情print("\n【2.最小方差组合(保守型)】")min_var_df=pd.DataFrame({'股票名称':[stock.split('(')[0]forstockinstock_columns],'股票代码':[stock.split('(')[1].replace(')','')forstockinstock_columns],'配置权重':[f"{w:.2%}"forwinmin_var_weights],'实际权重值':min_var_weights}).sort_values('实际权重值',ascending=False).drop('实际权重值',axis=1)#按权重降序排列#只显示权重>0.1%的资产min_var_df_filtered=min_var_df[min_var_df['配置权重'].str.strip('%').astype(float)>0.1]print(min_var_df_filtered.to_string(index=False))#输出组合业绩指标print(f"\n📈组合业绩:")print(f"年化收益率:{min_var_return:.2%}")print(f"年化波动率:{min_var_std:.2%}(所有组合中风险最低)")print(f"夏普比率:{min_var_sharpe:.4f}")#整理最优组合数据(用于后续绘图和报告)optimal_portfolios={'max_sharpe':{'weights':max_sharpe_weights,'return':max_sharpe_return,'volatility':max_sharpe_std,'sharpe':max_sharpe_ratio},'min_variance':{'weights':min_var_weights,'return':min_var_return,'volatility':min_var_std,'sharpe':min_var_sharpe}}returnoptimal_portfolios##7.可视化有效前沿(修复保存逻辑,确保图表正常生成)#defplot_efficient_frontier(ef_df,annual_returns,annual_volatility,optimal_portfolios,config,stock_columns):"""绘制有效前沿图(包含单个资产、最优组合标记,支持Windows保存)"""print("\n🎨正在绘制有效前沿图...")#创建画布(设置合适大小,确保元素不拥挤)fig,ax=plt.subplots(1,1,figsize=(14,8))#1.绘制有效前沿曲线(蓝色实线,突出显示)ax.plot(ef_df['波动率'],ef_df['收益率'],'b-',linewidth=3,label='有效前沿',alpha=0.9,zorder=2)#zorder控制图层顺序(越大越靠上)#2.绘制单个资产点(不同颜色区分,带边框更清晰)#颜色配置(避免重复,适配7只股票)colors=['#FF6B6B','#4ECDC4','#45B7D1','#96CEB4','#FECA57','#FF9FF3','#54A0FF']#确保颜色数量足够(资产数量超过7时自动循环)asset_colors=colors*(len(stock_columns)//len(colors)+1)fori,(stock,color)inenumerate(zip(stock_columns,asset_colors)):stock_name_short=stock.split('(')[0]#简化股票名称(去掉代码)#绘制资产点(散点图)ax.scatter(annual_volatility.iloc[i],annual_returns.iloc[i],s=120,#点的大小c=color,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论