Python量化交易+网格技术分析及实战测试
主要目标
股票量化交易分析
使用Python爬取股票数据
由于网格比较简单,先来看看网格策略。
一、简单的网格架构
网格顾名思义,就是没有什么交易的策略,纯粹的以挂单形式买卖来获利。买卖单之间有部分价差以此来套利。
所以他的弊端也是很明显的,就是在单边行情(下跌阶段)的时候,会出现亏损。只有在横盘震荡或上涨阶段会有收益。
实战测试
具体操作过程这里不做演示,这里需要用到交易所的API key,API Sercret
币优可以用很多的交易所来进行网格,这里以币安为例:binance.com 进入个人中心,api管理即可创建api
上面已经说到,在上涨或震荡行情里能有收益。那么我们最好就是选择一个比较稳定的,价格波动不大的来进行网格测试。最终我选择了EOS。
由于近期行情处于震荡上涨阶段。所以收益还是可以的。这个是测试5天的结果。
综合来看:网格比较简单,只能在震荡行情中使用,单边行情效果不好,下跌阶段必亏。
网格没有什么智能交易,机器学习。只能按照设定好的固定买卖差价来进行挂单。
股票量化交易分析
使用Python爬取股票数据
在谷歌的下载内容里面找到我们刚才下载下来的文件。
如果想和我下一样的,请点击这个链接
分析URL下载地址
寻找XML地址
初学爬虫简单介绍一下数据采集
# 1、get无参数实例
import requests
ret = requests.get('https://www.baidu.com/')
# 2、get有参数实例
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.get("https://www.baidu.com/", params=payload)
# 1、基本post实例
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.post("https://www.baidu.com/", data=payload) # 2、post发送请求头和数据实例
import requests
import json
url = 'https://www.baidu.com/'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'}
ret = requests.post(url, data=json.dumps(payload), headers=headers)
import gevent
import requests
from gevent import monkey
monkey.patch_all()
def fetch_async(method, url, req_kwargs): print(method, url, req_kwargs) response = requests.request(method=method, url=url, **req_kwargs) print(response.url, response.content)
# ##### 发送请求 #####
gevent.joinall([ gevent.spawn(fetch_async, method='get', url='https://www.python.org/', req_kwargs={}), gevent.spawn(fetch_async, method='get', url='https://www.yahoo.com/', req_kwargs={}), gevent.spawn(fetch_async, method='get', url='https://github.com/', req_kwargs={}),
])
# ##### 发送请求(协程池控制最大协程数量) #####
# from gevent.pool import Pool
# pool = Pool(None)
# gevent.joinall([
# pool.spawn(fetch_async, method='get', url='https://www.python.org/', req_kwargs={}),
# pool.spawn(fetch_async, method='get', url='https://www.yahoo.com/', req_kwargs={}),
# pool.spawn(fetch_async, method='get', url='https://www.github.com/', req_kwargs={}),
# ])
编写程序设计
我们首先建立一个文件夹,里面包含四个文件夹。
文件夹含义:
bin:项目的执行文件
conf:配置文件
core:核心代码文件
share:共享文件
- 我们在bin目录下创建python代码,名字叫crawler_start.py
- 我们在conf目录下创建python代码,名字叫setting.py
- 我们在core目录下创建python代码,名字叫crawler_main.py
import os
import sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
from core import crawler_main
if __name__ == '__main__': crawler_main.run()
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 股票的行业ID
INDUSTRY_ID = {"financial_ID": "hy010000", "medicine_ID": "hy003014", }
# 行业对应的数据先设置为空,主程序中存储股票代码的序列
STOCK_CODE = {"financial": None, "medicine": None, }
settings文件中主要存放固定的常量。
编辑core/crawler_main.py,内容如下:
# coding:utf-8
import os
import json
import gevent
import requests
from gevent import monkey
from gevent.pool import Pool
from conf import settings
# 把标准库中的thread/socket等给替换掉.这样我们在后面使用socket的时候可以跟平常一样使用,无需修改任何代码,但是它变成非阻塞的了
monkey.patch_all()
def get_code(industry_id, page_num=0): """ 访问行业概况的页面,获取json序列; 拿到页面总数,循环当前行业的股票代码存到列表中。 :param industry_id:股票行业的代码 :param page_num:网页的页面数 :return:返回一个列表,存的是当前行业所有的股票代码 """ temp = [] industry_url = 'http://quotes.money.163.com/hs/service/diyrank.php?host=http%3A%2F%2Fquotes.money.163.com%2Fhs%2Fservice%2Fdiyrank.php&page={page_num}&query=PLATE_IDS%3A{industry_id}&fields=NO%2CSYMBOL%2CNAME%2CPRICE%2CPERCENT%2CUPDOWN%2CFIVE_MINUTE%2COPEN%2CYESTCLOSE%2CHIGH%2CLOW%2CVOLUME%2CTURNOVER%2CHS%2CLB%2CWB%2CZF%2CPE%2CMCAP%2CTCAP%2CMFSUM%2CMFRATIO.MFRATIO2%2CMFRATIO.MFRATIO10%2CSNAME%2CCODE%2CANNOUNMT%2CUVSNEWS&sort=PERCENT&order=desc&count=24&type=query' response = requests.get( industry_url.format( page_num=page_num, industry_id=industry_id), ) list_obj = json.loads(response.text) page = list_obj["page"] pagecount = list_obj["pagecount"] for i in list_obj["list"]: temp.append(i["CODE"]) for i in range(page + 1, pagecount): response = requests.get( industry_url.format( page_num=i, industry_id=industry_id), ) list_obj = json.loads(response.text) for j in list_obj["list"]: temp.append(j["CODE"]) return temp
def fetch_async(method, url, args): """ 当一个greenlet遇到IO操作时,比如访问网络, 就自动切换到其他的greenlet,等到IO操作完成, 再在适当的时候切换回来继续执行。由于IO操作非常耗时, 经常使程序处于等待状态,有了gevent为我们自动切换协程, 就保证总有greenlet在运行,而不是等待IO。 :param method:请求方式 :param url:网页地址 :param args:字典 :return: """ response = requests.request(method=method, url=url) print(url) try: g = response.iter_lines() next(g) with open(os.path.join(settings.BASE_DIR, "share", args["save_dir"], args["stock_code"] + ".csv"), "w", encoding="utf-8") as wf: wf.write(next(g).decode(encoding='gbk') + '\n') for row in g: if row != b'': wf.write(row.decode(encoding='gbk') + '\n') except StopIteration: os.remove(os.path.join(settings.BASE_DIR, "share", args["save_dir"], args["stock_code"] + ".csv"))
def main(stock_dic): """ 通过列表生成式,把下载csv文件的地址格式化,生成每个任务。 :param stock_dic: :return: """ download_url = 'http://quotes.money.163.com/service/chddata.html?code={stock_code}&start=20170101&end=20180101&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP' for name, list_obj in stock_dic.items(): if not os.path.exists(os.path.join(settings.BASE_DIR, "share", name)): os.mkdir(os.path.join(settings.BASE_DIR, "share", name)) pool = Pool(10) # 所有任务 request_list = [pool.spawn(fetch_async, method='get', url=download_url.format(stock_code=i), args={"stock_code": i, "save_dir": name}) for i in list_obj] # 开始执行,等待它们完成任务 gevent.joinall(request_list) print("crawler to complete.")
def run(): medicine_list = get_code(settings.INDUSTRY_ID["medicine_ID"]) financial_list = get_code(settings.INDUSTRY_ID["financial_ID"]) settings.STOCK_CODE["medicine"] = medicine_list settings.STOCK_CODE["financial"] = financial_list main(settings.STOCK_CODE)
- 执行启动文件会运行run函数;
- 第一个执行get_code函数,是获取某行业所有股票代码,通过industry_url获取总页码,循环每一页获取股票代码,最后将获取的所有股票代码存到列表中返回;
- 下面执行main函数,通过列表生成式,把下载csv文件的地址格式化,生成每个任务。
代码测试
运行crawler_start
查看share目录中是否存在下载的目录,这里我们爬取了金融类和医疗类的股票信息
数据清洗上传到HDFS
python连接HDFS
pip install hdfs
运用python中的hdfs模块,连接hadoop hdfs的程序:
import hdfs
#创建hdfs连接实例,要保证hadoop已经启动
client = hdfs.Client("http://127.0.0.1: 50070")
#对hdfs进行操,创建/hdfs_ test_ dir目录
client.makedirs("/hdfs_test_dir', permission=755)
程序编写
cd /apps/hadoop/sbin
./start-all.sh
- 在bin下创建python文件,名为upload_start.py、cleanout_start.py
- 在core下创建python文件,名为upload_file.py、cleanout_file.py
import os
import sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
from core import upload_file
if __name__ == '__main__': upload_file.run()
import os
import sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_dir)
from core import cleanout_file
if __name__ == '__main__': cleanout_file.run()
HDFS_SAVE_DIR = "/stock_data"
HDFS_API_URL = "http://127.0.0.1:50070"
settings文件中主要存放固定的常量。
编辑core/upload_file.py,该段代码功能为:先创建目录,再将数据上传到hdfs,内容如下:
#!/usr/bin/env python
import hdfs
import os
from conf import settings
def run(): client = hdfs.Client(settings.HDFS_API_URL) # 在hdfs系统创建/stock_data目录,权限755 client.makedirs(settings.HDFS_SAVE_DIR, permission=755) # share中的数据上传hdfs的/stock_data目录 upload_status = client.upload( settings.HDFS_SAVE_DIR, os.path.join(settings.BASE_DIR, "share") ) print(upload_status)
编辑core/cleanout_file.py,该段代码功能为:遍历每个目录的每个文件,运用pandas模块打开文件,将第三列数据清洗,保存文件,内容如下:
import pandas as pd
import os
from conf import settings
def run(): data_file = os.path.join(settings.BASE_DIR, 'share') for d in os.listdir(data_file): for f in os.listdir(os.path.join(data_file, d)): current_file = os.path.join(data_file, d, f) df = pd.read_csv(current_file, header=None) df[2] = df.apply(lambda x: df[df.iloc[:, 2].duplicated() == True].head(1).iloc[:, 2], axis=1) df.to_csv(current_file, header=None, index=None, encoding='utf-8') print('cleanout file to complete.')
运行cleanout_start.py和upload_start.py文件即可
使用PyHive对股票数据进行分析
实验环境
hive-1.1.0-cdh5.4.5
hadoop-2.6.0-cdh5.4.5
mysql-5.5.53
实验内容
实验步骤
首先,切换到/apps/hadoop/etc/hadoop目录下,使用vim编辑core-site.xml文件。
cd /apps/hadoop/etc/hadoop
vim core-site.xml
修改hadoop的配置文件core-site.xml,在xml文件中< configuration> < /configuration>之间插入如下代码,保存退出。
<property> <name>hadoop.proxyuser.amiee.groups</name>
<value>*</value>
</property> <property> <name>hadoop.proxyuser.amiee.hosts</name> <value>*</value>
</property>
切换到/apps/hadoop/sbin目录下,开启hadoop相关进程
cd /apps/hadoop/sbin
./start-all.sh
hadoop fs -put /data/mydata/data /
sudo service mysql start
python安装pyhive、thrift、sasl、thrift_sasl模块
pip install pyhive thrift sasl thrift_sasl -i https://pypi.douban.com/simple
hive --service hiveserver2 &
编写程序
from pyhive import hive
cursor = hive.connect(host='127.0.0.1', username='amiee').cursor()
# create database stockhive
cursor.execute("create database if not exists stockhive")
# use database stockhive
cursor.execute("use stockhive")
我们以通用设备制造股票为例子,创建hive外部表,名为financial,建表语句如下:
# create table financial
cursor.execute("create external table if not exists financial\
( date date,\
Stock_code string,\
name string,\
Closing_price float,\
Highest_price float,\
Lowest_price float,\
Opening_price float,\
Before_the_close float,\
Change_amount float,\
Quote_change float,\
Turnover_rate float,\
Volume int,\
Turnover float,\
The_total_market_capitalization string,\
Circulation_market_capitalization string) \
row format delimited fields terminated by ',' \
lines terminated by '\n' \
location '/data/financial'")
date, 日期, 2020-10-03,
Stock_code, 股票代码, '600000,
name, 名称, 浦发银行,
Closing_price, 收盘价, 16.3,
Highest_price, 最高价, 16.44,
Lowest_price, 最低价, 16.17,
Opening_price, 开盘价, 16.21,
Before_the_close, 前收盘, 16.21,
Change_amount, 涨跌额, 0.09,
Quote_change, 涨跌幅, 0.5552,
Turnover_rate, 换手率, 0.0791,
Volume, 成交量, 16237125,
Turnover, 成交金额, 265043268.0,
The_total_market_capitalization, 总市值, 3.52377962729e+11,
Circulation_market_capitalization 流通市值 3.34456742479e+11
cursor.execute("desc financial")
for i in cursor.fetchall(): print(i)
cursor.execute("create index index_date on table financial(date) \
as'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' \
with deferred rebuild")
案例分析一:查询通用设备制造全部股票2019年的总涨跌额,并排出上涨股票前十名
cursor.execute("select Stock_code,sum(Change_amount) from financial group by Stock_code")
for i in cursor.fetchall(): print(i)
cursor.execute("create table result0(Stock_code string,Change_amount_sum float) \
row format delimited fields terminated by '\t' \
stored as textfile")
cursor.execute("insert into table result0 \
select Stock_code,sum(Change_amount) as change_amount_sum from financial \
group by Stock_code \
order by change_amount_sum desc \
limit 10")
cursor.execute("select * from result0")
for i in cursor.fetchall():print(i)
案例分析二:分析金融类股票2019年成交量最大的前10天,成交金额分别为多少
cursor.execute("create table result1 row format delimited fields terminated by '\t' \
stored as textfile \
as select stock_code,date,max(volume) as max_volume,turnover from financial \
group by stock_code,date,turnover \
order by max_volume desc limit 10")
案例分析三:分析2019全年股票成交量前十名并指出成交量第一的股票最新流通市值为多少
创建result2表,包含股票代码stock_code和成交量volume两个字段,以\t为分隔符。
cursor.execute("create table result2 row format delimited fields terminated by '\t' \
stored as textfile \
as select stock_code,sum(volume) as sum_volume from financial \
group by stock_code \
order by sum_volume desc limit 10")
cursor.execute("select * from result2")
for i in cursor.fetchall(): print(i)
使用Sqoop将分析结果数据持久化到Mysql数据库
mysql -u root -p
create database stock;
use stock;
创建三张表result_0、result_1、result_2分别对应hive中的result0、result1、result2
create table result_0 (stock_code varchar(100),change_amount_sum float);
create table result_1 (stock_code varchar(100),date date,max_volume int,turnover float);
create table result_2 (stock_code varchar(100),sum_volume bigint);
使用Sqoop命令将Hive中的result0表、result1表、result2表导入到Mysql中的result_0表、result_1表、result_2表。
sqoop export \
--connect jdbc:mysql://localhost:3306/stock?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table result_0 \
--export-dir /user/hive/warehouse/stockhive.db/result0/000000_0 \
--input-fields-terminated-by '\t'
sqoop export \
--connect jdbc:mysql://localhost:3306/stock?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table result_1 \
--export-dir /user/hive/warehouse/stockhive.db/result1/000000_0 \
--input-fields-terminated-by '\t'
sqoop export \
--connect jdbc:mysql://localhost:3306/stock?characterEncoding=UTF-8 \
--username root \
--password strongs \
--table result_2 \
--export-dir /user/hive/warehouse/stockhive.db/result2/000000_0 \
--input-fields-terminated-by '\t'
Python数据分析–量化交易
1.股票:股票是股份公司发给出资人的一种凭证,股票的持有者就是股份公司的股东。
2.股票的作用:
- 公司自身因素:股票自身价值是决定股价最基本的因素,而这主要取决于发行公司的经营业绩、资信水平以及连带而来的股息红利派发状况、发展前景、股票预期收益水平等。
- 行业因素:行业在国民经济中地位的变更,行业的发展前景和发展潜力,新兴行业引来的冲击等,以及上市公司在行业中所处的位置,经营业绩,经营状况,资金组合的改变及领导层人事变动等都会影响相关股票的价格。
- 市场因素:投资者的动向,大户的意向和操纵,公司间的合作或相互持股,信用交易和期货交易的增减,投机者的套利行为,公司的增资方式和增资额度等,均可能对股价形成较大影响。
- 心理因素:情绪波动,判断失误,盲目追随大户、狂抛抢购
- 经济因素:经济周期,国家的财政状况,金融环境,国际收支状况,行业经济地位的变化,国家汇率的调整等
- 政治因素
4.量化投资:利用计算机技术并且采用一定的数学模型去实践投资理念,实现投资策略的过程。
5.量化投资的优势:
6.学习Python数据分析(量化交易)主要使用以下第三方相关模块:
7.学习使用NumPy+pandas+Matplotlib完成股票金叉死叉、双均线的计算
入门Numpy
- ndarray,一个多维数组结构,高效且节省空间
- 无需循环对整组数据进行快速运算的数学函数
- 读写磁盘数据的工具以及用于操作内存映射文件的工具
- 线性代数、随机数生成和傅里叶变换功能
- 用于集成C、C++等代码的工具
安装方法:pip install numpy -i https://pypi.douban.com/simple
引用方式:import numpy as np
常用属性:
入门Pandas
- 从ndarray创建Series:Series(arr)
- 与标量运算:sr*2
- 两个Series运算:sr1+sr2
- 索引:sr[0], sr[[1,2,4]]
- 切片:sr[0:2]
- 通用函数:np.abs(sr)
- 布尔值过滤:sr[sr>0]
pandas-Series缺失数据:
**缺失数据:**使用NaN(Not a Number)来表示缺失数据。其值等于np.nan。内置的None值也会被当做NaN处理。
处理缺失数据的相关方法:
- dropna() 过滤掉值为NaN的行
- fillna() 填充缺失数据
- isnull() 返回布尔数组,缺失值对应为True
- notnull() 返回布尔数组,缺失值对应为False
- 过滤缺失数据:sr.dropna() 或 sr[sr.notnull()]
- 填充缺失数据:sr.fillna(0)
pandas-DataFrame:
DataFrame是一个表格型的数据结构,含有一组有序的列。
DataFrame可以被看做是由Series组成的字典,并且共用一个索引。
入门Matplotlib
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltdf = pd.read_csv('data.csv',index_col='date',parse_dates=['date'])
计算5日均线和30日均线
方法一:常规的for循环方法,缺点是运行时间长:
df['ma5'] = np.nan
df['ma30'] = np.nan
for i in range(4, len(df)): df.loc[df.index[i],'ma5'] = df['close'][i-4:i+1].mean()
for i in range(29, len(df)): df.loc[df.index[i],'ma30'] = df['close'][i-29:i+1].mean()
print(df['ma5'])
print(df['ma30'] )
方法二:使用cunsum函数计算,这里涉及到位移函数shift()
sr = df['close'].cumsum()
df['ma5'] = (sr - sr.shift(1).fillna(0).shift(4))/5
df['ma30'] = (sr - sr.shift(1).fillna(0).shift(29))/30
print(df['ma5'])
print(df['ma30'] )
df['ma5'] = df['close'].rolling(5).mean()
df['ma30'] = df['close'].rolling(30).mean()
print(df['ma5'])
print(df['ma30'] )
计算金叉、死叉
双均线策略,通过建立m天移动平均线,n天移动平均线,则两条均线必有交点。若m>n,n天平均线“上穿越”m天均线则为买入点,我们称之为金叉。反之为卖出点,我们称之为死叉。
口诀:
短期均线上穿长期均线为金叉
短期均线下穿长期均线为死叉
继续编写test.py文件,去掉NaN,因为有NaN的数据不满足双均线策略
df = df.dropna()
death_cross = df[(df['ma30']>=df['ma5'])&(df['ma30']<df['ma5']).shift(1)].index
golden_cross = df[(df['ma30']<=df['ma5'])&(df['ma30']>df['ma5']).shift(1)].index
print('golden_cross:',golden_cross)
print('death_cross:',death_cross)
df[['ma5','ma30']].plot()
plt.show()
因为知识量有点杂多,所以这期没有全部代码。
望各位想要入门数据分析的小伙伴们,继续努力。
Python量化交易+网格技术分析及实战测试相关推荐
- 《深入浅出Python量化交易实战》:散户也能学会的数字化交易策略
前言 您可能不知道,许多专业的交易机构已经采用设定程序完成自动化交易,通过机器语言,解密盘面的走势,从而实现持续盈利的目的. (文末送读者福利) 这并非什么秘密,他们正是借助了这样的数字化工具进行操作 ...
- 学习《深入浅出python量化交易交易实战》第一章(笔记)
1.学习<深入浅出python量化交易交易实战>第一章 记录学习过程中的代码和一些坑 1.1 基础(名词解释) 1.1.1 CAPM (Capital Asset Pricing Moda ...
- 很燃基于掘金量化平台的《Python量化交易实战》新书介
原 很燃!基于掘金量化平台的<Python量化交易实战>新书简介 内容简介: 在目前不断变化.蓬勃发展的中国资本市场,量化投资作为新兴的投资方法,引来越来越多的关注,使用量化投资技术的证券 ...
- 使用python量化交易接口有哪些分析指标和策略?
量化交易有哪些指标可以用于分析呢?主要有技术面和基本面可以用于分析! 来看一下技术面和基本面有什么区别? 技术面更关注具体的价格,比如每天的开盘价.收盘价.以及和开盘价/收盘价/最低价/最高价相关的K ...
- Python量化交易实战-40easytrader开发环境安装
B站配套视频教程观看 初始化easytrader开发环境 一.安装对象 1.1客户端安装 股票的客户端,可以是券商,比如说华泰.海通.也可以是第三方平台,东方财富.同花顺.但是由于easytrader ...
- Python量化交易实战-41EasyTrader自动化模拟真实交易
B站配套视频教程观看 EasyTrader自动化模拟真实交易 来到官方文档的使用部分: https://easytrader.readthedocs.io/zh/master/usage/ 一.用法 ...
- Python量化交易实战-38使用开源项目回测双均线策略
B站配套视频教程观看 使用PyAlgoTrade回测双均线策略 双均线策略:长短周期均线,通过金叉,死叉的方式买入卖出股票,获取收益的策略. 回顾上节课代码的部分,上节课完成了可视化代码的部分, 主要 ...
- 福利 | 零基础学习Python量化交易 !(深圳)
文末有数据派独家福利 投资界的人才需求 量化投资在中国已经进入到一个高速发展期.量化人才需求也成为众多金融企业的关注.金融科技企业发现中国目前正面临严重的金融科技专业人才短缺.而量化分析从业者,俗称 ...
- Python量化交易05——基于多因子选择和选股策略(随机森林,LGBM)
参考书目:深入浅出Python量化交易实战 在机器学习里面的X叫做特征变量,在统计学里面叫做协变量也叫自变量,在量化投资里面则叫做因子,所谓多因子就是有很多的特征变量. 本次带来的就是多因子模型,并且 ...
最新文章
- 华为云服务器linux切换账号,华为云Windows服务器如何切换为Linux系统?
- 并发编程——进程——Process对象的属性和方法
- [深度学习]知识蒸馏技术
- ant编译无法依赖rt.jar
- python高级编程 豆瓣_《Python高级编程》读书笔记:方法解释顺序浅析
- oracle数据tsql,Tsql 下建立oracle数据库步骤
- 迅捷PDF虚拟打印机怎么安装和使用
- 美创科技荣获国家信息安全漏洞库(CNNVD)技术支撑单位
- 如何将360浏览器兼容IE8、IE7
- Linux下zip命令-不打包目标文件目录
- 从分类到选型,一文了解 SITOP 电源
- time模块时间格式转换及faker库数据伪造
- Linux文件帮助_重定向_vi
- 甘特图控件VARCHART XGantt,解读活动组布局的“单独行中的节点”选项!
- import.os 文件操作
- 被称为中国版“Robinhood”,老虎与富途谁的低佣生意更值钱?
- 男人就应该对自己狠一点
- 毕业5年,腾讯65万,拿到美团、滴滴、快手、阿里offer多少钱
- 电商红包雨是如何实现的?拿去面试用(典型高并发)
- 重t2加权是什么意思_魔兽世界怀旧服:为什么BWL打不腻,TAQ没多久大家都AFK了?...
热门文章
- uni-app:处理微信浏览器中授权微信登录后,无法正常回退问题
- 阿里云服务器2核4G配置性能参数表
- PhotoShop CS5入门到高级——视频教程【转】
- Xiaojie雷达之路---雷达原理(二刷)天线波束扫描方法
- C语言-有关数字翻转的函数
- redis原理详细分析图解(最全的都在这里)
- Redis管道Pipelining原理详解
- 度言外呼系统服务器错误,电话外呼营销系统,电话营销获客的一把“利剑”
- 希波克拉底四种气质测试,看看你属于哪种气质
- java 收费站程序_java-web实现简易收费站(含代码)