<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>6Youngの屋</title>
  
  <subtitle>一个只想一直和嘉宝在一起的吖吖</subtitle>
  <link href="https://6young.site/atom.xml" rel="self"/>
  
  <link href="https://6young.site/"/>
  <updated>2024-06-18T05:59:42.093Z</updated>
  <id>https://6young.site/</id>
  
  <author>
    <name>6Young</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>【金融知识】国债期货转换因子的推导与理解</title>
    <link href="https://6young.site/blog/aa67a6bc.html"/>
    <id>https://6young.site/blog/aa67a6bc.html</id>
    <published>2024-06-18T09:28:46.000Z</published>
    <updated>2024-06-18T05:59:42.093Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景">背景</h2><p>在国债期货到期日，现货市场往往存在多个符合交割标准的债券，国债期货在交割中设计了转换因子制度。在转换因子制度下，每只可交割债券都有其相应的转换因子，通过转换因子可计算该可交割债券的交割价格。</p><p>要理解国债期货转换因子这个概念，还需要对国债期货本身的特征有一定的了解。首先要了解国债期货中的<strong>标准券：<strong>国债期货是标准化合约，合约标的是一个名义标准券，也可以说是虚拟券，这个设计的最大功能，就是可以扩大可交割国债的范围，增强价格的抗操纵性，减小交割时的逼仓风险。但是事实上，国债期货采用</strong>实物交割</strong>，空头交割时理论上需要用名义标准券去履约。但现实中名义标准券并不存在，因而交易所规定可以使用现实中存在的、满足一定期限要求的<strong>一篮子国债均可进行交割</strong>。但是在金融市场中，金融产品在价格上必须满足一对一的映射才能保证定价体系的平衡，否则会出现<strong>无风险套利机会</strong>。转换因子(Conversion Factor, CF) 就是实现一对一映射的纽带。</p><p>在我国各类国债期货中，他们<strong>对应的标准券</strong>如下：</p><ul><li><p>2年期国债期货合约标的：面值为200万元人民币、票面利率为3%的名义中短期国债；</p></li><li><p>5年期国债期货合约标的是：面值为100万元人民币、票面利率为3% 的名义中期国债；</p></li><li><p>10年期国债期货合约标的：面值为100万元人民币、票面利率为3%的名义长期国债。</p></li></ul><h2 id="公式介绍">公式介绍</h2><p>现在给出中金所计算转换因子的公式：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mi>F</mi><mo>=</mo><mfrac><mn>1</mn><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mfrac><mi>r</mi><mi>f</mi></mfrac><msup><mo stretchy="false">)</mo><mfrac><mrow><mi>x</mi><mi>f</mi></mrow><mn>12</mn></mfrac></msup></mrow></mfrac><mo>∗</mo><mo stretchy="false">[</mo><mfrac><mi>c</mi><mi>f</mi></mfrac><mo>+</mo><mfrac><mi>c</mi><mi>r</mi></mfrac><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mfrac><mi>c</mi><mi>r</mi></mfrac><mo stretchy="false">)</mo><mo>∗</mo><mfrac><mn>1</mn><mrow><mtext>（</mtext><mn>1</mn><mo>+</mo><mfrac><mi>r</mi><mi>f</mi></mfrac><msup><mtext>）</mtext><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow></mfrac><mo stretchy="false">]</mo><mo>−</mo><mfrac><mi>c</mi><mi>f</mi></mfrac><mo>∗</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mfrac><mrow><mi>x</mi><mi>f</mi></mrow><mn>12</mn></mfrac><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">CF = \frac{1}{(1+\frac rf)^{\frac{xf}{12}}}*[\frac cf+ \frac cr + (1-\frac cr)*\frac{1}{（1+\frac rf）^{n-1}}] - \frac cf * (1-\frac{xf}{12})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.711988em;vertical-align:-1.390548em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.11em;"><span class="pstrut" style="height:3.01944em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.01944em;"><span style="top:-3.3485500000000004em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9584142857142857em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">2</span></span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.4623857142857144em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.24944em;"><span class="pstrut" style="height:3.01944em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.69644em;"><span class="pstrut" style="height:3.01944em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.390548em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.9880000000000002em;vertical-align:-0.8804400000000001em;"></span><span class="mopen">[</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault">c</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804400000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.7935600000000003em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault">c</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.7935600000000003em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault">c</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.4885479999999998em;vertical-align:-1.167108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">（</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord cjk_fallback">）</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.167108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.9880000000000002em;vertical-align:-0.8804400000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault">c</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804400000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.0574399999999997em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714399999999998em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span></span></span></span></span></p><p>其中，</p><p>​    r：10年期国债期货合约票面利率3%；</p><p>​    x：交割月到下一付息月的月份数；</p><p>​    n：剩余付息次数；</p><p>​    c：可交割国债的票面利率；</p><p>​    f：可交割国债每年的付息次数；</p><p>计算结果四舍五入至小数点后4位。</p><h2 id="推导过程">推导过程</h2><p>首先思考如何从金融的逻辑上去理解这个公式，假设现在国债期货价格为1，那么如果想要用其他债券去平掉当前仓位，就需要看其他债券的价格与标准券想必是</p><p>设想一个场景，在国债市场上存在一份5年期国债期货合约，我们希望用三年期的5%利率国债进行交割。此时，为了保证二者收益相等，就需要采用某个权值，将一系列的交割债券转换为作为标的物的标准券，保证二者收益一致，从而达到交割效果。这个权值就是转换因子。转换因子的实质就是面值1元的可交割国债在其剩余期限内所有现金流按照国债期货合约的票面利率折现的现值。</p><p><img src="/blog/aa67a6bc/image-20240618094411816.png" alt="image-20240618094411816"></p><p>有了这个思路，我们就可以计算了：</p><ol><li><p>首先，将债券未来现金流贴现至期货到期日后的第一个付息日，其中包括票息的折现与面值的折现。此时，债券还有n次票息未支付，每次支付的票息为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mi>c</mi><mi>f</mi></mfrac></mrow><annotation encoding="application/x-tex">\frac{c}{f}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1764999999999999em;vertical-align:-0.481108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">c</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>，折现利率就是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi><mo>=</mo><mn>3</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">r=3\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">3</span><span class="mord">%</span></span></span></span>：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>P</mi><mn>1</mn></msub><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></munderover><mfrac><mfrac><mi>c</mi><mi>f</mi></mfrac><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mfrac><mi>r</mi><mi>f</mi></mfrac><msup><mo stretchy="false">)</mo><mi>i</mi></msup></mrow></mfrac><mo>+</mo><mfrac><mn>1</mn><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mfrac><mi>r</mi><mi>f</mi></mfrac><msup><mo stretchy="false">)</mo><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">P_1 = \sum_{i=0}^{n-1} \frac{\frac{c}{f}}{(1+\frac{r}{f})^{i}}+\frac{1}{(1+\frac{r}{f})^{n-1}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:3.0787820000000004em;vertical-align:-1.277669em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8011130000000004em;"><span style="top:-1.872331em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.050005em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.300005em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.277669em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5665em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.750664em;"><span style="top:-2.9890000000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.871108em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">c</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.167108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.4885479999999998em;vertical-align:-1.167108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.167108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p></li><li><p>利用等比数列求和公式化简一下：</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: flalign at position 7: \begin{̲f̲l̲a̲l̲i̲g̲n̲}̲\nonumberP_1 …">\begin{flalign}\nonumberP_1 = \sum_{i=0}^{n-1} \frac{\frac{c}{f}}{(1+\frac{r}{f})^{i}}+\frac{1}{(1+\frac{r}{f})^{n-1}} &amp;= \frac{c}{f}\frac{1-(\frac{1}{1+\frac{r}{f}})^n}{1-\frac{1}{1+\frac{r}{f}}}+\frac{1}{(1+\frac{r}{f})^{n-1}} \\&amp;= \frac{c}{f}\frac{1+\frac{r}{f}-(\frac{1}{1+\frac{r}{f}})^{n-1}}{\frac{r}{f}}+\frac{1}{(1+\frac{r}{f})^{n-1}} \\&amp;= \frac{c}{r}+\frac{c}{f}-\frac{c}{r}\frac{1}{(1+\frac{r}{f})^{n-1}}+\frac{1}{(1+\frac{r}{f})^{n-1}} \\&amp;= \frac{c}{r}+\frac{c}{f}+(1-\frac{c}{r})*\frac{1}{(1+\frac{r}{f})^{n-1}}\nonumber\end{flalign}</p><p>如此一看，公式中间部分是不是就出来了！</p></li><li><p>将现金流进一步折现至期货到期日，此时还有x月就付息了，所以折现期为x月，对应的折现因子为：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mn>1</mn><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mfrac><mi>r</mi><mi>f</mi></mfrac><msup><mo stretchy="false">)</mo><mfrac><mrow><mi>x</mi><mi>f</mi></mrow><mn>12</mn></mfrac></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{1}{(1+\frac{r}{f})^{\frac{xf}{12}}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.711988em;vertical-align:-1.390548em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.11em;"><span class="pstrut" style="height:3.01944em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.01944em;"><span style="top:-3.3485500000000004em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9584142857142857em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">2</span></span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.4623857142857144em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.24944em;"><span class="pstrut" style="height:3.01944em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.69644em;"><span class="pstrut" style="height:3.01944em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.390548em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>所以，到期日债券全价为：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>P</mi><mn>0</mn></msub><mo>=</mo><mfrac><mn>1</mn><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mfrac><mi>r</mi><mi>f</mi></mfrac><msup><mo stretchy="false">)</mo><mfrac><mrow><mi>x</mi><mi>f</mi></mrow><mn>12</mn></mfrac></msup></mrow></mfrac><mo>∗</mo><msub><mi>P</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">P_0 = \frac{1}{(1+\frac{r}{f})^{\frac{xf}{12}}}*P_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.711988em;vertical-align:-1.390548em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.11em;"><span class="pstrut" style="height:3.01944em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.01944em;"><span style="top:-3.3485500000000004em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9584142857142857em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">2</span></span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.4623857142857144em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.24944em;"><span class="pstrut" style="height:3.01944em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.69644em;"><span class="pstrut" style="height:3.01944em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.390548em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>最后将债券当前的累计利息减掉</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>I</mi><mo>=</mo><mfrac><mi>c</mi><mi>f</mi></mfrac><mo>∗</mo><mfrac><mrow><mfrac><mn>12</mn><mi>f</mi></mfrac><mo>−</mo><mi>x</mi></mrow><mfrac><mn>12</mn><mi>f</mi></mfrac></mfrac><mo>=</mo><mfrac><mi>c</mi><mi>f</mi></mfrac><mo>∗</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mfrac><mrow><mi>x</mi><mi>f</mi></mrow><mn>12</mn></mfrac><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">I = \frac{c}{f}*\frac{\frac{12}{f}-x}{\frac{12}{f}} = \frac{c}{f}*(1-\frac{xf}{12})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.9880000000000002em;vertical-align:-0.8804400000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804400000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.9324320000000004em;vertical-align:-1.216216em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7162160000000002em;"><span style="top:-2.264892em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.871108em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord mathdefault">x</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.216216em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.9880000000000002em;vertical-align:-0.8804400000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804400000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.0574399999999997em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714399999999998em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span></span></span></span></span></p></li><li><p>由此得到债券净价，也就是转换因子的最终公式：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mi>F</mi><mo>=</mo><msub><mi>P</mi><mn>0</mn></msub><mo>−</mo><mi>I</mi></mrow><annotation encoding="application/x-tex">CF = P_0-I</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mi>F</mi><mo>=</mo><mfrac><mn>1</mn><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mfrac><mi>r</mi><mi>f</mi></mfrac><msup><mo stretchy="false">)</mo><mfrac><mrow><mi>x</mi><mi>f</mi></mrow><mn>12</mn></mfrac></msup></mrow></mfrac><mo>∗</mo><mo stretchy="false">[</mo><mfrac><mi>c</mi><mi>f</mi></mfrac><mo>+</mo><mfrac><mi>c</mi><mi>r</mi></mfrac><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mfrac><mi>c</mi><mi>r</mi></mfrac><mo stretchy="false">)</mo><mo>∗</mo><mfrac><mn>1</mn><mrow><mtext>（</mtext><mn>1</mn><mo>+</mo><mfrac><mi>r</mi><mi>f</mi></mfrac><msup><mtext>）</mtext><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow></mfrac><mo stretchy="false">]</mo><mo>−</mo><mfrac><mi>c</mi><mi>f</mi></mfrac><mo>∗</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mfrac><mrow><mi>x</mi><mi>f</mi></mrow><mn>12</mn></mfrac><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">CF = \frac{1}{(1+\frac rf)^{\frac{xf}{12}}}*[\frac cf+ \frac cr + (1-\frac cr)*\frac{1}{（1+\frac rf）^{n-1}}] - \frac cf * (1-\frac{xf}{12})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.711988em;vertical-align:-1.390548em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.11em;"><span class="pstrut" style="height:3.01944em;"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.01944em;"><span style="top:-3.3485500000000004em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9584142857142857em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">2</span></span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.4623857142857144em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">x</span><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.24944em;"><span class="pstrut" style="height:3.01944em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.69644em;"><span class="pstrut" style="height:3.01944em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.390548em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.9880000000000002em;vertical-align:-0.8804400000000001em;"></span><span class="mopen">[</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault">c</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804400000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.7935600000000003em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault">c</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.7935600000000003em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault">c</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.4885479999999998em;vertical-align:-1.167108em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord cjk_fallback">（</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.695392em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.481108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord cjk_fallback">）</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.989em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.167108em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.9880000000000002em;vertical-align:-0.8804400000000001em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.10756em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord mathdefault">c</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804400000000001em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:2.0574399999999997em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714399999999998em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">x</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span></span></span></span></span></p></li></ol><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">最近在看国债期货，接触到这个知识点，想了好久才推出来，记录一下</summary>
    
    
    
    <category term="金融知识" scheme="https://6young.site/categories/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="金融" scheme="https://6young.site/tags/%E9%87%91%E8%9E%8D/"/>
    
    <category term="国债期货" scheme="https://6young.site/tags/%E5%9B%BD%E5%80%BA%E6%9C%9F%E8%B4%A7/"/>
    
    <category term="公式推导" scheme="https://6young.site/tags/%E5%85%AC%E5%BC%8F%E6%8E%A8%E5%AF%BC/"/>
    
  </entry>
  
  <entry>
    <title>【数据挖掘】信贷背景的欺诈检测数据挖掘</title>
    <link href="https://6young.site/blog/b936bbd3.html"/>
    <id>https://6young.site/blog/b936bbd3.html</id>
    <published>2024-06-11T22:43:46.000Z</published>
    <updated>2024-06-18T05:59:42.001Z</updated>
    
    <content type="html"><![CDATA[<h2 id="项目简介">项目简介</h2><p>数据以及相关信息是在Kaggle上获取的</p><p><a href="https://www.kaggle.com/code/yu6young/credit-fraud-dealing-with-imbalanced-datasets/edit">Credit Fraud || Dealing with Imbalanced Datasets | Kaggle</a></p><h2 id="数据介绍">数据介绍</h2><p>本数据集包含欧洲持卡人在2013年9月中的某两天发生的信用卡交易，其中 284,807 笔交易中有 492 笔欺诈。数据集展现出高度不平衡的性质，正类（欺诈）占所有交易的 0.17%。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">df=pd.read_csv(<span class="string">&#x27;creditcard.csv&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="built_in">len</span>(df[df[<span class="string">&#x27;Class&#x27;</span>]==<span class="number">0</span>]),<span class="built_in">len</span>(df[df[<span class="string">&quot;Class&quot;</span>]==<span class="number">1</span>]))</span><br><span class="line">plt.pie([<span class="built_in">len</span>(df[df[<span class="string">&#x27;Class&#x27;</span>]==<span class="number">0</span>]),<span class="built_in">len</span>(df[df[<span class="string">&quot;Class&quot;</span>]==<span class="number">1</span>])],labels=[<span class="string">&#x27;正常交易&#x27;</span>,<span class="string">&#x27;欺诈&#x27;</span>],autopct= <span class="string">&#x27;%1.2f%%&#x27;</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p><img src="/blog/b936bbd3/clip_image002.png" alt="img"></p><p>整个数据包含Time、Amount、V1、V2、…V28以及Class共31个变量，其中出于保密原因，平台没有提供数据原始信息而是通过PCA处理后得到特征 V1、V2、… V28，唯一没有使用 PCA 转换的特征是时间（Time）和金额（Amount）。特征Time包含每个事务与数据集中第一个事务之间经过的秒数。特征Amount是交易金额，特征Class是响应变量，在欺诈的情况下取值为 1，否则为 0。</p><p>观察数据集中30个特征变量的分布情况，结果如图所示。其中蓝色代表非欺诈交易的分布情况，黄色代表欺诈情况的数据分布。可以观察到，除Time以外，其他特征均呈现单峰分布情况，考虑到数据集包含了两天时间的全部交易情况，Time特征在每一天应当也符合单峰分布。此外，可以明显观察到，欺诈与非欺诈在V6,V8,V13,V15,V20~V28这13个变量上分布特征极其相似，在之后的分类过程中，对于分类结果难以作出贡献，并会对分类器的效率造成影响，综合考虑之下，筛去这13个变量。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">column=<span class="built_in">list</span>(df.columns)</span><br><span class="line">fig=plt.figure(figsize=(<span class="number">30</span>,<span class="number">25</span>))</span><br><span class="line">fig.suptitle(<span class="string">&#x27;Data distribution&#x27;</span>,fontsize=<span class="number">50</span>)</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">30</span>):</span><br><span class="line">    plt.subplot(<span class="number">6</span>,<span class="number">5</span>,i+<span class="number">1</span>)</span><br><span class="line">    sns.distplot(df[df[<span class="string">&#x27;Class&#x27;</span>]==<span class="number">0</span>][column[i]],label=<span class="string">&#x27;Non Fraud&#x27;</span>,bins=<span class="number">100</span>)</span><br><span class="line">    sns.distplot(df[df[<span class="string">&#x27;Class&#x27;</span>]==<span class="number">1</span>][column[i]],label=<span class="string">&#x27;Fraud&#x27;</span>,bins=<span class="number">50</span>)</span><br><span class="line">lines, labels = fig.axes[-<span class="number">1</span>].get_legend_handles_labels()</span><br><span class="line">fig.legend(lines, labels, loc = <span class="string">&#x27;upper right&#x27;</span>,fontsize=<span class="number">20</span>)</span><br></pre></td></tr></table></figure><p><img src="/blog/b936bbd3/clip_image002-17185171005552.png" alt="img"></p><h2 id="数据预处理">数据预处理</h2><h3 id="数据标准化">数据标准化</h3><p>由于V1~V28这28个特征经过PCA处理后已经被归一化，具有零均值的特征，因此需要对时间以及数量两个特征进行标准化处理。数量特征的箱线图如图所示，有较多的离群点，为了防止标准化收到离群值较大影响，采用sklearn的RobustScaler标准化处理器进行标准化处理。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">sns.boxplot(x=df[<span class="string">&#x27;Amount&#x27;</span>], y=<span class="literal">None</span>, hue=<span class="literal">None</span>, data=<span class="literal">None</span>, </span><br><span class="line">            order=<span class="literal">None</span>, hue_order=<span class="literal">None</span>, orient=<span class="literal">None</span>, </span><br><span class="line">            color=<span class="literal">None</span>, palette=<span class="literal">None</span>, saturation=<span class="number">0.75</span>, </span><br><span class="line">            width=<span class="number">0.8</span>, dodge=<span class="literal">True</span>, fliersize=<span class="number">5</span>, </span><br><span class="line">            linewidth=<span class="literal">None</span>, whis=<span class="number">1.5</span>, ax=<span class="literal">None</span>)</span><br><span class="line"></span><br><span class="line">rob_scaler = RobustScaler()</span><br><span class="line">df[[<span class="string">&#x27;Time&#x27;</span>,<span class="string">&#x27;Amount&#x27;</span>]] = rob_scaler.fit_transform(df[[<span class="string">&#x27;Time&#x27;</span>,<span class="string">&#x27;Amount&#x27;</span>]].values.reshape(-<span class="number">1</span>,<span class="number">2</span>))</span><br></pre></td></tr></table></figure><p><img src="/blog/b936bbd3/clip_image001.png" alt="img"></p><h3 id="数据重采样">数据重采样</h3><p>不平衡分类一直是分类研究中的一个重要部分，目前学界有一些受广泛认同的处理方式，首先是对数据数量进行初步处理，常用的有过采样与欠采样两种处理方式。</p><p>随机过采样就是增加数据中少数类样本，使得正、反例数目接近，然后再进行学习。由于需要对少数类样本进行复制来扩大数据集，造成模型训练复杂度加大；同时也会造成模型的过拟合，因为随机过采样是简单的对初始样本进行复制采样，这就使得学习器学得的规则过于具体化，不利于学习器的泛化性能，造成过拟合问题。同时，过采样是重复正比例数据，实际上没有为模型引入更多数据，过分强调正比例数据，会放大正比例噪音对模型的影响。</p><p>欠采样即去除多数类中的一些样本使得正例、反例数目接近，然后再进行学习。这种方法由于采样的样本集合要少于原来的样本集合，因此会造成信息缺失，造成分类器表现不佳。</p><p>综合上述原因以及分类任务目标，决定使用过采样代表性（SMOTE）算法，SMOTE全称是Synthetic Minority Oversampling，即合成少数类过采样技术。是对随机过采样方法的一个改进算法：对每个少数类样本xi，从它的最近邻中随机选择一个样本x̅i，x̅i是少数类中的一个样本，然后在xi和x̅i之间的连线上随机选择一个点作为新合成的少数样本类。SMOTE算法摒弃了随机过采样复制样本的做法，可以防止随机过采样中容易过拟合的问题。</p><h2 id="模型选择">模型选择</h2><h3 id="多个模型对比">多个模型对比</h3><p>经过SMOTE算法进行过采样后，便可通过特征对样本进行分类学习。目前分类的策略多种多样，有基于规则的决策树分类，以及多个决策树形成的随机森林分类器；也有基于贝叶斯概率的贝叶斯分类器；还有基于回归的Logistic分类器；基于聚类的K-邻近聚类分类器等。</p><p>这里，我选择了DecisionTreeClassifier、LogisticRegression、KNeighborsClassifier、RandomForestClassifier、XGBClassifier、SVC六种分类器进行试验，并采用分层K折的方式对模型的AP值进行比较，选取效果最好的模型进行进一步调优。</p><p>对于一个模型分类结果好坏的评估，有多种方式，包括精确率（Precision），召回率（Recall）以及ROC曲线下面积（AUC）等等。考虑到数据具有较高的不平衡性，并结合比赛平台给出的建议，我使用AP值，即PR曲线下面积（Area Under Precision-Recall Curve）来衡量模型的质量。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> cross_val_score</span><br><span class="line"><span class="keyword">from</span> sklearn.model_selection <span class="keyword">import</span> StratifiedKFold</span><br><span class="line"><span class="keyword">from</span> sklearn.tree <span class="keyword">import</span> DecisionTreeClassifier</span><br><span class="line"><span class="keyword">from</span> imblearn.pipeline <span class="keyword">import</span> Pipeline</span><br><span class="line"><span class="keyword">from</span> imblearn.over_sampling <span class="keyword">import</span> SMOTE</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">steps = [(<span class="string">&#x27;over&#x27;</span>, SMOTE()), (<span class="string">&#x27;model&#x27;</span>, DecisionTreeClassifier())]</span><br><span class="line">pipeline = Pipeline(steps=steps)</span><br><span class="line"></span><br><span class="line">cv = StratifiedKFold(n_splits=<span class="number">10</span>,shuffle=<span class="literal">True</span>,random_state=<span class="number">37</span>)</span><br><span class="line">scores = cross_val_score(pipeline, X, y, scoring=<span class="string">&#x27;average_precision&#x27;</span>, cv=cv, n_jobs=<span class="number">4</span>)</span><br><span class="line">plt.plot(scores)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.linear_model <span class="keyword">import</span> LogisticRegression</span><br><span class="line"></span><br><span class="line">steps = [(<span class="string">&#x27;over&#x27;</span>, SMOTE()), (<span class="string">&#x27;model&#x27;</span>, LogisticRegression())]</span><br><span class="line">pipeline = Pipeline(steps=steps)</span><br><span class="line"></span><br><span class="line">cv = StratifiedKFold(n_splits=<span class="number">10</span>,shuffle=<span class="literal">True</span>,random_state=<span class="number">37</span>)</span><br><span class="line">scores1 = cross_val_score(pipeline, X, y, scoring=<span class="string">&#x27;average_precision&#x27;</span>, cv=cv, n_jobs=<span class="number">4</span>)</span><br><span class="line">plt.plot(scores1)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.svm <span class="keyword">import</span> SVC</span><br><span class="line"></span><br><span class="line">steps = [(<span class="string">&#x27;over&#x27;</span>, SMOTE()), (<span class="string">&#x27;model&#x27;</span>, SVC())]</span><br><span class="line">pipeline = Pipeline(steps=steps)</span><br><span class="line"></span><br><span class="line">cv = StratifiedKFold(n_splits=<span class="number">10</span>,shuffle=<span class="literal">True</span>,random_state=<span class="number">37</span>)</span><br><span class="line">scores2 = cross_val_score(pipeline, X, y, scoring=<span class="string">&#x27;average_precision&#x27;</span>, cv=cv, n_jobs=<span class="number">4</span>)</span><br><span class="line"><span class="comment">#print(&#x27;Mean ROC AUC: %.3f&#x27; % mean(scores))</span></span><br><span class="line">plt.plot(scores2)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.neighbors <span class="keyword">import</span> KNeighborsClassifier</span><br><span class="line"></span><br><span class="line">steps = [(<span class="string">&#x27;over&#x27;</span>, SMOTE()), (<span class="string">&#x27;model&#x27;</span>, KNeighborsClassifier())]</span><br><span class="line">pipeline = Pipeline(steps=steps)</span><br><span class="line"></span><br><span class="line">cv = StratifiedKFold(n_splits=<span class="number">10</span>,shuffle=<span class="literal">True</span>,random_state=<span class="number">37</span>)</span><br><span class="line">scores3 = cross_val_score(pipeline, X, y, scoring=<span class="string">&#x27;average_precision&#x27;</span>, cv=cv, n_jobs=<span class="number">4</span>)</span><br><span class="line">plt.plot(scores3)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.naive_bayes <span class="keyword">import</span> MultinomialNB</span><br><span class="line"></span><br><span class="line">steps = [(<span class="string">&#x27;over&#x27;</span>, SMOTE()), (<span class="string">&#x27;model&#x27;</span>, MultinomialNB())]</span><br><span class="line">pipeline = Pipeline(steps=steps)</span><br><span class="line"></span><br><span class="line">cv = StratifiedKFold(n_splits=<span class="number">10</span>,shuffle=<span class="literal">True</span>,random_state=<span class="number">37</span>)</span><br><span class="line">scores4 = cross_val_score(pipeline, X, y, scoring=<span class="string">&#x27;average_precision&#x27;</span>, cv=cv, n_jobs=<span class="number">4</span>)</span><br><span class="line">plt.plot(scores4)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> sklearn.ensemble <span class="keyword">import</span> RandomForestClassifier</span><br><span class="line"></span><br><span class="line">steps = [(<span class="string">&#x27;over&#x27;</span>, SMOTE()), (<span class="string">&#x27;model&#x27;</span>, RandomForestClassifier())]</span><br><span class="line">pipeline = Pipeline(steps=steps)</span><br><span class="line"></span><br><span class="line">cv = StratifiedKFold(n_splits=<span class="number">10</span>,shuffle=<span class="literal">True</span>,random_state=<span class="number">37</span>)</span><br><span class="line">scores5 = cross_val_score(pipeline, X, y, scoring=<span class="string">&#x27;average_precision&#x27;</span>, cv=cv, n_jobs=<span class="number">4</span>)</span><br><span class="line">plt.plot(scores5)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> xgboost.sklearn <span class="keyword">import</span> XGBClassifier</span><br><span class="line"></span><br><span class="line">xgb_best = XGBClassifier(</span><br><span class="line">    learning_rate =<span class="number">0.01</span>, n_estimators=<span class="number">957</span>, </span><br><span class="line">    max_depth=<span class="number">9</span>, min_child_weight=<span class="number">1</span>, gamma=<span class="number">0.05</span>, </span><br><span class="line">    subsample=<span class="number">0.9</span>, colsample_bytree=<span class="number">0.6</span>, </span><br><span class="line">    reg_alpha=<span class="number">0.01</span>, reg_lambda=<span class="number">1</span>,</span><br><span class="line">    objective= <span class="string">&#x27;binary:logistic&#x27;</span>, </span><br><span class="line">    nthread=<span class="number">4</span>, scale_pos_weight=<span class="number">1</span>, seed=<span class="number">27</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">steps = [(<span class="string">&#x27;over&#x27;</span>, SMOTE()), (<span class="string">&#x27;model&#x27;</span>, xgb_best)]</span><br><span class="line">pipeline = Pipeline(steps=steps)</span><br><span class="line"></span><br><span class="line">cv = StratifiedKFold(n_splits=<span class="number">10</span>,shuffle=<span class="literal">True</span>,random_state=<span class="number">37</span>)</span><br><span class="line">scores6 = cross_val_score(pipeline, X, y, scoring=<span class="string">&#x27;average_precision&#x27;</span>, cv=cv, n_jobs=<span class="number">4</span>)</span><br><span class="line">plt.plot(scores6)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p>各个分类器的效果：</p><p><img src="/blog/b936bbd3/clip_image002-17185186795765.png" alt="img"></p><p>通过上述方法对模型进行K折验证，发现随机森林与XGBoost的预测效果明显优于其他分类器。考虑到XGBoost已被证明推动了提升树算法的计算能力极限，通过调参容易获得更好的结果，因此我们最终选择了XGBoost模型。</p><p>关于XGBoost的一些知识可以参考：</p><div calss="anzhiyu-tag-link"><a class="tag-Link" target="_blank" href="https://www.6young.site/blog/1c131ed5.html">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://api.iowen.cn/favicon/www.6young.site/blog/1c131ed5.html.png);"></div>        <div class="tag-link-right">            <div class="tag-link-title">【编程学习】关于XGBoost你需要了解的知识</div>            <div class="tag-link-sitename">6Young</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div><h2 id="模型调参">模型调参</h2><h3 id="确定估计器数目">确定估计器数目</h3><p>估计模型参数时，使用XGBoost模块的cv函数，这个函数可以在每一次迭代中使用交叉验证，并返回理想的决策树数量。最终我们可以从训练结果中得知在当前参数下最合适的估计器数量。</p><p>为了确定估计器数目，我们要先给其他参数一个初始值。max_depth参数取值一般位于3-10之间，设定其起始值为5；由于信用卡交易欺诈分类是极度不平衡的问题，某些叶子节点下的值会比较小，因此将min_child_weight设置为1，取一个较小的值；设置gamma为一个较小的值0，这是在模型调优过程中较为常用的取值；设置subsample=0.8，colsample_bytree = 0.8，这两个参数取值范围一般在0.5-0.9之间，一般在参数调优时设置为0.8；为了加快不平衡问题种模型的收敛速度，设置scale_pos_weight取值为1。</p><p>最终，最优估计器数目为98个。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">modelfit</span>(<span class="params">alg, X_train, y_train, X_test, y_test, useTrainCV=<span class="literal">True</span>, cv_folds=<span class="number">5</span>, early_stopping_rounds=<span class="number">50</span></span>):</span><br><span class="line">    xgb_param = alg.get_xgb_params()</span><br><span class="line">    xgtrain = xgb.DMatrix(X_train.values, label=y_train.values)</span><br><span class="line">    xgtest = xgb.DMatrix(X_test.values)</span><br><span class="line">    cvresult = xgb.cv(</span><br><span class="line">        xgb_param, xgtrain, </span><br><span class="line">        num_boost_round=alg.get_params()[<span class="string">&#x27;n_estimators&#x27;</span>], </span><br><span class="line">        nfold=cv_folds,</span><br><span class="line">        early_stopping_rounds=early_stopping_rounds,</span><br><span class="line">    )</span><br><span class="line">    alg.set_params(n_estimators=cvresult.shape[<span class="number">0</span>])</span><br><span class="line">    alg.fit(X_train, y_train, eval_metric=<span class="string">&#x27;auc&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># pred</span></span><br><span class="line">    dtrain_predictions = alg.predict(X_train)</span><br><span class="line">    y_score = alg.predict_proba(X_test)[:,<span class="number">1</span>]</span><br><span class="line">        </span><br><span class="line">    <span class="comment"># eval</span></span><br><span class="line">    ap=average_precision_score(y_test,y_score)</span><br><span class="line">    <span class="built_in">print</span> (<span class="string">&quot;\n关于现在这个模型&quot;</span>)</span><br><span class="line">    <span class="built_in">print</span> (<span class="string">&quot;准确率 : %.4g&quot;</span> % metrics.accuracy_score(y_train.values, dtrain_predictions))</span><br><span class="line">    <span class="built_in">print</span> (<span class="string">&quot;AP 得分 (训练集): %f&quot;</span> % ap)</span><br><span class="line">    <span class="built_in">print</span> (<span class="string">&#x27;n_estimators=&#x27;</span>,cvresult.shape[<span class="number">0</span>])</span><br><span class="line">    <span class="built_in">print</span> (cvresult)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># ft-imp</span></span><br><span class="line">    <span class="comment">#feat_imp = pd.Series(alg.feature_importances_,index=list(X_train.columns)).sort_values(ascending=False)</span></span><br><span class="line">    <span class="comment">#plt.figure(figsize=(15,5))</span></span><br><span class="line">    <span class="comment">#feat_imp.plot(kind=&#x27;bar&#x27;, title=&#x27;Feature Importances&#x27;)</span></span><br><span class="line">    <span class="comment">#plt.ylabel(&#x27;Feature Importance Score&#x27;)</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (alg.feature_importances_,<span class="built_in">list</span>(X_train.columns))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">tun_parameters</span>(<span class="params">X_train,y_train,X_test,y_test</span>):  </span><br><span class="line">    xgb1 = XGBClassifier(learning_rate=<span class="number">0.1</span>,n_estimators=<span class="number">150</span>,max_depth=<span class="number">5</span>,min_child_weight=<span class="number">1</span>,gamma=<span class="number">0</span>,subsample=<span class="number">0.8</span>,  </span><br><span class="line">                         colsample_bytree=<span class="number">0.8</span>,objective= <span class="string">&#x27;binary:logistic&#x27;</span>,nthread=<span class="number">4</span>,scale_pos_weight=<span class="number">1</span>,seed=<span class="number">27</span>)  </span><br><span class="line">    modelfit(xgb1, X_train,y_train,X_test,y_test)</span><br><span class="line">    </span><br><span class="line">    </span><br><span class="line">a=tun_parameters(X_train,y_train,X_test,y_test)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 关于现在这个模型</span></span><br><span class="line"><span class="comment"># 准确率 : 0.9998</span></span><br><span class="line"><span class="comment"># AP 得分 (训练集): 0.846524</span></span><br><span class="line"><span class="comment"># n_estimators= 98</span></span><br></pre></td></tr></table></figure><h3 id="使用网格搜索-gridsearchcv-进行参数调优">使用网格搜索（GridSearchCV）进行参数调优</h3><p>网格搜索其实分为两个部分，即网格搜索（GridSearch）和交叉验证（CV）。网格搜索，搜索的是参数，即在指定的参数范围内，按步长依次调整参数，利用调整的参数训练学习器，从所有的参数中找到在验证集上精度最高的参数，这其实是一个训练和比较的过程。</p><p>GridSearchCV可以保证在指定的参数范围内找到精度最高的参数，但是这也是网格搜索的缺陷所在，他要求遍历所有可能参数的组合，在面对大数据集和多参数的情况下，非常耗时。</p><p>考虑到本模型需要调整的参数为gamma、subsample、colsample_bytree以及alpha和beta两个正则化参数共五个参数，数量并不大，且可以进行分组分别进行调优，因此选用此方法进行调参。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">param_test1 = &#123;  </span><br><span class="line">    <span class="string">&#x27;max_depth&#x27;</span>:[<span class="number">9</span>,<span class="number">10</span>,<span class="number">11</span>],  </span><br><span class="line">    <span class="string">&#x27;min_child_weight&#x27;</span>:[<span class="number">0</span>,<span class="number">1</span>]  </span><br><span class="line">&#125;  </span><br><span class="line">gsearch1 = GridSearchCV(</span><br><span class="line">    estimator=XGBClassifier(</span><br><span class="line">        learning_rate =<span class="number">0.1</span>, n_estimators=<span class="number">98</span>, max_depth=<span class="number">5</span>,  </span><br><span class="line">        min_child_weight=<span class="number">1</span>, gamma=<span class="number">0</span>, subsample=<span class="number">0.8</span>,colsample_bytree=<span class="number">0.8</span>,  </span><br><span class="line">        objective= <span class="string">&#x27;binary:logistic&#x27;</span>, nthread=<span class="number">4</span>,scale_pos_weight=<span class="number">1</span>, seed=<span class="number">27</span></span><br><span class="line">    ),  </span><br><span class="line">    param_grid=param_test1,</span><br><span class="line">    scoring=<span class="string">&#x27;average_precision&#x27;</span>,</span><br><span class="line">    iid=<span class="literal">False</span>,</span><br><span class="line">    cv=<span class="number">5</span>)</span><br><span class="line">gsearch1.fit(X_train,y_train)  </span><br><span class="line"><span class="built_in">print</span>(gsearch1.best_params_,gsearch1.best_score_)</span><br><span class="line"></span><br><span class="line"><span class="comment"># &#123;&#x27;max_depth&#x27;: 9, &#x27;min_child_weight&#x27;: 1&#125; 0.8552545517691739</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">param_test3 = &#123;  </span><br><span class="line">    <span class="string">&#x27;gamma&#x27;</span>: [i / <span class="number">20.0</span> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="number">16</span>)]  </span><br><span class="line">&#125;  </span><br><span class="line">param_test4 = &#123;  </span><br><span class="line">    <span class="string">&#x27;subsample&#x27;</span>: [i / <span class="number">10.0</span> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">6</span>, <span class="number">10</span>)],  </span><br><span class="line">    <span class="string">&#x27;colsample_bytree&#x27;</span>: [i / <span class="number">10.0</span> <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">6</span>, <span class="number">10</span>)]  </span><br><span class="line">&#125;  </span><br><span class="line">param_test6 = &#123;  </span><br><span class="line"> <span class="string">&#x27;reg_alpha&#x27;</span>:[<span class="number">1e-5</span>, <span class="number">1e-2</span>, <span class="number">0.1</span>, <span class="number">1</span>, <span class="number">100</span>]  </span><br><span class="line">&#125;  </span><br><span class="line">param_test8 = &#123;  </span><br><span class="line">    <span class="string">&#x27;reg_lambda&#x27;</span>: [<span class="number">1e-5</span>, <span class="number">1e-2</span>, <span class="number">0.1</span>, <span class="number">1</span>, <span class="number">100</span>]  </span><br><span class="line">&#125; </span><br><span class="line"></span><br></pre></td></tr></table></figure><p>最终得到最优参数：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">xgb_best = XGBClassifier(</span><br><span class="line">    learning_rate =<span class="number">0.01</span>, n_estimators=<span class="number">957</span>, </span><br><span class="line">    max_depth=<span class="number">9</span>, min_child_weight=<span class="number">1</span>, gamma=<span class="number">0.05</span>, </span><br><span class="line">    subsample=<span class="number">0.9</span>, colsample_bytree=<span class="number">0.6</span>, </span><br><span class="line">    reg_alpha=<span class="number">0.01</span>, reg_lambda=<span class="number">1</span>,</span><br><span class="line">    objective= <span class="string">&#x27;binary:logistic&#x27;</span>, </span><br><span class="line">    nthread=<span class="number">4</span>, scale_pos_weight=<span class="number">1</span>, seed=<span class="number">27</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><h2 id="最终模型结果">最终模型结果</h2><p>决策树的学习最耗时的一个步骤就是对特征的值进行排序（因为决策树模型要确定最佳分割点，因此其最重要的一个步骤就是退特征的值进行排序，我训练的XGBoost模型的各个特征重要性排序结果如下：</p><p><img src="/blog/b936bbd3/clip_image002-17185198914877.png" alt="img"></p><p>P-R曲线刻画查准率（Precision）和查全率（Recall）之间的关系，查准率指的是在所有预测为正例的数据中，真正例所占的比例，查全率是指预测为真正例的数据占所有正例数据的比例。查准率和查全率是一对矛盾的度量，一般来说，查准率高时，查全率往往偏低，查全率高时，查准率往往偏低。</p><p>在很多情况下，我们可以根据学习器的预测结果对样例进行排序，排在前面的是学习器认为最可能是正例的样本，排在后面的是学习器认为最不可能是正例的样本，按此顺序逐个把样本作为正例进行预测，则每次可计算当前的查全率和查准率，以查准率为y轴，以查全率为x轴，可以画出P-R曲线。</p><p>本模型的PR曲线效果如下，曲线下面积（AUPRC）为0.91：</p><p><img src="/blog/b936bbd3/clip_image002-17185199433339.png" alt="img"></p><p>K-S曲线，又称作洛伦兹曲线。实际上，K-S曲线的数据来源以及本质和ROC曲线是一致的，只是ROC曲线是把真正率（TPR）和假正率（FPR）当作横纵轴，而K-S曲线是把真正率（TPR）和假正率（FPR）都当作是纵轴，横轴则由选定的阈值来充当。本模型的K-S值为0.937，模型的区分能力较强。</p><p><img src="/blog/b936bbd3/clip_image002-171851995136111.png" alt="img"></p><h2 id="最终树结构">最终树结构</h2><p><img src="/blog/b936bbd3/image-20240616143955932.png" alt="image-20240616143955932"></p><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">好久以前做过的数据挖掘的小项目，翻出来炒一下</summary>
    
    
    
    <category term="编程学习" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="数据挖掘" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/"/>
    
    
    <category term="数据挖掘" scheme="https://6young.site/tags/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/"/>
    
    <category term="XGBoost" scheme="https://6young.site/tags/XGBoost/"/>
    
    <category term="欺诈检测" scheme="https://6young.site/tags/%E6%AC%BA%E8%AF%88%E6%A3%80%E6%B5%8B/"/>
    
  </entry>
  
  <entry>
    <title>【金融知识】在做市交易中如何调整你的Fair Price</title>
    <link href="https://6young.site/blog/4ec42129.html"/>
    <id>https://6young.site/blog/4ec42129.html</id>
    <published>2024-06-11T22:43:46.000Z</published>
    <updated>2024-06-18T05:59:42.093Z</updated>
    
    <content type="html"><![CDATA[<p>所谓Fair price就是我们通过模型和经验预测的资产在某一时间点的真实价值。所以交易的本质内在逻辑就是当市场价高于Fair price就卖出，否则就买入。</p><p><strong>手机上展示效果较差，本篇博客建议在电脑浏览器中阅读</strong></p><h1>基本思路</h1><p>不管是用哪一方的策略，我们本质并不是通过预测资产的趋势来获取资本利得，而是通过频繁的交易获得资产波动时的价差。所以如果大量持有某一方向的头寸，会导致我们承受资产价格波动的风险，而且对于资金的利用不够完全，损失掉很多盈利机会。</p><p>因此，当我们的某一资产相对较多时，可以调低我们对他的fair price，让我们更容易将其卖掉，更难买入，直到两者平衡。基本思路就是将左图所示变化为右图所示，具体使用曲线函数还是分段线性函数需要具体尝试，也是我们不断优化策略的角度。</p><p><img src="/blog/4ec42129/17181169869801.png" alt="img"></p><p>下面就给出了一个简单的调整方案可以参考，大家也可以调整参数看看变化情况。具体的，我们只需要保证买入价格高于卖出价格，曲线向左下倾斜即可。<strong>手机上展示效果较差，请在电脑浏览器中访问（若没加载出来稍等一下）</strong></p><iframe src="/asset/fair_price_adjustment.html" height="600px" width="100%" scrolling="no" frameborder="0"></iframe><h1>其他细节</h1><p><img src="/blog/4ec42129/17181169892804.png" alt="img"></p><p>具体看上图，图中的每个价格其实是每个相对资产对应的，也就是如果我们买卖100单位资产，其中每一单位资产所对应的fair price都不同，也就是说fair price会连续的从p3变为p1。</p><p>那么考虑现在有机会用p3的价格卖出资产，在当前仓位我们当然是原因卖出，但是一旦卖出一单位资产，fair price升高，我们就不愿意卖出了。p2也是一个道理，我们只会将资产卖出一部分，直到当前的仓位fair price恰好等于p2，当市场价格大于等于p3，哪怕我们将整个交易完成，我们的fair price 仍然比现有卖价低，所以就可以彻底完成这笔交易。</p><p>具体代码中，我们需要通过交易价格与fair price的反函数确定一个可以交易的交易量，并与最大可交易持仓量、trade中的可占有交易量对比，从而获得最终的有效交易量。</p><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">实习中学习到的市场中的maker与taker的交易思路</summary>
    
    
    
    <category term="金融知识" scheme="https://6young.site/categories/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="投资策略" scheme="https://6young.site/tags/%E6%8A%95%E8%B5%84%E7%AD%96%E7%95%A5/"/>
    
    <category term="做市交易" scheme="https://6young.site/tags/%E5%81%9A%E5%B8%82%E4%BA%A4%E6%98%93/"/>
    
    <category term="maker" scheme="https://6young.site/tags/maker/"/>
    
    <category term="taker" scheme="https://6young.site/tags/taker/"/>
    
    <category term="高频交易" scheme="https://6young.site/tags/%E9%AB%98%E9%A2%91%E4%BA%A4%E6%98%93/"/>
    
    <category term="价格调整" scheme="https://6young.site/tags/%E4%BB%B7%E6%A0%BC%E8%B0%83%E6%95%B4/"/>
    
  </entry>
  
  <entry>
    <title>【金融知识】交易市场中的Maker与Taker</title>
    <link href="https://6young.site/blog/74dc0b6d.html"/>
    <id>https://6young.site/blog/74dc0b6d.html</id>
    <published>2024-06-11T11:16:46.000Z</published>
    <updated>2024-06-18T05:59:42.093Z</updated>
    
    <content type="html"><![CDATA[<h2 id="写在前面">写在前面</h2><p>本文假设诸位对于各种专业名词有一定的了解，当然，如果对其中的专业名词还不熟悉，可以看一下这篇文章：[点击下载 Theory For Ready Trader One](/Theory For Ready Trader One.pdf)</p><p>对于Fair price，所谓Fair price就是我们通过模型和经验预测的资产在某一时间点的真实价值。所以交易的本质内在逻辑就是当市场价高于Fair price就卖出，否则就买入。</p><h2 id="market-maker-market-taker">Market maker &amp; Market taker</h2><p>首先要知道交易市场中存在maker与taker两种身份，其中maker是市场流动性的提供者，能够促进整个市场的交易，对整个交易所有利，所以maker在交易过程中的交易费较低，甚至是负的交易费；反之taker则需要像正常金融产品交易一样，缴纳相对较高的交易费。当然，如果maker获得了负交易费，那么该费用的绝对值一定比taker的费用低，否则交易所无法盈利。</p><p>从具体的行为上来看，在当前LOB中的一系列价格中，你下在一个位置，等待别人来交易，那你就是maker；反之，你直接选择一个交易对手报出的价格，直接进行交易，那么你就是taker。</p><p>定义taker交易费为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">f_t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，maker交易费为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">f_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>在这个过程中，交易所的利润就是<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>t</mi></msub><mo>+</mo><msub><mi>f</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">f_t+f_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>m</mi></msub><mo>&lt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">f_m&lt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>时也是一样的。</p><h2 id="交易策略">交易策略</h2><p><img src="/blog/74dc0b6d/17180746767257.png" alt="img"></p><p>在市场中有两种身份，自然也会有对应的两种策略，在面对市场<strong>trade数据（上图）</strong>，当前市场交易方向为buy，用交易价格为0.9431，交易量为16.371728，如果你愿意使用更高的价格买入，那么就是taker策略；如果愿意用更低的价格卖出，那么就是maker策略。（需要了解，trade数据中side字段所代表的方向均为taker的方向）</p><p><img src="/blog/74dc0b6d/17180746636834.png" alt="img"></p><p>具体考虑上图四种情况（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>m</mi></msub><mo>&lt;</mo><mn>0</mn><mo separator="true">,</mo><msub><mi>f</mi><mi>t</mi></msub><mo>&gt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">f_m&lt;0, f_t&gt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>, fair price不变化只是时点状态）：</p><ol><li>此时市场方向为sell，说明当时市场中maker在LOB上挂了买单，taker在这个价格主动买入了资产。当交易被撮合后，由于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>m</mi></msub><mo>&lt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">f_m&lt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>所以maker只需要付出<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mi>a</mi><mi>k</mi><mi>e</mi><mi>r</mi><mi mathvariant="normal">_</mi><mi>p</mi><mi>a</mi><mi>i</mi><mi>d</mi><mo>=</mo><mi>p</mi><mi>r</mi><mi>i</mi><mi>c</mi><mi>e</mi><mo>∗</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><msub><mi>f</mi><mi>m</mi></msub><mo stretchy="false">)</mo><mo>&lt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">maker\_paid = price*(1+f_m)&lt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.00444em;vertical-align:-0.31em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord" style="margin-right:0.02778em;">_</span><span class="mord mathdefault">p</span><span class="mord mathdefault">a</span><span class="mord mathdefault">i</span><span class="mord mathdefault">d</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">p</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">i</span><span class="mord mathdefault">c</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>即可，taker只能获得<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi><mi>a</mi><mi>k</mi><mi>e</mi><mi>r</mi><mi mathvariant="normal">_</mi><mi>g</mi><mi>e</mi><mi>t</mi><mo>=</mo><mi>p</mi><mi>r</mi><mi>i</mi><mi>c</mi><mi>e</mi><mo>∗</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><msub><mi>f</mi><mi>t</mi></msub><mo stretchy="false">)</mo><mo>&lt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">taker\_get = price*(1-f_t)&lt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.00444em;vertical-align:-0.31em;"></span><span class="mord mathdefault">t</span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord" style="margin-right:0.02778em;">_</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">e</span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">p</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">i</span><span class="mord mathdefault">c</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2805559999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>，交易所在这个过程中盈利了<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mi>a</mi><mi>k</mi><mi>e</mi><mi>r</mi><mi mathvariant="normal">_</mi><mi>p</mi><mi>a</mi><mi>i</mi><mi>d</mi><mo>−</mo><mi>t</mi><mi>a</mi><mi>k</mi><mi>e</mi><mi>r</mi><mi mathvariant="normal">_</mi><mi>g</mi><mi>e</mi><mi>t</mi></mrow><annotation encoding="application/x-tex">maker\_paid-taker\_get</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.00444em;vertical-align:-0.31em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord" style="margin-right:0.02778em;">_</span><span class="mord mathdefault">p</span><span class="mord mathdefault">a</span><span class="mord mathdefault">i</span><span class="mord mathdefault">d</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.00444em;vertical-align:-0.31em;"></span><span class="mord mathdefault">t</span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mord mathdefault">e</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord" style="margin-right:0.02778em;">_</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">e</span><span class="mord mathdefault">t</span></span></span></span>。进一步考虑，我们希望使用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>a</mi><mi>i</mi><mi>r</mi><mi>p</mi><mi>r</mi><mi>i</mi><mi>c</mi><mi>e</mi><mo>−</mo><mi>a</mi><mi>s</mi><mi>k</mi></mrow><annotation encoding="application/x-tex">fair price - ask</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mord mathdefault">a</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">p</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">i</span><span class="mord mathdefault">c</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">a</span><span class="mord mathdefault">s</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>卖出，使用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>a</mi><mi>i</mi><mi>r</mi><mi>p</mi><mi>r</mi><mi>i</mi><mi>c</mi><mi>e</mi><mo>−</mo><mi>b</mi><mi>i</mi><mi>d</mi></mrow><annotation encoding="application/x-tex">fair price - bid</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mord mathdefault">a</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">p</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">i</span><span class="mord mathdefault">c</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span><span class="mord mathdefault">i</span><span class="mord mathdefault">d</span></span></span></span>买入。此时的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mi>a</mi><mi>k</mi><mi>e</mi><msub><mi>r</mi><mi>p</mi></msub><mi>a</mi><mi>i</mi><mi>d</mi></mrow><annotation encoding="application/x-tex">maker_paid</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.980548em;vertical-align:-0.286108em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord mathdefault">a</span><span class="mord mathdefault">i</span><span class="mord mathdefault">d</span></span></span></span>比我们的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>a</mi><mi>i</mi><mi>r</mi><mi>p</mi><mi>r</mi><mi>i</mi><mi>c</mi><mi>e</mi><mi>b</mi><mi>i</mi><mi>d</mi></mrow><annotation encoding="application/x-tex">fair price bid</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mord mathdefault">a</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">p</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">i</span><span class="mord mathdefault">c</span><span class="mord mathdefault">e</span><span class="mord mathdefault">b</span><span class="mord mathdefault">i</span><span class="mord mathdefault">d</span></span></span></span>高，我们不愿意用这么高的价格买，无法通过maker策略交易；此时的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi><mi>a</mi><mi>k</mi><mi>e</mi><msub><mi>r</mi><mi>g</mi></msub><mi>e</mi><mi>t</mi></mrow><annotation encoding="application/x-tex">taker_get</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.980548em;vertical-align:-0.286108em;"></span><span class="mord mathdefault">t</span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord mathdefault">e</span><span class="mord mathdefault">t</span></span></span></span>比我们的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mi>a</mi><mi>i</mi><mi>r</mi><mi>p</mi><mi>r</mi><mi>i</mi><mi>c</mi><mi>e</mi><mi>a</mi><mi>s</mi><mi>k</mi></mrow><annotation encoding="application/x-tex">fair price ask</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mord mathdefault">a</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">p</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">i</span><span class="mord mathdefault">c</span><span class="mord mathdefault">e</span><span class="mord mathdefault">a</span><span class="mord mathdefault">s</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>高，也就是我们愿意以比当时市场价更低的价格卖，那在当时的市场条件下，我们就可以用这个价格（或者低一些）卖出资产，成功交易，实现taker策略。</li><li>使用maker策略sell</li><li>使用maker策略buy</li><li>使用taker策略buy</li></ol><p>后三个可以自己尝试分析，进一步可以思考交易价穿插于fair、 price之间的分析，比如下面这种情况，maker sell和taker buy都是无利可图的。</p><p><img src="/blog/74dc0b6d/17180746599381.png" alt="img"></p><p>当然，对于我们交易者来说，同一时刻的Fair price不是一成不变的，会由于你的持仓情况不同而不同。毕竟我们是做市商，是通过交易来盈利而非持有资产而盈利。因此，当我们持有BTC较多时，我们就希望调低自己对于BTC的fair price，让自己能够更容易地卖出他们。具体的方法论可以看下一篇文章~</p><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">实习中学习到的市场中的maker与taker的交易思路</summary>
    
    
    
    <category term="金融知识" scheme="https://6young.site/categories/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="投资策略" scheme="https://6young.site/tags/%E6%8A%95%E8%B5%84%E7%AD%96%E7%95%A5/"/>
    
    <category term="做市交易" scheme="https://6young.site/tags/%E5%81%9A%E5%B8%82%E4%BA%A4%E6%98%93/"/>
    
    <category term="maker" scheme="https://6young.site/tags/maker/"/>
    
    <category term="taker" scheme="https://6young.site/tags/taker/"/>
    
    <category term="高频交易" scheme="https://6young.site/tags/%E9%AB%98%E9%A2%91%E4%BA%A4%E6%98%93/"/>
    
  </entry>
  
  <entry>
    <title>【编程学习】关于XGBoost你需要了解的知识</title>
    <link href="https://6young.site/blog/1c131ed5.html"/>
    <id>https://6young.site/blog/1c131ed5.html</id>
    <published>2024-06-05T10:59:46.000Z</published>
    <updated>2024-06-18T05:59:42.021Z</updated>
    
    <content type="html"><![CDATA[<h2 id="什么是xgboost">什么是XGBoost</h2><p>首先，要了解<code>GBDT</code>（梯度提升决策树）是一种基于boosting增强策略的加法模型，其核心思想是通过迭代的方式，每次训练一棵CART（分类与回归树）来拟合前t-1棵树预测结果与实际训练样本真实值之间的残差。在训练过程中，<code>GBDT</code>采用前向分布算法进行贪婪学习，旨在逐步优化整体模型的预测能力。</p><p>接着，<code>XGBoost</code>（极限梯度提升）在<code>GBDT</code>的基础上进行了多项优化。例如，它对损失函数进行了二阶泰勒展开，使模型能够更准确地逼近最优解；在目标函数中加入了正则项，有助于防止过拟合；同时，<code>XGBoost</code>支持并行处理，大大加快了训练速度；并且默认对缺失值进行了处理，提高了模型的鲁棒性。这些优化使得<code>XGBoost</code>在可扩展性和训练速度上有了显著的提升，但其核心思想——通过迭代训练CART树来拟合残差——与<code>GBDT</code>保持一致。</p><h2 id="xgboost如何实现并行？">XGBoost如何实现并行？</h2><p>boosting不是一种串行的结构吗?<code>XGBoost</code>怎么可以实现并行的？</p><p><code>XGBoost</code>的并行不是tree粒度的并行，<code>XGBoost</code>也是一次迭代完才能进行下一次迭代的（第t次迭代的代价函数里包含了前面t-1次迭代的预测值）。</p><p><code>XGBoost</code>的并行是在特征粒度上的。我们知道，决策树的学习最耗时的一个步骤就是对特征的值进行排序（因为要确定最佳分割点），<code>XGBoost</code>在训练之前，预先对数据进行了排序，然后保存为block结构，后面的迭代中重复地使用这个结构，大大减小计算量。这个block结构也使得并行成为了可能，在进行节点的分裂时，需要计算每个特征的增益，最终选增益最大的那个特征去做分裂，那么各个特征的增益计算就可以开多线程进行。</p><h2 id="gbdt和xgboost的区别？">GBDT和XGBoost的区别？</h2><p>**基分类器：**传统的<code>GBDT</code>采用<code>CART</code>作为基分类器，<code>XGBoost</code>支持多种类型的基分类器，比如线性分类器。</p><p><strong>二阶导数：</strong><code>GBDT</code> 在模型训练时只使用了代价函数的一阶导数信息，<code>XGBoost</code>对代价函数进行二阶泰勒展开，可以同时使用一阶和二阶导数。</p><p>**正则项：**在使用<code>CART</code>作为基分类器时，<code>XGBoost</code>显式地加入了正则项来控制模型的复杂度，有利于防止过拟合，从而提高模型的泛化能力。</p><p>**列采样：**传统的<code>GBDT</code>在每轮迭代时使用全部的数据，<code>XGBoost</code>则采用了与随机森林相似的策略，支持对数据进行采样，支持列抽样，不仅能降低过拟合，还能减少计算，这也是<code>XGBoost</code>异于传统<code>GBDT</code>的一个特性。</p><p>**缺失值处理：**传统的<code>GBDT</code>没有设计对缺失值进行处理，<code>XGBoost</code>可以为缺失值或者特定值指定分支的默认方向，对特征值有缺失的样本可以自动学习出他的分裂方向。</p><p><strong>并行化：</strong><code>XGBoost</code>支持并行，可以在特征粒度上并行，在训练前对特征进行分块排序，在寻找最佳分裂点的时候可以并行化计算，大大提升速度。</p><p>**Shrinkage（缩减）：**相当于学习速率（<code>XGBoost</code>中的 eta）。<code>XGBoost</code>在进行完一次迭代后，会将叶子节点的权重乘上该系数，主要是为了削弱每棵树的影响，让后面有更大的学习空间。实际应用中，一般把 eta 设置得小一点，然后迭代次数设置得大一点（注意，传统<code>GBDT</code>的实现也有学习速率）。</p><h2 id="xgboost防止过拟合的方法">XGBoost防止过拟合的方法</h2><p><code>XGBoost</code>在设计时，为了防止过拟合做了很多优化，具体如下：</p><ul><li><strong>目标函数添加正则项</strong>：叶子节点个数+叶子节点权重的L2正则化</li><li><strong>列抽样</strong>：训练的时候只用一部分特征（不考虑剩余的block块即可）</li><li><strong>子采样</strong>：每轮计算可以不使用全部样本，使算法更加保守</li><li><strong>shrinkage</strong>: 可以叫学习率或步长，为了给后面的训练留出更多的学习空间</li></ul><h2 id="xgboost如何评价特征的重要性？">XGBoost如何评价特征的重要性？</h2><p>采用三种方法来评判<code>XGBoost</code>模型中特征的重要程度。</p><p>weight ：该特征在所有树中被用作分割样本的特征的总次数。</p><p>gain：该特征在其出现过的所有树中产生的平均增益。</p><p>cover ：该特征在其出现过的所有树中的平均覆盖范围。</p><p>注意：覆盖范围这里指的是一个特征用作分割点后，其影响的样本数量，即有多少样本经过该特征分割到两个子节点。</p><h2 id="xgboost如何处理缺失值">XGBoost如何处理缺失值</h2><p>当<code>XGBoost</code>在特征k上寻找最佳分割点时，仅对特征值为非缺失的样本进行遍历。这种策略显著减少了为稀疏离散特征寻找分割点的时间开销，使得模型训练更加高效。</p><p>在逻辑实现上，<code>XGBoost</code>为了保证完备性，会将特征值缺失的样本分别分配到左叶子结点和右叶子结点进行预测计算。对于每一种分配方式（即缺失值样本被分到左分支或右分支），都会计算其对应的分裂增益。然后，模型会选择导致分裂后增益最大的那个方向（左分支或是右分支）作为默认分支方向，用于预测时特征值缺失的样本。</p><p>此外，如果在模型训练过程中没有遇到缺失值，但在预测时出现了缺失值，<code>XGBoost</code>会默认将缺失值的划分方向放到右子结点。这种处理方式确保了模型在预测时能够处理缺失值，并给出合理的预测结果。</p><h2 id="xgboost中的一棵树的停止生长条件">XGBoost中的一棵树的停止生长条件</h2><ul><li>当新引入的一次分裂所带来的增益Gain&lt;0时，放弃当前的分裂。这是训练损失和模型结构复杂度的博弈过程。</li><li>当树达到最大深度时，停止建树，因为树的深度太深容易出现过拟合，这里需要设置一个超参数max_depth。</li><li>当引入一次分裂后，重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值，也会放弃此次分裂。这涉及到一个超参数:最小样本权重和，是指如果一个叶子节点包含的样本数量太少也会放弃分裂，防止树分的太细。</li></ul><h2 id="rf和gbdt的区别">RF和GBDT的区别</h2><p><strong>相同点：</strong></p><ul><li>都是由多棵树组成，最终的结果都是由多棵树一起决定。</li></ul><p><strong>不同点：</strong></p><ul><li><strong>集成学习</strong>：RF属于bagging思想，而<code>GBDT</code>是boosting思想</li><li><strong>偏差-方差权衡</strong>：RF不断的降低模型的方差，而<code>GBDT</code>不断的降低模型的偏差</li><li><strong>训练样本</strong>：RF每次迭代的样本是从全部训练集中有放回抽样形成的，而<code>GBDT</code>每次使用全部样本</li><li><strong>并行性</strong>：RF的树可以并行生成，而<code>GBDT</code>只能顺序生成(需要等上一棵树完全生成)</li><li><strong>最终结果</strong>：RF最终是多棵树进行多数表决（回归问题是取平均），而<code>GBDT</code>是加权融合</li><li><strong>数据敏感性</strong>：RF对异常值不敏感，而<code>GBDT</code>对异常值比较敏感</li><li><strong>泛化能力</strong>：RF不易过拟合，而<code>GBDT</code>容易过拟合</li><li><strong>剪枝</strong>：<code>XGBoost</code>先从顶到底建立所有可以建立的子树，再从底到顶反向机芯剪枝，比起GBM，这样不容易陷入局部最优解</li></ul><h2 id="lr和gbdt的区别">LR和GBDT的区别</h2><ul><li>LR是线性模型，可解释性强，很容易并行化，但学习能力有限，需要大量的人工特征工程</li><li><code>GBDT</code>是非线性模型，具有天然的特征组合优势，特征表达能力强，但是树与树之间无法并行训练，而且树模型很容易过拟合；</li></ul><p>当在高维稀疏特征的场景下，LR的效果一般会比<code>GBDT</code>好。因为：<strong>带正则化的线性模型比较不容易对稀疏特征过拟合。</strong></p><h2 id="xgboost有哪些参数">XGBoost有哪些参数</h2><p>XGBoost模型有众多参数，针对参数调整，可以显著改善模型的表现。XGBoost的参数名称以及作用效果如下：</p><ol><li>eta：默认是0.3，别名是 leanring_rate，更新过程中用到的收缩步长，在每次提升计算之后，算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守；取值范围：[0,1]</li><li>gamma：默认是0，别名是 min_split_loss，在节点分裂时，只有在分裂后损失函数的值下降了（达到gamma指定的阈值），才会分裂这个节点。gamma值越大，算法越保守（越不容易过拟合）；取值范围：[0，∞]</li><li>max_depth：默认是6，树的最大深度，值越大，越容易过拟合；[0，∞]</li><li>min_child_weight：默认是1，决定最小叶子节点样本权重和，加权和低于这个值时，就不再分裂产生新的叶子节点。当它的值较大时，可以避免模型学习到局部的特殊样本。但如果这个值过高，会导致欠拟合。取值范围：[0，∞]</li><li>max_delta_step：默认是0，这参数限制每颗树权重改变的最大步长。如果是 0 意味着没有约束。如果是正值那么这个算法会更保守，通常不需要设置。取值范围：[0，∞]</li><li>subsample：默认是1，这个参数控制对于每棵树，随机采样的比例。减小这个参数的值算法会更加保守，避免过拟合。但是这个值设置的过小，它可能会导致欠拟合；取值范围：(0,1]</li><li>colsample_bytree：默认是1，用来控制每颗树随机采样的列数的占比；取值范围：(0,1]</li><li>colsample_bylevel：默认是1，用来控制的每一级的每一次分裂，对列数的采样的占比；值范围：(0,1]</li><li>lambda：默认是1，别名是reg_lambda，L2 正则化项的权重系数，越大模型越保守；</li><li>alpha：默认是0，别名是reg_alpha，L1 正则化项的权重系数，越大模型越保守；在数据维度很高的情况下，可以提高运行速度。</li><li>scale_pos_weight：默认是1，在类别高度不平衡的情况下，将参数设置大于0，可以加快收敛。</li><li>n_estimators：弱学习器的数量。</li></ol><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">XGBoost面试常见知识，学习记录一下</summary>
    
    
    
    <category term="编程学习" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="XGBoost" scheme="https://6young.site/tags/XGBoost/"/>
    
    <category term="编程学习" scheme="https://6young.site/tags/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>【编程学习】SQL窗口函数一览</title>
    <link href="https://6young.site/blog/ccdb7de7.html"/>
    <id>https://6young.site/blog/ccdb7de7.html</id>
    <published>2024-06-05T09:54:46.000Z</published>
    <updated>2024-06-18T05:59:42.013Z</updated>
    
    <content type="html"><![CDATA[<h2 id="over里面怎么写？">over里面怎么写？</h2><p>先写<code>partition by col1</code>，代表着我们在进行窗口函数计算时，先将数据按照<code>col1</code>列进行分组，与SQL的DQL语言中的<code>group by</code>一样。</p><p>其次，<code>order by col2</code>，代表着我们在进行窗口函数计算时，先将数据按照<code>col2</code>列进行排序，这对我们在进行排名类的操作时至关重要，同样的，与SQL的DQL语言中的<code>order by</code>一样。</p><p>最后是选取范围，要用到<code>rows between …… and …… </code>关键字，从其英文含义上就很容易理解他的使用方式。具体的可选参数有以下几个：</p><ul><li><code>unbounded preceding</code> 前面所有行</li><li><code>unbounded following</code> 后面所有行</li><li><code>current row</code> 当前行</li><li><code>n following</code> 后面n行</li><li><code>n preceding</code> 前面n行</li></ul><p>这几个参数可以根据你的需要进行组合，应该很容易理解。简单来说，就是将窗口函数的参数范围限制在了有限的行中，实现滚动窗口的左右。</p><h2 id="排序类">排序类</h2><p>在窗口内进行排序。</p><p><code>row_number() over()</code></p><p><code>rank() over()</code></p><p><code>dense_rank() over()</code></p><p><code>ntile(n) over() </code></p><p>假设现在有一组有序数据：98 96 94 94 90 83 80 80 75 59，各个函数的输出结果如下：</p><table><thead><tr><th>原始数列</th><th>98</th><th>96</th><th>94</th><th>94</th><th>90</th><th>83</th><th>80</th><th>80</th><th>75</th><th>59</th></tr></thead><tbody><tr><td><code>row_number() over()</code></td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td></tr><tr><td><code>rank() over()</code></td><td>1</td><td>2</td><td>3</td><td>3</td><td>5</td><td>6</td><td>7</td><td>7</td><td>9</td><td>10</td></tr><tr><td><code>dense_rank() over()</code></td><td>1</td><td>2</td><td>3</td><td>3</td><td>4</td><td>5</td><td>6</td><td>6</td><td>7</td><td>8</td></tr><tr><td><code>ntile(2) over() </code></td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>2</td><td>2</td><td>2</td><td>2</td><td>2</td></tr><tr><td><code>ntile(5) over() </code></td><td>1</td><td>1</td><td>2</td><td>2</td><td>3</td><td>3</td><td>4</td><td>4</td><td>5</td><td>5</td></tr></tbody></table><h2 id="运算类">运算类</h2><p><code>count() over()</code></p><p><code>max() over()</code></p><p><code>min() over()</code></p><p><code>sum() over()</code></p><p><code>avg() over()</code></p><h2 id="其他类">其他类</h2><p>选取窗口内的第一个值/最后一个值</p><p><code>first_value() over()</code></p><p><code>last_value() over()</code></p><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">SQL面试常见知识，各种窗口函数的简单技术细节</summary>
    
    
    
    <category term="编程学习" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="SQL" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/SQL/"/>
    
    
    <category term="编程学习" scheme="https://6young.site/tags/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="SQL" scheme="https://6young.site/tags/SQL/"/>
    
    <category term="窗口函数" scheme="https://6young.site/tags/%E7%AA%97%E5%8F%A3%E5%87%BD%E6%95%B0/"/>
    
  </entry>
  
  <entry>
    <title>【编程学习】利用shell脚本解决图床链接自动化更换问题</title>
    <link href="https://6young.site/blog/a273038a.html"/>
    <id>https://6young.site/blog/a273038a.html</id>
    <published>2024-05-31T10:42:23.000Z</published>
    <updated>2024-06-18T05:59:42.021Z</updated>
    
    <content type="html"><![CDATA[<h2 id="首先直接放出最终代码">首先直接放出最终代码</h2><p>放在<code>replace_url.sh</code>文件中，然后运行<code>bash replace_url.sh </code>即可，别忘了这个只能在<code>bash</code>中运行，<code>windows</code>的<code>cmd</code>是不行的，可以打开<code>git bash</code>后再运行。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">备份旧的IFS变量</span></span><br><span class="line">OLDIFS=&quot;$IFS&quot;</span><br><span class="line">IFS=$&#x27;\n&#x27;   # 修改分隔符为换行符</span><br><span class="line"></span><br><span class="line">before=&quot;https:\/\/cdn.jsdelivr.net&quot;</span><br><span class="line">after=&quot;https:\/\/jsd.onmicrosoft.cn&quot;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">计算当前目录下.md文件的数量</span></span><br><span class="line">file_count=$(find . -type f -name &quot;*.md&quot; | wc -l)</span><br><span class="line">count=0</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">开始处理文件并显示进度</span></span><br><span class="line">echo &quot;正在进行文件处理...&quot;</span><br><span class="line">for md_file in $(find . -type f -name &quot;*.md&quot;); do</span><br><span class="line">    ((count++))</span><br><span class="line">    # 替换文件中的URL前缀</span><br><span class="line">    sed -i &quot;s|$before|$after|g&quot; &quot;$md_file&quot;</span><br><span class="line">    </span><br><span class="line">    # 计算进度百分比</span><br><span class="line">    progress=$(( (count * 100) / file_count ))</span><br><span class="line">    </span><br><span class="line">    # 计算进度条的长度，这里设置为50个字符</span><br><span class="line">    bar_length=50</span><br><span class="line">    filled_length=$(( (bar_length * progress) / 100 ))</span><br><span class="line">    </span><br><span class="line">    # 显示进度条，使用\r来回到行首，不换行显示</span><br><span class="line">    echo -ne &quot;进度: [$(printf &quot;%$&#123;filled_length&#125;s&quot; | tr &#x27; &#x27; &#x27;=&#x27;)&gt;] $&#123;progress&#125;% (文件: $&#123;count&#125;/$&#123;file_count&#125;)    \r&quot;</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">完成进度显示</span></span><br><span class="line">echo -e &quot;\n文件处理完成&quot;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">恢复旧的IFS变量</span></span><br><span class="line">IFS=&quot;$OLDIFS&quot;</span><br></pre></td></tr></table></figure><h2 id="效果展示">效果展示</h2><p>其实速度并不算快，但是能够自动化就已经提高了太多的效率。</p><p><img src="/blog/a273038a/replace_url.gif" alt="replace_url"></p><h2 id="详细解释">详细解释</h2><h3 id="字符串替换方法sed">字符串替换方法sed</h3><p>在shell中，我们使用<code>sed -i</code>进行文件文本的替换</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sed -i &quot;s|before|after|g&quot; &quot;test.txt&quot;</span><br></pre></td></tr></table></figure><p>通过这句命令行，我们可以将<code>test.txt</code>文件中的所有“before”字符串转化为“after”字符串；其中，<code>s</code>代表“替换指定字符”，<code>g</code>代表“表示行内全面替换”。</p><p>其中一些详细参数可以在这里看看：</p><div calss="anzhiyu-tag-link"><a class="tag-Link" target="_blank" href="https://blog.csdn.net/qq_45206551/article/details/104498965">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://api.iowen.cn/favicon/blog.csdn.net/qq_45206551/article/details/104498965.png);"></div>        <div class="tag-link-right">            <div class="tag-link-title">史上最详细的sed命令教程</div>            <div class="tag-link-sitename">CSDN</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div><p>通过循环遍历目录下的md文件，然后对每个文件进行处理</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">for md_file in $(find . -type f -name &quot;*.md&quot;); do</span><br><span class="line">    sed -i &quot;s|before|after|g&quot; &quot;$md_file&quot;</span><br><span class="line">done</span><br></pre></td></tr></table></figure><h3 id="分隔符更换">分隔符更换</h3><p>由于我的文件名中有空格，这样会导致在遍历<code>md_file</code>时，程序将空格也当作分隔符，导致文件名的获取出问题。因此，需要修改全局变量<code>IFS</code>，将其改为<code>\n</code>换行符，当然别忘了保留原来的IFS，并在最后换回来。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">OLDIFS=&quot;$IFS&quot;</span><br><span class="line">IFS=$&#x27;\n&#x27;   # 修改分隔符为换行符</span><br><span class="line"></span><br><span class="line">IFS=&quot;$OLDIFS&quot;</span><br></pre></td></tr></table></figure><h3 id="文件数量统计">文件数量统计</h3><p>在这里，我们需要统计当前目录下所有<code>.md</code>文件。</p><p>其中<code>find . -type f -name &quot;*.md&quot;</code>含义为找到目录下所有md文件并输出，然后将输出通过<code>|</code>管道送给<code>wc</code>命令，然后按行计数，如此就实现了文件数量的统计。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">file_count=$(find . -type f -name &quot;*.md&quot; | wc -l)</span><br></pre></td></tr></table></figure><h3 id="进度条实现">进度条实现</h3><p>没啥说的，可以学会这个模板直接用。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">备份旧的IFS变量</span></span><br><span class="line">OLDIFS=&quot;$IFS&quot;</span><br><span class="line">IFS=$&#x27;\n&#x27;   # 修改分隔符为换行符</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">计算当前目录下.md文件的数量</span></span><br><span class="line">file_count=$(find . -type f -name &quot;*.md&quot; | wc -l)</span><br><span class="line">count=0</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">开始处理文件并显示进度</span></span><br><span class="line">echo &quot;正在进行文件处理...&quot;</span><br><span class="line">for md_file in $(find . -type f -name &quot;*.md&quot;); do</span><br><span class="line">    ((count++))</span><br><span class="line">    </span><br><span class="line">    # 计算进度百分比</span><br><span class="line">    progress=$(( (count * 100) / file_count ))</span><br><span class="line">    </span><br><span class="line">    # 计算进度条的长度，这里设置为50个字符</span><br><span class="line">    bar_length=50</span><br><span class="line">    filled_length=$(( (bar_length * progress) / 100 ))</span><br><span class="line">    </span><br><span class="line">    # 显示进度条，使用\r来回到行首，不换行显示</span><br><span class="line">    echo -ne &quot;进度: [$(printf &quot;%$&#123;filled_length&#125;s&quot; | tr &#x27; &#x27; &#x27;=&#x27;)&gt;] $&#123;progress&#125;% (文件: $&#123;count&#125;/$&#123;file_count&#125;)    \r&quot;</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">恢复旧的IFS变量</span></span><br><span class="line">IFS=&quot;$OLDIFS&quot;</span><br></pre></td></tr></table></figure><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">最近更换了图床链接，然而我有80多个文章需要更换图片链接，好麻烦，赶紧找方法批量处理</summary>
    
    
    
    <category term="个人博客" scheme="https://6young.site/categories/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
    
    
    <category term="编程学习" scheme="https://6young.site/tags/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="shell" scheme="https://6young.site/tags/shell/"/>
    
    <category term="自动化" scheme="https://6young.site/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    
    <category term="sed" scheme="https://6young.site/tags/sed/"/>
    
  </entry>
  
  <entry>
    <title>【编程学习】使用Screen解放你的客户端</title>
    <link href="https://6young.site/blog/14b2a3a9.html"/>
    <id>https://6young.site/blog/14b2a3a9.html</id>
    <published>2024-05-27T22:43:23.000Z</published>
    <updated>2024-06-18T05:59:42.021Z</updated>
    
    <content type="html"><![CDATA[<h2 id="安装">安装</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install screen</span><br></pre></td></tr></table></figure><h2 id="常用命令">常用命令</h2><h3 id="创建会话">创建会话</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">screen -S myscreen</span><br><span class="line"></span><br><span class="line">screen -U -S myscreen # 解决screen中中文乱码问题</span><br></pre></td></tr></table></figure><h3 id="显示已经创建的会话">显示已经创建的会话</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">screen -ls</span><br><span class="line">There is a screen on:</span><br><span class="line">        29085.myscreen  (Detached)</span><br><span class="line">1 Socket in /run/screen/S-root.  </span><br></pre></td></tr></table></figure><h3 id="离开会话">离开会话</h3><ul><li>保持会话运行</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Ctrl+a</span><br></pre></td></tr></table></figure><h3 id="恢复会话">恢复会话</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">screen -r 29085.myscreen # 别忘了加入前面的pid</span><br><span class="line">screen -x 29085.myscreen # 也可以进入会话</span><br><span class="line"></span><br><span class="line">screen -U -r myscreen # 解决screen中中文乱码问题,要求screen是用screen -U -S myscreen方案构建的</span><br></pre></td></tr></table></figure><h3 id="关闭会话">关闭会话</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">exit</span><br><span class="line">ctrl + d</span><br></pre></td></tr></table></figure><h2 id="其他技巧">其他技巧</h2><h3 id="screen的移动">screen的移动</h3><p>由于开启screen后，你无法使用鼠标滚轮进行翻页，此时需要一些技巧开启“复制模式”，然后动用上下左右键移动光标找到你想要查看的内容。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">1. Control+a ESC 上下左右键</span><br><span class="line">2. Control+a [ 上下左右键</span><br></pre></td></tr></table></figure><p>注意，在这个过程中千万不要动鼠标，不然就会失败。</p><h3 id="批量删除screen">批量删除screen</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">screen -ls|awk &#x27;NR&gt;=2&amp;&amp;NR&lt;=5&#123;print $1&#125;&#x27;|awk &#x27;&#123;print &quot;screen -S &quot;$1&quot; -X quit&quot;&#125;&#x27;|sh</span><br></pre></td></tr></table></figure><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">使用screen实现代码的真正托管，解放笔记本，再也不用担心断联啦！！！</summary>
    
    
    
    <category term="编程学习" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Linux" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/Linux/"/>
    
    
    <category term="编程学习" scheme="https://6young.site/tags/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Linux" scheme="https://6young.site/tags/Linux/"/>
    
    <category term="screen" scheme="https://6young.site/tags/screen/"/>
    
  </entry>
  
  <entry>
    <title>【编程学习】Event Loop事件循环机制的基本认知</title>
    <link href="https://6young.site/blog/467c6fec.html"/>
    <id>https://6young.site/blog/467c6fec.html</id>
    <published>2024-05-27T21:37:23.000Z</published>
    <updated>2024-06-18T05:59:42.013Z</updated>
    
    <content type="html"><![CDATA[<p>事件循环是一种常见的运行机制，尤其在单线程的JavaScript语言中就采用这种机制，来解决单线程运行带来的一些问题。本文尝试用python来实现事件循环的基本逻辑与功能：</p><h2 id="基本概念">基本概念</h2><h3 id="python的协程方案">python的协程方案</h3><p>首先要了解Python中的异步编程，主要有以下几种方案：</p><ul><li><p><code>twisted</code>：使用事件驱动机制来提升python性能</p></li><li><p><code>gevent</code>：使用greenlet在用户态完成栈和上下文切换来减少切换带来的性能损耗</p></li><li><p><code>tornado</code>：使用生成器来保存协程上下文及状态，使用原生的python语法实现了协程</p></li><li><p><code>asyncio</code>：异步编程标准化。</p></li></ul><p>而本次就先介绍<code>asyncio</code>的异步编程标准化方案</p><h3 id="协程">协程</h3><ul><li>协程是一个可以在返回之前“暂停执行”的函数，它可以在一段时间内间接地将控制传递给另一个协程</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># await将函数控制传递回事件循环（它暂停了周围协程的执行）</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">g</span>():</span><br><span class="line">    r = <span class="keyword">await</span> f()</span><br><span class="line">    <span class="keyword">return</span> r</span><br></pre></td></tr></table></figure><h3 id="asyncio">asyncio</h3><ul><li>Async IO是一种语言无关的编程范式，asyncio是与其对应的python包<ul><li>async/await用于定义协程的python关键字</li></ul></li></ul><h3 id="异步">异步</h3><p>什么是异步？</p><ul><li>异步协程能够在等待最终结果时“暂停”，同时让其他协程运行</li><li>异步代码提供了并发的感觉</li></ul><p>**同步和异步很好的描述：**Judit和24个对手下棋，Judit每下一步需要5秒，对手需要55秒，游戏平均每人下30步结束(总共60步)</p><p>同步版本【一个任务完成再做下一个任务】：</p><ul><li>Judit每次只和一个对手玩，直到游戏完成，再换下一个对手</li><li>每局游戏耗时(55 + 5)* 30 == 1800秒，即30分钟。24个对手需要：24 * 30 == 720分钟=12个小时</li></ul><p>异步版本【多个任务并发执行】：</p><ul><li>Judit每下完一步，离开桌子换下一个对手，在所有24个对手中，Judit的一次移动需要24 * 5 == 120秒，也就是2分钟。全部下完需要：120 * 30 = = 3600秒=1小时</li></ul><h2 id="asyncio实现携程">asyncio实现携程</h2><h3 id="基本函数">基本函数</h3><ul><li><code>loop.call_later()</code></li><li><code>loop.call_soon()</code></li><li><code>loop.time()</code></li></ul><h3 id="实践一下">实践一下</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> asyncio</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">function_1</span>(<span class="params">end_time, loop</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;function_1 called&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> loop.time() &lt; end_time:</span><br><span class="line">        loop.call_later(<span class="number">1</span>, function_2, end_time, loop)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        loop.stop()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">function_2</span>(<span class="params">end_time, loop</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;function_2 called &quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> loop.time() &lt; end_time:</span><br><span class="line">        loop.call_later(<span class="number">1</span>, function_3, end_time, loop)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        loop.stop()</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">function_3</span>(<span class="params">end_time, loop</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;function_3 called&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> loop.time() &lt; end_time:</span><br><span class="line">        loop.call_later(<span class="number">1</span>, function_1, end_time, loop)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        loop.stop()</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    loop = asyncio.get_event_loop()</span><br><span class="line">    end_loop_time = loop.time() + <span class="number">8.0</span></span><br><span class="line">    loop.call_soon(function_1, end_loop_time, loop)</span><br><span class="line">    <span class="comment"># 运行事件循环直到loop.stop()被调用</span></span><br><span class="line">    loop.run_forever()</span><br><span class="line">    loop.close()</span><br></pre></td></tr></table></figure><p><strong>输出：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">function_1 called</span><br><span class="line">function_2 called</span><br><span class="line">function_3 called</span><br><span class="line">function_1 called</span><br><span class="line">function_2 called</span><br><span class="line">function_3 called</span><br><span class="line">function_1 called</span><br><span class="line">function_2 called</span><br><span class="line">function_3 called </span><br></pre></td></tr></table></figure><h3 id="run-in-executor">run_in_executor</h3><ul><li>在默认的<code>thread pool</code>中执行<code>func</code></li><li>在指定的<code>thread pool</code>中执行<code>func</code>：<code>IO-bound</code>操作</li><li>在指定的<code>process pool</code>中执行<code>func</code>：<code>CPU-bound</code>操作</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> asyncio</span><br><span class="line"><span class="keyword">import</span> concurrent.futures</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">blocking_io</span>():</span><br><span class="line">    <span class="comment"># IO-bound操作会block event loop</span></span><br><span class="line">    <span class="comment"># 应该放到thread pool中去执行</span></span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&#x27;./test.txt&#x27;</span>, <span class="string">&#x27;w&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        <span class="keyword">return</span> f.write(<span class="string">&#x27;test-string&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">cpu_bound</span>():</span><br><span class="line">    <span class="comment"># CPU-bound操作会block event loop,</span></span><br><span class="line">    <span class="comment"># 应该放到process pool中去执行</span></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">sum</span>(i * i <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span> ** <span class="number">7</span>))</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    loop = asyncio.get_running_loop()</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 1. 在默认的thread pool中执行</span></span><br><span class="line">    result = <span class="keyword">await</span> loop.run_in_executor(</span><br><span class="line">        <span class="literal">None</span>, blocking_io)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;default thread pool&#x27;</span>, result)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 2. 在指定的thread pool中执行</span></span><br><span class="line">    <span class="keyword">with</span> concurrent.futures.ThreadPoolExecutor() <span class="keyword">as</span> pool:</span><br><span class="line">        result = <span class="keyword">await</span> loop.run_in_executor(</span><br><span class="line">            pool, blocking_io)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;custom thread pool&#x27;</span>, result)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 3. 在指定的process pool中执行</span></span><br><span class="line">    <span class="keyword">with</span> concurrent.futures.ProcessPoolExecutor() <span class="keyword">as</span> pool:</span><br><span class="line">        result = <span class="keyword">await</span> loop.run_in_executor(</span><br><span class="line">            pool, cpu_bound)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;custom process pool&#x27;</span>, result)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    asyncio.run(main())</span><br><span class="line"></span><br><span class="line"><span class="comment"># 输出:</span></span><br><span class="line"><span class="comment"># default thread pool 11</span></span><br><span class="line"><span class="comment"># custom thread pool 11</span></span><br><span class="line"><span class="comment"># custom process pool 333333283333335000000 </span></span><br></pre></td></tr></table></figure><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">详解事件循环机制，通过多线程、多进程以及异步方案更高效使用python</summary>
    
    
    
    <category term="编程学习" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Python" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/Python/"/>
    
    
    <category term="编程学习" scheme="https://6young.site/tags/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="代码效率" scheme="https://6young.site/tags/%E4%BB%A3%E7%A0%81%E6%95%88%E7%8E%87/"/>
    
    <category term="事件循环" scheme="https://6young.site/tags/%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF/"/>
    
    <category term="异步" scheme="https://6young.site/tags/%E5%BC%82%E6%AD%A5/"/>
    
  </entry>
  
  <entry>
    <title>【编程学习】代码效率优化——并行与异步</title>
    <link href="https://6young.site/blog/b1ee4e92.html"/>
    <id>https://6young.site/blog/b1ee4e92.html</id>
    <published>2024-05-27T21:13:23.000Z</published>
    <updated>2024-06-18T05:59:42.017Z</updated>
    
    <content type="html"><![CDATA[<h2 id="gil">GIL</h2><ul><li>“CPython解释器”所采用的一种机制，确保同一时刻只有一个线程在执行 Python bytecode</li></ul><h2 id="thread">Thread</h2><p><img src="/blog/b1ee4e92/17167954019834.png" alt="img"></p><h3 id="thread对象">Thread对象</h3><ul><li>如何创建线程？创建线程的2种方式：<ul><li>方式1：传递一个可调用对象给Thread构造函数</li><li>方式2：继承Thread，在子类中重载run()方法。要注意的是，子类只能重载构造函数和run()方法，不能重载其它方法</li></ul></li><li>如何启动线程？线程被创建之后，调用start()启动，会在独立的线程中调用run()方法</li><li>一旦现成被启动，该线程被认为是“存活”的，当run()方法正常退出或者抛出未被处理的异常，线程就不是“存活”的了，可以用is_alive()方法检测线程是否存活</li><li>如何等待一个线程结束？其他线程可以调用一个线程的 join() 方法，这会阻塞调用该方法的线程，直到被调用 join() 方法的线程终结</li></ul><h3 id="守护线程">守护线程</h3><ul><li>守护线程的含义：当剩下的线程都是守护线程时，整个Python程序将会退出</li><li>守护线程在程序退出时会突然关闭，他们的资源（例如已经打开的文档等）可能没有被正确释放</li><li>主线程不是一个守护线程</li><li>可以通过设置参数daemon来设置一个线程是否是守护线程，这个值必须在调用start()之前设置。如果不设置，默认继承自创建线程</li></ul><h3 id="basic">basic</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> threading</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime, timedelta</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">task</span>(<span class="params">task_id: <span class="built_in">int</span></span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;task &#123;&#125; thread name &#123;&#125;, &#123;&#125;&#x27;</span>.<span class="built_in">format</span>(</span><br><span class="line">        task_id, threading.current_thread().getName(), datetime.utcnow() + timedelta(hours=<span class="number">8</span>)))</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    threads = []</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">5</span>):</span><br><span class="line">        t = threading.Thread(target=task, args=(i, ))</span><br><span class="line">        threads.append(t)</span><br><span class="line">        t.setName(<span class="string">&#x27;name-&#123;&#125;&#x27;</span>.<span class="built_in">format</span>(i))</span><br><span class="line">        t.start()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> t <span class="keyword">in</span> threads:</span><br><span class="line">        t.join()</span><br></pre></td></tr></table></figure><p><strong>输出：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">task 0 thread name name-0, 2022-07-25 11:55:15.709096</span><br><span class="line">task 1 thread name name-1, 2022-07-25 11:55:15.709423</span><br><span class="line">task 2 thread name name-2, 2022-07-25 11:55:15.709562</span><br><span class="line">task 3 thread name name-3, 2022-07-25 11:55:15.709658</span><br><span class="line">task 4 thread name name-4, 2022-07-25 11:55:15.709718</span><br></pre></td></tr></table></figure><h3 id="consumer-producer">consumer &amp; producer</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> threading <span class="keyword">import</span> Thread</span><br><span class="line"><span class="keyword">from</span> queue <span class="keyword">import</span> Empty, Queue</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line">_shutdown = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">producer</span>(<span class="title class_ inherited__">Thread</span>):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, queue</span>):</span><br><span class="line">        Thread.__init__(self)</span><br><span class="line">        self.queue = queue</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">run</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line">            item = random.randint(<span class="number">0</span>, <span class="number">256</span>)</span><br><span class="line">            self.queue.put(item)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&#x27;Producer notify: item N° %d appended to queue by %s&#x27;</span> %</span><br><span class="line">                  (item, self.name))</span><br><span class="line">            time.sleep(<span class="number">0.1</span>)</span><br><span class="line">        <span class="comment"># 等待所有的item被消费掉</span></span><br><span class="line">        self.queue.join()</span><br><span class="line">        <span class="keyword">global</span> _shutdown</span><br><span class="line">        _shutdown = <span class="literal">True</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;Producer done %s&#x27;</span> % (self.name))</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">consumer</span>(<span class="title class_ inherited__">Thread</span>):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, queue</span>):</span><br><span class="line">        Thread.__init__(self)</span><br><span class="line">        self.queue = queue</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">run</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">while</span> <span class="literal">True</span> <span class="keyword">and</span> <span class="keyword">not</span> _shutdown:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                item = self.queue.get(block=<span class="literal">True</span>, timeout=<span class="number">1</span>)</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&#x27;Consumer notify : %d popped from queue by %s&#x27;</span> %</span><br><span class="line">                      (item, self.name))</span><br><span class="line">                self.queue.task_done()</span><br><span class="line">            <span class="keyword">except</span> Empty:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;Consumer done %s&#x27;</span> % (self.name))</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    queue = Queue()</span><br><span class="line">    t1 = producer(queue)</span><br><span class="line">    t2 = consumer(queue)</span><br><span class="line">    t3 = consumer(queue)</span><br><span class="line">    t1.start()</span><br><span class="line">    t2.start()</span><br><span class="line">    t3.start()</span><br><span class="line">    t1.join()</span><br><span class="line">    t2.join()</span><br><span class="line">    t3.join()</span><br></pre></td></tr></table></figure><p><strong>输出：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">Producer notify: item N° 126 appended to queue by Thread-1</span><br><span class="line">Consumer notify : 126 popped from queue by Thread-2</span><br><span class="line">Producer notify: item N° 36 appended to queue by Thread-1</span><br><span class="line">Consumer notify : 36 popped from queue by Thread-3</span><br><span class="line">Producer notify: item N° 205 appended to queue by Thread-1</span><br><span class="line">Consumer notify : 205 popped from queue by Thread-2</span><br><span class="line">Producer notify: item N° 55 appended to queue by Thread-1</span><br><span class="line">Consumer notify : 55 popped from queue by Thread-3</span><br><span class="line">Producer notify: item N° 152 appended to queue by Thread-1</span><br><span class="line">Consumer notify : 152 popped from queue by Thread-2 </span><br><span class="line">Producer notify: item N° 70 appended to queue by Thread-1  </span><br><span class="line">Consumer notify : 70 popped from queue by Thread-3 </span><br><span class="line">Producer notify: item N° 168 appended to queue by Thread-1</span><br><span class="line">Consumer notify : 168 popped from queue by Thread-2</span><br><span class="line">Producer notify: item N° 74 appended to queue by Thread-1 </span><br><span class="line">Consumer notify : 74 popped from queue by Thread-3</span><br><span class="line">Producer notify: item N° 87 appended to queue by Thread-1</span><br><span class="line">Consumer notify : 87 popped from queue by Thread-2</span><br><span class="line">Producer notify: item N° 59 appended to queue by Thread-1</span><br><span class="line">Consumer notify : 59 popped from queue by Thread-3       </span><br><span class="line">Producer done Thread-1</span><br><span class="line">Consumer done Thread-2</span><br><span class="line">Consumer done Thread-3 </span><br></pre></td></tr></table></figure><h2 id="process">Process</h2><p><img src="/blog/b1ee4e92/17167954018201.png" alt="img"></p><h3 id="basic">basic</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> multiprocessing</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime, timedelta</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">task</span>(<span class="params">task_id: <span class="built_in">int</span></span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;task &#123;&#125; process id &#123;&#125;, &#123;&#125;&#x27;</span>.<span class="built_in">format</span>(</span><br><span class="line">        task_id, multiprocessing.current_process().pid, datetime.utcnow() + timedelta(hours=<span class="number">8</span>)))</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    processes = []</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">5</span>):</span><br><span class="line">        p = multiprocessing.Process(target=task, args=(i, ))</span><br><span class="line">        processes.append(p)</span><br><span class="line">        p.start()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> p <span class="keyword">in</span> processes:</span><br><span class="line">        p.join()</span><br></pre></td></tr></table></figure><p><strong>输出：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">task 0 process id 7651, 2022-07-25 11:54:22.553022</span><br><span class="line">task 3 process id 7654, 2022-07-25 11:54:22.554469</span><br><span class="line">task 1 process id 7652, 2022-07-25 11:54:22.555789</span><br><span class="line">task 4 process id 7655, 2022-07-25 11:54:22.564164</span><br><span class="line">task 2 process id 7653, 2022-07-25 11:54:22.567585</span><br></pre></td></tr></table></figure><h3 id="consumer-producer">consumer &amp; producer</h3><p><strong>和多线程的区别：</strong></p><ul><li><code>multiprocessing.Queue</code>相比标准库的<code>queue.Queue</code>，缺少了 task_done()和 join()这两个方法</li><li>如果同步_shutdown<ul><li>多线程用<code>全局变量</code>作为_shutdown</li><li>多进程使用<code>共享内存变量</code>作为_shutdown</li></ul></li></ul><p><img src="/blog/b1ee4e92/17167954018202.png" alt="img"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> multiprocessing <span class="keyword">import</span> Process, Queue, Value</span><br><span class="line"><span class="keyword">from</span> queue <span class="keyword">import</span> Empty</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">producer</span>(<span class="title class_ inherited__">Process</span>):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, queue: Queue, shutdown: Value</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">        Process.__init__(self)</span><br><span class="line">        self.queue = queue</span><br><span class="line">        self.shutdown = shutdown</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">run</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line">            item = random.randint(<span class="number">0</span>, <span class="number">256</span>)</span><br><span class="line">            self.queue.put(item)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&#x27;Producer notify: item N° %d appended to queue by %s&#x27;</span> %</span><br><span class="line">                  (item, self.name))</span><br><span class="line">            time.sleep(<span class="number">0.1</span>)</span><br><span class="line">        <span class="comment"># 当前进程将不会再往队列中放入对象, 一旦所有缓冲区中的数据被写入管道之后,</span></span><br><span class="line">        <span class="comment"># 后台的线程会退出</span></span><br><span class="line">        self.queue.close()</span><br><span class="line">        <span class="comment"># 等待后台线程, 这个方法仅在调用了close()方法之后可用, 会阻塞当前进程, 直</span></span><br><span class="line">        <span class="comment"># 到后台线程退出, 确保所有缓冲区中的数据都被写入管道中</span></span><br><span class="line">        self.queue.join_thread()</span><br><span class="line">        self.shutdown.value = <span class="number">1</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;Producer done %s&#x27;</span> % (self.name))</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">consumer</span>(<span class="title class_ inherited__">Process</span>):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, queue: Queue, shutdown: Value</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">        Process.__init__(self)</span><br><span class="line">        self.queue = queue</span><br><span class="line">        self.shutdown = shutdown</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">run</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">while</span> <span class="literal">True</span> <span class="keyword">and</span> <span class="keyword">not</span> self.shutdown.value:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                item = self.queue.get(block=<span class="literal">True</span>, timeout=<span class="number">1</span>)</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&#x27;Consumer notify : %d popped from queue by %s&#x27;</span> %</span><br><span class="line">                      (item, self.name))</span><br><span class="line">            <span class="keyword">except</span> Empty:</span><br><span class="line">                <span class="keyword">if</span> self.shutdown.value:</span><br><span class="line">                    <span class="keyword">break</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&#x27;Consumer done %s&#x27;</span> % (self.name))</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    queue = Queue()</span><br><span class="line">    <span class="comment"># 返回一个从共享内存上创建的对象</span></span><br><span class="line">    _shutdown = Value(<span class="string">&#x27;i&#x27;</span>, <span class="number">0</span>)</span><br><span class="line">    p1 = producer(queue, _shutdown)</span><br><span class="line">    p2 = consumer(queue, _shutdown)</span><br><span class="line">    p3 = consumer(queue, _shutdown)</span><br><span class="line">    p1.start()</span><br><span class="line">    p2.start()</span><br><span class="line">    p3.start()</span><br><span class="line">    p1.join()</span><br><span class="line">    p2.join()</span><br><span class="line">    p3.join()</span><br></pre></td></tr></table></figure><p><strong>输出：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">Producer notify: item N° 119 appended to queue by producer-1</span><br><span class="line">Consumer notify : 119 popped from queue by consumer-2       </span><br><span class="line">Producer notify: item N° 250 appended to queue by producer-1</span><br><span class="line">Consumer notify : 250 popped from queue by consumer-2       </span><br><span class="line">Producer notify: item N° 215 appended to queue by producer-1</span><br><span class="line">Consumer notify : 215 popped from queue by consumer-2       </span><br><span class="line">Producer notify: item N° 210 appended to queue by producer-1</span><br><span class="line">Consumer notify : 210 popped from queue by consumer-2       </span><br><span class="line">Producer notify: item N° 70 appended to queue by producer-1 </span><br><span class="line">Consumer notify : 70 popped from queue by consumer-2        </span><br><span class="line">Producer notify: item N° 29 appended to queue by producer-1 </span><br><span class="line">Consumer notify : 29 popped from queue by consumer-2        </span><br><span class="line">Producer notify: item N° 237 appended to queue by producer-1</span><br><span class="line">Consumer notify : 237 popped from queue by consumer-2       </span><br><span class="line">Producer notify: item N° 55 appended to queue by producer-1 </span><br><span class="line">Consumer notify : 55 popped from queue by consumer-2        </span><br><span class="line">Producer notify: item N° 10 appended to queue by producer-1 </span><br><span class="line">Consumer notify : 10 popped from queue by consumer-2        </span><br><span class="line">Producer notify: item N° 224 appended to queue by producer-1</span><br><span class="line">Consumer notify : 224 popped from queue by consumer-2       </span><br><span class="line">Producer done producer-1                                    </span><br><span class="line">Consumer done consumer-2                                    </span><br><span class="line">Consumer done consumer-3 </span><br></pre></td></tr></table></figure><h2 id="executor">Executor</h2><p><img src="/blog/b1ee4e92/17167954018203.png" alt="img"></p><p>异步执行可调用对象，异步执行可以由 <code>ThreadPoolExecutor</code> 使用线程或由 <code>ProcessPoolExecutor</code> 使用单独的进程来实现</p><ul><li><code>concurrent.futures.Executor</code></li><li><code>concurrent.futures.ThreadPoolExecutor</code></li><li><code>concurrent.futures.ProcessPoolExecutor</code></li><li><code>concurrent.futures.Future</code></li></ul><p><strong>ThreadPoolExecutor VS ProcessPoolExecutor</strong></p><ul><li>ThreadPoolExecutor:<ul><li>Threads</li><li>Lightweight workers</li><li>全局变量</li><li>GIL</li><li>IO-bound Tasks</li></ul></li><li>ProcessPoolExecutor:<ul><li>Processes</li><li>Heavyweight Workers</li><li>共享内存变量（跨进程）</li><li>No GIL</li><li>CPU-bound Tasks</li></ul></li></ul><h3 id="threadpoolexecutor">ThreadPoolExecutor</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> concurrent.futures <span class="keyword">import</span> ThreadPoolExecutor, Future</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> threading</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime, timedelta</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">task</span>(<span class="params">file_name: <span class="built_in">str</span>, url: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    res = requests.get(url)</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(file_name, mode=<span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        f.write(res.content)</span><br><span class="line"></span><br><span class="line">    response = <span class="string">&#x27;task thread name &#123;&#125;&#x27;</span>.<span class="built_in">format</span>(</span><br><span class="line">        threading.current_thread().getName())</span><br><span class="line">    <span class="built_in">print</span>(file_name, datetime.utcnow() + timedelta(hours=<span class="number">8</span>))</span><br><span class="line">    <span class="keyword">return</span> response</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">done_callback</span>(<span class="params">future: Future</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;task done[thread name=&#123;&#125;]:&#x27;</span>.<span class="built_in">format</span>(</span><br><span class="line">        threading.current_thread().getName()), future.result())</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    task_lists = [</span><br><span class="line">        (<span class="string">&#x27;regex101.txt&#x27;</span>, <span class="string">&#x27;https://regex101.com/&#x27;</span>),</span><br><span class="line">        (<span class="string">&#x27;morning.txt&#x27;</span>, <span class="string">&#x27;https://www.politico.com/tipsheets/morning-money&#x27;</span>),</span><br><span class="line">        (<span class="string">&#x27;economics.txt&#x27;</span>, <span class="string">&#x27;https://www.bloomberg.com/markets/economics&#x27;</span>)</span><br><span class="line">    ]</span><br><span class="line">    future_lists: <span class="built_in">list</span>[Future] = []</span><br><span class="line">    pool = ThreadPoolExecutor(<span class="number">10</span>)</span><br><span class="line">    <span class="keyword">for</span> file_name, url <span class="keyword">in</span> task_lists:</span><br><span class="line">        future = pool.submit(task, file_name, url)</span><br><span class="line">        future.add_done_callback(done_callback)</span><br><span class="line">        future_lists.append(future)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 在所有待执行的future对象完成执行且释放已分配的资源后才会返回</span></span><br><span class="line">    pool.shutdown(<span class="literal">True</span>)</span><br><span class="line">    response_lists = []</span><br><span class="line">    <span class="keyword">for</span> f <span class="keyword">in</span> future_lists:</span><br><span class="line">        response_lists.append(f.result())</span><br><span class="line">    <span class="built_in">print</span>(response_lists)</span><br></pre></td></tr></table></figure><p><strong>输出：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">economics.txt 2022-07-25 09:49:59.536341                    </span><br><span class="line">task done[thread name=ThreadPoolExecutor-0_2]: task thread name ThreadPoolExecutor-0_2                                                                                         </span><br><span class="line">regex101.txt 2022-07-25 09:49:59.766962                     </span><br><span class="line">task done[thread name=ThreadPoolExecutor-0_0]: task thread name ThreadPoolExecutor-0_0                                                                                         </span><br><span class="line">morning.txt 2022-07-25 09:50:00.081044                      </span><br><span class="line">task done[thread name=ThreadPoolExecutor-0_1]: task thread name ThreadPoolExecutor-0_1                                                                                         </span><br><span class="line">[&#x27;task thread name ThreadPoolExecutor-0_0&#x27;, </span><br><span class="line"> &#x27;task thread name ThreadPoolExecutor-0_1&#x27;, </span><br><span class="line"> &#x27;task thread name ThreadPoolExecutor-0_2&#x27;]</span><br></pre></td></tr></table></figure><h3 id="processpoolexecutor">ProcessPoolExecutor</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> concurrent.futures <span class="keyword">import</span> ProcessPoolExecutor, Future</span><br><span class="line"><span class="keyword">import</span> multiprocessing</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime, timedelta</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">task</span>(<span class="params">file_name: <span class="built_in">str</span>, url: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    res = requests.get(url)</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(file_name, mode=<span class="string">&#x27;wb&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        f.write(res.content)</span><br><span class="line"></span><br><span class="line">    response = <span class="string">&#x27;task process id &#123;&#125;&#x27;</span>.<span class="built_in">format</span>(</span><br><span class="line">        multiprocessing.current_process().pid)</span><br><span class="line">    <span class="built_in">print</span>(file_name, datetime.utcnow() + timedelta(hours=<span class="number">8</span>))</span><br><span class="line">    <span class="keyword">return</span> response</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">done_callback</span>(<span class="params">future: Future</span>) -&gt; <span class="literal">None</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;task done [process id=&#123;&#125;]:&#x27;</span>.<span class="built_in">format</span>(</span><br><span class="line">        multiprocessing.current_process().pid), future.result())</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    task_lists = [</span><br><span class="line">        (<span class="string">&#x27;regex101.txt&#x27;</span>, <span class="string">&#x27;https://regex101.com/&#x27;</span>),</span><br><span class="line">        (<span class="string">&#x27;morning.txt&#x27;</span>, <span class="string">&#x27;https://www.politico.com/tipsheets/morning-money&#x27;</span>),</span><br><span class="line">        (<span class="string">&#x27;economics.txt&#x27;</span>, <span class="string">&#x27;https://www.bloomberg.com/markets/economics&#x27;</span>)</span><br><span class="line">    ]</span><br><span class="line">    future_lists: <span class="built_in">list</span>[Future] = []</span><br><span class="line">    pool = ProcessPoolExecutor(<span class="number">10</span>)</span><br><span class="line">    <span class="keyword">for</span> file_name, url <span class="keyword">in</span> task_lists:</span><br><span class="line">        future = pool.submit(task, file_name, url)</span><br><span class="line">        future.add_done_callback(done_callback)</span><br><span class="line">        future_lists.append(future)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 在所有待执行的future对象完成执行且释放已分配的资源后才会返回</span></span><br><span class="line">    pool.shutdown(<span class="literal">True</span>)</span><br><span class="line">    response_lists = []</span><br><span class="line">    <span class="keyword">for</span> f <span class="keyword">in</span> future_lists:</span><br><span class="line">        response_lists.append(f.result())</span><br><span class="line">    <span class="built_in">print</span>(response_lists)</span><br></pre></td></tr></table></figure><p><strong>输出：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">morning.txt 2022-07-25 09:43:24.237463                      </span><br><span class="line">task done [process id=6920]: task process id 6924           </span><br><span class="line">economics.txt 2022-07-25 09:43:24.389305                    </span><br><span class="line">task done [process id=6920]: task process id 6923           </span><br><span class="line">regex101.txt 2022-07-25 09:43:24.849390                     </span><br><span class="line">task done [process id=6920]: task process id 6922           </span><br><span class="line">[&#x27;task process id 6922&#x27;, </span><br><span class="line"> &#x27;task process id 6924&#x27;, </span><br><span class="line"> &#x27;task process id 6923&#x27;]  </span><br></pre></td></tr></table></figure><h2 id="process-pool">Process Pool</h2><h3 id="apply-async">apply async</h3><ul><li>使用<code>AsyncResult.get()</code>获取进程的返回值</li><li>放入Pool中计算的函数参数最好是基本Python类型，所有的类型都是可以<code>pickle</code>的</li><li>如果放入Pool中计算的task需要一定时间，要控制放入的频率，否则Pool队列会堆积，导致task过很长时间才会被执行。例如：一个task的计算时间是100毫秒，Pool中进程数量是10，理论上每秒最多处理10x10=100个task，如果我们每秒放入Pool 200个task，这会导致放入Pool中的task很长时间才会被执行，在实际计算中，我们可以将这个时间写入日志，方便后续统计观测&amp;发现问题</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> multiprocessing <span class="keyword">as</span> mp</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">calculate</span>(<span class="params">func, args</span>):</span><br><span class="line">    result = func(*args)</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;%s says that %s%s = %s&#x27;</span> % (</span><br><span class="line">        mp.current_process().name,</span><br><span class="line">        func.__name__, args, result</span><br><span class="line">    )</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">calculatestar</span>(<span class="params">args</span>):</span><br><span class="line">    <span class="keyword">return</span> calculate(*args)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">mul</span>(<span class="params">a, b</span>):</span><br><span class="line">    time.sleep(<span class="number">0.5</span> * random.random())</span><br><span class="line">    <span class="keyword">return</span> a * b</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">plus</span>(<span class="params">a, b</span>):</span><br><span class="line">    time.sleep(<span class="number">0.5</span> * random.random())</span><br><span class="line">    <span class="keyword">return</span> a + b</span><br><span class="line"></span><br><span class="line">TASKS = [(mul, (i, <span class="number">7</span>)) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>)] + \</span><br><span class="line">        [(plus, (i, <span class="number">8</span>)) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>)]</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    pool = mp.Pool(os.cpu_count())</span><br><span class="line">    results = [pool.apply_async(calculate, t) <span class="keyword">for</span> t <span class="keyword">in</span> TASKS]</span><br><span class="line">    <span class="keyword">for</span> r <span class="keyword">in</span> results:</span><br><span class="line">        <span class="built_in">print</span>(r.get())</span><br><span class="line">    pool.close()</span><br><span class="line">    pool.join()</span><br></pre></td></tr></table></figure><p><strong>输出：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">SpawnPoolWorker-4 says that mul(0, 7) = 0                   </span><br><span class="line">SpawnPoolWorker-1 says that mul(1, 7) = 7                   </span><br><span class="line">SpawnPoolWorker-3 says that mul(2, 7) = 14                  </span><br><span class="line">SpawnPoolWorker-5 says that mul(3, 7) = 21                  </span><br><span class="line">SpawnPoolWorker-6 says that mul(4, 7) = 28                  </span><br><span class="line">SpawnPoolWorker-7 says that mul(5, 7) = 35                  </span><br><span class="line">SpawnPoolWorker-4 says that mul(6, 7) = 42                  </span><br><span class="line">SpawnPoolWorker-2 says that mul(7, 7) = 49                  </span><br><span class="line">SpawnPoolWorker-8 says that mul(8, 7) = 56                  </span><br><span class="line">SpawnPoolWorker-8 says that mul(9, 7) = 63                  </span><br><span class="line">SpawnPoolWorker-1 says that plus(0, 8) = 8                  </span><br><span class="line">SpawnPoolWorker-8 says that plus(1, 8) = 9                  </span><br><span class="line">SpawnPoolWorker-4 says that plus(2, 8) = 10                 </span><br><span class="line">SpawnPoolWorker-8 says that plus(3, 8) = 11                 </span><br><span class="line">SpawnPoolWorker-5 says that plus(4, 8) = 12                 </span><br><span class="line">SpawnPoolWorker-7 says that plus(5, 8) = 13                 </span><br><span class="line">SpawnPoolWorker-3 says that plus(6, 8) = 14                 </span><br><span class="line">SpawnPoolWorker-6 says that plus(7, 8) = 15                 </span><br><span class="line">SpawnPoolWorker-1 says that plus(8, 8) = 16                 </span><br><span class="line">SpawnPoolWorker-1 says that plus(9, 8) = 17 </span><br></pre></td></tr></table></figure><ul><li>使用回调函数<code>callback</code>获取进程的返回值</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">on_success</span>(<span class="params">res</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;on_success: &#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(res))</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">on_error</span>(<span class="params">e</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;on_error: &#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(e))</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    pool = mp.Pool(os.cpu_count())</span><br><span class="line">    [pool.apply_async(calculate, t, callback=on_success,</span><br><span class="line">                      error_callback=on_error) <span class="keyword">for</span> t <span class="keyword">in</span> TASKS]</span><br><span class="line">    pool.close()</span><br><span class="line">    pool.join()</span><br></pre></td></tr></table></figure><p><strong>输出：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">on_success: SpawnPoolWorker-7 says that mul(4, 7) = 28      </span><br><span class="line">on_success: SpawnPoolWorker-5 says that mul(6, 7) = 42      </span><br><span class="line">on_success: SpawnPoolWorker-1 says that mul(0, 7) = 0       </span><br><span class="line">on_success: SpawnPoolWorker-2 says that mul(3, 7) = 21      </span><br><span class="line">on_success: SpawnPoolWorker-6 says that mul(5, 7) = 35      </span><br><span class="line">on_success: SpawnPoolWorker-3 says that mul(1, 7) = 7       </span><br><span class="line">on_success: SpawnPoolWorker-7 says that mul(8, 7) = 56      </span><br><span class="line">on_success: SpawnPoolWorker-5 says that mul(9, 7) = 63      </span><br><span class="line">on_success: SpawnPoolWorker-6 says that plus(2, 8) = 10     </span><br><span class="line">on_success: SpawnPoolWorker-4 says that mul(2, 7) = 14      </span><br><span class="line">on_success: SpawnPoolWorker-6 says that plus(6, 8) = 14     </span><br><span class="line">on_success: SpawnPoolWorker-8 says that mul(7, 7) = 49      </span><br><span class="line">on_success: SpawnPoolWorker-1 says that plus(0, 8) = 8      </span><br><span class="line">on_success: SpawnPoolWorker-3 says that plus(3, 8) = 11     </span><br><span class="line">on_success: SpawnPoolWorker-7 says that plus(4, 8) = 12     </span><br><span class="line">on_success: SpawnPoolWorker-8 says that plus(9, 8) = 17     </span><br><span class="line">on_success: SpawnPoolWorker-2 says that plus(1, 8) = 9      </span><br><span class="line">on_success: SpawnPoolWorker-6 says that plus(8, 8) = 16     </span><br><span class="line">on_success: SpawnPoolWorker-5 says that plus(5, 8) = 13     </span><br><span class="line">on_success: SpawnPoolWorker-4 says that plus(7, 8) = 15 </span><br></pre></td></tr></table></figure><h3 id="map">map</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> multiprocessing <span class="keyword">as</span> mp</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">calculate</span>(<span class="params">func, args</span>):</span><br><span class="line">    result = func(*args)</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;%s says that %s%s = %s&#x27;</span> % (</span><br><span class="line">        mp.current_process().name,</span><br><span class="line">        func.__name__, args, result</span><br><span class="line">    )</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">calculatestar</span>(<span class="params">args</span>):</span><br><span class="line">    <span class="keyword">return</span> calculate(*args)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">mul</span>(<span class="params">a, b</span>):</span><br><span class="line">    time.sleep(<span class="number">0.5</span> * random.random())</span><br><span class="line">    <span class="keyword">return</span> a * b</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">plus</span>(<span class="params">a, b</span>):</span><br><span class="line">    time.sleep(<span class="number">0.5</span> * random.random())</span><br><span class="line">    <span class="keyword">return</span> a + b</span><br><span class="line"></span><br><span class="line">TASKS = [(mul, (i, <span class="number">7</span>)) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>)] + \</span><br><span class="line">        [(plus, (i, <span class="number">8</span>)) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>)]</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    pool = mp.Pool(os.cpu_count())</span><br><span class="line">    <span class="keyword">for</span> x <span class="keyword">in</span> pool.<span class="built_in">map</span>(calculatestar, TASKS):</span><br><span class="line">        <span class="built_in">print</span>(x)</span><br><span class="line">    pool.close()</span><br><span class="line">    pool.join()</span><br></pre></td></tr></table></figure><p><strong>输出：</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">SpawnPoolWorker-<span class="number">2</span> says that mul(<span class="number">0</span>, <span class="number">7</span>) = <span class="number">0</span>                   </span><br><span class="line">SpawnPoolWorker-<span class="number">1</span> says that mul(<span class="number">1</span>, <span class="number">7</span>) = <span class="number">7</span>                   </span><br><span class="line">SpawnPoolWorker-<span class="number">4</span> says that mul(<span class="number">2</span>, <span class="number">7</span>) = <span class="number">14</span>                  </span><br><span class="line">SpawnPoolWorker-<span class="number">3</span> says that mul(<span class="number">3</span>, <span class="number">7</span>) = <span class="number">21</span>                  </span><br><span class="line">SpawnPoolWorker-<span class="number">5</span> says that mul(<span class="number">4</span>, <span class="number">7</span>) = <span class="number">28</span>                  </span><br><span class="line">SpawnPoolWorker-<span class="number">6</span> says that mul(<span class="number">5</span>, <span class="number">7</span>) = <span class="number">35</span>                  </span><br><span class="line">SpawnPoolWorker-<span class="number">8</span> says that mul(<span class="number">6</span>, <span class="number">7</span>) = <span class="number">42</span>                  </span><br><span class="line">SpawnPoolWorker-<span class="number">7</span> says that mul(<span class="number">7</span>, <span class="number">7</span>) = <span class="number">49</span>                  </span><br><span class="line">SpawnPoolWorker-<span class="number">8</span> says that mul(<span class="number">8</span>, <span class="number">7</span>) = <span class="number">56</span>                  </span><br><span class="line">SpawnPoolWorker-<span class="number">7</span> says that mul(<span class="number">9</span>, <span class="number">7</span>) = <span class="number">63</span>                  </span><br><span class="line">SpawnPoolWorker-<span class="number">3</span> says that plus(<span class="number">0</span>, <span class="number">8</span>) = <span class="number">8</span>                  </span><br><span class="line">SpawnPoolWorker-<span class="number">6</span> says that plus(<span class="number">1</span>, <span class="number">8</span>) = <span class="number">9</span>                  </span><br><span class="line">SpawnPoolWorker-<span class="number">2</span> says that plus(<span class="number">2</span>, <span class="number">8</span>) = <span class="number">10</span>                 </span><br><span class="line">SpawnPoolWorker-<span class="number">1</span> says that plus(<span class="number">3</span>, <span class="number">8</span>) = <span class="number">11</span>                 </span><br><span class="line">SpawnPoolWorker-<span class="number">4</span> says that plus(<span class="number">4</span>, <span class="number">8</span>) = <span class="number">12</span>                 </span><br><span class="line">SpawnPoolWorker-<span class="number">8</span> says that plus(<span class="number">5</span>, <span class="number">8</span>) = <span class="number">13</span>                 </span><br><span class="line">SpawnPoolWorker-<span class="number">5</span> says that plus(<span class="number">6</span>, <span class="number">8</span>) = <span class="number">14</span>                 </span><br><span class="line">SpawnPoolWorker-<span class="number">5</span> says that plus(<span class="number">7</span>, <span class="number">8</span>) = <span class="number">15</span>                 </span><br><span class="line">SpawnPoolWorker-<span class="number">1</span> says that plus(<span class="number">8</span>, <span class="number">8</span>) = <span class="number">16</span>                 </span><br><span class="line">SpawnPoolWorker-<span class="number">8</span> says that plus(<span class="number">9</span>, <span class="number">8</span>) = <span class="number">17</span> </span><br></pre></td></tr></table></figure><h3 id="异常">异常</h3><ul><li><code>AsyncResult.get([timeout])</code>用于获取执行结果<ul><li>如果 <code>timeout</code> 不是 None 并且在 timeout 秒内仍然没有执行完得到结果，则抛出 multiprocessing.TimeoutError 异常</li><li>如果远程调用发生异常，这个异常会通过 get() 重新抛出</li></ul></li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> multiprocessing <span class="keyword">as</span> mp</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f</span>(<span class="params">x</span>):</span><br><span class="line">    <span class="keyword">return</span> <span class="number">1.0</span> / (x - <span class="number">5.0</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    pool = mp.Pool(os.cpu_count())</span><br><span class="line">    r = pool.apply_async(f, (<span class="number">5</span>,))</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># 1. 如果timeout不是None并且在timeout秒内仍然没有执行完得到结果, 则抛出</span></span><br><span class="line">        <span class="comment">#    multiprocessing.TimeoutError异常</span></span><br><span class="line">        <span class="comment"># 2. 如果远程调用发生异常, 这个异常会通过get()重新抛出。</span></span><br><span class="line">        r.get()</span><br><span class="line">    <span class="keyword">except</span> ZeroDivisionError <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(e)</span><br><span class="line">    <span class="keyword">except</span> mp.TimeoutError <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(e)</span><br><span class="line">    pool.close()</span><br><span class="line">    pool.join()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 输出:</span></span><br><span class="line"><span class="comment"># float division by zero </span></span><br></pre></td></tr></table></figure><ul><li>通过回调函数<code>on_error</code>捕获进程抛出的异常</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">on_success</span>(<span class="params">res</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;on_success: &#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(res))</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">on_error</span>(<span class="params">e</span>):</span><br><span class="line">    <span class="comment"># 捕获进程抛出的异常</span></span><br><span class="line">    <span class="keyword">assert</span> <span class="built_in">isinstance</span>(e, ZeroDivisionError)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;on_error: &#123;0&#125;&#x27;</span>.<span class="built_in">format</span>(e))</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    pool = mp.Pool(os.cpu_count())</span><br><span class="line">    r = pool.apply_async(f, (<span class="number">5</span>,), callback=on_success, error_callback=on_error)</span><br><span class="line">    pool.close()</span><br><span class="line">    pool.join()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 输出:</span></span><br><span class="line"><span class="comment"># on_error: float division by zero </span></span><br></pre></td></tr></table></figure><ul><li>捕获进程抛出的异常</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    pool = mp.Pool(os.cpu_count())</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        r = pool.<span class="built_in">map</span>(f, [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>])</span><br><span class="line">    <span class="keyword">except</span> ZeroDivisionError <span class="keyword">as</span> e:</span><br><span class="line">        <span class="built_in">print</span>(e)</span><br><span class="line">    pool.close()</span><br><span class="line">    pool.join()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 输出:</span></span><br><span class="line"><span class="comment"># float division by zero </span></span><br></pre></td></tr></table></figure><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">通过多线程、多进程以及异步方案更高效使用python</summary>
    
    
    
    <category term="编程学习" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Python" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/Python/"/>
    
    
    <category term="编程学习" scheme="https://6young.site/tags/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="代码效率" scheme="https://6young.site/tags/%E4%BB%A3%E7%A0%81%E6%95%88%E7%8E%87/"/>
    
    <category term="多线程" scheme="https://6young.site/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/"/>
    
    <category term="多进程" scheme="https://6young.site/tags/%E5%A4%9A%E8%BF%9B%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>【数据研发】数据仓库的一些基础知识分享</title>
    <link href="https://6young.site/blog/17295809.html"/>
    <id>https://6young.site/blog/17295809.html</id>
    <published>2024-04-29T14:41:23.000Z</published>
    <updated>2024-06-18T05:59:42.009Z</updated>
    
    <content type="html"><![CDATA[<h2 id="数据仓库">数据仓库</h2><h3 id="概念模型-逻辑模型-物理模型">概念模型、逻辑模型、物理模型</h3><p>概念模型是面向业务的，可以用E-R图进行构建，比如我们在一个水果网购的业务中，就需要考虑到需要有一个客户的实体，然后订单实体，商家实体，然后考虑这些实体之间的对应关系。</p><p>逻辑模型也是面向业务的，是在概念模型上的进一步丰富，这一步就是给各个实体添加详细的信息，比如联系人需要他的昵称、联系方式，地址等信息。就是把概念模型中的实体抽象为一个个数据表。</p><p>最后的物理模型是面向技术实现层面的，我们需要考虑各个字段的变量类型，具体的各个表之间的外键链接以及约束关系等等数据库实现方面的要素。</p><h3 id="数据仓库的主要特征">数据仓库的主要特征</h3><p>数据仓库是面向主题的（Subject-Oriented ）、集成的（Integrated）、稳定的（Non-Volatile）和时变的（Time-Variant ）数据集合，面向数据分析，用以支持管理决策。</p><ol><li><p>主题性：不同于传统数据库对应于某一个或多个项目，数据仓库根据使用者实际需求，将不同数据源的数据在一个较高的抽象层次上做整合，所有数据都围绕某一主题来组织。</p></li><li><p>集成性：数据仓库中存储的数据是来源于多个数据源的集成，原始数据来自不同的数据源，存储方式各不相同。要整合成为最终的数据集合，需要从数据源经过一系列抽取、清洗、转换的过程。</p></li><li><p>稳定性：数据仓库中保存的数据是一系列历史快照，不允许被修改。用户只能通过分析工具进行查询和分析。这里说明一点，数据仓库基本上是不许允许用户进行修改，删除操作的。大多数的场景是用来查询分析数据。</p></li><li><p>时变性：数据仓库会定期接新的集成数据，反应出最新的数据变化。这和稳定特点并不矛盾。</p></li></ol><h3 id="数据仓库和数据库的区别？">数据仓库和数据库的区别？</h3><p>从目标、用途、设计来说</p><ol><li>数据库是面向事务处理的，数据是由日常的业务产生的，并且是频繁更新的；数据仓库是面向主题的，数据来源多样化，经过一定的规则转换得到的，用于分析和决策。</li><li>数据库一般用来存储当前事务性数据，如交易数据；数据仓库一般存储的是历史数据，用于对数据进行分析。</li><li>数据库设计一般符合三范式，有最大的精确度和最小的冗余度，有利于数据的插入；数据仓库设计一般不符合三范式，有利于查询。</li></ol><p><strong>数据库与数据仓库的区别本质是 OLTP 与 OLAP 的区别。</strong></p><p>数据仓库的出现，并不是要取代数据库。数据库是面向事务的设计，数据仓库是面向主题设计的。数据库一般存储业务数据，数据仓库存储的一般是历史数据。</p><p>数据库设计是尽量避免冗余，一般针对某一业务应用进行设计，比如一张简单的User表，记录用户名、密码等简单数据即可，符合业务应用，但是不符合分析。<strong>数据仓库在设计是有意引入冗余，依照分析需求，分析维度、分析指标进行设计</strong>。</p><p><strong>数据库是为捕获数据而设计，数据仓库是为分析数据而设计</strong>。<strong>数据仓库，是在数据库已经大量存在的情况下，为了进一步挖掘数据资源、为了决策需要而产生的，它决不是所谓的“大型数据库”</strong>。</p><h3 id="数据仓库最重要的是什么">数据仓库最重要的是什么</h3><p>个人认为是数据集成和数据质量</p><p>企业的数据通常存储在多个异构数据库中，要进行分析，必须对数据进行一致性整合，整合后才能对数据进行分析挖掘出潜在的价值；</p><p>数据质量必须有保障，数据质量不过关，别人怎么会使用你的数据？</p><h3 id="为什么要进行数据仓库建模">为什么要进行数据仓库建模</h3><ul><li>性能：良好的模型能帮我们快速查询需要的数据，减少数据的IO吞吐</li><li>成本：减少数据冗余、计算结果复用、从而降低存储和计算成本</li><li>效率：改善用户使用数据的体验，提高使用数据的效率</li><li>改善统计口径的不一致性，减少数据计算错误的可能性</li></ul><h3 id="如何控制数据质量">如何控制数据质量</h3><ol><li>校验机制，每天对比数据量，比如count(*)，早发现，早修复</li><li>数据内容的比对，抽样对比</li><li>复盘、每月做一次全量</li></ol><h2 id="元数据">元数据</h2><h3 id="怎么理解元数据">怎么理解元数据</h3><p><strong>狭义来讲</strong>，元数据就用来描述数据的数据。</p><p><strong>广义来讲</strong>，除了业务逻辑直接读写处理的业务数据，所有其他用来维护整个系统运转所需要的数据，都可以认为是元数据。</p><p>在数仓中，元数据可以帮助数仓人员方便找到他们所关系的数据，是描述数仓内部数据的结构和建立方法的数据。按照用途可分为：技术元数据、业务员数据</p><p><strong>技术元数据</strong>：存储关于数据仓库技术细节的数据，用于开发和管理数仓使用的数据<br>**业务元数据：**从业务角度描述了数据仓库中的数据，提供介于使用者和实际系统之间的语义层，使不懂计算机技术的业务人员也能读懂数仓中的数据</p><h3 id="四种常见模型">四种常见模型</h3><h4 id="维度模型">维度模型</h4><ol><li><p>星型模型：星型模型主要是维表和事实表，以事实表为中心，所有维度直接关联在事实表上，呈星型分布。</p><p><img src="/blog/17295809/v2-cc9cdd88164936bfe9fee1ec44082b44_1440w.png" alt="img"></p></li><li><p>雪花模型：雪花模型，在星型模型的基础上，维度表上又关联了其他维度表。这种模型维护成本高，性能方面也较差，所以一般不建议使用。</p><p><img src="/blog/17295809/v2-d7010b818337c5cb187d3763fe94220c_1440w.png" alt="img"></p></li><li><p>星座模型：星座模型是很多数据仓库的常态，因为很多数据仓库都是多个事实表的。所以星座模型只反映是否有多个事实表，他们之间是否共享一些维度表<img src="/blog/17295809/v2-6d56daa85cf4d55958dd3416e2893a71_1440w.webp" alt="img"></p></li></ol><h4 id="范式模型">范式模型</h4><ul><li><p>从全企业的高度设计一个3NF模型，用实体加关系描述的数据模型描述企业业务架构，在范式理论上符合3NF。</p></li><li><p>范式化的表减少了数据冗余，数据表更新操作快、占用存储空间少。反范式的过程就是通过冗余数据来提高查询性能，但冗余数据会牺牲数据一致性。</p></li><li><p>个人感觉本质就是关系型数据库。</p></li></ul><h4 id="data-vault模型">Data Vault模型</h4><ul><li>DataVault由Hub（关键核心业务实体）、Link（关系）、Satellite（实体属性） 三部分组成 ，是Dan Linstedt发起创建的一种模型方法论，它是在ER关系模型上的衍生，同时设计的出发点也是为了实现数据的整合，并非为数据决策分析直接使用。</li></ul><h4 id="anchor模型">Anchor模型</h4><ul><li>高度可扩展的模型，所有的扩展只是添加而不是修改，因此它将模型规范到6NF，基本变成了K-V结构模型。企业很少使用。</li></ul><h2 id="olap">OLAP</h2><h3 id="olap-oltp">OLAP&amp;OLTP</h3><p>联机事务处理 OLTP（On-Line Transaction Processing，），也可以称面向交易的处理系统，它是针对具体业务在数据库联机的日常操作，通常对少数记录进行查询、修改。<strong>用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题</strong>。传统的数据库系统作为数据管理的主要手段，主要用于操作型处理，像Mysql，Oracle等关系型数据库一般属于OLTP。</p><p>分析型处理，叫联机分析处理 OLAP（On-Line Analytical Processing）一般针对某些主题的历史数据进行分析，支持管理决策。</p><h3 id="olap的操作">OLAP的操作</h3><p><img src="/blog/17295809/olap.jpg" alt="olap"></p><h3 id="维度建模过程">维度建模过程</h3><p><strong>1、选择业务过程</strong></p><p>维度建模是紧贴业务的，所以必须以业务为根基进行建模，那么选择业务过程，顾名思义就是在整个业务流程中选取我们需要建模的业务，根据运营提供的需求及日后的易扩展性等进行选择业务。比如商城，整个商城流程分为商家端，用户端，平台端，运营需求是总订单量，订单人数，及用户的购买情况等，我们选择业务过程就选择用户端的数据，商家及平台端暂不考虑。业务选择非常重要，因为后面所有的步骤都是基于此业务数据展开的。</p><p><strong>2、声明粒度</strong></p><p>先举个例子：对于用户来说，一个用户有一个身份证号，一个户籍地址，多个手机号，多张银行卡，那么与用户粒度相同的粒度属性有身份证粒度，户籍地址粒度，比用户粒度更细的粒度有手机号粒度，银行卡粒度，存在一对一的关系就是相同粒度。为什么要提相同粒度呢，因为维度建模中要求我们，在<strong>同一事实表</strong>中，必须具有<strong>相同的粒度</strong>，同一事实表中不要混用多种不同的粒度，不同的粒度数据建立不同的事实表。并且从给定的业务过程获取数据时，强烈建议从关注原子粒度开始设计，也就是从最细粒度开始，因为原子粒度能够承受无法预期的用户查询。但是上卷汇总粒度对查询性能的提升很重要的，所以对于有明确需求的数据，我们建立针对需求的上卷汇总粒度，对需求不明朗的数据我们建立原子粒度。</p><p><strong>3、确认维度</strong></p><p>维度表是作为业务分析的入口和描述性标识，所以也被称为数据仓库的“灵魂”。在一堆的数据中怎么确认哪些是维度属性呢，如果该列是对具体值的描述，是一个文本或常量，某一约束和行标识的参与者，此时该属性往往是维度属性，数仓工具箱中告诉我们<strong>牢牢掌握事实表的粒度，就能将所有可能存在的维度区分开</strong>，并且要<strong>确保维度表中不能出现重复数据，应使维度主键唯一</strong></p><p><strong>4、确认事实</strong></p><p>事实表是用来度量的，基本上都以数量值表示，事实表中的每行对应一个度量，每行中的数据是一个特定级别的细节数据，称为粒度。维度建模的核心原则之一<strong>是同一事实表中的所有度量必须具有相同的粒度</strong>。这样能确保不会出现重复计算度量的问题。有时候往往不能确定该列数据是事实属性还是维度属性。记住<strong>最实用的事实就是数值类型和可加类事实</strong>。所以可以通过分析该列是否是一种包含多个值并作为计算的参与者的度量，这种情况下该列往往是事实。</p><h2 id="数据仓库之etl">数据仓库之ETL</h2><p>建立OLAP应用之前，我们要想办法把各个独立系统的数据抽取出来，经过一定的转换和过滤，存放到一个集中的地方，成为数据仓库。这个抽取，转换，加载的过程叫ETL（Extract， Transform，Load），目的是将企业中分散、零乱、标准不统一的数据整合到一起。</p><ol><li><p>抽取</p><p>抽取的数据源分为结构化数据、非结构化数据，半结构化数据。结构化一般采用JDBC、数据库日志方式，非结构或半结构化数据会建通文件变动。</p><p>抽取方式：<strong>全量抽取</strong>：适用于数据量小且不容易判断其数据发生改变的诸如关系表，维度表，配置表等，一般用于初始化数据。<strong>增量抽取</strong>：适用于数据量大，为了节省抽取时间而采用的抽取策略，一般用于数据更新</p></li><li><p>清洗</p><p>空值处理：将空值替换为特定值或直接过滤掉</p><p>验证数据正确性：把不符合业务含义的数据做统一处理</p><p>规范数据格式：比如把所有日期都规范成YYYY-MM-DD的格式</p><p>数据转码：把一个源数据中用编码表示的字段通过关联编码表转换成代表其真实意义的值</p><p>数据标准统一：比如在源数据中表示男女的方式有很多种，在抽取的时候直接根据模型中定义的值做转化。（主要是针对非结构化或半结构化数据）</p></li><li><p>转换和加载</p><p>转换：用ODS中的增量或者全量数据来刷新DW中的表</p><p>加载：每insert数据到一张表都可以称为数据加载，就是将处理完的数据导入到对应的目标源里</p></li></ol><h2 id="全量同步与增量同步">全量同步与增量同步</h2><p>当一个数据需要存储多份时，会出现一致性问题，所以就需要进行同步与备份，根据备份时的目标数据，我们可以分为<strong>增量</strong>和全量，以及结合两者优缺点的一个折中方案——<strong>差异</strong>备份。</p><p><img src="/blog/17295809/v2-5ed717a8550a7db7efc28d93d2fafc4c_1440w.png" alt="img"></p><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">数据仓库的相关基础知识</summary>
    
    
    
    <category term="知识分享" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/"/>
    
    <category term="数据研发" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E6%95%B0%E6%8D%AE%E7%A0%94%E5%8F%91/"/>
    
    
    <category term="数据分析" scheme="https://6young.site/tags/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/"/>
    
    <category term="互联网" scheme="https://6young.site/tags/%E4%BA%92%E8%81%94%E7%BD%91/"/>
    
    <category term="数据仓库" scheme="https://6young.site/tags/%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93/"/>
    
  </entry>
  
  <entry>
    <title>【奇思妙想】如何理解财务指标的倒数与能否倒数</title>
    <link href="https://6young.site/blog/4754b2ac.html"/>
    <id>https://6young.site/blog/4754b2ac.html</id>
    <published>2024-04-22T22:41:23.000Z</published>
    <updated>2024-06-18T05:59:42.001Z</updated>
    
    <content type="html"><![CDATA[<h2 id="取倒数的问题">取倒数的问题</h2><p>在我们计算因子时，有时可能会用到倒数的操作。可能是为了将其作为一个希望越小越好的权重，又或者是希望反转这个因子的方向，但又不想让因子出现负值。但是操作过程中能随便用<code>倒数</code>吗？</p><img src="/blog/4754b2ac/image-20240422094510939.png" alt="image-20240422094510939" style="zoom:50%;"><p>如果此时的因子值都是正数，那当然没有问题。采取倒数操作后，因子值的方向完全反过来，且不会出现负数的情况。具体从函数概念来说，当<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>&gt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x&gt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>时，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mfrac><mn>1</mn><mi>x</mi></mfrac></mrow><annotation encoding="application/x-tex">y=\frac 1x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>为减函数。</p><p>但是因子值有负数时，情况就大不相同了。</p><p>考虑一个简单的序列<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>3</mn><mo separator="true">,</mo><mo>−</mo><mn>2</mn><mo separator="true">,</mo><mo>−</mo><mn>1</mn><mo separator="true">,</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">-3,-2,-1,1,2,3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">−</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">3</span></span></span></span>，将他们分别取倒数，就可以得到：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mfrac><mn>1</mn><mn>3</mn></mfrac><mo separator="true">,</mo><mo>−</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mo separator="true">,</mo><mo>−</mo><mn>1</mn><mo separator="true">,</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">-\frac13,-\frac12,-1,1,2,3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">3</span></span></span></span>。问题出现了，负数部分的大小顺序反了，正确的顺序应该是：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn><mo separator="true">,</mo><mo>−</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mo separator="true">,</mo><mo>−</mo><mfrac><mn>1</mn><mn>3</mn></mfrac><mo separator="true">,</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">-1,-\frac12,-\frac13,1,2,3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">3</span></span></span></span>。从函数角度说，当<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>&gt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x&gt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>或<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>&lt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x&lt;0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>时，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mfrac><mn>1</mn><mi>x</mi></mfrac></mrow><annotation encoding="application/x-tex">y=\frac 1x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>为减函数，但是整体来看，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mfrac><mn>1</mn><mi>x</mi></mfrac></mrow><annotation encoding="application/x-tex">y=\frac 1x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>却不是一个减函数。</p><p>所以，如果随便的取倒数，就会造成因子顺序发生变化。而对一个因子来说，顺序无疑是重要的，不管是计算<code>Rank-IC</code>还是计算分组收益率，乃至最终根据因子进行选股，都需要从因子顺序入手，对其具体取值的关心比较少。</p><h3 id="取倒数的合格案例">取倒数的合格案例</h3><p>考虑一对常见的因子指标：EP与PE，其中：</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>P</mi><mo>=</mo><mi>E</mi><mi mathvariant="normal">/</mi><mi>P</mi></mrow><annotation encoding="application/x-tex">EP=E/P</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mord">/</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span></span></span></span>是盈利收益率，是将公司净利润对市值进行归一化调整后的盈利指标。对于这个指标P一定为正数，E可能为任何数，单纯考虑这个指标，当然盈利越高的股票未来上涨可能性越大，反之下跌可能性越大。也就是EP越大越好，因子值与股票的预期收益是正相关的。</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mi>E</mi><mo>=</mo><mi>P</mi><mi mathvariant="normal">/</mi><mi>E</mi></mrow><annotation encoding="application/x-tex">PE=P/E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord">/</span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span></span></span></span>是市盈率，是使用公司市值除以公司净利润，代表投资者收回投资的预期时长。同样的，对于这个指标P一定为正数，E可能为任何数。当E为正数时，PE显然越小越好，因为这代表着投资者能以较短的时间收回投资，大家就会更愿意投资这家公司。当E为负数，PE的绝对值就代表投资者亏完全部投资的预期时长，此时投资者自然希望PE的绝对值越大越好，也就是同样偏好PE小的公司。整体来看，PE值与股票预期收益都是负相关的。</p><p>虽然倒数会导致因子序列的位序变化，但是深挖其背后金融逻辑，还是合理的。因此对于PE和EP来说，是可以直接通过倒数计算，因为其拥有各自的金融逻辑，而其他因子能否计算倒数就需要详细讨论了。</p><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">在因子计算过程中突然想到的问题</summary>
    
    
    
    <category term="量化金融" scheme="https://6young.site/categories/%E9%87%8F%E5%8C%96%E9%87%91%E8%9E%8D/"/>
    
    
    <category term="因子计算" scheme="https://6young.site/tags/%E5%9B%A0%E5%AD%90%E8%AE%A1%E7%AE%97/"/>
    
    <category term="量化金融" scheme="https://6young.site/tags/%E9%87%8F%E5%8C%96%E9%87%91%E8%9E%8D/"/>
    
    <category term="因子逻辑" scheme="https://6young.site/tags/%E5%9B%A0%E5%AD%90%E9%80%BB%E8%BE%91/"/>
    
    <category term="市盈率" scheme="https://6young.site/tags/%E5%B8%82%E7%9B%88%E7%8E%87/"/>
    
  </entry>
  
  <entry>
    <title>【金融知识】投资学知识要点回顾整理（五）</title>
    <link href="https://6young.site/blog/b3f747d6.html"/>
    <id>https://6young.site/blog/b3f747d6.html</id>
    <published>2024-04-20T11:48:23.000Z</published>
    <updated>2024-06-18T05:59:42.105Z</updated>
    
    <content type="html"><![CDATA[<h2 id="利率风险">利率风险</h2><p>利率风险用以描述债券价格在收益率变化时的变化情况，可以通过绘制不同特征的债券价格变化率随利率变化情况的图来进行分析。</p><p><img src="/blog/b3f747d6/image-20240419234133817.png" alt="image-20240419234133817"></p><ol><li>具体的，当收益升高时，债券价格下跌；当收益下降时，债券价格上升。</li><li>债券的到期收益率升高导致其价格变化的幅度小于等规模的收益率下降导致其价格变化的幅度。</li><li>长期债券价格对利率变化的敏感性比短期债券高。</li><li>当债券期限增加时，债券价格对收益率变化的敏感性增加，但增速递减。</li><li>利率风险和票面利率成反比，低票面利率债券的价格比高票面利率债券的价格对利率更敏感。</li><li>债券价格对其收益率变化的敏感性与当期出售债券的到期收益率成反比，也就是当前债券的YTM低，则他的价格对YTM变化更加敏感。</li></ol><h2 id="利率风险指标">利率风险指标</h2><p>债券定价是通过未来现金流贴现实现的，对债券价格公式进行泰勒展开：</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲p(y) &amp;= \sum\l…">\begin{align}p(y) &amp;= \sum\limits_{t=1}^TCF_t(1+y)^{-t} \\\\p(y) &amp;= p(y_0) + \frac{dp}{dy}(y-y_0) + \frac12 \frac{d^2p}{dy^2}(y-y_0)^2 + o(y^2)\\\\\end{align}</p><p>其中，p对y的前两阶导数分别为：</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲\frac{dp}{dy} …">\begin{align}\frac{dp}{dy} &amp;= \sum\limits_{t=1}^T-tCF_t(1+y)^{-t-1} = -\sum\limits_{t=1}^T\frac{tCF_t}{(1+y)^{t+1}} \\\\\frac{d^2p}{dy^2} &amp;= \sum\limits_{t=1}^Tt(t+1)CF_t(1+y)^{-t-2} = \sum\limits_{t=1}^T\frac{t(t+1)CF_t}{(1+y)^{t+2}}\end{align}</p><p>所以可以进一步计算：</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲p(y) - p(y_0) …">\begin{align}p(y) - p(y_0) &amp;= -\sum\limits_{t=1}^T\frac{tCF_t}{(1+y)^{t+1}}(y-y_0) + \frac{1}{2}\sum\limits_{t=1}^T\frac{t(t+1)CF_t}{(1+y)^{t+2}}(y-y_0)+ o(y^2)\\\\ &amp;=   -\frac{p}{1+y}\frac{\sum\limits_{t=1}^T\frac{tCF_t}{(1+y)^{t}}}{p}(y-y_0) + \frac{1}{2}\frac{p}{(1+y)^2}\frac{\sum\limits_{t=1}^T\frac{t(t+1)CF_t}{(1+y)^{t}}}{p}(y-y_0)+ o(y^2)\end{align}</p><p>最终得到：</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲\frac{\Delta p…">\begin{align}\frac{\Delta p}{p}  &amp;=   -\frac{1}{1+y}\frac{\sum\limits_{t=1}^T\frac{tCF_t}{(1+y)^{t}}}{p}\Delta y + \frac{1}{2}\frac{1}{(1+y)^2}\frac{\sum\limits_{t=1}^T\frac{t(t+1)CF_t}{(1+y)^{t}}}{p}\Delta y+ o(y^2) \end{align}</p><p>在这里，我们就可以忽略最后的二阶无穷小量，并定义两个重要的利率风险指标：久期<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi></mrow><annotation encoding="application/x-tex">D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span></span></span></span>和凸性<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi></mrow><annotation encoding="application/x-tex">C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span></span></span></span>，原式可以进一步化简：</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲D &amp;= \frac{\su…">\begin{align}D &amp;= \frac{\sum\limits_{t=1}^T\frac{tCF_t}{(1+y)^{t}}}{p} \\\\C &amp;= \frac{\sum\limits_{t=1}^T\frac{t(t+1)CF_t}{(1+y)^{t}}}{p(1+y)^2}\\\\\frac{\Delta p}{p} &amp;= -\frac{D}{1+y}\Delta y + \frac{1}{2}C\Delta y^2\\\\\end{align}</p><h2 id="久期-duration">久期（Duration）</h2><p>久期是什么？</p><ul><li>久期用于解决债券多次支付的“期限”如何定义的问题。</li><li>久期用于测度债券发生现金流的平均期限。</li><li>久期用于测量债券价格对利率变化的敏感性。</li></ul><p>通常用麦考利久期来计算，等于债券每次息票或本金支付时间的加权平均。同时，为了让公式更简短，定义了修正久期<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>D</mi><mo>∗</mo></msup></mrow><annotation encoding="application/x-tex">D^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.688696em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.688696em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span></span></span></span>，当y很小时，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi></mrow><annotation encoding="application/x-tex">D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span></span></span></span>与<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>D</mi><mo>∗</mo></msup></mrow><annotation encoding="application/x-tex">D^*</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.688696em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.688696em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mbin mtight">∗</span></span></span></span></span></span></span></span></span></span></span>近似相等。</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲D &amp;= \frac{\su…">\begin{align}D &amp;= \frac{\sum\limits_{t=1}^T\frac{t\*CF_t}{(1+y)^{t}}}{\sum\limits_{t=1}^T\frac{CF_t}{(1+y)^{t}}} \\\\\frac{dp/p}{dy} &amp;= -\frac{1}{1+y}D \\\\-\frac{D}{1+y} &amp;= -D^\*\end{align}</p><p>从<strong>久期定义</strong>公式，我们可以明确：</p><ul><li><p>债券价格的利率敏感性通常随其债券期限的增加而增加。</p></li><li><p>当利率变化时，债券价格的变化率与其到期收益率的变化之间关系为：债券价格的变化率等于债券久期乘以（1+债券收益率）的变化率。</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲\Delta y &amp;= \D…">\begin{align}\Delta y &amp;= \Delta (1+y) \\\\\frac{\Delta p}{p} &amp;= -D\frac{\Delta(1+y)}{1+y}\end{align}</p></li></ul><p><strong>修正久期</strong>：</p><ul><li>债券的价格的变化率与修正久期成比例。</li><li>修正久期可以用来测度债券在利率变化时的风险敞口。</li><li>相同久期的债券利率敏感性相同，并且价格变化百分比等于修正久期乘以收益率的变化。</li></ul><p>通过学者们的研究，发现久期有以下的一些<strong>规律</strong>：</p><ul><li>零息债券的久期等于它的到期时间，息票债券比相同期限零息债券的久期短</li><li>到期时间不变，当息票利率较高时，债券久期较短</li><li>如果票面利率不变，债券久期通常会随着期限增加而增加</li><li>保持其他因素不变，当债券到期收益率较低时，息票债券的久期较长</li><li>终身年金的久期为$(1+y) / y  $</li></ul><p>很容易理解，随着债券的票息提高，我们越能提前收回本金，也就意味这久期变小。而期限增加后，我们收回最后一期本金的时间延后，久期变长。</p><p><img src="/blog/b3f747d6/image-20240420104822592.png" alt="image-20240420104822592"></p><h2 id="凸性-convexity">凸性（Convexity）</h2><p>作为利率敏感性的度量方式，久期仅仅是利率关于债券价格的一阶影响，事实上两者的关系是非线性的，还有更高阶的因素影响。而利率关于债券价格的二阶影响就是凸性。</p><p><img src="/blog/b3f747d6/image-20240420110732035.png" alt="image-20240420110732035"></p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲C &amp;= \frac{\su…">\begin{align}C &amp;= \frac{\sum\limits_{t=1}^T\frac{t*(t+1)*CF_t}{(1+y)^{t}}}{p(1+y)^2} \\\\\frac{\Delta p}{p} &amp;= -D\Delta y+\frac{1}{2}C(\Delta y)^2\end{align}</p><p>凸性如何描述利率风险？</p><ul><li>凸性大的债券价格在利率下降时的价格上升大于在利率上涨时的价格下跌。</li></ul><p>这一不对称是具有吸引力的，因为如果利率不稳定，债券A从利率下降中得到更多的好处，而从利率上升中损失较少。因此，<strong>凸性较大的债券，价格较高，到期收益率较低。</strong></p><h3 id="可赎回债券的久期和凸性">可赎回债券的久期和凸性</h3><h4 id="特征">特征</h4><p>可赎回债券的价格-收益曲线</p><ul><li>利率较高时，曲线为凸，价格-收益曲线位于切线之上</li><li>利率下降时，债券价格有一个上限，不会超过其赎回价格，价格-收益曲线位于切线之下（债券具有负凸性）</li></ul><p><img src="/blog/b3f747d6/image-20240420112037604.png" alt="image-20240420112037604"></p><ul><li>当债券价格位于负凸性区域，价格-收益曲线表现出不具吸引力的非对称性，也就是对于同样的变化幅度，利率上升引起的价格下跌幅度大于利率下降引起的价格上涨幅度</li></ul><h4 id="计算">计算</h4><p>由于可赎回债券事实上是一种“嵌入期权债券”，由于期权的存在，我们无法对未来现金流支付的时间进行加权平均，不能用麦考利久期进行分析。因此为了度量可赎回债券的久期，设计了“有效久期”这一概念，也就是债券价格变化率与市场利率变化量之比。</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mi>f</mi><mi>f</mi><mi>e</mi><mi>c</mi><mi>t</mi><mi>i</mi><mi>v</mi><mi>e</mi><mtext> </mtext><mi>D</mi><mi>u</mi><mi>r</mi><mi>a</mi><mi>t</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo>=</mo><mfrac><mrow><mi mathvariant="normal">Δ</mi><mi>P</mi><mi mathvariant="normal">/</mi><mi>P</mi></mrow><mrow><mi mathvariant="normal">Δ</mi><mi>r</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">Effective \ Duration = \frac{\Delta P / P}{\Delta r}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mord mathdefault">e</span><span class="mord mathdefault">c</span><span class="mord mathdefault">t</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span><span class="mord mathdefault">e</span><span class="mspace"> </span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">a</span><span class="mord mathdefault">t</span><span class="mord mathdefault">i</span><span class="mord mathdefault">o</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.113em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">Δ</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">Δ</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord">/</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>用一个例题来说明会更加清楚：</p><ul><li><p>假设可赎回债券的赎回价格为1050美元，今天的售价为980美元。如果收益率曲线上移0.5%，债券价格将下降至930美元。如果收益率曲线下移0.5%，债券价格将上升至1010美元。请计算有效久期。</p></li><li><p>∆r=假定的利率增加-假定的利率减少=0.5%-(-0.5%)=1%=0.01</p></li><li><p>∆P=利率增加0.5%时的价格-利率减少0.5%时的价格=930美元-1010美元=-80美元</p></li><li><p>债券有效久期=-（-80/980） / 0.01 = 8.16年</p></li></ul><h2 id="消极债券管理">消极债券管理</h2><p>消极债券管理者认为债券定价是合理的</p><p>两种常用的消极管理策略（处理风险敞口的方式不同）</p><ol><li><strong>指数策略</strong>：复制既定债券指数的业绩，此时债券指数资产组合的风险-回报将和与之联系的债券市场指数的风险-回报状况相当。</li><li><strong>免疫策略</strong>：广泛应用于金融机构（如保险公司和养老基金），用于规避金融头寸的利率波动风险，通过建立一种几乎是零风险的资产组合，其中利率变动对公司价值无任何影响。</li></ol><h3 id="指数策略">指数策略</h3><p>对于指数策略，存在着诸多问题：</p><ol><li>指数包含数千只债券，按市值比重购买困难</li><li>很多债券的交易量很小</li><li>再平衡问题，因为用于计算债券指数的证券不断变化</li><li>大量利息收入的再投资问题</li></ol><h3 id="免疫策略">免疫策略</h3><p>免疫策略是用于使整个金融资产免受利率风险影响的策略，在银行与养老基金中广泛使用，因为：</p><ul><li>银行和储蓄机构在资产和负债的期限结构上存在天然的不匹配：银行的负债为客户存款，期限短，久期短；银行资产主要由未偿还的商业和个人贷款或按揭贷款构成，久期长于存款。</li><li>基金所持有的利率敏感性资产与其债务——对养老退休人员的支付之间存在不匹配。</li></ul><p>固定收益投资者面临两种相互抵消的利率风险类型：价格风险和再投资利率风险，如果资产组合的久期选择合适，以上两种影响正好相互抵消。</p><ul><li>价格风险：利率提高会导致资本损失</li><li>再投资利率风险：利率提高会导致再投资收入会增加</li></ul><p>因此，通过调整资产，持有久期匹配的资产和负债可以使得资产组合免受利率波动的影响。</p><p>同样用一个例题来理解：</p><ul><li>一家保险公司在7年后需要支付19487美元。市场利率是10%（即债务的现值是10000元）。公司的资产组合经理想用3年期零息债券和年付息一次的终身年金来兑现负债。经理该如何使债务免疫？</li><li>计算债务的久期： 一次性支付的7年期负债，所以<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mi>d</mi></msub><mo>=</mo><mn>7</mn></mrow><annotation encoding="application/x-tex">D_d = 7</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">d</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">7</span></span></span></span></li><li>零息债券的久期<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mi>z</mi></msub><mo>=</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">D_z=3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.04398em;">z</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">3</span></span></span></span>，终身年金的久期<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mi>y</mi></msub><mo>=</mo><mn>1.1</mn><mi mathvariant="normal">/</mi><mn>0.1</mn><mo>=</mo><mn>11</mn></mrow><annotation encoding="application/x-tex">D_y=1.1/0.1=11</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mord">.</span><span class="mord">1</span><span class="mord">/</span><span class="mord">0</span><span class="mord">.</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">1</span></span></span></span>，假设持有零息债券比例为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span></span></span></span>，那么有：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi><msub><mi>D</mi><mi>z</mi></msub><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>w</mi><mo stretchy="false">)</mo><msub><mi>D</mi><mi>y</mi></msub><mo>=</mo><msub><mi>D</mi><mi>d</mi></msub></mrow><annotation encoding="application/x-tex">wD_z + (1-w)D_y = D_d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.04398em;">z</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mclose">)</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">d</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，得到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi><mo>=</mo><mn>0.5</mn></mrow><annotation encoding="application/x-tex">w=0.5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">5</span></span></span></span></li><li>所以，应该购买5000美元的零息债券，以及5000美元的年金。</li></ul><h4 id="利率免疫方法的局限性">利率免疫方法的局限性</h4><ol><li>**不准确问题，需要不断地再平衡。**当然，如果只选择期限合适的零息票债券或息票债券确保每一期的现金流与需支付的债务流相配合，问题就解决了（量身定作策略），但实际上，难以找到期限合适的债券。</li><li>**在较严重的通货膨胀情况下，利率免疫方法是无能为力的。**尽管免疫安排可以确保现值或到期支付额的足额发放，但不能保证足额的货币具有相同的购买力。</li></ol><h2 id="积极债券管理">积极债券管理</h2><ol><li>预测利率水平的变化情况，根据利率可能上升或下降的前景决定是更多地持有短期还是长期债券，即是缩短债券资产组合的久期还是延长其久期。如果预计利率下降，将增加投资组合的久期，反之亦然。</li><li>在市场中寻找被低估的债券进行投资，被低估的债券有如下几种情况：<ol><li>市场中有两种条件相同的债券，它们的到期收益率不同。</li><li>市场中有两种条件不同的债券，它们之间有利差。</li><li>通常长期债券比短期债券的利率高，可以投资于期限更长的债券以获取更高的收益。</li></ol></li><li>掉期、互换：<ol><li>**替代掉期、互换：**债券与几乎相同的替代品的互换（票面利率、期限、质量、赎回条款、偿债基金条款等）。这些同质债务若因信用评级的不准确、不对称使价格有差异，可以利用掉期套利。</li><li>**市场间价差掉期：**投资者认为在债券市场两个部门之间的利差暂时异常，可以进行套利。</li><li>**纯收益获得互换：**当收益率曲线向上倾斜时，买入长期债券，期待在高收益债券中获得期限风险溢价，投资者愿意承受该策略带来的利率风险。在这个过程中，只要收益率曲线不发生上移，则将短期债券换成长期债券会获得更高收益率，但如果上移，则长期债券会遭受到较大的资本损失。</li><li>**税收掉期 /互换：**利用税收优势的互换。</li></ol></li></ol><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">投资学的知识是金融领域最重要的基础之一，笔面试中也经常有相关知识点，将其中的知识要点复习整理一下。</summary>
    
    
    
    <category term="知识分享" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/"/>
    
    <category term="金融知识" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/"/>
    
    <category term="投资学" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/%E6%8A%95%E8%B5%84%E5%AD%A6/"/>
    
    
    <category term="投资学" scheme="https://6young.site/tags/%E6%8A%95%E8%B5%84%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>【金融知识】投资学知识要点回顾整理（四）</title>
    <link href="https://6young.site/blog/dc698291.html"/>
    <id>https://6young.site/blog/dc698291.html</id>
    <published>2024-04-19T16:44:23.000Z</published>
    <updated>2024-06-18T05:59:42.109Z</updated>
    
    <content type="html"><![CDATA[<h2 id="利率的期限结构">利率的期限结构</h2><ul><li><p>债券的到期收益率（Yield to maturity）与债券到期日（the term to maturity）之间的关系</p></li><li><p>可以用收益率曲线来直观表现：</p><ul><li>收益率和期限之间的关系图形表示</li><li>以时间和期限为要素的函数平面图</li><li>是债券估值的核心，为投资者提供判断未来利率期望值的依据</li></ul></li><li><p>四种不同形态的国债收益曲线：</p><p><img src="/blog/dc698291/image-20240419154355627.png" alt="image-20240419154355627"></p></li></ul><h2 id="债券定价">债券定价</h2><ul><li><p>我们可以将每一期债券现金流（包括利率和本金）视为独立销售的零息债券，对债券进行剥离，如果整个债券价格与各部分价格之和不相等，就出现套利机会。</p></li><li><p>面对这样一个收益率曲线，如果想要计算一个3年期、票面利率为10%、面值为1000美元的附息债券的价值，就可以通过折现的方法，并得到<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Y</mi><mi>T</mi><mi>M</mi><mo>=</mo><mn>6.88</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">YTM = 6.88\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.22222em;">Y</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">6</span><span class="mord">.</span><span class="mord">8</span><span class="mord">8</span><span class="mord">%</span></span></span></span>：</p><p><img src="/blog/dc698291/image-20240419154807249.png" alt="image-20240419154807249"></p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲\nonumberp &amp;=…">\begin{align}\nonumberp &amp;= \frac{100}{1+5\%} + \frac{100}{(1+6\%)^2} + \frac{1100}{(1+7\%)^2} = 1082.17\\\\p &amp;= \frac{100}{1+YTM} + \frac{100}{(1+YTM)^2} + \frac{1100}{(1+YTM)^2} = 1082.17\nonumber\end{align}</p></li></ul><h2 id="远期利率">远期利率</h2><ul><li><p>为了保证没有套利机会，①购买一个2年期国债②今年和明年都购买一个1年期国债。两个投资方式获得的收益应该是一样的，所以有：</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: flalign at position 7: \begin{̲f̲l̲a̲l̲i̲g̲n̲}̲\nonumber(1+y…">\begin{flalign}\nonumber(1+y_2)^2 &amp;= (1+y_1)(1+f_2)\\\\f_2 &amp;= \frac{(1+y_2)^2}{(1+y_1)}-1\nonumber\end{flalign}</p></li><li><p>进一步考虑到n期的情况：</p><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: flalign at position 7: \begin{̲f̲l̲a̲l̲i̲g̲n̲}̲\nonumber(1+y…">\begin{flalign}\nonumber(1+y_n)^n &amp;= (1+y_{n-1})(1+f_n)\\\\f_n &amp;= \frac{(1+y_n)^n}{(1+y_{n-1})^{n-1}}-1\nonumber\end{flalign}</p></li><li><p>考虑到未来利率的不确定性，下一年的期望短期收益率<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">E(r_n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>并不完全为计算出的远期利率<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">f_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，应该根据不同条件调整。</p></li></ul><h3 id="预期理论">预期理论</h3><p>以未来短期利率期望值=远期利率。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo>=</mo><msub><mi>f</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">E(r_n)=f_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><h3 id="流动性偏好理论">流动性偏好理论</h3><p>人们更加偏好流动性强的资产，也就是更加偏好短期投资，为此长期债券必须提供一定的流动性溢价才能吸引投资者。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo>&lt;</mo><msub><mi>f</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">E(r_n)&lt;f_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.10764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><p><img src="/blog/dc698291/image-20240419160941562.png" alt="image-20240419160941562"></p><ul><li>远期利率升高的两个原因<ul><li>投资者预期利率<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">E(r_n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>上升。</li><li>投资者对持有长期债券要求一个很高的溢价•</li></ul></li><li>虽然未来利率将会上升的预期确实会导致收益率曲线上升，但反过来并不成立，上升的收益率曲线本身并不意味着更高的未来收益率预期</li><li>非常陡的收益率曲线被解释为利率即将上升的警示信号</li><li>向下倾斜的收益率曲线意味着预期利率下降，经济衰退即将来临</li></ul><h3 id="市场分割理论">市场分割理论</h3><ul><li>长期债券和短期债券分别适应于不同的投资者。</li><li>长期债券和短期债券市场各自独立运行，则利率期限结构具有独立性。</li><li>各种债券的利率由各自分割市场的供求决定。</li></ul><p>该理论的解释是若较多的投资者偏好期限较短的债券，则短期债券的需求上升，拉动其价格上升，从而使短期利率下降，长期利率相对上升，收益率曲线向上倾斜；反之，若较多投资者偏好长期债券，长期利率下降，短期利率上升，收益率曲线向下倾斜；由于人民们更偏好短期利率债券，因而收益率曲线多向上倾斜。该理论缺陷在于各种债券收益率相互独立，无法解释不同期限债券收益率同向波动。</p><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">投资学的知识是金融领域最重要的基础之一，笔面试中也经常有相关知识点，将其中的知识要点复习整理一下。</summary>
    
    
    
    <category term="知识分享" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/"/>
    
    <category term="金融知识" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/"/>
    
    <category term="投资学" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/%E6%8A%95%E8%B5%84%E5%AD%A6/"/>
    
    
    <category term="投资学" scheme="https://6young.site/tags/%E6%8A%95%E8%B5%84%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>【金融知识】近代以来经济学中的主要学派与思想</title>
    <link href="https://6young.site/blog/b348f04e.html"/>
    <id>https://6young.site/blog/b348f04e.html</id>
    <published>2024-04-19T14:38:23.000Z</published>
    <updated>2024-06-18T05:59:42.117Z</updated>
    
    <content type="html"><![CDATA[<h3 id="古典经济学">古典经济学</h3><ul><li>代表人物：亚当·斯密、大卫·李嘉图、托马斯·马尔萨斯</li><li>核心思想：古典经济学派主张<strong>自由市场</strong>和<strong>市场自发调节机制</strong>。他们相信自由竞争能够促进资源的有效配置和经济增长。古典经济学派的经济学家强调<strong>个体利益与整体利益</strong>的关系。“看不见的手”</li></ul><h3 id="新古典经济学-新古典主义经济学">新古典经济学（新古典主义经济学）</h3><ul><li>代表人物：阿尔弗雷德·马歇尔</li><li>核心思想：新古典经济学派重视<strong>供求关系对价格和资源配置的影响</strong>。他们认为市场是有效的资源配置机制，企业和消费者的行为是基于<strong>边际效用和边际成本</strong>的。</li></ul><h3 id="凯恩斯主义经济学">凯恩斯主义经济学</h3><ul><li>代表人物：约翰·梅纳德·凯恩斯</li><li>核心思想：凯恩斯主义经济学派认为市场经济可能存在长期失业和经济不稳定问题。他们主张<strong>政府应该通过货币政策和财政政策来干预经济</strong>，并强调<strong>有效需求的重要性</strong>，提出了有效需求理论和辩护性支出的概念。</li></ul><h3 id="新凯恩斯主义经济学">新凯恩斯主义经济学</h3><ul><li>代表人物：约瑟夫·斯蒂格利茨 (Joseph Stiglitz)</li><li>核心思想：在<strong>凯恩斯主义基础上</strong>，更加强调<strong>市场失灵和信息不对称</strong>对经济的影响，而且企业和个人的行为受到市场预期和不确定性的影响，主张<strong>政府应该更积极地干预</strong>以纠正市场的不完美。</li></ul><h3 id="奥地利经济学">奥地利经济学</h3><ul><li>代表人物：卡尔·门格尔 (Carl Menger)、路德维希·冯·米塞斯 (Ludwig von Mises)、弗里德里希·哈耶克 (Friedrich Hayek)</li><li>核心思想：奥地利经济学派强调<strong>市场竞争和自由企业的重要性</strong>。他们反对政府过多干预经济活动，认为自由市场能够提高效率和创新，而<strong>政府干预则可能导致资源分配不当和经济不稳定</strong>。</li></ul><h3 id="马克思主义经济学">马克思主义经济学</h3><ul><li>代表人物：卡尔·马克思、弗里德里希·恩格斯</li><li>核心思想：马克思主义经济学派关注<strong>资本主义体系内部的矛盾</strong>，特别是劳动剩余价值理论和资本积累过程。认为资本主义制度会导致阶级斗争和剥削，资本主义制度内在地趋向于<strong>产生不平等</strong>和<strong>周期性的经济危机</strong>。</li></ul><h3 id="货币主义学派">货币主义学派</h3><ul><li><p>代表人物：维尔弗雷多·帕累托、弗里德里希·哈耶克</p></li><li><p>核心思想：货币主义学派认为<strong>货币供给和需求是影响经济运行和通货膨胀的主要因素</strong>。他们关注货币政策对经济的影响，强调中央银行在调控货币供给方面的作用。</p></li></ul><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">复习金融常识时，发现自己对这一部分的了解有所欠缺，便使用GPT回答学习一下~</summary>
    
    
    
    <category term="知识分享" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/"/>
    
    <category term="金融知识" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/"/>
    
    
    <category term="经济学派" scheme="https://6young.site/tags/%E7%BB%8F%E6%B5%8E%E5%AD%A6%E6%B4%BE/"/>
    
    <category term="金融知识" scheme="https://6young.site/tags/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/"/>
    
  </entry>
  
  <entry>
    <title>【金融知识】投资学知识要点回顾整理（三）</title>
    <link href="https://6young.site/blog/6b449bf4.html"/>
    <id>https://6young.site/blog/6b449bf4.html</id>
    <published>2024-04-19T00:04:23.000Z</published>
    <updated>2024-06-18T05:59:42.097Z</updated>
    
    <content type="html"><![CDATA[<h2 id="风险资产配置">风险资产配置</h2><p>现有两个金融资产，其一是普通金融资产<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">p</span></span></span></span>，另一个为无风险资产<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span></span>，在我们的投资组合中，它们分别为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>−</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">1-y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>，并由此得到投资组合<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">c</span></span></span></span>。</p><table><thead><tr><th>种类</th><th>收益率</th><th>风险</th><th>权重</th></tr></thead><tbody><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mi>f</mi></msub><mo>=</mo><mn>7</mn></mrow><annotation encoding="application/x-tex">r_f=7%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">7</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mrow><mi>r</mi><mi>f</mi></mrow></msub><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">\sigma_{rf}=0%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">r</span><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>−</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">1-y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">p</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>p</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mn>15</mn></mrow><annotation encoding="application/x-tex">E(r_p)=15%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">5</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>p</mi></msub><mo>=</mo><mn>22</mn></mrow><annotation encoding="application/x-tex">\sigma_p=22%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">2</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo>=</mo><mi>y</mi><mi>p</mi><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>y</mi><mo stretchy="false">)</mo><mi>f</mi></mrow><annotation encoding="application/x-tex">c = yp+(1-y)f</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">c</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7777700000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord mathdefault">p</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span></span></td><td></td><td></td><td></td></tr></tbody></table><h3 id="资本配置线">资本配置线</h3><p>容易得出，组合收益率为：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>c</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mi>y</mi><mo>∗</mo><msub><mi>r</mi><mi>p</mi></msub><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>y</mi><mo stretchy="false">)</mo><mo>∗</mo><msub><mi>r</mi><mi>f</mi></msub><mo>=</mo><mn>7</mn><mo>+</mo><mn>8</mn><mi>y</mi></mrow><annotation encoding="application/x-tex">E(r_c)=y*r_p+(1-y)*r_f=7+8y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.6597200000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8694379999999999em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">7</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">8</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></span></p><p>同样的，组合风险为：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>c</mi></msub><mo>=</mo><mi>y</mi><mo>∗</mo><msub><mi>σ</mi><mi>p</mi></msub><mo>=</mo><mn>22</mn><mi>y</mi></mrow><annotation encoding="application/x-tex">\sigma_c = y*\sigma_p = 22y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.6597200000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">2</span><span class="mord">2</span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></span></p><p>将二者联立起来，消去公式中的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>，就能得到，也就是在这一部分中得到的第一条线：资本配置线（Captal, Allocation Line，CAL）：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>c</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>8</mn><mn>22</mn></mfrac><msub><mi>σ</mi><mi>c</mi></msub><mo>+</mo><mn>7</mn></mrow><annotation encoding="application/x-tex">E(r_c) = \frac{8}{22}\sigma_c + 7</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.00744em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">8</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">7</span></span></span></span></span></p><p><img src="/blog/6b449bf4/image-20240415230106534.png" alt="image-20240415230106534"></p><p>资本配置线代表着投资者所有可能的风险收益组合；斜率<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span></span></span></span>代表”报酬-波动性比率“，也就是夏普比率。</p><ul><li>如果投资者只选择风险资产，则<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">y= 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>，整个组合即为P点</li><li>如果投资者只选择无风险资产，则<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">y=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span>，整个组合即为F点</li><li>如果<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>&lt;</mo><mi>y</mi><mo>&lt;</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">0&lt; y&lt; 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68354em;vertical-align:-0.0391em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>，组合坐标点位于连接F和P点之间的直线上，随着风险资产投资比例<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>的增加，期望收益率以8%的速率增加，标准差以22%的速率增加</li><li>如果<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>&gt;</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">y&gt; 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>，资本配置线上位于投资组合P右边的点，此时投资者可以以无风险利率7%借入资金，并连同自有自己投资在风险资产P上，也就是通过借款杠杆使得风险资产头寸<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>&gt;</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">y&gt;1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>。</li></ul><h3 id="分散化与组合风险">分散化与组合风险</h3><ul><li>组合风险的两个来源：<ul><li>市场/系统性/不可分散的风险：来源于经济状况等宏观因素的不确定性商业周期，通货膨胀，利率，汇率等。</li><li>公司特有/可分散化/非系统性的风险：来源于公司层面的不确定性，影响因素只会影响某一特定公司或行业，基本不会影响经济体中的其他企业。</li></ul></li></ul><p>考虑一个债券基金D和股权基金E，与它们构建的投资组合P：</p><table><thead><tr><th>种类</th><th>收益率</th><th>风险</th><th>权重</th></tr></thead><tbody><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi></mrow><annotation encoding="application/x-tex">D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mi>D</mi></msub></mrow><annotation encoding="application/x-tex">r_D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>D</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_{D}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mi>D</mi></msub></mrow><annotation encoding="application/x-tex">W_D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mi>E</mi></msub></mrow><annotation encoding="application/x-tex">r_E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05764em;">E</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>σ</mi><mi>E</mi></msub></mrow><annotation encoding="application/x-tex">\sigma_E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05764em;">E</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mi>E</mi></msub></mrow><annotation encoding="application/x-tex">W_E</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05764em;">E</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></td></tr><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo>=</mo><msub><mi>W</mi><mi>D</mi></msub><mi>D</mi><mo>+</mo><msub><mi>W</mi><mi>E</mi></msub><mi>E</mi></mrow><annotation encoding="application/x-tex">P = W_DD+W_EE</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.02778em;">D</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05764em;">E</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span></span></span></span></td><td></td><td></td><td></td></tr></tbody></table><p class="katex-block katex-error" title="ParseError: KaTeX parse error: No such environment: equation at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{aligned…">\begin{equation}\begin{aligned}r_p &amp;= W_Dr_D+W_Er_E \\\\E(r_p) &amp;= W_DE(r_D)+W_EE(r_E) \\\\\sigma_P^2 &amp;= E[r_P-E(r_P)]^2 =E[W_Dr_D+W_Er_E-W_DE(r_D)-W_EE(r_E)]^2 \\\\&amp;= E[W_D(r_D-E(r_D))+W_E(r_E-E(r_E))]^2 \\\\&amp;= W_D^2\sigma_D^2 + W_E^2\sigma_E^2 + 2W_DW_ECov(r_D, r_E) \\\\\end{aligned}\end{equation}</p><ul><li><p>如果协方差为负，则组合的方差会降低。</p></li><li><p>即使协方差为正值，组合的标准差仍然低于两个证券标准差的加权平均，除非连个证券是完全正相关的</p></li></ul><p>绘制<code>组合标准差~资产E比例</code>的图：</p><p><img src="/blog/6b449bf4/image-20240415232446133.png" alt="image-20240415232446133"></p><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ρ</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\rho=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">ρ</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>时，分散化无意义，投资组合标准差是构成资产标准差的简单加权平均数。</li><li>随着<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ρ</mi></mrow><annotation encoding="application/x-tex">\rho</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">ρ</span></span></span></span>变小，也就是相关资产投资组合风险相关性越小，分散化越有效，投资组合风险越低。</li><li>当两种资产完全负相关<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ρ</mi><mo>=</mo><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\rho=-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">ρ</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span>时完美对冲，对应的最小方差投资组合解是：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mi>D</mi></msub><mo>=</mo><mfrac><msub><mi>σ</mi><mi>E</mi></msub><mrow><msub><mi>σ</mi><mi>D</mi></msub><mo>+</mo><msub><mi>σ</mi><mi>E</mi></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">W_D=\frac{\sigma_E}{\sigma_D+\sigma_E}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.1570019999999999em;vertical-align:-0.44530499999999995em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7116969999999999em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3567071428571427em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.14329285714285717em;"><span></span></span></span></span></span></span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3567071428571427em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05764em;">E</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.14329285714285717em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.410305em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3567071428571427em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05764em;">E</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.14329285714285717em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.44530499999999995em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>  <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>W</mi><mi>E</mi></msub><mo>=</mo><mfrac><msub><mi>σ</mi><mi>D</mi></msub><mrow><msub><mi>σ</mi><mi>D</mi></msub><mo>+</mo><msub><mi>σ</mi><mi>E</mi></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">W_E=\frac{\sigma_D}{\sigma_D+\sigma_E}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">W</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05764em;">E</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.1570019999999999em;vertical-align:-0.44530499999999995em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7116969999999999em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3567071428571427em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.14329285714285717em;"><span></span></span></span></span></span></span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3567071428571427em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05764em;">E</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.14329285714285717em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.410305em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3567071428571427em;margin-left:-0.03588em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.14329285714285717em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.44530499999999995em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></li></ul><p>换一个视角来看，绘制<code>组合收益~组合标准差</code>的图，我们对于这个投资组合的风险收益特征有了更清楚的认识：</p><p><img src="/blog/6b449bf4/image-20240415232843776.png" alt="image-20240415232843776"></p><p>但是事实上，这个图最重要的是，我们可以将其与上一部分的CAL组合起来，去分析两个风险资产与无风险资产如何构建一个最佳的投资组合：</p><table><thead><tr><th><img src="/blog/6b449bf4/image-20240415233135998.png" alt="image-20240415233135998"></th><th><img src="/blog/6b449bf4/image-20240415233520935.png" alt="image-20240415233520935"></th></tr></thead><tbody></tbody></table><p>显然，对于左图来说，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mi>A</mi><mi>L</mi><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">CAL(B)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">A</span><span class="mord mathdefault">L</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">)</span></span></span></span>的斜率更大，也就是B投资组合的夏普比率更高。但是很明显，组合的收益还有进一步提高的空间，最佳的状态就是直线与双曲线相切的一刻，也就是右图的P组合。</p><h2 id="马科维茨markowitz资产组合选择模型">马科维茨Markowitz资产组合选择模型</h2><p>将前面讨论到的问题扩展到更多资产上们就是马科维茨资产组合模型的基本思想。</p><p>如何使用该模型构建自己的投资组合呢？</p><ol><li><p>确定投资者面临的风险收益机会</p><ul><li><p><img src="/blog/6b449bf4/image-20240416110624018.png" alt="image-20240416110624018"></p></li><li><p>最小方差边界，边界线是在给定组合期望收益率下方差最低的组合点描成的曲线</p></li><li><p>所有单个资产都在该边界的右方，由单个资产构成的风险组合不是最有效的。分散化投资可以提升期望收益率降低风险。</p></li><li><p>所有最小方差边界上最小方差组合上方的点提供最优的风险和收益（双曲线上半部分有意义，下半部分没有意义）</p></li></ul></li><li><p>包含无风险资产的最优化——寻找报酬-波动率最高的资本配置线</p><ul><li>斜率最高的资本配置线；与有效边界相切；切点是最优风险组合P</li><li><img src="/blog/6b449bf4/image-20240416110840791.png" alt="image-20240416110840791"></li></ul></li><li><p>投资者在最优风险资产组合P和短期国库券之间选择合适的比例构成最终组合C。</p></li></ol><p>选择出这个组合P有什么意义呢？</p><p>投资经理会向所有客户提供风险组合P，无论客户的风险厌恶程度如何。然后再根据客户不同的风险厌恶程度通过在资本配置线上选择不同风险资产与无风险资产比例来进行风险的匹配。</p><p>而且容易得到：</p><p>投资组合的总方差为：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>σ</mi><mi>P</mi><mn>2</mn></msubsup><mo>=</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><msubsup><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><msub><mi>w</mi><mi>i</mi></msub><msub><mi>w</mi><mi>j</mi></msub><mi>C</mi><mi>o</mi><mi>v</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>r</mi><mi>j</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\sigma_P^2 = \sum\limits_{i=1}^n\sum\limits_{j=1}^nw_iw_jCov(r_i,r_j)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.089439em;vertical-align:-0.275331em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-2.424669em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">P</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.275331em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.465174em;vertical-align:-1.113777em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3513970000000004em;"><span style="top:-2.122331em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0000050000000003em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop op-symbol small-op">∑</span></span></span><span style="top:-3.950005em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9776689999999999em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3513970000000004em;"><span style="top:-2.122331em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0000050000000003em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop op-symbol small-op">∑</span></span></span><span style="top:-3.950005em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.113777em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02691em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02691em;">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.02691em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></p><p>若定义<span class="katex-error" title="ParseError: KaTeX parse error: Expected group after &#039;_&#039; at position 27: …^2}=\frac1n\sum_̲\limits{i=1}^n\…">\bar{\sigma^2}=\frac1n\sum_\limits{i=1}^n\sigma_i^2</span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><mi>C</mi><mi>o</mi><mi>v</mi></mrow><mo>ˉ</mo></mover><mo>=</mo><mfrac><mn>1</mn><mrow><mi>n</mi><mo stretchy="false">(</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></mfrac><msubsup><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn><mo separator="true">,</mo><mi>j</mi><mo mathvariant="normal">≠</mo><mi>i</mi></mrow><mi>n</mi></msubsup><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></msubsup><mi>C</mi><mi>o</mi><mi>v</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>r</mi><mi>j</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\bar{Cov}=\frac{1}{n(n-1)}\sum\limits_{j=1,j\neq i}^n\sum\limits_{i=1}^nCov(r_i,r_j)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8201099999999999em;vertical-align:0em;"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8201099999999999em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span></span></span><span style="top:-3.25233em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˉ</span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.489618em;vertical-align:-1.138221em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mopen mtight">(</span><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.52em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3513970000000004em;"><span style="top:-2.097887em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight">=</span><span class="mord mtight">1</span><span class="mpunct mtight">,</span><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight"><span class="mrel mtight"><span class="mord mtight"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.69444em;"><span style="top:-2.7em;"><span class="pstrut" style="height:2.7em;"></span><span class="rlap mtight"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel mtight"></span></span><span class="fix"></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.19444em;"><span></span></span></span></span></span></span><span class="mrel mtight">=</span></span><span class="mord mathdefault mtight">i</span></span></span></span><span style="top:-3.0000050000000003em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop op-symbol small-op">∑</span></span></span><span style="top:-3.950005em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.138221em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3513970000000004em;"><span style="top:-2.122331em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.0000050000000003em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop op-symbol small-op">∑</span></span></span><span style="top:-3.950005em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9776689999999999em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>，那么，当投资组合为等权重组合时：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>σ</mi><mi>P</mi><mn>2</mn></msubsup><mo>=</mo><mfrac><mn>1</mn><mi>n</mi></mfrac><mover accent="true"><msup><mi>σ</mi><mn>2</mn></msup><mo>ˉ</mo></mover><mo>+</mo><mfrac><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow><mi>n</mi></mfrac><mover accent="true"><mrow><mi>C</mi><mi>o</mi><mi>v</mi></mrow><mo>ˉ</mo></mover></mrow><annotation encoding="application/x-tex">\sigma_P^2=\frac{1}{n}\bar{\sigma^2}+\frac{n-1}{n}\bar{Cov}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.089439em;vertical-align:-0.275331em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-2.424669em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">P</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.275331em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.2218879999999999em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8768879999999999em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.9890000000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span><span style="top:-3.309108em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˉ</span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.190108em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8201099999999999em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span></span></span><span style="top:-3.25233em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.25em;"><span class="mord">ˉ</span></span></span></span></span></span></span></span></span></span></p><p>也就是说，当证券之间的平均协方差为零时，组合方差在n变大时趋近于零，此时所有风险都是公司特有风险。</p><h2 id="capm资本资产定价模型">CAPM资本资产定价模型</h2><h3 id="模型假设">模型假设</h3><p>假设核心是使每个投资者尽可能同质化（尽管其初始财富和风险厌恶程度存在显著差异）</p><ol><li><p>**完全竞争假设：**市场存在大量投资者，投资者是价格的接受者，其交易行为对证券价格不产生影响。</p></li><li><p>**单一投资期假设：**所有投资者只考虑一个相同的投资持有期（短视行为假设）忽略了在持有期结束时点上发生的任何事情的影响。</p></li><li><p>投资者的投资范围仅限于市场公开交易的金融资产，且可以以相同的固定无风险利率借入或借出任意额度资金。</p></li><li><p>不考虑交易费与税。</p></li><li><p><strong>投资者理性假设</strong>：都追求资产组合的方差最小化，都运用马科维茨的资产选择模型进行决策。</p></li><li><p>**同质期望假设：**所有投资者都采用相同的方法进行证券分析并对经济前景的看法一致。也就是投资者的期望收益率和协方差矩阵相同，投资者的有效边界相同，也就具有相同的、唯一的最优风险资产组合。</p></li></ol><h3 id="均衡关系">均衡关系</h3><ol><li><p>所有投资者都依据包含所有可交易资产的市场投资组合按比例复制自己的风险资产组合。（市场投资组合位于有效边界且与CAL相切的点，此时的CAL又称作资本市场线CML）</p><p><img src="/blog/6b449bf4/image-20240418235046327.png" alt="image-20240418235046327"></p></li><li><p>市场投资组合的风险溢价与市场风险和投资者的风险厌恶程度成比例。</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>m</mi></msub><mo stretchy="false">)</mo><mo>−</mo><msub><mi>r</mi><mi>f</mi></msub><mo>=</mo><mover accent="true"><mi>A</mi><mo>ˉ</mo></mover><msubsup><mi>σ</mi><mi>m</mi><mn>2</mn></msubsup></mrow><annotation encoding="application/x-tex">E(r_m)-r_f = \bar{A}\sigma^2_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.1111079999999998em;vertical-align:-0.247em;"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8201099999999999em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">A</span></span></span><span style="top:-3.25233em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.11110999999999999em;"><span class="mord">ˉ</span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641079999999999em;"><span style="top:-2.4530000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span></span></span></span></span></p></li><li><p>单个资产的风险溢价与市场投资组合M的风险溢价成正比，与市场投资组合与证券之间的β也成比例。（市场组合β=1）</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mtable rowspacing="0.24999999999999992em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mi>β</mi></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><mrow><mi>C</mi><mi>o</mi><mi>v</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>r</mi><mi>m</mi></msub><mo stretchy="false">)</mo></mrow><msubsup><mi>σ</mi><mi>m</mi><mn>2</mn></msubsup></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><msub><mi>r</mi><mi>i</mi></msub><mo>−</mo><msub><mi>r</mi><mi>f</mi></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mi>β</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>m</mi></msub><mo>−</mo><msub><mi>r</mi><mi>f</mi></msub><mo stretchy="false">)</mo><mo>+</mo><msub><mi>α</mi><mi>i</mi></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mi>E</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>−</mo><msub><mi>r</mi><mi>f</mi></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mi>β</mi><mo stretchy="false">(</mo><mi>E</mi><mo stretchy="false">(</mo><msub><mi>r</mi><mi>m</mi></msub><mo stretchy="false">)</mo><mo>−</mo><msub><mi>r</mi><mi>f</mi></msub><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{aligned}\beta &amp;= \frac{Cov(r_i, r_m)}{\sigma^2_{m}} \\\\r_i-r_f &amp;= \beta (r_m-r_f) + \alpha_i \\\\E(r_i)-r_f &amp;= \beta (E(r_m)-r_f)\end{aligned}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:8.66em;vertical-align:-4.08em;"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.58em;"><span style="top:-6.58em;"><span class="pstrut" style="height:3.427em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05278em;">β</span></span></span><span style="top:-4.507em;"><span class="pstrut" style="height:3.427em;"></span><span class="mord"></span></span><span style="top:-3.0070000000000006em;"><span class="pstrut" style="height:3.427em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span><span style="top:-1.5070000000000006em;"><span class="pstrut" style="height:3.427em;"></span><span class="mord"></span></span><span style="top:-0.007000000000001005em;"><span class="pstrut" style="height:3.427em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.079999999999999em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.58em;"><span style="top:-6.58em;"><span class="pstrut" style="height:3.427em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">σ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.740108em;"><span style="top:-2.4530000000000003em;margin-left:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span style="top:-2.9890000000000003em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.03588em;">v</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.933em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.007em;"><span class="pstrut" style="height:3.427em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord mathdefault" style="margin-right:0.05278em;">β</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.0037em;">α</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.0037em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-0.007000000000000117em;"><span class="pstrut" style="height:3.427em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord mathdefault" style="margin-right:0.05278em;">β</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.08em;"><span></span></span></span></span></span></span></span></span></span></span></span></p></li></ol><h3 id="证券市场线sml">证券市场线SML</h3><h4 id="特征">特征</h4><ul><li>期望收益-贝塔关系</li><li>市场组合贝塔值等于1</li><li>斜率是市场组合的风险溢价</li><li>横轴为β值，纵轴为期望收益</li></ul><p><img src="/blog/6b449bf4/image-20240418234829253.png" alt="image-20240418234829253"></p><h4 id="资本市场线与证券市场线">资本市场线与证券市场线</h4><ul><li><p>资本市场线：有效资产组合的风险溢价是资产组合的标准差的函数。</p></li><li><p>证券市场线： 单个风险资产的风险溢价是该资产风险指标贝塔值的函数</p><ul><li>作为高度分散化资产组合一部分的单项资产，其风险测度不再是资产的标准差或方差，而是该资产对资产组合方差的贡献程度（贝塔值）</li><li>证券市场线对有效资产组合和单项资产都适用</li></ul></li><li><p>“公平定价”资产一定在资本市场线上</p></li><li><p>均衡市场中，所有证券都必须在证券市场线上</p></li></ul><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">投资学的知识是金融领域最重要的基础之一，笔面试中也经常有相关知识点，将其中的知识要点复习整理一下。</summary>
    
    
    
    <category term="知识分享" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/"/>
    
    <category term="金融知识" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/"/>
    
    <category term="投资学" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/%E6%8A%95%E8%B5%84%E5%AD%A6/"/>
    
    
    <category term="投资学" scheme="https://6young.site/tags/%E6%8A%95%E8%B5%84%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>【金融知识】投资学知识要点回顾整理（二）</title>
    <link href="https://6young.site/blog/265a38a6.html"/>
    <id>https://6young.site/blog/265a38a6.html</id>
    <published>2024-04-15T22:50:23.000Z</published>
    <updated>2024-06-18T05:59:42.105Z</updated>
    
    <content type="html"><![CDATA[<h2 id="利率">利率</h2><p>名义利率（Nominal interest rate）<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span></span></span></span>；实际利率（Real interest rate）<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span></span></span>；通货膨胀率（Inflation rate）<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span>；<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi><mo>=</mo><mfrac><mrow><mi>R</mi><mo>−</mo><mi>i</mi></mrow><mrow><mn>1</mn><mo>+</mo><mi>i</mi></mrow></mfrac><mo>≈</mo><mi>R</mi><mo>−</mo><mi>i</mi></mrow><annotation encoding="application/x-tex">r=\frac{R-i}{1+i}≈R-i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.275662em;vertical-align:-0.403331em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.872331em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight">i</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.00773em;">R</span><span class="mbin mtight">−</span><span class="mord mathdefault mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.403331em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span></span></span></span></p><p><strong>费雪等式：</strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><mo>=</mo><mi>r</mi><mo>+</mo><mi>E</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">R = r+E(i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord mathdefault">i</span><span class="mclose">)</span></span></span></span>如果实际利率是稳定的，则名义利率的上涨意味着更高的通货膨胀率</p><p>**税收与实际利率：**给定税率<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.61508em;vertical-align:0em;"></span><span class="mord mathdefault">t</span></span></span></span>，名义利率<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span></span></span></span>，实际利率<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span></span></span>，那么税后实际利率近似等于税后名义利率减去通货膨胀率<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>t</mi><mo stretchy="false">)</mo><mo>−</mo><mi>i</mi><mo>=</mo><mo stretchy="false">(</mo><mi>r</mi><mo>+</mo><mi>i</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>t</mi><mo stretchy="false">)</mo><mo>−</mo><mi>i</mi><mo>=</mo><mi>r</mi><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>t</mi><mo stretchy="false">)</mo><mo>−</mo><mi>i</mi><mi>t</mi></mrow><annotation encoding="application/x-tex">R(1-t)-i=(r+i)(1-t)-i=r(1-t)-it</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">i</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span><span class="mord mathdefault">t</span></span></span></span>。也就是说税后实际利率随着通货膨胀率的上升而下降，投资者承受了相当于税率乘以通货膨胀率的通胀损失<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mi>t</mi></mrow><annotation encoding="application/x-tex">it</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathdefault">i</span><span class="mord mathdefault">t</span></span></span></span>。</p><h3 id="影响实际利率的四个因素">影响实际利率的四个因素</h3><ul><li>供给Supply</li><li>需求Demand</li><li>政府行为Government actions</li><li>通货膨胀预期Expected rate of inflation</li></ul><p><img src="/blog/265a38a6/image-20240415213813252.png" alt="image-20240415213813252"></p><ul><li>供需曲线：<ul><li>供给曲线向上倾斜：实际利率越高，居民储蓄的需求越大</li><li>需求曲线向下倾斜：实际利率越低，厂商会加大资本投资的力度</li><li>供给曲线与需求曲线的交点形成均衡点E</li></ul></li><li>政府和中央银行可以通过财政政策或货币政策向左或向右移动供给曲线和需求曲线<ul><li>增加政府预算赤字：政府需要增加借款，推动需求曲线向右平移，均衡点从E点移至E’点</li><li>央行可通过用扩张性货币政策抵消该预期，供给曲线向右移</li></ul></li></ul><h3 id="债券收益率">债券收益率</h3><p><strong>有效年利率：</strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>+</mo><mi>E</mi><mi>A</mi><mi>R</mi><mo>=</mo><mo stretchy="false">[</mo><mn>1</mn><mo>+</mo><msub><mi>r</mi><mi>f</mi></msub><mo stretchy="false">(</mo><mi>T</mi><mo stretchy="false">)</mo><msup><mo stretchy="false">]</mo><mfrac><mn>1</mn><mi>T</mi></mfrac></msup></mrow><annotation encoding="application/x-tex">1+EAR=[1+r_f(T)]^{\frac1T}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">E</span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1.2401280000000001em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361079999999999em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.10764em;">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mclose">)</span><span class="mclose"><span class="mclose">]</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9540200000000001em;"><span style="top:-3.363em;margin-right:0.05em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8443142857142858em;"><span style="top:-2.656em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span><span style="top:-3.2255000000000003em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line mtight" style="border-bottom-width:0.049em;"></span></span><span style="top:-3.384em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.344em;"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span></span></span></span></span></span></span></span></span></span></span></span></p><p><strong>年化百分比率：</strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>P</mi><mi>R</mi><mo>=</mo><mfrac><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mi>E</mi><mi>A</mi><mi>R</mi><msup><mo stretchy="false">)</mo><mi>T</mi></msup><mo>−</mo><mn>1</mn></mrow><mi>T</mi></mfrac></mrow><annotation encoding="application/x-tex">APR=\frac{(1+EAR)^T-1}{T}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.473365em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.128365em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.485em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mtight">1</span><span class="mbin mtight">+</span><span class="mord mathdefault mtight" style="margin-right:0.05764em;">E</span><span class="mord mathdefault mtight">A</span><span class="mord mathdefault mtight" style="margin-right:0.00773em;">R</span><span class="mclose mtight"><span class="mclose mtight">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9190928571428572em;"><span style="top:-2.931em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">T</span></span></span></span></span></span></span></span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p><p><strong>持有期收益率：</strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mrow><msub><mi>P</mi><mn>1</mn></msub><mo>−</mo><msub><mi>P</mi><mn>0</mn></msub><mo>+</mo><msub><mi>D</mi><mn>1</mn></msub></mrow><msub><mi>P</mi><mn>0</mn></msub></mfrac></mrow><annotation encoding="application/x-tex">\frac{P_1-P_0+D_1}{P_0}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.3335309999999998em;vertical-align:-0.44509999999999994em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8884309999999999em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:-0.13889em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.4101em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:-0.13889em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mbin mtight">−</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.13889em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:-0.13889em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span><span class="mbin mtight">+</span><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right:0.02778em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31731428571428577em;"><span style="top:-2.357em;margin-left:-0.02778em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:2.5em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.44509999999999994em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p><h3 id="风险度量">风险度量</h3><p>正常情况下：</p><ul><li>夏普比率</li><li>偏度</li><li>峰度</li></ul><p>极端负收益率发生的风险度量指标：</p><ul><li>在险价值Value at Risk：度量一定概率下发生极端负收益所造成的损失</li><li>预期尾部损失Expected shortfall：关注的是最坏情况发生条件下的预期损失</li><li>下偏标准差</li><li>索提诺比率Lower partial standard deviation</li></ul><h2 id="none"></h2><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">投资学的知识是金融领域最重要的基础之一，笔面试中也经常有相关知识点，将其中的知识要点复习整理一下。</summary>
    
    
    
    <category term="知识分享" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/"/>
    
    <category term="金融知识" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/"/>
    
    <category term="投资学" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/%E6%8A%95%E8%B5%84%E5%AD%A6/"/>
    
    
    <category term="投资学" scheme="https://6young.site/tags/%E6%8A%95%E8%B5%84%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>【金融知识】投资学知识要点回顾整理（一）</title>
    <link href="https://6young.site/blog/164cd47e.html"/>
    <id>https://6young.site/blog/164cd47e.html</id>
    <published>2024-04-15T17:14:23.000Z</published>
    <updated>2024-06-18T05:59:42.097Z</updated>
    
    <content type="html"><![CDATA[<h2 id="简单概念">简单概念</h2><h3 id="代理问题-agency-problems">代理问题 Agency Problems</h3><p>管理者可能被诱惑从事不符合股东最大利益的活动：</p><ul><li>组建自己的集团</li><li>为保住自己的职位而避免投资风险项目</li><li>过度消费奢侈品，如豪车，私人飞机</li></ul><p>缓解潜在代理问题的管理机制：</p><ul><li>将管理层收入与公司经营成败成功联系在一起的薪酬计划（期权/奖金/薪水）</li><li>董事会可以解雇表现不好的管理者</li><li>证券分析师和大型机构投资者对管理者进行监督</li><li>存在被收购的威胁</li></ul><h3 id="投资过程">投资过程</h3><p>**自上而下的投资组合构建法：**从资产配置开始，确定如何在大类资产之间进行配置，然后确定在每一类资产中选择哪些证券。</p><p><strong>自下而上的投资组合构建法</strong>：投资组合是由价格看起来很有吸引力的证券构成的，而不需要过多考虑资产配置；但是会使投资者无形中将赌注全投向经济的某一领域。</p><h3 id="金融市场的参与者">金融市场的参与者</h3><ul><li>公司-净借款人<ul><li>筹集资金以支付厂房和设备的投资</li></ul></li><li>家庭-净储蓄者<ul><li>购买需要募集资金的公司发行的证券</li></ul></li><li>政府——既可以是借款人，也可以是贷款者<ul><li>预算赤字Budget deficit：借款人</li><li>预算盈余Budget surplus：贷款人</li></ul></li><li>金融中介Financial intermediaries<ul><li>集资与投资，可以把贷方和借方联系在一起；通过发行证券募集资金以购买其他公司发行的证券。</li><li>汇集许多小投资者的资金，有能力提供大额贷款；通过向许多借款人放贷实现风险显著分散的效果；中介机构通过其大量业务量储备积累专业知识，并可以利用规模经济和范围经济来评估和监控风险。</li></ul></li><li>投资银行Investment bankers<ul><li>承销新股和债券发行，负责证券在一级市场primary market的销售,向公众发行新的证券</li><li>就证券发行价格、利率为发行公司提出建议</li></ul></li></ul><h2 id="货币市场">货币市场</h2><h3 id="短期国库券">短期国库券</h3><ul><li>卖方报价Asked price：从证券交易商手中买入国库券时必须支付的价格</li><li>买方报价Bid price：将一张国库券卖给交易商时能收到的价格，略低于卖方报价</li><li>买卖价差Bid-asked spread：卖方报价和卖方报价之间的差额</li></ul><p><img src="/blog/164cd47e/image-20240415160922200.png" alt="image-20240415160922200"></p><p>银行贴现法，到期值或面值的贴现率是按年计算（一年按360天算）</p><p>针对图中报价：</p><ul><li>买入国库券：<ul><li>到期日： 2009年11月19日</li><li>距离到期日还剩天数： 36天</li><li>卖方报价的收益率： 0.043%<ul><li>折扣率：0.043%*(36/360)=0.0043%</li><li>若面值为10000，则价格为：10,000*(1-0.0043%)=9,999.57</li><li>转化为按365天计算的年度收益为：0.0043%*(365/36)=0.044%</li></ul></li></ul></li><li>卖出国库券<ul><li>买方报价的收益率： 0.050%<ul><li>折扣率：0.050%*(36/360)=0.0050%</li><li>若面值为10000，则价格为：10,000*(1-0.0050%)=9,999.50</li></ul></li></ul></li></ul><h3 id="大额存单">大额存单</h3><ul><li>不能随时提取，银行只在大额存单到期时，才向储户支付利息和本金。</li><li>面额超过100， 000美元的大额存单可以转让</li><li>变现力强</li><li>当银行出现偿债能力危机时，持有者可获得高达25万美元的保额</li></ul><h3 id="回购协议">回购协议</h3><ul><li>政府债券交易商的短期（通常是隔夜）借款手段</li><li>交易商将政府债券卖给投资者，并签订协议在第二天以稍高的价格购回。<ul><li>协议约定的价格增幅为隔夜利息。</li><li>相当于交易商从投资者处借款一天，证券充当抵押品</li><li>回购协议安全性高</li></ul></li></ul><h3 id="逆回购协议">逆回购协议</h3><ul><li>是回购的镜像</li><li>交易商找到持有政府债券的投资者，从投资者手中买入证券，并协定在第二天或未来某一日以稍高的价格售回给投资者。</li></ul><h2 id="债券市场">债券市场</h2><h3 id="通胀保值债券">通胀保值债券</h3><ul><li><p>债券与生活成本指数相联系</p></li><li><p>债券的本金需要根据消费者物价指数（CPI）的增幅按比例进行调整</p></li></ul><h3 id="市政债券">市政债券</h3><ul><li>利息收入无须缴纳联邦所得税，在发行州也无须缴纳州和地方税</li><li>债券到期或投资者以高于卖方报价将债券售出时，需要缴纳资本利得税</li><li>市政债券的利率较低</li><li>分类：<ul><li>一般责任债券General obligation bonds ：完全由发行者的信用支撑（征税能力）</li><li>收入债券Revenue bonds ：为特定项目筹资而发行的，并由该项目获得的收入或运作该项目的特定市政机构担保</li></ul></li><li>假设：投资者的边际税率为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></mrow><annotation encoding="application/x-tex">t</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.61508em;vertical-align:0em;"></span><span class="mord mathdefault">t</span></span></span></span>；应税债券的税前收益率为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span></span></span></span>；市政债券收益率为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">r_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>；若： <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>t</mi><mo stretchy="false">)</mo><mo>&gt;</mo><msub><mi>r</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">r(1-t)&gt;r_m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">t</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:-0.02778em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>， 投资者应购买应税债券，否则应购买免税的市政债券。</li></ul><h2 id="股权市场">股权市场</h2><h3 id="普通股">普通股</h3><ul><li>赋予所有者在年度股东大会上对任何公司治理事务的投票权</li><li>代表了对公司财务利益的索取权</li></ul><p><strong>普通股的特点：</strong></p><ul><li>剩余追索权：股东对公司资产和收益的追索权位于最后一位<ul><li>公司清算资产时，普通股股东只有在其他索偿人都得到补偿后，才能对剩余资产享有索偿权</li><li>处于未清算的公司，普通股股东只对扣除利息和税收之后的运营收益享有索偿权</li></ul></li><li>有限责任：公司经营失败时，股东的最高损失是其原始投资额，个人对公司的债务不负有任何责任</li></ul><h3 id="优先股">优先股</h3><ul><li><p>兼具权益和债务的双重特征</p><ul><li><p>向投资者承诺每年支付固定的收益</p></li><li><p>投资者无参与公司决策的权利</p></li><li><p>代表了对公司财务利益的索取权</p></li></ul></li><li><p>税收待遇</p><ul><li>向优先股股东支付的是股利而不是利息，不可抵税（劣势）</li><li>公司计算应税收益时可以扣除从国内公司收到的70%的股利，个人投资者不能</li></ul></li></ul><h2 id="存托凭证">存托凭证</h2><p>是什么：</p><ul><li>美国市场上交易的代表对国外公司所有权份额的凭证</li><li>每张存托凭证都与某一国外公司的部分股份相对应</li></ul><p>为什么：</p><ul><li><p>是美国投资者投资国外公司股票最常用的方式</p></li><li><p>使国外公司更容易满足美国注册证券的要求</p></li></ul><h2 id="衍生工具市场">衍生工具市场</h2><h2 id="期权-option">期权 Option</h2><h4 id="看涨期权">看涨期权</h4><ul><li>赋予持有者在到期日expiration date或到期日之前以特定价格（执行价格the strike or exercise price ）购买某种资产的权利</li><li>看涨期权的持有者并不是必须行权，只有当标的资产的市场价格超过执行价格时行权才有利可图</li></ul><h4 id="看跌期权">看跌期权</h4><ul><li>赋予持有者在到期日expiration date或到期日之前以特定价格（执行价格the strike or exercise price ）出售某种资产的权利</li><li>看跌期权的持有者并不是必须行权，只有当标的资产的市场价格低于执行价格时行权才有利可图</li></ul><h3 id="期货合约-futures">期货合约 Futures</h3><ul><li>在规定的交割日或到期日delivery or maturity date按约定的价格对某一资产（或其现金价值）进行交割的合约</li><li>持有多头头寸Long position的交易者，承诺在交割日购买资产</li><li>持有空头头寸Short position的交易者，承诺在合约到期时出售资产</li></ul><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">投资学的知识是金融领域最重要的基础之一，笔面试中也经常有相关知识点，将其中的知识要点复习整理一下。</summary>
    
    
    
    <category term="知识分享" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/"/>
    
    <category term="金融知识" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/"/>
    
    <category term="投资学" scheme="https://6young.site/categories/%E7%9F%A5%E8%AF%86%E5%88%86%E4%BA%AB/%E9%87%91%E8%9E%8D%E7%9F%A5%E8%AF%86/%E6%8A%95%E8%B5%84%E5%AD%A6/"/>
    
    
    <category term="投资学" scheme="https://6young.site/tags/%E6%8A%95%E8%B5%84%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>【编程学习】利用python实现一个SlashDict</title>
    <link href="https://6young.site/blog/9564b232.html"/>
    <id>https://6young.site/blog/9564b232.html</id>
    <published>2024-04-14T15:52:23.000Z</published>
    <updated>2024-06-18T05:59:42.021Z</updated>
    
    <content type="html"><![CDATA[<h2 id="参照完整性">参照完整性</h2><h2 id="前情提要">前情提要</h2><p>最近在互联网遨游的过程中，看到这样的一个题目需求：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; sd = SlashDict(&#123;<span class="string">&#x27;a&#x27;</span>: &#123;<span class="string">&#x27;b&#x27;</span>: &#123;<span class="string">&#x27;c&#x27;</span>: &#123;<span class="string">&#x27;x&#x27;</span>: 1. <span class="string">&#x27;y&#x27;</span>: 2&#125;&#125;,<span class="string">&#x27;d&#x27;</span>: 3&#125;,<span class="string">&#x27;e&#x27;</span>: &#123;<span class="string">&#x27;f&#x27;</span>:&#123;<span class="string">&#x27;g&#x27;</span>: 5&#125;&#125;&#125;)</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; sd[<span class="string">&#x27;a/b/c&#x27;</span>]</span><br><span class="line">SlashDict(&#123;<span class="string">&#x27;x&#x27;</span>: 1, <span class="string">&#x27;y&#x27;</span>: 2&#125;)</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; sd[<span class="string">&#x27;a/d&#x27;</span>]</span><br><span class="line">3</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; sd[<span class="string">&#x27;a/b/k&#x27;</span>]</span><br><span class="line">KeyError: Dict under key <span class="string">&#x27;a/b&#x27;</span> does not have key <span class="string">&#x27;k&#x27;</span></span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; sd.pop(<span class="string">&#x27;a/b/c/y&#x27;</span>)</span><br><span class="line">2</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; sd[<span class="string">&#x27;e/f/g&#x27;</span>] = 5</span><br><span class="line">&gt;&gt;&gt; sd</span><br><span class="line">SlashDict(&#123;<span class="string">&#x27;a&#x27;</span>: &#123;<span class="string">&#x27;b&#x27;</span>: &#123;<span class="string">&#x27;c&#x27;</span>: &#123;<span class="string">&#x27;x&#x27;</span>: 1&#125;&#125;,<span class="string">&#x27;d&#x27;</span>: 3&#125;,<span class="string">&#x27;e&#x27;</span>: &#123;<span class="string">&#x27;f&#x27;</span>:&#123;<span class="string">&#x27;g&#x27;</span>: 5&#125;&#125;&#125;)</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; list(sd.deep_keys(())</span><br><span class="line">[<span class="string">&#x27;a/b/c/x&#x27;</span>,<span class="string">&#x27;a/d&#x27;</span>, <span class="string">&#x27;e/f/g&#x27;</span>]</span><br></pre></td></tr></table></figure><p>事不宜迟，立马开始实现！</p><h2 id="类的内置方法">类的内置方法</h2><p>首先，我们要直到，在定义类时python给我们提供了很多内置方法，能极大地减少我们的工作量：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">MyList</span>:</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, l</span>):</span><br><span class="line">        self.<span class="built_in">list</span> = l</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__getitem__</span>(<span class="params">self, key</span>): </span><br><span class="line">        <span class="keyword">return</span> self.<span class="built_in">list</span>[<span class="string">&#x27;key&#x27;</span>]</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__setitem__</span>(<span class="params">self, key, value</span>): </span><br><span class="line">        self.<span class="built_in">list</span>[<span class="string">&#x27;key&#x27;</span>] = value</span><br><span class="line">        </span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__iter__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">iter</span>(self.<span class="built_in">list</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__str__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">str</span>(self.<span class="built_in">list</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__repr__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="string">f&quot;MyList(<span class="subst">&#123;<span class="built_in">str</span>(self.<span class="built_in">list</span>)&#125;</span>)&quot;</span></span><br><span class="line">    </span><br><span class="line">mylist = MyList([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>])</span><br></pre></td></tr></table></figure><p><code>__getitem__</code>：为你的类实现索引，通过设置这个方法，就可以通过<code>mylist[1]</code>的方式索引类中的信息。</p><p><code>__setitem__</code>：为你的类实现索引赋值，通过设置这个方法，就可以通过<code>mylist[1]=8</code>的方式修改类中的信息。</p><p><code>__iter__</code>：使你能够通过<code>for item in mylist:</code>的方法遍历你的类</p><p><code>__str__</code>：当你使用<code>print(mylist)</code>，所输出的内容就是该方法的返回值。</p><p><code>__repr__</code>：效果与<code>__str__</code>类似，但是是你在命令行中直接调用<code>mylist</code>所返回的内容</p><p>当然，自定义类还有很多内置方法，但是本次实现中没有涉及。</p><h2 id="slashdict实现">SlashDict实现</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">SlashDict</span>(<span class="title class_ inherited__">object</span>):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self, dic</span>):</span><br><span class="line">        self.<span class="built_in">dict</span> = dic</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__getitem__</span>(<span class="params">self, slash_key</span>): </span><br><span class="line">        keys = slash_key.split(<span class="string">&quot;/&quot;</span>)</span><br><span class="line">        dict_now = self.<span class="built_in">dict</span></span><br><span class="line">        good_keys = []</span><br><span class="line">        <span class="keyword">for</span> key <span class="keyword">in</span> keys:</span><br><span class="line">            <span class="keyword">if</span> key <span class="keyword">in</span> dict_now:</span><br><span class="line">                dict_now = dict_now[key]</span><br><span class="line">                good_keys.append(key)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">raise</span> KeyError(<span class="string">f&quot;Dict under key &#x27;<span class="subst">&#123;<span class="string">&#x27;/&#x27;</span>.join(good_keys)&#125;</span>&#x27; does not have key &#x27;<span class="subst">&#123;key&#125;</span>&#x27;&quot;</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">isinstance</span>(dict_now, <span class="built_in">dict</span>):</span><br><span class="line">            <span class="keyword">return</span> SlashDict(dict_now)</span><br><span class="line">        <span class="keyword">return</span> dict_now</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__setitem__</span>(<span class="params">self, slash_key, value</span>): </span><br><span class="line">        keys = slash_key.split(<span class="string">&quot;/&quot;</span>)</span><br><span class="line">        keys_num = <span class="built_in">len</span>(keys)</span><br><span class="line">        dict_now = self.<span class="built_in">dict</span></span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(keys_num):</span><br><span class="line">            key = keys[i]</span><br><span class="line">            <span class="keyword">if</span> i == keys_num - <span class="number">1</span>:</span><br><span class="line">                dict_now[key] = value</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">if</span> key <span class="keyword">in</span> dict_now:</span><br><span class="line">                dict_now = dict_now[key]</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                dict_now[key] = &#123;&#125;</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__iter__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span>  <span class="built_in">iter</span>(self.<span class="built_in">dict</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__str__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">str</span>(self.<span class="built_in">dict</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__repr__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="keyword">return</span> <span class="string">f&quot;SlashDict(<span class="subst">&#123;<span class="built_in">str</span>(self.<span class="built_in">dict</span>)&#125;</span>)&quot;</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">pop</span>(<span class="params">self, slash_key</span>):</span><br><span class="line">        keys = slash_key.split(<span class="string">&quot;/&quot;</span>)</span><br><span class="line">        dict_now = self.<span class="built_in">dict</span></span><br><span class="line">        good_keys = []</span><br><span class="line">        <span class="keyword">for</span> key <span class="keyword">in</span> keys[<span class="number">0</span>:-<span class="number">1</span>]:</span><br><span class="line">            <span class="keyword">if</span> key <span class="keyword">in</span> dict_now:</span><br><span class="line">                dict_now = dict_now[key]</span><br><span class="line">                good_keys.append(key)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">raise</span> KeyError(<span class="string">f&quot;Dict under key &#x27;<span class="subst">&#123;<span class="string">&#x27;/&#x27;</span>.join(good_keys)&#125;</span>&#x27; does not have key &#x27;<span class="subst">&#123;key&#125;</span>&#x27;&quot;</span>)</span><br><span class="line">        </span><br><span class="line">        element = dict_now[keys[-<span class="number">1</span>]]</span><br><span class="line">        <span class="keyword">del</span> dict_now[keys[-<span class="number">1</span>]]</span><br><span class="line">        <span class="keyword">return</span> element</span><br><span class="line">        </span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">deep_keys</span>(<span class="params">self</span>):</span><br><span class="line">        self.deep_keys_list = []</span><br><span class="line">        <span class="keyword">for</span> key <span class="keyword">in</span> self.<span class="built_in">dict</span>:</span><br><span class="line">            self._key_dfs(key)</span><br><span class="line">        <span class="keyword">return</span> self.deep_keys_list</span><br><span class="line">            </span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">_key_dfs</span>(<span class="params">self, key</span>):</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">isinstance</span>(self[key], SlashDict):</span><br><span class="line">            <span class="keyword">for</span> key_ <span class="keyword">in</span> self[key]:</span><br><span class="line">                self._key_dfs(<span class="string">f&quot;<span class="subst">&#123;key&#125;</span>/<span class="subst">&#123;key_&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            self.deep_keys_list.append(key)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>接下来，就是依次测试样例需求的内容：</p><p><img src="/blog/9564b232/image-20240414162102899.png" alt="image-20240414162102899"></p><p><img src="/blog/9564b232/image-20240414162141612.png" alt="image-20240414162141612"></p><p><img src="/blog/9564b232/image-20240414162235248.png" alt="image-20240414162235248"></p><p><img src="/blog/9564b232/image-20240414162325793.png" alt="image-20240414162325793"></p><p><img src="/blog/9564b232/image-20240414162558150.png" alt="image-20240414162558150"></p><p>匹配成功，实现有效~~</p><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">看到一个有趣的题目，使用python实现其中细节</summary>
    
    
    
    <category term="编程学习" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Python" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/Python/"/>
    
    
    <category term="Python" scheme="https://6young.site/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>【编程学习】在Python中有效使用Parquet数据格式</title>
    <link href="https://6young.site/blog/75d539b0.html"/>
    <id>https://6young.site/blog/75d539b0.html</id>
    <published>2024-04-03T20:49:23.000Z</published>
    <updated>2024-06-18T05:59:42.025Z</updated>
    
    <content type="html"><![CDATA[<h3 id="基础使用">基础使用</h3><p>首先我们先构建一个虚拟的数据框来用于测试：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> faker <span class="keyword">import</span> Faker</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"></span><br><span class="line">NUM_OF_RECORDS = <span class="number">100</span></span><br><span class="line">fake = Faker()</span><br><span class="line"></span><br><span class="line">data = &#123;</span><br><span class="line">    <span class="string">&#x27;id&#x27;</span>: <span class="built_in">range</span>(NUM_OF_RECORDS),  <span class="comment"># Generate IDs from 1 to 100</span></span><br><span class="line">    <span class="string">&#x27;name&#x27;</span>: [fake.name() <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(NUM_OF_RECORDS)],</span><br><span class="line">    <span class="string">&#x27;age&#x27;</span>: [fake.random_int(<span class="built_in">min</span>=<span class="number">18</span>, <span class="built_in">max</span>=<span class="number">24</span>) <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(NUM_OF_RECORDS)],</span><br><span class="line">    <span class="string">&#x27;state&#x27;</span>: [fake.state() <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(NUM_OF_RECORDS)],</span><br><span class="line">    <span class="string">&#x27;city&#x27;</span>: [fake.city() <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(NUM_OF_RECORDS)],</span><br><span class="line">    <span class="string">&#x27;street&#x27;</span>: [fake.street_address() <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(NUM_OF_RECORDS)]</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">df = pd.DataFrame(data)</span><br></pre></td></tr></table></figure><p>最简单的使用方法，就是像<code>csv</code>文件格式一样，直接用<code>pandas</code>读写即可：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将数据保存为parquet</span></span><br><span class="line">df.to_parquet(<span class="string">&quot;test_data.parquet&quot;</span>)</span><br><span class="line"><span class="comment"># 读取parquet数据</span></span><br><span class="line">df1 = pd.read_parquet(<span class="string">&quot;test_data.parquet&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="文件分块保存与读取">文件分块保存与读取</h3><p>我们可以根据自己的需求，在保存数据时按照某个指标的值进行分类保存，具体的可以看代码：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df.to_parquet(<span class="string">&quot;test_data_partition&quot;</span>, partition_cols=<span class="string">&quot;age&quot;</span>)</span><br></pre></td></tr></table></figure><p>这样，我们就可以看到在<code>test_data_partition</code>路径下有众多<code>age=18</code>类似的文件，里面就是原数据中所有<code>age=18</code>的数据。</p><p><img src="/blog/75d539b0/image-20240403194311226.png" alt="image-20240403194311226"></p><p>当然，用于分割的字段并不唯一，你可以同时对多个字段进行切分，这样的话，在保存路径中就会有多级嵌套的文件夹：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df.to_parquet(<span class="string">&quot;test_data_partition_by_2condition&quot;</span>, partition_cols=[<span class="string">&quot;age&quot;</span>, <span class="string">&#x27;state&#x27;</span>])</span><br></pre></td></tr></table></figure><p><img src="/blog/75d539b0/image-20240403195306085.png" alt="image-20240403195306085"></p><p>想要读取数据，你就直接读取保存时的路径即可：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df2 = pd.read_parquet(<span class="string">&quot;test_data_partition&quot;</span>)</span><br></pre></td></tr></table></figure><p>此外，你还可以读取里面分割出的子文件，比如，只想读取<code>age=18</code>的数据，那么就可以直接这样写，但是要注意，这样读取的结果中，就不存在<code>age</code>列了：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df3 = pd.read_parquet(<span class="string">&quot;test_data_partition/age=18/&quot;</span>)</span><br></pre></td></tr></table></figure><p><img src="/blog/75d539b0/image-20240403203857216.png" alt="image-20240403203857216"></p><p>这样保存的好处其实在于，当你只想获得<code>age=18</code>的数据时，你就可以直接用上面的方法有条件的读取数据，这样的筛选方法比常规读入DataFrame后再筛选效率高很多。</p><h3 id="数据的条件读取">数据的条件读取</h3><p>如果想要将数据按条件进行一些筛选，但是你并没有像上一板块一样将数据分类保存。常规的操作也就只是读取DataFrame后再筛选，但是<code>parquet</code>文件格式给了我们更多的选择：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">df3 = pd.read_parquet(<span class="string">&quot;test_data.parquet&quot;</span>, filters=[(<span class="string">&#x27;state&#x27;</span>,<span class="string">&#x27;==&#x27;</span>,<span class="string">&#x27;Oregon&#x27;</span>), (<span class="string">&quot;age&quot;</span>, <span class="string">&quot;&gt;=&quot;</span>, <span class="number">20</span>)])</span><br><span class="line">df3</span><br></pre></td></tr></table></figure><p>这样，我们就可以直接读取符合我们需求的数据了。</p><p><img src="/blog/75d539b0/image-20240403204638066.png" alt="image-20240403204638066"></p><p>而且，如果只想读取某些列，<code>parquet</code>也可以很方便的实现，可以通过<code>columns</code>参数直接选择需要的字段，大大避免了读入全部数据再处理带来的巨大内存消耗。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">df4 = pd.read_parquet(path=<span class="string">&quot;test_data.parquet&quot;</span>, columns=[<span class="string">&quot;name&quot;</span>, <span class="string">&quot;state&quot;</span>])</span><br></pre></td></tr></table></figure><p><img src="/blog/75d539b0/image-20240403204855723.png" alt="image-20240403204855723"></p><script type="text&#x2F;javascript" src="https://unpkg.com/kity@2.0.4/dist/kity.min.js"></script><script type="text&#x2F;javascript" src="https://unpkg.com/kityminder-core@1.4.50/dist/kityminder.core.min.js"></script><script defer="true" type="text&#x2F;javascript" src="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.js"></script><link rel="stylesheet" type="text&#x2F;css" href="https://unpkg.com/hexo-simple-mindmap@0.8.0/dist/mindmap.min.css">]]></content>
    
    
    <summary type="html">最近发现了Parquet数据格式，而且在读取时有很多有趣的方案，分享一下~~</summary>
    
    
    
    <category term="编程学习" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/"/>
    
    <category term="Python" scheme="https://6young.site/categories/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/Python/"/>
    
    
    <category term="Python" scheme="https://6young.site/tags/Python/"/>
    
    <category term="Pandas" scheme="https://6young.site/tags/Pandas/"/>
    
    <category term="Parquet" scheme="https://6young.site/tags/Parquet/"/>
    
  </entry>
  
</feed>
