量化A 发布于2022-08-09
回复 116
浏览 8587
90
下面代码方便大家查看思路,有残缺哦直接复制没用,要想可以运行的底下源码克隆策略哦。**目前已更新至3.0版本,重大更新sell函数**
**交流群:821983439**
模拟盘链接可以直接实时查看
两个版本参数略微有些差别
【JoinQuant】策略名称:东财打板3.2 链接:https://www.joinquant.com/algorithm/live/liveUrlShareIndex?backtestId=3d08810421e0de255cb13f2837267bd5 密码:asu4vt
【JoinQuant】策略名称:东财人气打板3.0 链接:https://www.joinquant.com/algorithm/live/liveUrlShareIndex?backtestId=73ed497dbd7bef39ff1dd0052fe4e842 密码:7nxet4
**更新2022-9-04 初步定稿卖出函数,不再是仅局限于9:40的生硬卖点而错过许多好股的行情,以下是对卖出函数的改进说明:**
** 3.0版本暂时不更新在聚宽进群可以领取**
* def sell(context):
if 9:40后量比大于10直接出掉:
if 处于水下:
if 水下-3个点,且五分钟内涨幅达2.5%出货
elif 未回撤新低且震荡上行,2:00未涨停出货
elif 未创新低且全天大低开横盘2:00分出货
if 处于水上:
if 涨停不出:
if 炸板出:
elif 未涨停:
if 涨幅小于5个点持股不动,2:00卖出
elif 涨幅大于5个点两分钟内涨幅达到2个点*以上,回撤2%出货
从回测上来看表现有明显提高,会买的是徒弟会卖的是师傅。

存在些许小问题,现已修复,如14:00后不卖出非涨停
**更新2022-8-21 剔除科创板和创业板,打板时添加量比 剔除高位放巨量的板
回测代码已更新**
> volume = pd.Series()
ma5 = attribute_history(security,unit='5d',skip_paused=True,fields='volume',count=1,fq=None).volume/1200
n_ma = attribute_history(security,skip_paused=True,fields='volume',count=1,unit='1m').volume.mean()
volume[security]=float(n_ma/ma5)
if volume[security] < 2.5:
>
**更新2.0**,**2022-8-26 解决了一个我一直想解决的问题,现在爬虫是每bar更新,根据市场热点实时变化,牵一发动全身为了这个改了不少东西。回测可复制代码已更新。**

**更新2.5**,**图片仅量比函数局部代码下方回测可复制已更新**昨日打板亨通光电时发现明明其量比已达到10,放巨量为何还打他的板,让我很疑惑,在寻找与计算中发现,量比公式获取的仅是当前时刻的分钟量比,而位于当日总成交量进行对比计算,所以在其基础上引入datetime对量比进行修改调整,目前改后量比已与东财所得量比一致。

根据图片可以很明显看出倒数第四行(修改前),倒数第三行修改后,其量比差距很明显。**同样的修改过后明显开仓次数大大减少,可以根据自己对风险、量比把控自己修改if后的条件数值,越大开仓次数也就越多,我这边设的是3**

# 初始化程序, 整个回测只运行一次
>
import jqdata
import datetime
import requests
import re
def initialize(context):
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 每天买入股票数量
g.daily_buy_count = 3
#需求:人气前100
#抓包动态数据爬取每天人气榜排名前100,仅打人气前100的板
run_daily(pachong,time='9:25')
# 让每天早上开盘时执行 morning_sell_all
run_daily(morning_sell_all, time='9:40')
run_daily(handle,time='every_bar')
run_daily(before_trading_start)
def pachong(context):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47'
}
#设置一个通用的url模板
url = 'https://emappdata.eastmoney.com/stockrank/getAllCurrentList'
params = {'appId': "appId01",
'globalId': "786e4c21-70dc-435a-93bb-38",
'marketType': "",
'pageNo': 1,
'pageSize': 100}
page_text = requests.post(url=url,json=params,headers=headers).text# 读取编码
ex='"(..\d+)"'
stock = re.findall(ex, page_text, re.S)
stocks=[]
for security in stock:
if 'SH' in security:
security = security+'.XSHG'
security=security.strip('SH')
stocks.append(security)
if 'SZ'in security:
security=security +'.XSHE'
security=security.strip('SZ')
stocks.append(security)
g.stocks = stocks
# 防止板块之间重复包含某只股票, 排除掉重复的, g.stocks 现在是一个集合(set)
g.stocks = set(g.stocks)
print(g.stocks)
def morning_sell_all(context):
# 将目前所有的股票卖出
for security in context.portfolio.positions:
price = get_current_data()[security].last_price
high_limit=get_current_data()[security].high_limit
if price >= high_limit:
return
else:
# 全部卖出
order_target(security, 0)
# 记录这次卖出
log.info("Selling %s" % (security))
# 在每分钟的第一秒运行, data 是上一分钟的切片数据
def handle(context):
# 判断是否在当日9:30-10:30早盘数据,我们只追涨早盘1小时满足追涨条件的股票
if context.current_dt.hour > 10.30 :
return
# 每天只买这么多个
if len(g.today_bought_stocks) >= g.daily_buy_count:
return
# 只遍历今天还没有买入的股票
#替代表达:****(g.stocks - g.today_bought_stocks)
for security in g.stocks:
if security not in context.portfolio.positions:
if security in g.stock_pac:
# 得到当前价格
price = get_current_data()[security].last_price
# 获取这只股票昨天收盘价
last_close = g.last_df[security][0]
high_limit=get_current_data()[security].high_limit
# 如果上一时间点价格已经涨了9.5%~9.9%
# 今天的涨停价格区间大于1元,今天没有买入该支股票
if price/last_close > 1.095 \
and price/last_close < 1.099 :
# 得到当前资金余额
cash = context.portfolio.cash
# 计算今天还需要买入的股票数量
need_count = g.daily_buy_count - len(g.today_bought_stocks)
# 把现金分成几份,
buy_cash = context.portfolio.cash / need_count
# 买入这么多现金的股票
order_value(security, buy_cash)
break
page_text = requests.post(url=url,json=params,headers=headers).text# 读取编码
>
----------------------------------------------------------------------
下面从2022-8-10日于聚宽模拟位进行模拟盘交易,每日交易结果会持续更新,有兴趣可以关注看看
10日打板文一科技,目前处于连板,稳稳拿!

12日早盘打板股
8.18日打板三只,两只炸板

8.19日 远大智能连扳,打板圣阳股份

8.23日 打板传艺科技
8.24日 三换板,没想到海特涨停他又给我接回来了,总体来说昨天小赚一个多点
8.26日打板大庆华科和长久物流

8.30日8.31日仅操作亨通光电,发现量比函数设定有误,更新2.5
 
9.1打板修改后打板陕西煤业,盈方微都没封住

9.2打板贵绳股份,可惜了昨天的盈方微连板没拿到,卖出函数的修改迫在眉睫最近找时间改一改,朋友们有好的建议可以在评论区留言或进群讨论。

9.7打板贵绳股份,9.8走势极具戏剧性,这种高位板也就量化敢打,一波十个点的振幅也就量化拿的住 
2点出了,没想到尾盘很猛又拉停了

9月15
最近行情比较极端一直没有出现什么热点,所以策略也没有开仓,耐心等一等行情重新调整
9月19日
打板传艺科技

9月20
传艺科技涨停板

9月21
传艺科技继续涨停,上板中远海能
 
9月22打板中国软件
![FE1B6DDE-B09C-43EC-823D-7FC57BB2BB9F.png][1]
这周收益还不错跑赢大盘,上周基本没怎么开仓都压到这周了
![94C4ED8E-9E40-40A8-A5D4-5AD69E531278.png][2]
[1]: https://image.joinquant.com/eb3e0d3b40c4f579066343014f6e44a3
[2]: https://image.joinquant.com/3852497454b4dca4f19f14ed82bc9062
很久没更了贴一张收益图吧,最近一直在试盘效果还不错
评论
此代码无法用与回测,仅可用于实盘,因为东财人气榜是实时数据,无法获取当日前人气榜数据,若回测可能会出现无交易现象
2022-08-09
@xiaomei168 谢谢分享,已经点赞。盼回复
2022-08-10
@xiaoyao518 谢谢点赞
2022-08-10
@xiaomei168 谢谢点赞
2022-08-10
大佬,你这要聚宽本地数据 才能运行吗
2022-08-10
@xiaoyao518 谢谢点赞
2022-08-10
@妙手 复制源码点一个空白策略进去就可以运了,但是如果想真正试的话用聚宽模拟交易位去运行
2022-08-10
模拟实测运行中发现有一些细节问题已经修复,将持续更新
2022-08-11
为什么在initialize里爬stocks列表呢,东财的这个排名是实时变动的,如果是当日的最后2小时进行买卖操作,是否应该在买卖前一秒获取股票标的列表?
------
另外,akshare有对应的接口获取东财人气股票代码,https://www.akshare.xyz/data/stock/stock.html?highlight=个股人气#id296
2022-08-11
@kami 是早盘9:30-10:30哈,不是尾盘最后两个小时
2022-08-11
@kami 之前不知道akshare有人气榜哈,感谢
2022-08-11
你这种实盘中会买到很多摸板的股票。。。然后就仅仅是摸一下 然后炸板炸掉了 并不能一直买到封板的股票啊 人气榜前100名当日炸板的也不少的,分钟的K线买入也会导致涨停买不到的因素 不知道楼主怎么确保买入不炸板和买的到的问题
2022-08-11
@万曲不倾心 打板就是会炸板的,人气高连扳概率大,炸板概率偏小,没有什么策略一劳永逸,这只不过是测试而已,不试你永远不知道策略有没有用
2022-08-11
这个没用吧,人气高的时候,已经涨停,买不到了
2022-08-12
@xiaoxiaoxiaolvoe 肯定可以买到的哈,除了开盘一字板排单排不到,可以关注跟踪哈每天会更新
2022-08-12
@宝程??²º²¹ 应该是可以的,模拟盘都是正常运行
2022-08-12
@船行渔歌 就是一创聚宽的实盘,代码能直接运行么?
2022-08-12