备份gp

import pandas as pd
import baostock as bs
import requests
from datetime import datetime, timedelta
import talib as ta

def get_history(gp_type,code,end_date=False,start_date=False,days=14):
    if not end_date:
        end_date=datetime.now().strftime("%Y-%m-%d")
    if not start_date:
        start_date=(datetime.strptime(end_date, "%Y-%m-%d") - timedelta(days=14)).strftime("%Y-%m-%d")
    bs.login()
    rs = bs.query_history_k_data_plus(
        code=gp_type+"."+str(code),         
        fields="code,date,open,high,low,close,volume,adjustflag",  # 要获取的字段(手动指定,Akshare 自动返回全字段)
        start_date=start_date,   # 日期格式:必须带横杠(Akshare 可无)
        end_date=end_date,
        frequency="d",             # 周期:d=日线(和 Akshare 的 period="daily" 对应)
        adjustflag="2"             # 复权:2=前复权(对应 Akshare 的 adjust="qfq")
    )
    # 3. 转为DataFrame(核心步骤)
    df = rs.get_data()
    df = df.replace("", 0)  # 把所有空字符串变成 0
    # 4. 数据类型转换(避免数值以字符串显示)
    df = df.astype({
        "code":str,
        "open": float, 
        "high": float, 
        "low": float,
        "close": float, 
        "volume": float,
        "adjustflag": int  # 复权标识转整数
    })
    bs.logout()
    return df

def gp_code(code):
    str_code=str(code)
    if str_code[0] in ['0','1','2','3']:
        gp_type='sz'
    elif str_code[0] in ['5','6','9']:
        gp_type='sh'
    elif str_code[0] in ['4','8']:
        gp_type='bj'
    else:
        return False
    return [gp_type,str_code]

def get_today(gp_type,code):
    str_code=str(code)
    url="https://qt.gtimg.cn/q="
    url=url+gp_type+str_code
    headers = {
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36"
    }
    res=requests.get(url,headers=headers)
    if res.status_code==200:
        if len(res.content)>30:
            reb = res.content.decode("gbk")
            reb = reb.replace("~~~", "~").replace("~~", "~")
            vsx = reb.split('~')
            return [
                        {
                            "code":gp_type+"."+str_code,
                            "date":datetime.now().strftime("%Y-%m-%d"),
                            "open": vsx[5], 
                            "high": vsx[32], 
                            "low": vsx[33],
                            "close": vsx[3], 
                            "volume": float(vsx[6])*100,
                            "adjustflag": 2  # 复权标识转整数
                        },
                        {
                            "name":vsx[1],
                            'money':vsx[42]
                        }
                    ]
    return False

ea=gp_code(600302)

print(ea)

ma=get_today(ea[0],ea[1])

print(ma)

# c=get_history('sh','600302')
# print('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>')
# print(c.head(100))

# df = pd.concat([c, pd.DataFrame([ma[0]])], ignore_index=True)


# df['MA5'] = ta.MA(df['close'], timeperiod=5)
# df['MA10'] = ta.MA(df['close'], timeperiod=10)
# df['MA20'] = ta.MA(df['close'], timeperiod=20)
# # df['MACD'], df['MACD_SIGNAL'], df['MACD_HIST'] = ta.MACD(df['close'])
# df['RSI'] = ta.RSI(df['close'], timeperiod=14)

# # 成交量均线
# df['VOL_MA5'] = ta.MA(df['volume'], timeperiod=5)
# df['VOL_MA10'] = ta.MA(df['volume'], timeperiod=10)
# df['VOL_MA20'] = ta.MA(df['volume'], timeperiod=20)
# df['ATR'] = ta.ATR(df['high'], df['low'], df['close'], timeperiod=6)

# print(df.head(10))
发表在 None | 留下评论

腾讯股票接口 快速

 if(in_array($jugg,['0','1','2','3'])){
                    $value='sz'.$value;
                }elseif(in_array($jugg,['5','6','9'])) {
                    $value='sh'.$value;
                }elseif(in_array($jugg,['4','8'])) {
                    $value='bj'.$value;
                }else{
                    continue;
                }

qt.gtimg.cn/q=s_sh600519,s_sh601318,s_sh601899,s_sh600036,s_sh601689,s_sh600016,s_sh601088,s_sh600887,s_sh601288,s_sh601658,s_sh600000,s_sh601989,s_sh601398,s_sh600104,s_sh600900,s_sh601898,s_sh600030,s_sh600690,s_sh601166,s_sh600703,s_sz300750,s_sz000333,s_sz000858,s_sz002594,s_sz000651,s_sz002475,s_sz002415,s_sz000001,s_sz000725,s_sz002142,s_sz000568,s_sz002230,s_sz000895,s_sz002508,s_sz000983,s_sz002371,s_sz002714,s_sz002008,s_sz000063,s_sz002821,s_sz300476,s_sz300059,s_sz300124,s_sz300760,s_sz002916,s_sz002202,s_sz000776,s_sz002601,s_sz002460,s_sz002304

上面简要信息

数据:
v_s_sh600519=”1~贵州茅台~600519~1408.07~-36.93~-2.56~47256~666971~~17632.84~GP-A~”; v_s_sh601318=”1~中国平安~601318~57.47~-2.27~-3.80~1253823~726410~~10406.46~GP-A~”;

市场类型
1 = 沪 A / 51 = 深 A
股票名称
贵州茅台
股票代码
600519
当前价格
涨跌额(今价 – 昨收)
涨跌幅 %
成交量(手)
成交额(万元)
(空字段,无用)
换手率 %
股票类型
GP-A=A 股 / GP-A-CYB = 创业板

可以打包获取全部,且字段少

发表在 None | 留下评论

数据获取 baostock

pip install baostock

但是只能提前一天,需要再加上腾讯的股票API 可以获取当日交易数据

import pandas as pd
import baostock as bs

bs.login()

rs = bs.query_history_k_data_plus(
    code="sz.000021",          # 股票代码:必须加市场前缀(sz=深市,sh=沪市),Akshare 不用
    fields="date,open,high,low,close,volume,adjustflag",  # 要获取的字段(手动指定,Akshare 自动返回全字段)
    start_date="2025-01-01",   # 日期格式:必须带横杠(Akshare 可无)
    end_date="2026-03-13",
    frequency="d",             # 周期:d=日线(和 Akshare 的 period="daily" 对应)
    adjustflag="2"             # 复权:2=前复权(对应 Akshare 的 adjust="qfq")
)


# 3. 转为DataFrame(核心步骤)
df = rs.get_data()

# 4. 数据类型转换(避免数值以字符串显示)
df = df.astype({
    "open": float, 
    "high": float, 
    "low": float,
    "close": float, 
    "volume": float,
    "adjustflag": int  # 复权标识转整数
})

bs.logout()

数据结构:

,date,open,high,low,close,volume,adjustflag
0,2025-01-02,18.8231439000,18.8627091000,17.6757531000,17.9527095000,60318610,2
1,2025-01-03,18.0021660000,18.1109703000,17.3097750000,17.3196663000,46006347,2
2,2025-01-06,17.2801011000,17.5174923000,17.0229273000,17.2306446000,30090966,2
3,2025-01-07,17.3196663000,17.6559705000,17.1910794000,17.6361879000,37186445,2
4,2025-01-08,17.4680358000,17.7252096000,16.7459709000,17.4284706000,44330600,2
5,2025-01-09,17.3097750000,17.9823834000,17.3097750000,17.6757531000,42315366,2
6,2025-01-10,17.6065140000,18.1307529000,17.2998837000,17.2998837000,41871400,2
7,2025-01-13,16.9141230000,17.3592315000,16.7558622000,17.1910794000,27391847,2
8,2025-01-14,17.3196663000,18.2296659000,17.1515142000,18.1999920000,48855138,2
9,2025-01-15,18.1208616000,18.2593398000,17.9032530000,17.9428182000,31419000,2
10,2025-01-16,18.1406442000,18.3681441000,17.7054270000,17.9032530000,33532828,2
11,2025-01-17,17.8142313000,18.2692311000,17.7153183000,18.0911877000,39192662,2
发表在 None | 留下评论

统一化壁纸

插入壁纸

发表在 None | 留下评论

量化交易

【股票候选池「收盘后执行」】

  1. 收盘价接近10日高点
  2. 收盘价>MA5
  3. 收盘MA5>昨日MA5
  4. ATR值在最近20个交易日内,由小到大排在第6位以后
  5. VOL-MA5 成交金额>2亿 【太小不看】 市值>50亿
  6. 额外的选股策略 防超买:RSI6 < 70 防反弹:收盘价 > MA20、MA20 不下行(今日MA20>昨日MA20) 防空间不够:前压力离现价 ≥ 1.5 ATR 【上一个周期的最高点价格为压力位>现价+1.5*ATR】

股票候选池 【可以人工审核 也可以AI分析审核】

生成主要4价格 k=[1.2,1.3]

因子K盈 K亏

  1. 止盈价=买入价+k*ATR 此处k取[1.2,1.3]
  2. 止损价=买入价-k*ATR 此处k取1
  3. 保本价=买入价+[0.7,0.8]*ATR #用于保证在止盈价下无法卖出
  4. 买入价 【用于在尾盘买入决策 14:30-14:45】

【买入价规则[股票池中数据 14:30-14:45 保证接近全天的数据] 】

在交易日期间内满足,趋势,交易量,必须经过仓位管理系统判断:单股不超30% 20%-30%区间;仓位=1%*总金额/最大损失股价;可以选3-4只股票减少风险;严格管理40%-60%。下面的很难同时满足请务必注意1 3两条

  1. 盘中10个交易日内最高
  2. 阳线 【当前价格>开盘价】
  3. 盘中交易量>VOL_MA5
  4. 盘中交易量>昨日交易量的1.2倍
  5. 大盘MA5>大盘昨日MA5

1-3天 等待区间,过了直接现价抛,时间就是金钱

【卖出规则】

及时盯盘到止盈 或者止损点卖,如果卖不出只能等待保本价,实在不行现价卖。

发表在 None | 留下评论