在A股市场上,两种基本的策略形式就是选股和择时,选股就是选出来具有alpha的股票,择时就是低买高卖。通过对上证指数的收益率进行分析,发现,收益率前0.25%的交易日带来的收益率居然超过了所有交易日的总的收益率,以前听说A股收益率主要是1%的交易日带来的,数据分析的结果表明,如果剔除收益率前0.25%的交易日,剩下交易日的收益率总体上基本为0,长期持有的预期收益率为0,如果把每个交易日看成一次赌博,那么,必然结果就是久赌必输,除非你能在整体上零和的情况下,发现明显的规律。所以,这0.25%的交易日至关重要,想要挑选出这0.25%的交易日,想想就知道,有多难了。
而在期货市场上,一个简单的趋势跟踪策略的收益率的分布,有前5%的交易日的收益率超过所有交易日的总的收益率,实际上,我应该直接分析期货市场的指数或者期货品种,这里用一个趋势跟踪策略的收益率代替了,结果不一定准确。
import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体 plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题# 读取数据 data = pd.read_csv("/home/yun/data/指数/上证指数.csv",encoding='gbk')# 升序排列日期 data = data.sort_values("日期") data.index = range(len(data))# 去掉涨跌幅是None的字符串,并转变为数字 data = data[data['涨跌幅']!="None"] data['涨跌幅'] = data[['涨跌幅']].astype("float") data['close'] = data[['收盘价']].astype("float")# 以日期作为index data.index = pd.to_datetime(data['日期'])# 计算对数收益率 data['log_return'] = np.log(data['close'])-np.log(data['close'].shift(1)) data = data.dropna()# 计算总体上的收益率 total_return = data['log_return'].sum()# 计算99%的分位数 target_rate = np.percentile(data['log_return'], 99.75) df = data[data['log_return']>= target_rate]# 1%的收益率是多少 target_total_return = df['log_return'].sum() # 1%的交易日的收益率占总收益率的比例为: print(f"0.25%的交易日的收益率占总收益率的比例为:{(np.e**target_total_return-1)/(np.e**total_return-1)}") # 0.25%的交易日的收益率占总收益率的比例为:1.097321736574832