在今年股市大涨后,突然对股票有了一定的兴趣,于是采用python作为语言去对股票进行操作,用到的库是 akshare 。操作涉及两个方面,一个是选股,一个是买股和卖出。此策略是针对公司股票基本估值的一个买卖,最大程度上减少了与机构的博弈,关注的是股票本身的价值。
先上结果,这是利用股票数据建立数学模型后得到的。
该数据一共跑了 7 轮数据,4 轮数据从 20190101 - 20241011,3 轮数据从 20200101 - 20241011 ,时间跨度很大。收益率最高的还是策略 2,10 w本金 6 年 增长至 30.6 w。
选股
选股的策略是只选择前两年公司发展较好,公司在三年前已上市的股票(如 2019 年就只用 2018,2017 年发展较好且在2016年就已上市的股票),每一年选一次,一年一轮(相应的该策略下股票应当在年底进行抛售,无论当时股票的行情好与否)。
策略
卖出和买入的时机大致是通过市盈率来进行判断,在市盈率较高的时机抛出,在市盈率较低的时机买入。在实验中发现,股票的持有时间在40天-190天不等,虽然按照策略达不到最低点买入和最高点卖出,但卖出时基本都是盈利的。所以一旦出现买入信号,会直接购置股票的买入上限。
在实际操作中发现股票代码 00 开头的股票会出现某天严重下跌的情况,但又没办法抛开 00 的股票不进行操作,于是有了策略 2 ,对 00 开头的股票进行限购,限购 1500 股,其他的股票无限制。
选股代码
#股票连续三年ROE、EPS涨幅超过20的股票,陡然增长的股票不要
def xuangu_all():
'''
:param year: 多少年开始模拟
:param N_year: 模拟数据提前知晓的财务报表年份
:return:
'''
import akshare as ak
import datetime
year=2024
today = datetime.datetime.today()
now_year = today.year
#选出价格在20-40之间的市盈率大于0的股票,选择存在三年以上的股票
stock_zh_a_spot_em_df = ak.stock_zh_a_spot_em()
print(stock_zh_a_spot_em_df)
daixuan=[]
# for i in range(len(stock_zh_a_spot_em_df)):
# if stock_zh_a_spot_em_df.loc[i,'最新价']<40 and stock_zh_a_spot_em_df.loc[i,'最新价']>20:
# if stock_zh_a_spot_em_df.loc[i,'市盈率-动态']>0:
# daixuan.append(stock_zh_a_spot_em_df.loc[i,'代码'])
#
for i in range(len(stock_zh_a_spot_em_df)):
daixuan.append(stock_zh_a_spot_em_df.loc[i,'代码'])
daixuan2=[]
#未满三年的股票剔除,不满足ROE和EPS的股票剔除
for num in range(len(daixuan)):
# #三年前未入市的股票不要
daily_data = ak.stock_zh_a_hist(symbol=daixuan[num], start_date=f'{year-3}0101',end_date=f'{year-3}0201')
if len(daily_data)<10:
continue
print(num)
data=ak.stock_financial_abstract_ths(daixuan[num],indicator='按年度')
#财务报表小于5年的股票不要
if len(data)<3:
continue
#算3年的ROE和EPS,看同比增长大于20的
#EPS
_time=2
for N in range(1):
N=now_year-year
try:
EPS = 0
_EPS=[]
for i in range(_time):
_EPS.append((float(data.loc[i+N,'基本每股收益'])-float(data.loc[i+1+N,'基本每股收益']))/float(data.loc[i+1+N,'基本每股收益']))
EPS+=(float(data.loc[i+N,'基本每股收益'])-float(data.loc[i+1+N,'基本每股收益']))/float(data.loc[i+1+N,'基本每股收益'])
if (float(data.loc[i+N,'基本每股收益'])-float(data.loc[i+1+N,'基本每股收益']))/float(data.loc[i+1+N,'基本每股收益'])<=0.1:
EPS=0
break
EPS/=_time
#ROE
ROE=0
_ROE=[]
for i in range(_time):
_ROE.append(float(data.loc[i+N,'净资产收益率'][:-1]))
ROE+=float(data.loc[i+N,'净资产收益率'][:-1])
if float(data.loc[i+N,'净资产收益率'][:-1])<10:
ROE=0
break
ROE/=_time
except:
continue
print('EPS',EPS,'ROE',ROE)
if EPS>=0.25 and ROE>=25:
daixuan2.append(daixuan[num])
print(daixuan2)
with open('xuangu.txt','w')as f:
for i in daixuan2:
f.write(i+'\n')
break
print('done')
return daixuan2