重磅-----股票情绪分析,提供打包程序,源代码

昨天毕业答辩完,接下来一个月就比较有时间完善程序了,本分析模型从实盘交易模型独立出来,做投资分析参考使用,程序启动方式有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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
目标用户群:习惯用通达信看盘,或习惯用大智慧看盘,但又喜欢用同花顺单独交易程序(xiadan.exe)来交易。 配置方式:打开压缩包中的配置文件,配置 "下单程序"的路径属性,即将path后面的路径改成你本机xiadan.exe的真实路径。(务必保持配置文件和本脚本名字一致) 使用步骤: 1、配置好上面说的路径 2、启动看盘软件,如通达信 3、启动本工具 4、本工具会根据上面所配置路径启动xiadan.exe 5、手动登录xiadan.exe 6、程序会发送F1、F2检查下单功能 7、无误后会在屏幕上方看到下单助手工具条。(点住左侧的矩形可以移动工具条的位置) 8、在通达信(大智慧)上浏览某股票,会同步更新到工具条上。 9、点击买或卖单选框可以切换到买模式或卖模式。(展示相应按钮,屏蔽无关按钮,避免操作出错。核买按钮就是涨停买,核卖就是跌停卖。) 10、选择仓位或者输入手数 11、选择价格或输入价格 12、点击下单按钮 13、本程序会将:股票代码、下单数量、下单价格、自动填写到 xiadan.exe 中。(并会核算下单数量是否符合可下单额度) 14、如选择了闪电复选框,那么在上面第13步下单确认窗口会自动被点击确认。(初期测试不建议选择闪电,另请务必在模拟账户上进行测试,本脚本只做为学习交流,不建议实盘应用,稳定性尚需打磨,欢迎交流探讨。)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_50882340

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值