股票量化交易-获取数据的N种方法

来源:萧遥量化

作者: sally

 

在上一篇的基础上再分享两个量化股票需要的数据资源。

通过python第三方库pytdx获取

这是个很强大的第三方库,原理是解析通达信的.dat底层数据。没错,我说的就是老少皆宜,平时看盘下单的通达信软件。现在只需要在python里面安装第三方库,就可以获取到原始交易数据了。

获取行情数据的代码是这样的,返回数据可以是list格式,也可以是dataframe格式。

from pytdx.hq import
TdxHq_APIapi = TdxHq_API()
# 数据获取接口一般返回list结构,如果需要转化为pandas Dataframe接口,可以使用 api.to_df 进行转化
with api.connect('119.147.212.81', 7709):    
# 返回普通list    
    data = api.get_security_bars(9, 0, '000001', 0, 10)         print(data)    
# 返回DataFrame    
    data = api.to_df(api.get_security_bars(9, 0, '000001',      0, 800))    print(data)

返回数据如下:

 

除了行情数据,还可以获得财务数据

from pytdx.crawler.history_financial_crawler import HistoryFinancialListCrawler
crawler = HistoryFinancialListCrawler()
list_data = crawler.fetch_and_parse()
print(pd.DataFrame(data=list_data))

运行上面的程序可以得到下面的结果,这些zip文件就是当季所有股票的财务数据。我们可以看到最新的财务数据已经更新到2019年6月30日。

除了行情数据,还可以获得财务数据

from pytdx.crawler.history_financial_crawler import HistoryFinancialListCrawler
crawler = HistoryFinancialListCrawler()
list_data = crawler.fetch_and_parse()
print(pd.DataFrame(data=list_data))

运行上面的程序可以得到下面的结果,这些zip文件就是当季所有股票的财务数据。我们可以看到最新的财务数据已经更新到2019年6月30日。

下面我们来查看一下最近一个财务周期的数据是怎样的。

from pytdx.reader import HistoryFinancialReader
import pandas as pd
pd.set_option('display.max_columns', None)

print(HistoryFinancialReader().get_df('C://zd_axzq//vipdoc//cw//gpcw20190630.zip'))

注意这里获取数据的地址是需要你自己电脑上通达信的安装目录,如果找不到这个目录呢,可以在浏览器里面搜索gpcw20190630.zip这个文件就能找到了

运行上面的代码后可以得到如下的数据,左边的code就是股票代码,右边col001-col300是财务数据,具体每个编号对应哪个财务数据,请查看这里https://github.com/QUANTAXIS/QUANTAXIS/blob/master/QUANTAXIS/QAData/financial_mean.py

从腾讯网站获取历史数据

获取数据的网址是这个:http://web.ifzq.gtimg.cn/appstock/app/fqkline/get?_var=kline_dayqfq&param=sz000001,day,,,50,qfq&r=0.5643184591626897

其中需要输入几个参数,股票代码,数据的周期(年,月,周,日)

from urllib.request import urlopen
import json
from random import randint
import pandas as pd
pd.set_option('expand_frame_repr', False)
pd.set_option('display.max_rows', 5000)


# =====创建随机数的函数
def _random(n=16):
    """
    创建一个n位的随机整数
    :param n:
    :return:
    """
    start = 10**(n-1)
    end = (10**n)-1

    return str(randint(start, end))

stock_code = 'sz000001'  
type = 'day'  # day, week, month分别对用日线、周线、月线
num = 640  # 股票最多不能超过640,指数、etf等没有限制

# 构建url
url = 'http://web.ifzq.gtimg.cn/appstock/app/fqkline/get?_var=kline_%sqfq&param=%s,%s,,,%s,qfq&r=0.%s'
url = url % (k_type, stock_code, k_type, num, _random())
content = urlopen(url).read().decode()  
content = content.split('=', maxsplit=1)[-1]
content = json.loads(content)
data = content['data'][stock_code]
if type in data:    
data = data[type]
elif 'qfq' + type in data:  # qfq是前复权的缩写    
data = data['qfq' + type]
else:    
raise ValueError('已知的key在dict中均不存在,请检查数据')
df = pd.DataFrame(data)
print(df)

运行代码后获得的数据如下:

其中0: 'candle_end_time', 1: 'open', 2: 'close', 3: 'high', 4: 'low', 5: 'amount'

复权处理

上面两种方法得到的数据都是未经过复权处理的,那么我们怎样得到复权的数据呢?

我们可以通过计算复权因子来得到复权数据,具体方法如下代码。

import pandas as pd
pd.set_option('expand_frame_repr', False)
pd.set_option('display.max_rows', 5000)

# 导入数据
path = 'D:/sz000001.csv'
df = pd.read_csv(path, encoding='gbk', skiprows=1)

# 计算复权涨跌幅
df['涨跌幅'] = df['收盘价'] / df['前收盘价'] - 1

# 计算复权因子
df['复权因子'] = (1 + df['涨跌幅']).cumprod()

# 计算前复权价
df['收盘价_复权'] = df['复权因子'] * (df.iloc[-1]['收盘价'] / df.iloc[-1]['复权因子'])

# 计算后复权价
df['收盘价_复权'] = df['复权因子'] * (df.iloc[0]['收盘价'] / df.iloc[0]['复权因子'])

# 计算复权后的开盘价、最高价、最低价
df['开盘价_复权'] = df['开盘价'] / df['收盘价'] * df['收盘价_复权']
df['最高价_复权'] = df['最高价'] / df['收盘价'] * df['收盘价_复权']
df['最低价_复权'] = df['最低价'] / df['收盘价'] * df['收盘价_复权']

tushare获取数据

tushare上有丰富的交易数据,财务数据。安装也十分简单,pip install tushare就可以了。https://tushare.pro/

下面示例一下历史交易数据和财务数据的获取

pro = ts.pro_api()
df = ts.pro_bar(ts_code='300024.SZ', adj='qfq', start_date='20180101', end_date='20190920')
print(df)

这是获取股票300024从2018年1月1号到2019年9月20号的所有前复权数据的代码。运行后返回的数据如下。

下面是获取财务指标数据的代码

pro = ts.pro_api()
df = pro.fina_indicator(ts_code='300024.SZ')
print(df)

运行后返回dataframe格式数据,非常方便调取我们需要的列数据。比如我们要调取EPS数据,只需要这样写就可以了print (df['eps'])

掘金量化API

掘金量化是一个在线量化平台,目前推出了可以在本地使用的数据API接口,这个平台类似于聚宽,优矿,可以在线写策略并回测。亮点在于,这个平台支持本地IDE编辑策略,也就是说策略编写是存放在本地而不是在平台的云端,这样可以避免策略泄露。

这是掘金API说明书https://www.myquant.cn/docs/python/73?

具体加载数据和回测仔细看看说明就可以了解。

 

<think>嗯,用户想让我介绍如何写一个简单的股票量化交易程序。首先,我需要理解用户的需求。他们可能对量化交易不太熟悉,所以需要从基础开始解释。我应该先明确量化交易的基本概念,然后分步骤说明如何构建一个简单的程序。 首先,量化交易程序通常包括数据获取、策略开发、回测和交易执行这几个部分。用户可能没有编程经验,所以我需要用简单的语言来解释,并且给出具体的例子。比如,用Python的话,可能需要用到pandas、numpy这些库,还有数据源如Tushare或者AKShare。 接下来,数据获取部分。需要解释如何安装必要的库,比如Tushare,然后获取股票数据。这里要注意数据的时间范围,比如最近一年的数据,还有数据频率,比如日线数据。然后展示一段代码示例,让用户能够复制粘贴运行,但也要提醒他们可能需要注册获取token。 然后是策略开发。用户可能对均线策略比较熟悉,所以选择双均线策略作为例子。需要解释如何计算短期和长期均线,比如5日和20日均线,然后生成交易信号。这里要提到如何用pandas计算rolling均值,以及生成买卖信号的逻辑,比如金叉和死叉。 回测部分需要计算策略收益,并与基准收益比较。这里需要展示如何计算每日收益率,累乘得到累计收益,并绘制图表。要注意提醒用户回测的局限性,比如未来函数、过拟合等问题,以及手续费的影响可能没有考虑。 最后是交易执行,但实际交易会更复杂,需要连接券商API,这里可以简单提及,并建议使用模拟交易环境先测试。同时,要强调风险,提醒用户量化交易的风险,建议先用模拟盘。 在代码部分,要确保语法正确,使用$...$和$$...$$格式,比如变量和公式用行内LaTeX,独立公式单独成段。例如,收益率计算部分可以用$每日收益率$,累计收益用乘积符号。同时,结构要清晰,分步骤说明,每个步骤的代码和解释对应。 可能用户的问题还包括如何验证策略的有效性,所以需要提到回测的结果分析,比如年化收益率、最大回撤等指标,但简单示例可能不涉及这些,可以建议进一步学习的方向。 需要检查是否有遗漏的部分,比如数据预处理(处理缺失值)、滑点、成交量等因素,但在简单程序中可能暂时忽略,保持示例的简洁性。同时,提醒用户实际应用中的复杂性和注意事项。 总结下来,回答的结构应该是:概述量化交易程序组成,分步骤讲解数据获取、策略开发、回测、执行,给出代码示例,并补充注意事项和进一步学习的建议。确保用中文,语言口语化,避免专业术语过多,必要时解释术语。</think>好的!以下是一个简单的股票量化交易程序实现思路和示例代码,分为数据获取、策略开发、回测验证三个核心步骤: --- ### 一、数据获取 使用Python的`tushare`库获取股票数据(需先注册获取API token): ```python import tushare as ts # 初始化接口 ts.set_token('你的token') pro = ts.pro_api() # 获取贵州茅台日线数据(示例) df = pro.daily(ts_code='600519.SH', start_date='20230101', end_date='20231231') df['trade_date'] = pd.to_datetime(df['trade_date']) df = df.set_index('trade_date').sort_index() ``` --- ### 二、策略开发:双均线策略 策略逻辑: - 当**短期均线(5日)**上穿**长期均线(20日)**时买入 - 当短期均线下穿长期均线时卖出 ```python # 计算均线 df['ma5'] = df['close'].rolling(window=5).mean() df['ma20'] = df['close'].rolling(window=20).mean() # 生成信号(1=买入,-1=卖出,0=持有) df['signal'] = 0 df.loc[df['ma5'] > df['ma20'], 'signal'] = 1 df.loc[df['ma5'] < df['ma20'], 'signal'] = -1 ``` --- ### 三、回测验证 计算策略收益并与基准(买入持有)对比: ```python # 计算每日收益率 df['return'] = df['close'].pct_change() df['strategy_return'] = df['signal'].shift(1) * df['return'] # 累计收益 cumulative_returns = (1 + df[['return', 'strategy_return']]).cumprod() # 绘制收益曲线 import matplotlib.pyplot as plt cumulative_returns.plot(figsize=(10,6)) plt.title('策略收益 vs 基准收益') plt.show() ``` --- ### 四、关键公式说明 1. **收益率计算**: $$ r_t = \frac{P_t - P_{t-1}}{P_{t-1}} $$ 2. **累计收益**: $$ \text{CumReturn} = \prod_{i=1}^{n}(1 + r_i) $$ --- ### 五、注意事项 1. **数据质量**:需处理缺失值和异常值 2. **过拟合风险**:避免在单一股票/时间段优化参数 3. **交易成本**:实际需扣除手续费(示例中未计算) 4. **进阶方向**: - 添加止损止盈机制 - 多因子策略(MACD、RSI等) - 使用`backtrader`等专业回测框架 --- ### 六、完整代码结构 ```python # 依赖库 import tushare as ts import pandas as pd import matplotlib.pyplot as plt # 数据获取 def get_data(): # ...(同上)... # 策略逻辑 def generate_signals(df): # ...(同上)... # 回测引擎 def backtest(df): # ...(同上)... # 主程序 if __name__ == "__main__": df = get_data() df = generate_signals(df) backtest(df) ``` --- 实际操作前建议: 1. 使用**模拟交易**测试策略 2. 增加**夏普比率**、**最大回撤**等风险评估指标 3. 学习《量化投资:以Python为工具》等专业书籍深入理解
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值