扇贝编程吧 关注:41贴子:368

#编程之星|人大学子:Python让我从300个人中脱颖而出

只看楼主收藏回复


我是中国人民大学商学院工商管理专业的一名学生,学校的课程涉及到大量商业报表和企业案例,长时间苦于繁琐的分析,想要找到一种快速高效的方法。


1楼2021-05-24 14:47回复
    我也是扇贝英语的老用户,已经连续单词打卡1430天,得知扇贝推出了面向编程小白的Python编程课,我毫不犹豫地报了名,没想到就此爱上了写代码。


    2楼2021-05-24 17:29
    回复
      扇贝编程是沉浸式的互动教学与案例相结合,让我切实使用Python解决了许多问题,这非常有成就感。
      记得最开始使用print指令运行成功第一行程序时的激动,也记得在使用爬虫获取股价和绘图程序做出股价K线图时的感叹。
      开学以后,我遇到了第一个与专业相关的实战项目,需要选择合适的行业与股票组合,进行计算分析找到最大化的投资比例。看似简单,实则运算量巨大。
      室友利用Excel不眠不休,足足做了一个星期,而我用Python仅仅2天就跑完了数据。
      庆幸自己在扇贝编程学习了python,并且将所学的知识进行延伸,与实际的投资学知识相联系,让我轻松使用程序完成了很多重复工作。


      3楼2021-05-24 18:28
      回复
        【实战项目】基于Python的股票投资组合分析与选择
        一、计算逻辑与分析步骤
        使用Python的Tushare财经数据包获取股价并计算预期收益率
        使用Python的matplotlib绘制马科维茨收益方差模型绘制投资组合曲线
        给出投资组合中的股票投资比例
        使用CAPM资产定价模型计算投资组合预期收益率


        4楼2021-05-24 18:37
        回复
          二、需求分析
          中国汽车工业起步于20世纪90年代初,2000年以来经历了一次迅猛的增长。我们相信汽车市场仍在兴起。根据2018年的调查,美国的平均驾驶年数超过10年,而中国的平均驾驶年数仅为4.9年。尽管到2020年,由于冠状病毒的影响,汽车销量略有下降,但预计在经济复苏开启的同时,汽车行业的增长也将稳步提升。一方面,Covid-19在中国得到了有效控制,另一方面,报复性消费的存在将刺激汽车行业的进一步增长。
          首先,我们从汽车行业中选择了两个竞争对手,以比较该行业内不同因素的表现和影响。从过去的表现来看,上汽集团和广汽集团超越了其他竞争对手,这两家公司都以包装为主营业务。福耀玻璃工业集团是另外两家公司的上游公司,其核心业务是生产和向这些汽车公司提供汽车玻璃。最重要的是,上述三家公司均在上海证券交易所的同一主板A股上市,有助于与上证指数进行比较。
          因此,我们决定选择上汽集团、广汽集团和福耀玻璃工业集团的股票作为我们的投资组合并将抓取2019年的数据来进行投资组合的分析。
          基础数据获取: 获取股票收盘价
          股票数据: 利用股票连续两个交易日的收盘价计算股票日收益率,然后根据得到的日收益率计算年化收益率。我们使用两种方法得到这三只股票的收盘价,并用两种方法得到的数据交叉检查,以此确保数据来源的正确性和匹配性。
          市场数据获取: 获取上证指数收盘价。上证综指由上海证券交易所编制,以在上海证券交易所上市的所有股票为计算范围,以发行量为权重综合。它反映了上海证券交易所的整体趋势,因此使用上证指数衡量市场平均收益
          时间区间: 2019年。考虑到2019年的经济走势最能代表未来经济和股市走势,我们有以下两个考虑:一方面,使用时间过长的一年可能会对未来的预测造成太大的干扰,另一方面,由于2020年的疫情,经济形势发生了很大变化。所以我们以2019年为基准年


          5楼2021-05-24 18:37
          回复
            【方法一】基于Python Tushare财经数据包的股价获取
            我们使用Tushare数据包的get_hist_data()指令来获取股票2019年全年的日收盘价,并使用pct_change()计算两个交易日之间单只股票的日收益率的百分比变化,并将其保存在['return']序列中。然后我们使用.std()指令来计算标准偏差,并使用to_excel()将数据保存在本地excel文件,编程指令及输出的excel截图如下:



            6楼2021-05-24 18:38
            回复
              【方法二】基于Python Pandas库爬虫的股价获取
              在第二种方法中,我们使用Pandas库的web.DaraReader()指令从雅虎财经网上直接获取数据,数据处理方法与方法一一致。值得一提的是,Tushare数据库只保存近两年的数据,如果想获取更长历史区间的股价数据,则需使用此种方法进行数据抓取。

              我们用这两种方法获取到的数据进行交叉检查,发现两种方法获取到的股价均为除权价格,这与我们计算的逻辑保持一致,即消除复权的影响,只计算股票的纯资本利得。


              7楼2021-05-24 18:38
              回复
                三、数据分析1、建立两两股票的收益-方差模型
                除了标准差,收益以外,我们还需要计算两两股票的协方差以及年化数据,经过计算以后我们可以使用python程序绘制每两只股票和三只股票组合的收益-方差曲线,以帮助我们确定三只股票在我们的投资组合中的适当比例,使我们获得最大的利润回报。


                8楼2021-05-24 18:38
                回复
                  首先,我们可以画出每两只股票的均值-方差曲线,找出它们之间的关系。我们使用np.linspace指令生成股票A的一系列持股比例为x,则股票B的持股比例为(1-x)。其他两两组合的股票持股比例同理。我们在python程序中设置了之前计算的各项系数,然后,我们将预期收益率的方程组设为e_i_ j,标准差为s_i_j。最后,带入收益率和标准差的公式,然后利用python的绘图工具plt.plot()绘制每两支股票的收益-标准差曲线。


                  9楼2021-05-24 18:47
                  回复
                    从python程序绘制的图形可以看出,我们的投资组合的标准差在0.05到0.15之间,标准差的值随着持股比例的变化而变化。同时,预期收益率从-0.075到0.125不等。如果我们选择不同的投资组合,预期收益率和标准差会有很大的不同。正如我们所看到的,A股和B股的投资组合(福耀和广汽)比其他两个组合的利润更高。
                    之后,我们尝试使用python程序,看看是否可以绘制出三只股票组合的均值-方差曲线,从而找到有效的投资边界。首先,我们有一些问题,因为在三个股票组合的均值-方差曲线方程中,有三个变量。虽然我们可以用x,y和(1-x-y)作为这三个股票的比率来减少变量的数量,但是我们也找不到变量x和变量y之间的关系,因为这两个变量的值情况几乎是无穷大的。所以我们试着用另一种方式来思考这个问题。


                    10楼2021-05-24 18:48
                    回复
                      2、使用CAPM资产定价模型计算三只股票投资组合的收益
                      (1)利用蒙特卡罗模拟寻找投资组合的有效边界并得到最优配置
                      【方法】使用Python程序进行蒙特卡洛模拟
                      蒙特卡罗模拟是通过用一系列值建立可能结果的模型来进行风险分析的一种方法。然后我们进行这一系列值进行重复计算,每次都使用不同的随机数集。根据不确定性的数量和指定的范围,蒙特卡罗模拟可能需要数千或数万次重新计算才能完成。蒙特卡罗模拟可以产生一系列可能的结果值,并以此来找出可能的有效边界。
                      虽然很难找到一个拟合函数表达式来描述三只股票组合的平均标准差曲线,但我们仍然可以利用python程序的计算能力,对这三只股票组合进行蒙特卡罗模拟,以计算预期收益率和标准差,并设置有效面积只要我们能找到足够组合的三只股票的持股比例。因此,我们把这个问题的解决方案变成了找到足够多的持股比例组合,然后计算出每个组合的预期回报率和标准差,并在图上画出点。用这种方法,我们可以在图上画出许多点。每个点代表这三个股票加权比率的组合。然后,我们可以发现,所有这些点都将落入一个有效区域,即有效投资区域。
                      程序指令如下所示:


                      11楼2021-05-24 18:49
                      回复
                        首先,我们可以使用Numpy工具包中的随机数生成器生成一系列随机样本,然后将一些空白列表序列设置为x_list[]、y_list[]、z_list[]来存储可能组合的比率。这种方法的优点是通过使用随机发生器,可以消除主观选择引起的误差。为此,我们使用随机。随机()指令生成X数并记录空白表中的比率,然后生成Y值,其值从0变化到(1-x),因此,Z的值将是(1-X-Y)。使用这个随机数生成指令,我们将得到组合的数目,我们也可以设置组合的数目,我们只需输入数字到程序中。
                        其次,我们假设市场中的每个人都是理性的,这样每个人的收益率都会高于设定为国债收益率(2019年为2.96%)的无风险利率。我们用y轴上的无风险利率点来画一条与有效投资区内的点相连接的线,在同质预期假设下,任何投资者都会选择资本市场线(Capital Market Line)与资产投资组合的切点这一点所代表的持股比例,通过绘制CML,我们可以在有效投资区间找到这个切点,这将是最佳持股比例组合点。


                        12楼2021-05-24 18:49
                        回复
                          第三,我们将随机函数产生的可能组合放入三个列表中,并利用这些数据计算出CML的最大斜率,并用它来反向计算持股比例。我们也可以根据前面计算的持股比例来计算此持股比例下实际的回报率和标准差。
                          最后,利用该程序可以同时打印出最优比率组合的结果以及期望收益率和标准差。然后,我们尝试使用1000到1000000之间的不同随机数来找出是否存在差异。当点数为1千,1万,10万和100万时,输出结果如下:





                          13楼2021-05-24 18:49
                          回复
                            我们可以发现,虽然在不同的模拟次数下,比率的计算结果会有所不同,但当我们选择A股(福耀)和B股(广汽)对半的持股比例时,权重似乎是最合适的选择。


                            14楼2021-05-24 18:49
                            回复
                              (2)计算β权重和预期回报
                              投资组合的贝塔系数有如下公式:
                              代入我们在第一步得到的0与得到投资组合的

                              以上计算表明,以上证综指为基准,贝塔系数接近1.0。如果贝塔系数大于1.0,则表明该证券的价格理论上比市场波动更大。由于投资组合贝塔系数为0.928,假设其波动性比市场低近1%。科技股和小盘股的贝塔系数往往高于市场基准,因为我们选择的汽车行业波动性可能会小一些。


                              15楼2021-05-24 18:50
                              回复