擅长:python、mysql、java
<p>首先,将价格转换为回报:</p>
<pre><code>df['daily_return'] = df.SETTLE.pct_change()
</code></pre>
<p>然后,计算正/负日收益天数:</p>
<pre><code>df['pos_returns'] = df.daily_return.gt(0) # or df.SETTLE.gt(df.SETTLE.shift())
df['neg_returns'] = df.daily_return.lt(0)
</code></pre>
<p>通过比较布尔标志和前一个标志(例如<code>(df.pos_returns != df.pos_returns.shift())</code>),创建标识符来对每个返回序列进行分组。取这些值的累积和来创建具有相同真/假范围的组。通过乘以标志来掩盖假值,并取正的组值。你知道吗</p>
<p>最后,执行<code>value_counts()</code>两次。第一次按日计数聚合组,第二次聚合日计数事件。你知道吗</p>
<pre><code>pos_groups = (df.pos_returns != df.pos_returns.shift()).cumsum().mul(df.pos_returns)
consec_pos_return_days = pos_groups[pos_groups > 0].value_counts().value_counts()
neg_groups = (df.neg_returns != df.neg_returns.shift()).cumsum().mul(df.neg_returns)
consec_neg_return_days = neg_groups[neg_groups > 0].value_counts().value_counts()
>>> pd.concat([consec_pos_return_days, consec_neg_return_days], axis=1).fillna(0)
pos_returns neg_returns
1 3 2
2 1 4
7 2 0
</code></pre>
<p>该表显示,有3个单日正收益,1个两日正收益和2个七日正收益。你知道吗</p>