如何对AI量化策略进行管理?三步走 (副本)
由small_q创建,最终由small_q 被浏览 14 用户
导语
大部分初学AI-量化的同学做选股策略的做法都是简单粗暴将全市场的股票数据都放入模型训练, 然后企图训练出一个万能模型-图灵机, 寄希望于仅仅只通过暴力的数据挖掘,或者某些因子,就可以打造出一个适应于 任何行情的选股模型--圣杯。
但遗憾的是,A股市场中的数据噪音是很大的,不同的市场环境,不同的因子的选股效果也不一样。
各种风格不同类型的股票他们会互相形成干扰,导致我们通过正常的方法很难从中挖掘到超额收益。 通过这些少量的带有噪音的数据,我们通常非常难训练出一个良好的模型, 穷尽拟合所有可能发生的市场状态。
因此,我一般设计策略的思路 都是会将不同市场行情先做切分。将不同的市场行情做分类,开发出对适合该类市场的策略做组合投资, 以此类分散风险。
策略分类
我会做多几种不同风格,适用于不同市场行情的策略,比如单边牛市的时候,就做进攻型策略。
行情下跌的时候就做防守,做防守型策略。
震荡市场中,我就用大小情绪周期轮动的方式,将攻防策略一体化做一个策略组合。
这种切分市场的做法好处是:可以使得策略池中,永远都存在适应当下市场的一种。同时也能确保策略池里的选股策略,能覆盖到大部分的市场行情。
本次分享将通过简单的绩效分析管理账户策略,尤其是单股流的策略。通过本次分享, 可以思考一下如何去驾驭手中的超短策略模型。
我们的策略库中可能存在的策略:
- 超短进攻类型的策略:资金流追涨,上攻形态追涨,平台、箱体突破;
- 追涨停板 超短择时防守型策略:回踩支撑位反弹,超跌反弹,强势股回调反弹
- 超短攻防一体型策略:攻防策略大小周期轮动组合
匹配策略库策略
获取api_token
获取策略notebookid
路径:我的交易-模拟交易策略-策略详情页-链接里的
Pandas策略绩效分析
将api_token和notebook_id导入以下代码中运行,读取数据。用pandas对策略进行绩效分析,对策略绩效的结果进行一些简单的排序评估。
爬取交易api数据
#----这里是首先要运行一次的文件
import pandas as pd
import requests
import json
def request_position_by_api_key(uname, key,notebook_id):
position_url = 'https://bigquant.com/bigwebapi/algo_info/plot_return'
r = requests.get(url=position_url, params={
'owner': uname,
'api_key': key,
'notebook_id': notebook_id,
})
return json.loads(r.text)
uname='woshisilvio' #这里填写你的账号用户名 比如账号用户名id
#这里填写你刚才在api中获取到的的 token_id
api_token = """
api_token_id
"""
#----- 下面的 ids 填写的 是 我的交易中的策略notebook_id
ids=['策略1的notebook_id','策略2的notebook_id','策略3的notebook_id']
获取策略指标
def get_strategy_metrics(notebook_id, owner, api_token):
url = f"https://bigquant.com/bigwebapi/algo_info/plot_return?owner={owner}¬ebook_id={notebook_id}&limit=-1&api_key={api_token}"
response = requests.get(url)
sharpe = response.json()["data"]["algo_info_plot_return"]["sharpe"]
return sharpe
获取策略信号
def get_strategy_signal(api_token, ids):
url = 'https://bigquant.com/bigwebapi/algo_info/planned_orders'
headers = {'Authorization': 'Bearer {}'.format(api_token.strip().replace(", ""))}
data = {
'id_list': ids
}
r = requests.post(url=url, data=data, headers=headers)
res_dict = json.loads(r.text)
return res_dict
sharpes = [get_strategy_metrics(ids[i], user, api_token) for i in range(len(ids))]
res_dict =get_strategy_signal(api_token, ";".join(ids))
signals =[res_dict["data"][i]["planned_orders"] for i in range(len(ids))]
数据清洗
对爬取的数据列表重命名,进行数据清洗。
#这个是空的dataframe
df_empty=pd.DataFrame()
for i in ids:
#这里把自定中的 key value分离出来
result =[request_position_by_api_key(uname,key,i)['data']['algo_info_plot_return']]
data = pd.DataFrame(result)
#我们把我的交易中的策略绩效数据爬取出来
del data['after_shared_cum_return_plot'],data['before_shared_cum_return_plot'],data['benchmark_cum_return_plot'],data['max_drawdown_stamp'],data['cum_return_plot']
data.reset_index(inplace=True, drop=True)
data.rename(columns={
'algo_name':'策略名',
'annual_return':'年化收益',
'cum_return':'累计收益净值',
'alpha':'alpha',
'sharpe':'夏普比率',
'today_return':'日收益',
'win_ratio':'胜率',
'max_drawdown':'最大回撤',
'week_return':'周收益',
'month_return':'月收益',
'volatility':'波动率'
}, inplace=True)
df_empty=df_empty.append(data)
#df_empty
计算策略指标
计算用于衡量策略在区间内表现的一些指标:夏普比率,年化回撤比,年化波动比。
df_empty1=pd.DataFrame(df_empty,columns=['策略名','年化收益','累计收益净值','alpha','夏普比率','胜率','最大回撤','日收益','周收益','月收益','波动率'])
#data
df_empty1['年化回撤比']=df_empty1['年化收益']/df_empty1['最大回撤']
df_empty1['年化波动比']=df_empty1['年化收益']/df_empty1['波动率']
df_empty2=df_empty1.sort_values(by=['夏普比率'], ascending=0)
#df_empty2=df_empty1.sort_values(by=['年化回撤比'], ascending=0)
#df_empty2=df_empty1.sort_values(by=['年化波动比'], ascending=0)
分配资金仓位
按照年化波动比、年化回撤比、夏普比率用来分配资金仓位。
stock_count=len(ids) stock_weight=T.norm([1 / math.log(i + 2) for i in range(0, stock_count)]) df_empty2['资金分配到该策略的仓位比例']=stock_weight df_empty2
效果展示
按照夏普比率:
多策略组合后的曲线:
等权重:
按夏普比率排名:(组合绩效明显提升)