超跌20230413

[‘2023-04-06_603229_奥翔药业_化学制药’, ‘2023-04-12_688690_纳微科技_化学制药’, ‘2023-04-04_603456_九洲药业_化学制药’, ‘2023-04-04_300759_康龙化成_医疗服务’, ‘2023-04-11_002911_佛燃能源_燃气’] [‘2023-03-20_603128_华贸物流_物流行业’, ‘2023-03-16_002258_利尔化学_农药兽药’, ‘2023-03-20_603612_索通发展_非金属材料’, ‘2023-03-17_002015_协鑫能科_电力行业’, ‘2023-03-21_600153_建发股份_贸易行业’, ‘2023-03-17_002245_蔚蓝锂芯_电池’, ‘2023-03-17_002326_永太科技_化学制品’, ‘2023-03-17_300035_中科电气_非金属材料’, ‘2023-03-20_300861_美畅股份_非金属材料’, ‘2023-03-17_000408_藏格矿业_化肥行业’, ‘2023-03-20_002349_精华制药_中药’, ‘2023-03-20_300332_天壕环境_燃气’, ‘2023-03-20_603229_奥翔药业_化学制药’, ‘2023-03-20_600348_华阳股份_煤炭行业’]

March 22, 2023 · 1 min · 19 words

ETF轮动策略

概述 1、ETF即场内基金,比公募操作灵活,可以在交易t日不同时刻买入,交易t+1任意时刻卖出,一般比股票波动略小 2、轮动即为在每一时间周期开始的时候进行检查,调入符合策略的标的,调出不符合的标的,按周期持有标的,常见的还有可转债双低轮动策略,二八轮动(大小盘轮动) 3、通过轮动的方式,在每个周期尽量保持持有优选的标的,来获取超额收益 分析与实现 1、轮动范围 主要为A股行业ETF且成交量、市值较高的,排除宽基,增加少量美股、港股ETF 序号 代码 名称 1 159941 纳指 2 513050 中概互联 3 512880 证券 4 159995 芯片 5 512170 医疗 6 515790 光伏 7 159928 消费 8 512660 军工 9 515030 新能源车 10 513060 恒生医疗 11 515220 煤炭 12 512400 有色金属 13 159998 计算机 14 159865 养殖 15 162411 华宝油气 16 512980 传媒 17 159766 旅游 18 512200 房地产 19 159996 家电 20 513330 恒生互联网 21 512480 半导体 22 518880 黄金 23 159611 电力 24 516970 基建 25 159755 电池 2、买卖策略 1、择时 ...

February 6, 2023 · 1 min · 103 words

超跌20221012

[‘2022-10-11_600031_三一重工_工程机械’, ‘2022-10-11_603338_浙江鼎力_工程机械’, ‘2022-10-11_002463_沪电股份_电子元件’, ‘2022-10-11_600660_福耀玻璃_玻璃玻纤’, ‘2022-10-11_002558_巨人网络_游戏’, ‘2022-10-11_002626_金达威_食品饮料’, ‘2022-10-11_601633_长城汽车_汽车整车’, ‘2022-10-11_000582_北部湾港_航运港口’, ‘2022-10-11_603583_捷昌驱动_专用设备’, ‘2022-10-11_300685_艾德生物_医疗器械’, ‘2022-10-11_000877_天山股份_水泥建材’, ‘2022-10-11_000828_东莞控股_铁路公路’, ‘2022-10-11_300741_华宝股份_食品饮料’, ‘2022-10-11_603515_欧普照明_家电行业’, ‘2022-10-11_600548_深高速_铁路公路’, ‘2022-10-11_603919_金徽酒_酿酒行业’] [‘2022-10-10_300327_中颖电子_半导体’, ‘2022-10-10_601615_明阳智能_风电设备’, ‘2022-10-10_000581_威孚高科_汽车零部件’, ‘2022-10-10_600328_中盐化工_化学原料’, ‘2022-10-10_000960_锡业股份_小金属’, ‘2022-10-10_002545_东方铁塔_钢铁行业’, ‘2022-10-10_300261_雅本化学_农药兽药’, ‘2022-10-10_600058_五矿发展_贸易行业’, ‘2022-10-10_300233_金城医药_化学制药’, ‘2022-10-10_600030_中信证券_证券’, ‘2022-10-10_601800_中国交建_工程建设’, ‘2022-10-10_002056_横店东磁_小金属’, ‘2022-10-10_002539_云图控股_化肥行业’, ‘2022-10-10_600392_盛和资源_小金属’, ‘2022-10-10_600598_北大荒_农牧饲渔’, ‘2022-10-10_600999_招商证券_证券’, ‘2022-10-10_601877_正泰电器_电网设备’, ‘2022-10-10_600741_华域汽车_汽车零部件’, ‘2022-10-10_600459_贵研铂业_小金属’, ‘2022-10-10_600623_华谊集团_化学原料’, ‘2022-10-10_603693_江苏新能_电力行业’, ‘2022-10-10_000902_新洋丰_化肥行业’, ‘2022-10-10_600885_宏发股份_电网设备’, ‘2022-10-10_603025_大豪科技_专用设备’, ‘2022-10-10_600755_厦门国贸_贸易行业’, ‘2022-10-10_002736_国信证券_证券’, ‘2022-10-10_603638_艾迪精密_工程机械’, ‘2022-10-10_600720_祁连山_水泥建材’, ‘2022-10-10_601138_工业富联_消费电子’, ‘2022-10-10_600409_三友化工_化学原料’] [‘2022-09-30_002761_浙江建投_工程建设’, ‘2022-09-30_000703_恒逸石化_化纤行业’, ‘2022-09-30_000968_蓝焰控股_燃气’, ‘2022-09-30_603300_华铁应急_专用设备’, ‘2022-09-30_000723_美锦能源_煤炭行业’, ‘2022-09-30_300773_拉卡拉_软件开发’, ‘2022-09-30_600502_安徽建工_工程建设’, ‘2022-09-30_300587_天铁股份_橡胶制品’, ‘2022-09-30_603938_三孚股份_化肥行业’, ‘2022-09-30_600528_中铁工业_交运设备’, ‘2022-09-30_600352_浙江龙盛_化学制品’, ‘2022-09-30_600755_厦门国贸_贸易行业’, ‘2022-09-30_600643_爱建集团_多元金融’] [‘2022-09-28_002545_东方铁塔_钢铁行业’, ‘2022-09-29_601138_工业富联_消费电子’, ‘2022-09-29_002349_精华制药_中药’, ‘2022-09-29_600056_中国医药_医药商业’, ‘2022-09-29_600623_华谊集团_化学原料’, ‘2022-09-28_601952_苏垦农发_农牧饲渔’, ‘2022-09-29_000582_北部湾港_航运港口’, ‘2022-09-29_601233_桐昆股份_化纤行业’, ‘2022-09-29_600459_贵研铂业_小金属’, ‘2022-09-29_000672_上峰水泥_水泥建材’, ‘2022-09-29_600507_方大特钢_钢铁行业’, ‘2022-09-28_600406_国电南瑞_电网设备’, ‘2022-09-29_600801_华新水泥_水泥建材’, ‘2022-09-29_002064_华峰化学_化纤行业’, ‘2022-09-29_300261_雅本化学_农药兽药’, ‘2022-09-29_002558_巨人网络_游戏’, ‘2022-09-29_601211_国泰君安_证券’, ‘2022-09-29_600548_深高速_铁路公路’, ‘2022-09-29_600373_中文传媒_文化传媒’, ‘2022-09-29_002626_金达威_食品饮料’, ‘2022-09-29_002736_国信证券_证券’, ‘2022-09-29_600648_外高桥_房地产开发’, ‘2022-09-29_601166_兴业银行_银行’] ...

September 20, 2022 · 1 min · 124 words

模拟盘记录2022

202210 202209 202208

August 15, 2022 · 1 min · 3 words

复盘20211130

code 买入 卖出 收益 sz002073 软控股份 9.32 sh601778 晶科科技 9.34 sh600963 岳阳林纸 7.26 sz000682 东方电子 7.7 sz002135 东南网架 9.32 sh600072 中船科技 15.1 sh600143 金发科技 13.64 sz000930 中粮科技 11.86 sh601868 中国能建 2.51 sz002432 九安医疗 18.96 sz002006 精功科技 32.84 sh603105 芯能科技 18.01 sh600562 国睿科技 17.3 sz002063 远光软件 8.62 sh600995 文山电力 16.79 sh600150 中国船舶 24.27 sz002149 西部材料 21.19 sz002002 鸿达兴业 6.22 sz002106 莱宝高科 11.81 sz002745 木林森 17.1 sh600522 中天科技 18.97 sz000683 远兴能源 7.32 sh603005 晶方科技 60.11

November 30, 2021 · 1 min · 73 words

复盘20211129

code 买入 卖出 收益 sz002056 横店东磁 20.64 20.23 -1.99 sh601515 东风股份 8.58 9.02 5.13 sz000546 金圆股份 14.87 15.97 7.4 sz002139 拓邦股份 21.0 20.77 -1.1 sz002063 远光软件 8.16 8.39 2.82 sz002176 江特电机 24.4 27.01 10.7 sz002326 永太科技 63.0 58.87 -6.56 sh600110 诺德股份 21.81 21.3 -2.34 sz000155 川能动力 29.53 29.21 -1.08 sz002191 劲嘉股份 16.42 15.5 -5.6 sh603906 龙蟠科技 48.15 46.79 -2.82 sh600418 江淮汽车 17.44 16.97 -2.69 sh600884 杉杉股份 38.15 38.42 0.71 sh601919 中远海控 16.05 17.48 8.91 sz002132 恒星科技 7.19 6.87 -4.45

November 29, 2021 · 1 min · 79 words

UI自动化图片相似度检测

在不同分辨率手机上校验图标是否存在的方法 Brute-Force匹配器基础 Brute-Force匹配器很简单,它取第一个集合里一个特征的描述子并用第二个集合里所有其他的特征和他通过一些距离计算进行匹配。最近的返回。 对于BF匹配器,首先我们得用cv2.BFMatcher()创建BF匹配器对象.它取两个可选参数,第一个是normType。它指定要使用的距离量度。默认是cv2.NORM_L2。对于SIFT,SURF很好。(还有cv2.NORM_L1)。对于二进制字符串的描述子,比如ORB,BRIEF,BRISK等,应该用cv2.NORM_HAMMING。使用Hamming距离度量,如果ORB使用VTA_K == 3或者4,应该用cv2.NORM_HAMMING2 第二个参数是布尔变量,crossCheck模式是false,如果它是true,匹配器返回那些和(i, j)匹配的,这样集合A里的第i个描述子和集合B里的第j个描述子最匹配。两个集合里的两个特征应该互相匹配,它提供了连续的结果, 当它创建以后,两个重要的方法是BFMatcher.match()和BFMatcher.knnMatch()。第一个返回最匹配的,第二个方法返回k个最匹配的,k由用户指定。当我们需要多个的时候很有用。 想我们用cv2.drawKeypoints()来画关键点一样,cv2.drawMatches()帮我们画匹配的结果,它把两个图像水平堆叠并且从第一个图像画线到第二个图像来显示匹配。还有一个cv2.drawMatchesKnn来画k个最匹配的。如果k=2,它会给每个关键点画两根匹配线。所以我们得传一个掩图,如果我们想选择性的画的话。 SIFT实现 加载图像 找到描述子 def sift(filename): img = cv2.imread(filename) # 读取文件 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转化为灰度图 sift = cv2.SIFT_create() keyPoint, descriptor = sift.detectAndCompute(img, None) # 特征提取得到关键点以及对应的描述符(特征向量) return img, keyPoint, descriptor bf.match 接着我们用距离度量cv2.NORM_L2创建一个BFMatcher对象,crossCheck设为真。然后我们用Matcher.match()方法来获得两个图像里最匹配的。我们按他们距离升序排列,这样最匹配的(距离最小)在最前面。然后我们画出最开始的50个匹配 import cv2 from matplotlib import pyplot as plt def match(filename1, filename2): img1, kp1, des1 = sift(filename1) img2, kp2, des2 = sift(filename2) bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True) # sift的normType应该使用NORM_L2或者NORM_L1 matches = bf.match(des1, des2) matches = sorted(matches, key=lambda x: x.distance) len_before = len(matches) for m in matches: for n in matches: if(m != n and m.distance >= n.distance*0.75): matches.remove(m) break len_after = len(matches) img = cv2.drawMatches(img1, kp1, img2, kp2, matches[:20], img2, flags=2) plt.imshow(img), plt.show() val = round(len_after / len_before, 2) print(val) return val bf.knnMatch BFMatcher.knnMatch()方法会返回最佳匹配。而该方法为每个关键点返回 k 个最佳匹配(降序排列之后取前 k 个),其中 k 是由用户设定的,设置k=2这样我们可以应用比率检测 ...

November 25, 2020 · 3 min · 583 words

U2自动安装APK

import uiautomator2 as u2 import apkutils from loguru import logger class AndroidClient(object): d:u2 @classmethod def start(cls, udid): cls.d = u2.connect(udid) cls.d.healthcheck() cls.d.implicitly_wait(5) cls.d.set_fastinput_ime(True) return cls.d class Base(object): def __init__(self): self.d = AndroidClient.d class ApkInstall(Base): def watch_device(self, keyword): ''' 如果存在元素则自动点击 :param keyword: exp: keyword="yes|允许|好的|跳过" ''' for i in keyword.split("|"): self.d.watcher.when(i).click() self.d.watcher.start(1.0) time.sleep(2) def unwatch_device(self): '''关闭watcher ''' self.d.watcher.stop() time.sleep(2) def get_apk_info(self, path): '''从apk获取信息 ''' tmp = apkutils.APK(path).get_manifest() info = {} info['versionCode'] = str(tmp.get('@android:versionCode')) info['versionName'] = str(tmp.get('@android:versionName')) info['package'] = str(tmp.get('@package')) return info def local_install(self, apk_path): ''' 安装本地apk 覆盖安装,不需要usb链接 :param apk_path: apk文件本地路径 ''' pkg_name = self.get_apk_info(apk_path)['package'] file_name = os.path.basename(apk_path)[:12] + '.apk' logger.info('start install %s' % file_name) self.d.shell('rm -rf /sdcard/*.apk') self.d.shell('rm -rf /sdcard/apks/*.apk') self.d.shell(['/data/local/tmp/atx-agent', 'server', '-d']) if self.d.device_info['brand'] == 'vivo': '''Vivo 手机通过打开文件管理 安装app''' dst = '/sdcard/apks/' + file_name self.d.push(apk_path, dst) self.d.app_stop('com.android.packageinstaller') self.d.app_stop('com.android.filemanager') self.d.app_start('com.android.filemanager') time.sleep(4) if self.d(text="本地文件").exists(timeout=3): self.d(text="本地文件").click() if self.d(text="手机存储").exists(timeout=3): self.d(text="手机存储").click() time.sleep(1) # self.d(scrollable=True).scroll.toEnd() # time.sleep(1) for i in range(10): if self.d(textContains="apks").exists: self.d(textContains="apks").click() time.sleep(1) break else: # self.d(scrollable=True).scroll.vert.forward(steps=100) self.d.swipe_ext("up", scale=0.8) time.sleep(1) for i in range(40): if self.d(textContains=file_name).exists: self.d(textContains=file_name).click() time.sleep(5) break else: # self.d(scrollable=True).scroll.vert.forward(steps=100) self.d.swipe_ext("up", scale=0.8) print(i) time.sleep(1) # self.d(text=u"继续安装").click(timeout=15) if self.d(resourceId="android:id/button1").exists: self.d(resourceId="android:id/button1").click() else: self.d(resourceId="com.android.packageinstaller:id/continue_button").click() self.d(resourceId="com.android.packageinstaller:id/ok_button").click() time.sleep(8) elif self.d.device_info['brand'] == 'OPPO': dst = '/sdcard/apks/' + file_name self.d.push(apk_path, dst) self.d.app_stop('com.coloros.filemanager') self.d.app_start('com.coloros.filemanager') time.sleep(4) if self.d(text="手机存储").exists(timeout=3): self.d(text="手机存储").click() if self.d(text="所有文件").exists(timeout=3): self.d(text="所有文件").click() time.sleep(1) self.d(scrollable=True).scroll.to(textContains="apks") time.sleep(2) self.d(textContains="apks").click() time.sleep(2) # self.d(scrollable=True).scroll.to(textContains=file_name) # time.sleep(2) self.d(textContains=file_name).click() time.sleep(5) btn_done = self.d(className="android.widget.Button", text="完成") while not btn_done.exists: self.d(text="继续安装旧版本").click_exists() self.d(text="重新安装").click_exists() if self.d(resourceId="com.android.packageinstaller:id/install_confirm_panel").exists: # R11Plus if self.d(resourceId="com.android.packageinstaller:id/cancel_button").exists: self.d(resourceId="com.android.packageinstaller:id/bottom_button_layout") \ .click(offset=(0.5, 0.3)) # R9s elif self.d(resourceId="com.android.packageinstaller:id/bottom_button_layout").exists: self.d(resourceId="com.android.packageinstaller:id/bottom_button_layout") \ .click(offset=(0.75, 0.5)) # R17 elif not self.d(resourceId="com.android.packageinstaller:id/bottom_button_layout").exists: self.d(resourceId="com.android.packageinstaller:id/install_confirm_panel") \ .click(offset=(0.5, 0.95)) time.sleep(3) btn_done.click() else: dst = '/data/local/tmp/' + file_name self.d.push(apk_path, dst) self.watch_device('允许|继续安装|允许安装|始终允许|安装|重新安装') r = self.d.shell(['pm', 'install', '-r', dst], stream=True) id = r.text.strip() print(time.strftime('%H:%M:%S'), id) self.unwatch_device() packages = list(map(lambda p: p.split(':')[1], self.d.shell('pm list packages').output.splitlines())) if pkg_name in packages: self.d.shell(['rm', dst]) else: raise Exception('%s 安装失败' % apk_path) def install_apk(self): apk = 'xxx.apk' pkg_name = self.get_apk_info(apk)['package'] self.d.app_stop(pkg_name) self.d.app_uninstall(pkg_name) self.local_install(apk) self.d.app_start(pkg_name) time.sleep(2) # 授权 self.d.shell('pm grant {} android.permission.READ_PHONE_STATE'.format(pkg_name)) self.d.shell('pm grant {} android.permission.READ_EXTERNAL_STORAGE'.format(pkg_name)) self.d.shell('pm grant {} android.permission.ACCESS_COARSE_LOCATION'.format(pkg_name)) self.d.shell('pm grant {} android.permission.ACCESS_FINE_LOCATION'.format(pkg_name)) self.d.shell('pm grant {} android.permission.CAMERA'.format(pkg_name)) self.d.shell('pm grant {} android.permission.RECORD_AUDIO'.format(pkg_name)) self.d.shell('pm grant {} android.permission.WRITE_EXTERNAL_STORAGE'.format(pkg_name)) self.d.shell('pm grant {} android.permission.READ_CONTACTS'.format(pkg_name))

November 25, 2020 · 2 min · 338 words

本地 STF 内网穿透公网访问

有些事不能靠别人,更多的是靠自己 前提需要有一台公网服务器,ip在以下配置中称为 server_ip 1、local方式(适用本地部署stf,公网访问) 内网穿透配置,使用frp或其他内网穿透工具 frp下载地址 https://github.com/fatedier/frp/releases 服务端配置文件,启动./frps -c ./frps.ini # frps.ini [common] bind_port = 7000 authentication_method = token token = your_token allow_ports = 7400-7600,7100,7110 vhost_http_port = 7100 客户端配置文件,启动./frpc -c ./frpc.ini # frpc.ini [common] server_addr = server_ip server_port = 7000 token = your_token [stf_web] type = http local_port = 7100 custom_domains = server_ip_or_domain [range:stf] type = tcp local_ip = 127.0.0.1 local_port = 7400-7420 # 取决于设备数量,约2口/台 remote_port = 7400-7420 # 取决于设备数量 [stf_websocket] type = tcp local_ip = 127.0.0.1 local_port = 7110 remote_port = 7110 stf启动 本地启动 stf local --public-ip server_ip_or_domain --allow-remote 访问 server_ip_or_domain:7100

November 25, 2020 · 1 min · 92 words

Android 通过 VirtualXposed 进行 Charles https 抓包

Android7.0以上,无需root,即可抓包的方法 由于Android的机制,7.0以上不再信任用户证书,如Charles中的介绍 所以有3种方法可以解决这个问题: 最暴力的,root,把证书加入到系统证书 如果是自家APP,参考上面链接,在APP中设置信任用户证书 通过VirtualXposed+插件绕过证书检查(本文) 1、手机安装VirtualXposed 不多介绍,直接下载安装 地址:https://github.com/android-hacker/VirtualXposed/releases 2、VirtualXposed中安装 JustTrustMe 或 SSLUnpinning 用于绕过 SSL 证书检查 JustTrustMe:https://github.com/Fuzion24/JustTrustMe/releases TrustMeAlready:https://github.com/ViRb3/TrustMeAlready SSLUnpinning:https://github.com/ac-pm/SSLUnpinning_Xposed/blob/master/mobi.acpm.sslunpinning_latest.apk 在VirtualXposed中安装apk并启用模块 并在设置中,点击重启以使模块生效 3、VirtualXposed中安装目标apk 在VirtualXposed中安装目标apk,并配置好抓包工具,从VirtualXposed中启动APP开始抓包

November 25, 2020 · 1 min · 23 words