昨天毕业答辩完,接下来一个月就比较有时间完善程序了,本分析模型从实盘交易模型独立出来,做投资分析参考使用,程序启动方式有2个,一个是源代码启动,一个是打包程序启动,打包程序不需要安装python直接使用,本模型采用了5个因子进行分析,具体看源代码。
使用前仔细看视频,源代码启动
交易配置,我还在完善大盘情绪,资金流
{
"交易模型":"人气交易模型",
"开始时间":"20220101",
"结束时间":"20500101",
"停止程序":"假",
"测试":"假",
"卖出时间":"09:20",
"买入时间":"09:22",
"跟新数据时间":"14:50",
"固定交易数量":"100",
"同花顺下单路径":"C:/同花顺软件/同花顺/xiadan.exe",
"是否剔除创业板":"是",
"价格上限":60,
"价格下限":5,
"今日涨跌幅上限":10.1,
"今日涨跌幅下限":-3,
"交易模式":"排名",
"排名前N":100,
"买入前N":5,
"持股限制":5,
"单一股票持股限制":200,
"交易排行":60,
"分数上限":80,
"分数下限":60,
"人气排行前N":100,
"指定买入":"假",
"指定买入数量":-3,
"指定买入说明":"默认卖出多数买入多少,指定买入在持股为空,自己指定发生作用,-3代表买入-3到-1位置公3只,3代表1到3 的位置",
"动态止盈止损":"真",
"止盈":30,
"止损":-10,
"当日止盈":20,
"当日止损":-20,
"qq":"1029762153@qq.com",
"qq掩码":"jgyhavzupyglecaf",
"发送通知":"真",
"交易时间配置":"配置如下,更新数据数据时间小于买入的时间",
"交易时间段":4,
"交易开始时间":9,
"交易结束时间":14,
"东方财富cookie":"12"
}
程序运行结果
股票排名数据按历史保持
声明:本文文提高的数据,程序仅仅用于交流学习,不得用于商业用途,其他行为自己承担风险
需要程序的关注微信公众 数据分析与运用,回复20230514就可以,安视频运行
很多读者说利用源代码看不太明白,不知道怎么样用我建立了一个学习平台,欢迎加入,但必须遵守规则,相互包容
同时分别交流学习,我邀请加入,我解答不懂的问题,最近答辩完有时间
不懂的欢迎一起学习
排名历史变化按日期保持
交易股票池按历史保持
人气原始数据按历史保持
还有很多数据可以研究
分析模型源代码
import pandas as pd
#东方财富人气模型
import dfcf_rq
from stock_data import stock_data
from tqdm import tqdm
from stock_change import stock_em
import json
from datetime import datetime
from stock_data import stock_data
data=stock_data()
#核心数据
def stock_dict_data():
'''
股票字典
'''
df=data.stock_individual_fund_flow_rank()
stock_dict=dict(zip(df['代码'].tolist(),df['名称'].tolist()))
price_dict=dict(zip(df['代码'].tolist(),df['最新价'].tolist()))
zdf_dict=dict(zip(df['代码'].tolist(),df['今日涨跌幅'].tolist()))
return stock_dict,price_dict,zdf_dict
stock_dict,price_dict,zdf_dict=stock_dict_data()
def popularity_models(stock='601360',n=20,total_n=100):
'''
人气排行前20/自己研究前100
模型20分,一个位置一分
'''
popularity=dfcf_rq.popularity()
df=popularity.get_stock_popularity_rank_data()
stock_list=df['代码'].tolist()[:total_n]
if stock not in stock_list:
score=0
else:
index=stock_list.index(stock)
score=abs((total_n-index))*(n/total_n)
return score
def cash_models(stock='600111',n=10):
'''
资金模型
10日资金
20分
'''
df=data.stock_individual_fund_flow(stock=stock)[-n:]
up_size=df[df['主力净流入净额']>=0].shape[0]
down_size=df[df['主力净流入净额']<=0].shape[0]
score=(up_size-down_size)*(20/n)
return score
def pct_change_models(stock='601858',start_date='20210101',end_date='20500101'):
'''
当日涨跌幅模型
20分
'''
df=data.get_stock_hist_data_em(stock=stock,start_date=start_date,end_date=end_date)
score=df['涨跌幅'].tolist()[-1]*2
if score>=20:
score=20
else:
score=score
return score
def mean_line_models(stock='600100',start_date='',end_date='20500101'):
'''
均线模型
趋势模型
5,10,20,30,60
'''
df=data.get_stock_hist_data_em(stock=stock,start_date=start_date,end_date=end_date)
df1=pd.DataFrame()
df1['date']=df['date']
df1['5']=df['close'].rolling(window=5).mean()
df1['10']=df['close'].rolling(window=10).mean()
df1['20']=df['close'].rolling(window=20).mean()
df1['30']=df['close'].rolling(window=30).mean()
df1['60']=df['close'].rolling(window=60).mean()
score=0
#加分的情况
mean_5=df1['5'].tolist()[-1]
mean_10=df1['10'].tolist()[-1]
mean_20=df1['20'].tolist()[-1]
mean_30=df1['30'].tolist()[-1]
mean_60=df1['60'].tolist()[-1]
#相邻2个均线进行比较
if mean_5>mean_10:
score+=5
if mean_10>mean_20:
score+=5
if mean_20>mean_30:
score+=5
if mean_30>mean_60:
score+=5
if mean_5<mean_10:
score-=5
if mean_10<mean_20:
score-=5
if mean_20<mean_30:
score-=5
if mean_30<mean_60:
score-=5
return score
def stock_change_rate(stock='002292',start_date='',end_date='20500101'):
'''
涨跌幅情况变化
上涨强度
'''
df=data.get_stock_hist_data_em(stock=stock,start_date=start_date,end_date=end_date)[-10:]
up=df[df['涨跌幅']>0].shape[0]
down=df[df['涨跌幅']<0].shape[0]
score=up*2
return score
def total_sore_models(stock='600105',start_date='20210101',end_date='20500101'):
'''
总分模型
'''
popularity=popularity_models(stock=stock)
cash=cash_models(stock=stock)
change=pct_change_models(stock=stock,start_date=start_date,end_date=end_date)
mean=mean_line_models(stock=stock,start_date=start_date,end_date=end_date)
zd=stock_change_rate(stock=stock,start_date=start_date,end_date=end_date)
total_score=popularity+cash+mean+change+zd
data=pd.DataFrame()
data['人气得分']=[popularity]
data['资金得分']=[cash]
data['涨跌幅得分']=[change]
data['趋势得分']=[mean]
data['上涨强度得分']=[zd]
data['总分']=[total_score]
data['股票代码']=[stock]
data['股票名称']=[stock_dict[stock]]
data['今日涨跌幅']=[zdf_dict[stock]]
data['最新价']=[price_dict[stock]]
return data
def cacal_more_stock_score(stock_list=['600031','600111','600100'],start_date='20210101',end_date='20500101'):
'''
计算多个股票
'''
df=pd.DataFrame()
for i in tqdm(range(len(stock_list))):
try:
df1=total_sore_models(stock=stock_list[i],start_date=start_date,end_date=end_date)
df=pd.concat([df,df1],ignore_index=True)
except:
pass
df2=df.sort_values(by='总分',ascending=False,ignore_index=True)
return df2
def cacal_all_stock_popularity(n=10,start_date='20210101',end_date='20500101'):
'''
东方财富人气分析
'''
popularity=dfcf_rq.popularity()
now_date=str(datetime.now())[:10]
df=popularity.get_stock_popularity_rank_data()
df.to_excel(r'人气原始数据\{}人气原始数据.xlsx'.format(now_date))
stock_list=df['代码'].tolist()[:n]
result=cacal_more_stock_score(stock_list=stock_list,start_date=start_date,end_date=end_date)
return result
def add_dfcf_rq():
rq=dfcf_rq.popularity()
df=rq.get_stock_popularity_rank_data()
df.to_excel(r'东方财富人气.xlsx')
code_list=df['代码'].tolist()
stock=stock_em()
stock.del_stock_zh_name(name='东方财富人气')
stock.create_stock_zh(name='东方财富人气')
for code in code_list:
stock.add_stock_to_account(name='东方财富人气',stock=code)
from datetime import datetime
data=stock_data()
trader_list=data.get_trader_date_list()
now_date=''.join(trader_list[-1].split('-'))
stock.all_zt_stock_add_to_account(date=now_date)
return df
def add_stock_to_account(stock_list=['600031','600111'],name='东方财富人气'):
'''
添加股票到组合
'''
stock=stock_em()
stock.del_stock_zh_name(name=name)
stock.create_stock_zh(name=name)
for code in stock_list:
stock.add_stock_to_account(name=name,stock=code)
def get_analysis_result_1():
'''
获取分析的结果1
买入股票池
'''
with open('分析配置.json','r+',encoding='utf-8') as f:
com=f.read()
text=json.loads(com)
n=text['人气排行前N']
price_max=text['价格上限']
price_min=text['价格下限']
zdf_max=text['今日涨跌幅上限']
zdf_min=text['今日涨跌幅下限']
del_cyb=text['是否剔除创业板']
trade_rank=text['交易排行']
score_min=text['分数下限']
score_max=text['分数上限']
df=cacal_all_stock_popularity(n=n)
data=stock_data()
now_date=str(datetime.now())[:10]
df.to_excel(r'股票排名原始数据\{}股票排名原始数据.xlsx'.format(now_date))
rank_data=df[:trade_rank]
rank_data.to_excel(r'排名股票池\{}排名股票池.xlsx'.format(now_date))
def select_data(x):
if x[:3]=='300':
return '是'
else:
return '不是'
if del_cyb=='是':
df['选择']=df['股票代码'].apply(select_data)
df1=df[df['选择']=='不是']
df=df1
else:
df=df
df1=df[df['今日涨跌幅']<=zdf_max]
df2=df1[df1['今日涨跌幅']>=zdf_min]
df3=df2[df2['最新价']<=price_max]
df4=df3[df3['最新价']>=price_min]
df5=df4[df4['总分']>=score_min]
df6=df5[df5['总分']<=score_max]
df6.to_excel(r'交易股票数据池\{}交易股票数据池.xlsx'.format(now_date))
return df6
def get_analysis_result_2():
'''
获取分析的结果,比较激进的交易方式
排序股票池
'''
with open('分析配置.json','r+',encoding='utf-8') as f:
com=f.read()
text=json.loads(com)
n=text['人气排行前N']
price_max=text['价格上限']
price_min=text['价格下限']
zdf_max=text['今日涨跌幅上限']
zdf_min=text['今日涨跌幅下限']
del_cyb=text['是否剔除创业板']
trade_rank=text['交易排行']
df=cacal_all_stock_popularity(n=n)[:trade_rank]
return df
def get_buy_sell_stock_by_rank():
'''
获取买入股票池
'''
with open('分析配置.json','r+',encoding='utf-8') as f:
com=f.read()
text=json.loads(com)
n=text['人气排行前N']
price_max=text['价格上限']
price_min=text['价格下限']
zdf_max=text['今日涨跌幅上限']
zdf_min=text['今日涨跌幅下限']
del_cyb=text['是否剔除创业板']
trade_rank=text['交易排行']
hold_limit=text['持股限制']
fix_trade=text['指定买入']
fix_amount=text['指定买入数量']
one_limit=text['单一股票持股限制']
if fix_trade=='假':
hold_stock=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')
if hold_stock.shape[0]>0:
def select_data(x):
if x[0]=='6' or x[0]=='3' or x[0]=='0':
return "是"
else:
return "不是"
hold_stock['选择']=hold_stock['证券代码'].apply(select_data)
hold_stock=hold_stock[hold_stock['选择']=='是']
select_stock=pd.read_excel(r'股票排名原始数据\股票排名原始数据.xlsx',dtype='object')[:trade_rank]
#卖出的股票
result=[]
if hold_stock.shape[0]==0:
buy_amount=hold_limit
else:
for stock in hold_stock['证券代码'].tolist():
if stock not in select_stock['股票代码'].tolist():
result.append(stock)
sell_df=pd.DataFrame({'股票代码':result})
sell_df.to_excel(r'卖出股票\卖出股票.xlsx')
now_amount=hold_stock.shape[0]-len(result)
if now_amount>hold_limit:
buy_amount=len(result)
else:
buy_amount=hold_limit-now_amount
trader_stock=df=pd.read_excel(r'交易股票数据池\交易股票数据池.xlsx',dtype='object')
buy_df=trader_stock[-buy_amount:]
buy_df.to_excel(r'买入股票\买入股票.xlsx')
print('买卖数据更新完成')
return buy_df,sell_df
else:
trader_stock=df=pd.read_excel(r'交易股票数据池\交易股票数据池.xlsx',dtype='object')
print('没有持股,启动默认买入')
if fix_amount>0:
df=trader_stock[:fix_amount]
else:
df=trader_stock[fix_amount:]
df.to_excel(r'买入股票\买入股票.xlsx')
return df
else:
trader_stock=df=pd.read_excel(r'交易股票数据池\交易股票数据池.xlsx',dtype='object')
if fix_amount>0:
df=trader_stock[:fix_amount]
else:
df=trader_stock[fix_amount:]
df.to_excel(r'买入股票\买入股票.xlsx')
return df
def get_buy_sell_stock_by_score():
'''
获取买入股票池
分散
'''
with open('分析配置.json','r+',encoding='utf-8') as f:
com=f.read()
text=json.loads(com)
n=text['人气排行前N']
price_max=text['价格上限']
price_min=text['价格下限']
zdf_max=text['今日涨跌幅上限']
zdf_min=text['今日涨跌幅下限']
del_cyb=text['是否剔除创业板']
score_max=text['分数上限']
score_min=text['分数下限']
trade_rank=text['交易排行']
hold_limit=text['持股限制']
hold_stock=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')
def select_data(x):
if x[0]=='6' or x[0]=='3' or x[0]=='0':
return "是"
else:
return "不是"
hold_stock['选择']=hold_stock['证券代码'].apply(select_data)
hold_stock=hold_stock[hold_stock['选择']=='是']
select_stock=pd.read_excel(r'股票排名原始数据\股票排名原始数据.xlsx',dtype='object')[:trade_rank]
#卖出的股票
result=[]
for stock in hold_stock['证券代码'].tolist():
score=select_stock[select_stock['股票代码']==stock]
if score.shape[0]==0:
result.append(stock)
else:
score=score['总分'].tolist()[-1]
if score>score_max or score<score_min:
result.append(stock)
else:
pass
sell_df=pd.DataFrame({'股票代码':result})
sell_df.to_excel(r'卖出股票\卖出股票.xlsx')
trader_stock=pd.read_excel(r'股票排名原始数据\股票排名原始数据.xlsx',dtype='object')
buy_amount=hold_limit-len(result)
#这个得看效果
buy_df=trader_stock[-buy_amount:]
buy_df.to_excel(r'买入股票\买入股票.xlsx')
return buy_df,sell_df
def update_all_data_by_rank():
'''
跟新全部数据
'''
with open('分析配置.json','r+',encoding='utf-8') as f:
com=f.read()
text=json.loads(com)
path=text['同花顺下单路径']
'''
trader=trader_frame(exe=r'{}'.format(path))
trader.connect()
account=trader.balance()
account.to_excel(r'账户数据\账户数据.xlsx')
print('账户数据保持成功')
hold_stock=trader.position()
hold_data=hold_stock[hold_stock['股票余额']>=100]
hold_data.to_excel(r'持股数据\持股数据.xlsx')
print('持股数据保持成功')
trades=trader.today_trades()
trades.to_excel(r'今日成交\今日成交.xlsx')
print('今日成交保存成功')
'''
get_analysis_result_1()
print('原始排名数据分析完成')
#get_buy_sell_stock_by_rank()
def dynamic_stop_profit_stop_loss(stock='002174'):
'''
动态止盈止损
'''
df=pd.read_excel(r'持股数据\持股数据.xlsx',dtype='object')
df1=df[df['证券代码']==stock]
if df1.shape[0]==0:
print('没有持股')
else:
df2=data.get_stock_set_bidding(stock=stock)
cost_price=df1['成本价'].tolist()[-1]
now_price=df2['成交价'].tolist()[-1]
result_ratio=((now_price-cost_price)/cost_price)*100
return result_ratio
def stock_hist_rank_change():
'''
股票历史排名变化
'''
from dfcf_rq import popularity
now_date=str(datetime.now())[:10]
df=pd.read_excel(r'股票排名原始数据\{}股票排名原始数据.xlsx'.format(now_date),dtype='object')
models=popularity(data_type='人气',market='A',globalId='786e4c21-70dc-435a-93bb-38')
stock_list=df['股票代码'].tolist()
data=pd.DataFrame()
for i in tqdm(range(len(stock_list))):
try:
stock=stock_list[i]
name=stock_dict[stock]
if stock[0]=='6':
stock='SH'+stock
else:
stock='SZ'+stock
df3=models.get_stock_hist_rank(stock=stock)
data['日期']=df3['日期']
data['{}排名'.format(name)]=df3['排名']
data['{}排名变化'.format(name)]=df3['排名变化']
except:
pass
data1=data.sort_index(ascending=False,ignore_index=True)
data1.to_excel(r'股票历史排名变化\{}股票历史排名变化.xlsx'.format(now_date))
print(data1)
print('股票历史排名变化完成')
return data
def get_stock_vermicelli_characteristics():
'''
粉丝特征
'''
from dfcf_rq import popularity
now_date=str(datetime.now())[:10]
df=pd.read_excel(r'股票排名原始数据\{}股票排名原始数据.xlsx'.format(now_date),dtype='object')
models=popularity(data_type='人气',market='A',globalId='786e4c21-70dc-435a-93bb-38')
stock_list=df['股票代码'].tolist()
for i in tqdm(range(len(stock_list))):
try:
stock=stock_list[i]
name=stock_dict[stock]
if stock[0]=='6':
stock='SH'+stock
else:
stock='SZ'+stock
df3=models.get_stock_vermicelli_characteristics(stock=stock)
df3.to_excel(r'股票粉丝特征\{}.xlsx'.format(name))
except:
pass
print('股票粉丝特征完成')
def get_stock_cov_key_word_rank():
'''
股票最相关的概念热度
'''
from dfcf_rq import popularity
now_date=str(datetime.now())[:10]
df=pd.read_excel(r'股票排名原始数据\{}股票排名原始数据.xlsx'.format(now_date),dtype='object')
models=popularity(data_type='人气',market='A',globalId='786e4c21-70dc-435a-93bb-38')
stock_list=df['股票代码'].tolist()
for i in tqdm(range(len(stock_list))):
try:
stock=stock_list[i]
name=stock_dict[stock]
if stock[0]=='6':
stock='SH'+stock
else:
stock='SZ'+stock
df3=models.get_stock_cov_key_word_rank(stock=stock)
df3.to_excel(r'股票相关概念热度\{}.xlsx'.format(name))
except:
pass
print('股票相关概念热度完成')
if __name__=='__main__':
'''
更新数据
'''
update_all_data_by_rank()
stock_hist_rank_change()
get_stock_vermicelli_characteristics()
get_stock_cov_key_word_rank()
print('程序运行完成准备退出')
import time
time.sleep(60)