题目中确实没有明确说明是考虑哪类兔子的死亡率。
根据斐波那契数列的定义,每个月新增的兔子数量是上个月成年兔子数量与上上个月成年兔子数量之和。也就是说,我们只考虑成年兔子,新生兔子暂时不考虑在内。所以,题目中提到的死亡率d,应该是指成年兔子的死亡率,表示每月有d比例的成年兔子死亡。
兔子题,每个月都会繁殖,那么是小兔子刚生下来就死了还是大兔子生小兔子之前死,有什么区别吗
你总不会要考虑大兔子生小兔子的过程中死吧,这已经包含在下个周期的死亡率里面了
如果是大牛小牛题,小牛要经过4年长成大牛才可以生育,那确实死的是谁会影响很大
兔子问题,你把它当成细菌有丝分裂就行了,不用管是大还是小,都一样
因子:能引起股票产生变化的因素,常见的有价值类因子PB,PE等等。。。见链接
因子获取:
这里以获取价值类的因子数据为例(那里共有12大类):
# -*- coding: utf-8 -*- ##支持中文输入
from atrader import * # 导入atrader工具包,点宽回测必须的包
import pandas as pd # 导入pandas工具包
import os ###处理文件和目录
因子类名='价值类'
因子类=['NegMktValue','PE','PB','PS','MktValue','PCF','LFLO','LCAP','NLSIZE','ForwardPE','StaticPE','ETOP','CETOP','PEG3Y','PEG5Y','CTOP','TA2EV','ETP5','CTP5']
股票 = pd.DataFrame(get_code_list('hs300', date='2018-09-30')) ##获取 2018 年 9 月 30 日沪深 300 指数的成分股及权重:
for 序号, 数据 in 股票.iterrows(): ##进入循环
多个因子 = pd.ExcelWriter("C:\\因子\\%s\\%s_%d_%s.xlsx" % (因子类名,因子类名,序号, 数据['name']))
isExists=os.path.exists("C:\\因子\\%s\\"%因子类名)
if not isExists:
os.makedirs(r"C:\\因子\\%s\\"%因子类名)
因子数值 = get_factor_by_code(factor_list=因子类,target=数据['code'],
begin_date='2016-01-1', end_date='2018-09-30') #这里是获取某个日期范围内的数据
文件 = pd.DataFrame(data=因子数值) ##
文件.to_excel(多个因子, sheet_name=数据['name'], index=False)
print("已完成第%d个,本企业代码为%s"%(序号,数据['code']))
多个因子.save() ###文件保存
print("已完成!!")
其中,利用点宽的函数get_code_list(‘hs300’, date=‘2018-09-30’),数据前几行长这样:
完成后有300家股票对应的因子数据,第一家平安银行的因子数据前几行长这样:
因子处理:
# -*- coding: utf-8 -*-
from atrader import *
import numpy as np
import pandas as pd
import ffn
各类因子 = ["基础科目与衍生类","质量类","收益风险类","情绪类","成长类","常用技术指标类","动量类","价值类","每股指标类","模式识别类",
"行业、分析师类","特色技术指标类"]
hs300 = pd.read_excel('G:\\泰迪杯\\\\A\\因子\\hs300.xlsx')
table=pd.DataFrame()
for i, j in hs300.iterrows():
##获取时期内单个股票的bar,循环,连续300个股票的bar
kdata = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\bar\\bar_%d_%s.xlsx' % (i, j['name'])))
dataclose = kdata.close
datavolume = kdata.volume
dataopen = kdata.open
datahigh = kdata.high
datalow = kdata.low
dataamount = kdata.amount
##数据读入并处理删除整列空值的以及删除日期列-----
d0 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[0], 各类因子[0], i, j['name']))).dropna(
axis=1, how="all")
d1 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[1], 各类因子[1], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d2 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[2], 各类因子[2], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d3 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[3], 各类因子[3], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d4 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[4], 各类因子[4], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d5 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[5], 各类因子[5], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d6 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[6], 各类因子[6], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d7 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[7], 各类因子[7], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d8 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[8], 各类因子[8], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d9 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[9], 各类因子[9], i, j['name']))).dropna(
axis=1, how="all").drop(['date'], axis=1, inplace=False)
d10 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[10], 各类因子[10], i, j['name']))).dropna(
axis=1,how="all").drop(['date'], axis=1, inplace=False)
d11 = pd.DataFrame(pd.read_excel('G:\\泰迪杯\\\\A\\因子\\%s\\%s_%d_%s.xlsx' % (各类因子[11], 各类因子[11], i, j['name']))).dropna(
axis=1,how="all").drop(['date'], axis=1, inplace=False)
合并 = pd.concat([d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11], axis=1)
if len(合并['date']) != len(kdata['time']):
print("长度不一致")
continue
factors=合并.drop(['date'], axis=1, inplace=False)
factorname = []
sharpe_factor=[]
for ii ,jj in factors.iteritems():###按列循环
##判断某个时期某个因子的值是否一直不变,如果不变,则主观认为该因子在本股票内的这个时期内并没有影响,所以被忽略计算
if jj.var() == jj.mean():
# print("该因子名称为",ii,"的值始终相同,已舍去。")
continue
factorname.append(ii) ##记录因子的名字
ret=ffn.to_returns(dataclose) ##计算每期收益率,
####参考书籍‘量化投资以python为工具----蔡立耑 著’252页
jjj = jj.astype(np.float) ###转为float类型
jjj = jjj.fillna(np.nanmean(jj)) ##因子缺失值处理
jjj[jjj < jjj.mean() - 3 * jjj.std()] = jjj.mean() - 3 * jjj.std() ##极小值处理
jjj[jjj > jjj.mean() + 3 * jjj.std()] = jjj.mean() + 3 * jjj.std() ##极大值处理
jjj = (jjj - jjj.min()) / (jjj.max() - jjj.min()) ##数据标准化(归一化)
f=pd.DataFrame(ret[1:].values)/pd.DataFrame(jjj[:-1].values) ##截面回归分析,其中f为因子收益率
###这里,我参考点宽网的相关资料,采用截面回归分析,大家也可以采用其他方法。。
f[np.isinf(f)]=np.nan ##正负无穷值处理为缺失值
f = f.dropna(axis=0, how="all") ###缺失值的剔除
sharpe=ffn.calc_risk_return_ratio(f) ###计算整个时期的夏普比率
sharpe_factor.append(sharpe)##每个因子的夏普比率记录
###转为dataframe
table1 = pd.concat([pd.DataFrame(factorname),pd.DataFrame(sharpe_factor)], axis=1)
table1.columns = ['%s_因子'% (j['name']) , '夏普比率%d' % (i)]
###利用其中函数进行排序,在转为dataframe
table2=pd.DataFrame(table1.sort_values(by='夏普比率%d' % (i),ascending=False).values)
table2.columns = ['%s_因子'% (j['name']) , '夏普比率%d' % (i)]
table = pd.concat([table, table2], axis=1)
print(table)
# print("当前已完成到第",i,j['name'])
# table.to_excel('G:\\合并因子.xlsx', 'rb')
其中,300个股票的平安银行bar的前几行数据长这样:
其中,计算收益率,年化收益率,夏普比率等可以参考python ffn包,详情看链接1或者链接2
其中截面数据回归分析,单个因子的具体算法可以参考点宽,看下图
其中,第一个股票因子合并后的某几个因子的数据长这样:(大概有5-6百个因子数据)
第一个股票的单期收益率和整个时期的夏普比率长这样:
程序运行完后,部分相对应因子的夏普比率如图,这里是以截面回归分析而来的,也可以采取其他的方法计算收益率,夏普比率。
通过上面的代码,我们就可以按照夏普比率来挑选出因子了。