从今天开始正式开启我的博客之旅,博客内容全部是我自己的量化心得,主要还是为自己将来中工作之中遇到相似问题,可以方便的找到答案,如果能帮到有相似问题的其他同学,我也很开心,如果帮不到的话,不喜勿喷,如果文章中有什么不对的地方,欢迎批评指正。
建立第一个简单的量化模型——小市值选股票模型。
思路:在A股市场之中,在每个月月底的时候,按照市值排名,选择最小市值的10只股票买入,持有到下个月月底,每月调仓一次,坚持一年,看收益率能否跑赢同期的创业板指数/中小板指数
具体操作:
方法1:
自己下载数据并且进行清洗和计算,建议使用tushare网站——http://tushare.org/,数据质量不错,还免费。
然后经过清洗和计算之后,得到自己想要的结果,我大概是用了近3天的时间才搞定,主要还是自己以前没学过python,很多函数都是现学现卖,浪费很多时间,之前的博客写过相关的内容,现在来看不值得新手学习,原因有二:
1:下载太多,数据清洗步骤太多,需要用到pandas 的各种方法,相比较之下都不是很好的方法,毕竟量化交易的核心不在数据清洗,这些都是基本工作,如果有质量很高的数据的话,可以减少很多无用功,所以建立一个好的数据库,可以节省很多时间。
2:在自己进行这个策略编织的时候,其实90%以上的时间都是用于计算各种数值,或者画图,这里还不包括用来评价策略好坏的夏普比率,要是加上的话,代码更多,真正策略本身的代码其实少得可怜,大多数都是脏活累活的数据清洗和整理,所以决定以后还是用第三方平台效率更高一些,可以更加的专注策略本身。
方法2:
使用第三方平台,目前我使用的是聚宽,我对比了一下聚宽、优矿、大宽网(已经倒闭了),都大同小异,选哪个都一样。
顺便说一句,虽然这些平台都大同小异,但是代码可不能简单复制粘贴,因为底层函数库是不一样的,有可能在别的平台根本用不了某个函数,并且简单复制到自己电脑中的python的话百分之百用不了。
talking is cheap, show me the code
展示部分源代码
def find(context):
# 计算出要买的股票——按照流通市值从小到大排序,并且选出50只,因为有可能有ST/*ST/停牌/涨停的股票,所以先得出股票池
df=get_fundamentals(query
(valuation.code,valuation.circulating_market_cap).order_by(valuation.circulating_market_cap)).loc[:49,"code"]
# 把股票池转为列表,并且带入过滤函数得到最后的buylist
buylist=list(df)
buylist=filter_stock(buylist)[:30]
#得到目前持仓
hold=[]
for i in context.portfolio.positions.keys():
hold.append(i)
# 如果目前持有的股票不在buylist中,就都卖出
sell=[]
for i in hold:
if i not in buylist:
order_target_value(i,0)
# 如果在buylist中的股票,不在目前的持仓中,就把股票放到to_buy中
to_buy=[]
for i in buylist:
if i not in hold:
to_buy.append(i)
# 如果to_buy不是空列表的话,就给每只股票平分可用资金,然后进场
if len(to_buy)>0:
cash=context.portfolio.available_cash/len(to_buy)
for i in to_buy:
order_value(i,cash)
代码的思路是,每个月底进行调仓,选出市值最小的股票交易,去掉ST/*ST/停牌/涨停的股票,然后选择最小市值的10只,基准是创业板综指,看看结果吧。
时间2017.1.1-2018.12.31,这波大盘走势先上后下,形成巨幅震荡行情
跑输创指,并且整体很悲催
时间2016.1.1-2018.2.28,大盘先下后上,和上次走势正好相反,但是因子的效果不同
这次跑赢指数,但是惨胜,回撤有点过分了
2014.4.28-2014.12.11,大盘单边上涨行情
表现非常靓丽。
结论:
1.因子本身的确有效,但是很明显单因子是不可能直接使用的。
2.顺风太浪,逆风就投,牛市来的时候可以搞,熊市很难做到降低风险
如果自己有策略,但是不会写代码的话,可以给我私信,价钱从几十到几百不等,看策略实现的难易程度而定,我使用的是聚宽平台,代码写好之后,可以在上面上模拟盘和实盘,对应的券商是第一创业证券。