百度上给出的定义:基本分析法是从影响证券价格变动的敏感因素出发,分析研究证券市场的价格变动的一般规律,为投资者作出正确决策提供科学依据的分析方法。主要有三个层次:一是宏观社会经济类影响因素; 二是行业(或产业)类影响因素; 三是公司类影响因素。三类影响证券价格的因素构成证券投资基本分析的三个部分,即宏观经济分析、行业分析和微观企业 (公司) 分析。我的以下分析主要集中在企业的数据上。
我的打分系统主要涉及到10个方面:营收,营利增长率,毛利率,期间费用,库存周转率,经营性现金流,净资产收益率,总资产收益率,市净率,市盈率。满分为一百分,分数越高,代表着公司的整体基本面越优秀(前提假设是公司没有做假账)。整套打分系统的源代码是由我的量化导师Cutehand所制作,我只是后期加工而已,如有需要请关注联系我的导师。所有的数据都是从Tushare上获取的,请自行去其官网进行注册,按照自己的需求来进行购买充值。
首先说一下本代码是.ipynb
格式,也就是我们说的Jupyter Notebook格式。另外我的代码分析不构成任何的投资推荐,请斟酌!
import pandas as pd
import numpy as np
import tushare as ts
# import talib
# import moduleigh as ml
import time
from datetime import datetime as dt
from pyfinance import TSeries
token = '你的tushare密钥'
ts.set_token(token)
pro = ts.pro_api(token)
df_20214 = pd.DataFrame(pd.read_csv("D:\\BaiduNetdiskWorkspace\\股票候选\\季度3连涨候选人_2021年第肆季.csv", encoding='GBK', index_col=0))
df_20221 = pd.DataFrame(pd.read_csv("D:\\BaiduNetdiskWorkspace\\股票候选\\季度3连涨候选人_2022年第壹季.csv", encoding='GBK', index_col=0))
df_20222 = pd.DataFrame(pd.read_csv("D:\\BaiduNetdiskWorkspace\\股票候选\\季度3连涨候选人_2022年第贰季.csv", encoding='GBK', index_col=0))
2. 其次我们看看这三张表里面,每张表大概有多少只股票。len(df_20214),len(df_20221),len(df_20222)
输出分别为179,509,594。
3. 当我们把分值缩小至66分以上,它们的输出缩小为55,105,132。
df_20214_66 = df_20214[df_20214[df_20214.columns[-1]] > 66]
df_20221_66 = df_20221[df_20221[df_20221.columns[-1]] > 66]
df_20222_66 = df_20222[df_20222[df_20222.columns[-1]] > 66]
set_stocklist = set(list_20214) & set(list_20221) & set(list_20222) # 看看哪些股票同时在这3张表内
df_result_list = pd.DataFrame({'ts_code':list(set_stocklist)}) # 创建一个列名为ts_code的dataframe
df_result = pd.merge(df_result_list, df_20222, on='ts_code') # 与最后一期表合并筛选出这几支股票都是哪些
df_result = df_result.sort_values(by=df_result.columns[-1], ascending=False).reset_index(drop=True) # 排序整理一下
5. 截至到这里我们发现,在2021年~2022年中的表现来看,我们的候选人从我的3张表中筛选出来的概率只有10%
def get_data(code,start='2021-01-01',end=''):
if code.startswith('399'): # 399开头的指数数据,用于区分股票数据
df=pro.index_daily(ts_code=code,start_date=start,end_date=end)
else:
df=ts.pro_bar(code,start_date=start,end_date=end,adj='qfq',freq='D')
df=df.sort_values('trade_date', ascending=True) # 按照时间正序排列,因为tushare给我们的是倒序排列
df.index=pd.to_datetime(df.trade_date) # 以时间轴为index
ret=df.close/df.close.shift(1)-1 # 计算每日收益率
#返回TSeries序列
return TSeries(ret.dropna())
freq=
的参数。建议大家pip install pyfinance
库后,去pyfinance的文件夹找一个叫做returns.py
的文件,把牵扯到anlzd_stdev()
的公式,统统将参数freq=250
进行固定年化设置。def performance(code):
tss=get_data(code)
benchmark=get_data('399300.SZ').loc[tss.index]
dd={}
#收益率
#年化收益率
dd['年化收益率']=tss.anlzd_ret()
#累积收益率
dd['累计收益率']=tss.cuml_ret()
#alpha和beta
dd['alpha']=tss.alpha(benchmark)
dd['beta']=tss.beta(benchmark)
#风险指标
#年化标准差
dd['年化标准差']=tss.anlzd_stdev(freq=250)
#下行标准差
dd['下行标准差']=tss.semi_stdev(freq=250)
#最大回撤
dd['最大回撤']=tss.max_drawdown()
#信息比率和特雷诺指数
dd['信息比率']=tss.info_ratio(benchmark)
dd['特雷纳指数']=tss.treynor_ratio(benchmark)
#风险调整收益率
dd['夏普比率']=tss.sharpe_ratio()
dd['索提诺比率']=tss.sortino_ratio(freq=250)
dd['calmar比率']=tss.calmar_ratio()
df=pd.DataFrame(dd.values(),index=dd.keys()).round(4)
return df
def analysis():
df=pd.DataFrame(index=performance('600110.SH').index)
name = df_result.name.values[:]
code = df_result.ts_code.values[:]
stocks = dict(zip(name,code))
for name,code in stocks.items():
try:
df[name] = performance(code).values
except:
continue
return df