您的位置 首页 股票入门

【手把手教你】Python面向对象编程入门及股票数据管理应用实例

1前言

通常来说,在学习或练习python的初期,我们在Jupyter Notebook(spyder或pycharm)上逐一执行语句和代码,可以达到良好的交互效果。但是,如果您想进行更大的项目实践,则这种不计划地执行语句和指令的计划是不合适的。为了最大程度地重用代码,并使模块之间的逻辑更加清晰,我们有必要学习模块化的抽象设计。模块化抽象设计的基本思想是描述主要框架和算法流程,然后添加相应的细节。面向对象编程是模块化设计的重要方法之一,也是高级学习Python的唯一方法。

本文主要介绍面向对象编程的基本知识,并以股票数据管理为例介绍面向对象编程的具体应用。后续推文将以更复杂的形式介绍面向对象编程在股票策略定量回测系统实现中的应用。本文的完整源代码将在Kn​​owledge Planet上共享(Knowledge Planet搜索ID:27799067,财务量化,CuteHand)。

2类编程简介

01class的定义

类是具有相同属性和方法的对象的集合。

python定义类有两种语法:

class班级名称:

类的类名(继承的类名):

def定义属性和方法

Class后跟类名。括号中的继承类名称表示所定义的类从哪个类继承。如果没有继承,请填写对象。例如,在下面定义股票 stock类,不要先编写属性和方法,而要使用pass(跳过)来表示。

#定义一个股票的类
class stock(object):
    pass
#创建了stock这个类之后,便可以使用“stock()”来创建实例
s=stock()
s
#输出结果:<__main__.stock at 0x21f3f5aa160>

s是从股票类创建的实例。 Python是一种动态语言,可以动态绑定实例的属性和方法,例如将代码属性绑定到s:

s.code='000001.SZ'
s.code
#输出结果:'000001.SZ'

类似地,您还可以从股票类创建s1的实例,并绑定代表价格的属性:

s1=stock()
s1.price=15.8
s1.price
#输出结果: 15.8

动态绑定可以具有不同的属性,但这不利于项目的开发和维护。如果希望从同一个类创建的实例具有一些公共属性,则可以定义一个特殊的__init__方法(请注意,在英语上下文中输入了下划线两次)以在创建实例时绑定非填充Unable to attribute

__ init __()的第一个参数按照惯例是self,这是指要实例化的对象。参数代码和价格用于为对象的属性分配值。例如,股票类假定有代码和两个价格属性,定义股票的类可以写为:

class stock(object):
    def __init__(self,code,price):
        self.code=code
        self.price=price

Python通过遵循某些属性和方法命名规则来实现访问控制的效果:

创建实例时,必须填写__init__方法中的参数(除了self之外,无需输入),否则将报告错误。

在创建了类的名称之后,您可以添加一些文本描述来简要说明该类的主要内容,以方便用户快速了解该类的功能。这些注释以字符串形式存储。注意编写python注释,在单行注释之前添加“#”,并对多行注释使用三引号。

class stock(object):
    '''
    stock类中包含属性code和price
    '''
    def __init__(self,code,price):
        self.code=code
        self.price=price
#查看类中的注释内容
print(stock.__doc__)
输出结果:stock类中包含属性code和price

如果将以上代码另存为本地StockClass.py文件(可以使用Anaconda的Spyder编写脚本)并将其保存在jupyter的当前运行路径中股票配资平台,则可以通过导入类名来使用该类。

from StockClass import stock
print(stock.__doc__)

类02的调用方法

调用类的主要方法有三种:(1)类实例;(2)静态方法(@Decorator);(3)类方法(clc))。

最常见的实例调用,通常使用“类名。方法”。静态方法由没有默认参数的类调用。从实例方法参数中删除self,然后在方法定义上方添加@staticmethod(@之前是python函数的装饰器方法),它成为静态方法。类方法由类调用股票知识入门数据库,并用@classmethod装饰,并至少传入一个cls(指的是类本身,类似于self)。执行类方法时,将自动分配调用该方法的类。到cls。建议使用类名。调用类方法的方法。

示例调用方法:

class StockCode:
    def __init__(self,name,code):
        self.name=name
        self.code=code
    def get_stock(self):
        return (self.name,self.code)
s=StockCode('中国平安','601318.SH')
s.get_stock()
#输出结果:('中国平安', '601318.SH')

静态方法调用

class Codes(object):
    @staticmethod
    def get_code(s):
        if len(s)==6:
            return (s+'SH') if s.startswith('6') else (s+'SZ')
        else:
            print('股票代码必须为6位数字!')
Codes.get_code('00001')
Codes.get_code('000001')
#输出结果:股票代码必须为6位数字!
#'000001SZ'

类调用方法:

有时传入的参数不是(’中国平安’,’601318.SH’)格式,而是(’中国平安-601318.SH’)格式,我该怎么办?做?首先,我们需要拆分它,但是使用实例方法来实现它非常麻烦。目前,您可以使用class方法。

class StockCode:
    def __init__(self,stock,code):
        self.stock=stock
        self.code=code
    @classmethod
    # 装饰器,立马执行下面的函数
    def split(cls,sc):
        # cls是默认的这个类的init函数,sc是传入参数
        stock,code=map(str,sc.split('-'))
        # 这里转换成了格式化的结构
        dd = cls(stock,code)
        # 然后执行这个类第一个方法
        return dd
s=StockCode.split(('中国平安-601318.SH'))
#查看属性
s.stock,s.code
#输出结果:('中国平安', '601318.SH')

03类别的三个特征:封装,继承和多态性

类具有三个特征,即封装,继承和多态性。对封装的简单理解是将属性和方法放在对象内部,从而从外部无法访问它。在上一个示例之后,如果要打印股票代码和价格,则可以先定义一个打印功能,然后按如下所示修改上一个类:

class stock(object):
    def __init__(self,code,price):
        self.code=code
        self.price=price
    #定义打印属性的函数
    def print_attr(self):
        print(f'股票代码为:{self.code}')
        print(f'股票价格为:{self.price}')
#使用“实例.方法”,即“实例名称.函数名()”的方式来调用
s1=stock('000001.SZ',15.8)
s1.print_attr()
#输出结果: 股票代码为:000001.SZ
#股票价格为:15.8

在对象内部编写方法仍然不能防止对象的属性被不相关的函数意外更改或错误使用。为了为这些属性提供更多的安全性,您可以限制外界访问它们。您可以在property变量前面添加两个破折号以指示private属性,以便只能在类内部访问该属性,然后从外部访问时将通过“实例。属性名称”进行报告。通过特权属性的访问限制,可以保护对象的内部状态,但是如果需要获取私有属性,则可以编写一种方法来获取类内部的属性。

class stock(object):
    def __init__(self,code,price):
        self.__code=code
        self.__price=price
    def get_attr(self):
        return(self.__code,self.__price)
s1=stock('000001.SZ',15.8)
s1.get_attr()
#输出结果:('000001.SZ', 15.8)

与从外部直接访问属性的设计相比,将方法封装在类中的优点是它们可以为方法赋予一些行为规范。例如,如果股票类需要修改代码值函数,则可以在类内部添加set_code()方法,并在定义该方法时指定传递的值必须为字符串类型,否则将报告错误。

class stock(object):
    def __init__(self,code,price):
        self.__code=code
        self.__price=price
    def get_attr(self):
        return(self.__code,self.__price)
    def set_code(self,codevalue):
        if type(codevalue)!=str:
            return("错误,输入参数必须为字符型")
        self.__code=codevalue
s1=stock('000001.SZ',15.8)
print(s1.set_code(60000))
#重新定义是s1的代码
s1.set_code('600000.SH')
print(s1.get_attr())
#输出结果:
错误,输入参数必须为字符型
    ('600000.SH', 15.8)

继承是为了充分利用现有的类函数,在其基础上扩展和定义新的类。实现继承概念的主要方法有两种:实现继承和接口继承。实现继承是指无需额外编码即可使用基类的属性和方法的能力。接口继承意味着仅使用属性和方法的名称,但是子类必须提供实现它的能力(子类重建父类方法)。在python中编写定量回测系统时,经常使用class的继承函数。

#实现继承
class Strategy(object):
    def print_info(self):
        print('策略模块的功能是生成“多”或“空”的交易信号')
class my_strategy(Strategy):
    pass
ss=my_strategy()
ss.print_info()
#输出结果:
策略模块的功能是生成“多”或“空”的交易信号

继承有什么好处?最大的优点是子类具有父类的所有功能。由于Strategy实现了print_info()方法,因此my_strategy作为其子类会自动具有print_info()方法。

股票知识入门_股票知识入门数据库_股票知识入门k线形态图分析

尽管上面的接口很简单,但是当为每种特定类型的策略继承此类时,它将变得更加复杂。策略类的目标​​是在投资组合模块中提供多头/空头/持有信号。继承可以直接采用父类的所有功能,因此无需从零开始。子类仅需要添加自己的唯一方法,并且还可以覆盖不适合父类的方法。有多态性。多态性意味着当子类(strategy 2)和父类(策略))具有相同的方法(print_info())时,实例化子类时将自动调用子类的方法(而不是父类)。方法)。

class Strategy(object):
    def print_info(self):
        print('策略模块的功能是生成“多”或“空”的交易信号')
#继承        
class strategy1(Strategy):
    pass
#多态        
class strategy2(Strategy):
    def print_info(self):
        print('这是个人的交易策略')
#实例化
strategy1().print_info()
strategy2().print_info()
#输出结果:
策略模块的功能是生成“多”或“空”的交易信号
    这是个人的交易策略

3类编程在金融量化中的应用

应用程序背景:使用tushare获取所有A股的每日交易数据,将其保存到本地数据库中,并每日更新数据库;根据市场数据进行可视化的简单策略分析和回测。由于篇幅所限,本文重点介绍股票数据管理(下载,数据更新)面向对象编程的应用示例。

#导入需要用到的模块
import numpy as np
import pandas as pd
from dateutil.parser import parse
from datetime import datetime,timedelta
#操作数据库的第三方包,使用前先安装pip install sqlalchemy
from sqlalchemy import create_engine
#tushare包设置
import tushare as ts
token='输入你在tushare上获得的token'
pro=ts.pro_api(token)
#使用python3自带的sqlite数据库
#本人创建的数据库地址为c:\zjy\db_stock\
file='sqlite:///c:\\zjy\\db_stock\\'
#数据库名称
db_name='stock_data.db'
engine = create_engine(file+db_name)
class Data(object):
    def __init__(self,
                 start='20050101',
                 end='20191115',
                 table_name='daily_data'):
        self.start=start
        self.end=end
        self.table_name=table_name
        self.codes=self.get_code()
        self.cals=self.get_cals()       
    #获取股票代码列表    
    def get_code(self):
        codes = pro.stock_basic(list_status='L').ts_code.values
        return codes
    #获取股票交易日历
    def get_cals(self):
        #获取交易日历
        cals=pro.trade_cal(exchange='')
        cals=cals[cals.is_open==1].cal_date.values
        return cals
    #每日行情数据
    def daily_data(self,code):
        try:
            df0=pro.daily(ts_code=code,start_date=self.start,
                end_date=self.end)            
            df1=pro.adj_factor(ts_code=code,trade_date='') 
            #复权因子
            df=pd.merge(df0,df1)  #合并数据
        except Exception as e:
            print(code)
            print(e)
        return df
    #保存数据到数据库
    def save_sql(self):
        for code in self.codes:
            data=self.daily_data(code)
            data.to_sql(self.table_name,engine,
                 index=False,if_exists='append')
    #获取最新交易日期
    def get_trade_date(self):
        #获取当天日期时间
        pass
    #更新数据库数据
    def update_sql(self):
        pass #代码省略
    #查询数据库信息            
    def info_sql(self):
        pass #代码省略

代码运行

#假设你将上述代码封装成class Data
#保存在'C:\zjy\db_stock'目录下的down_data.py中
import sys
#添加到当前工作路径
sys.path.append(r'C:\zjy\db_stock')
#导入py文件中的Data类
from download_data import Data
#实例类
data=Data()
#data.save_sql() #只需运行一次即可
data.update_sql()      
data.info_sql() 

输出结果:

数据是最新的!

统计查询总数:7747184

数据周期:20050104——20191125

数据库包含股票号:3724

#另外又根据画图需要,从数据库中提取数据画K线图
#写了一个stock_plot类保存在plot_stock.py文件中
from plot_stock import stock_plot
shfz=stock_plot('双汇发展')
shfz.kline_plot() #普通K线图

股票知识入门数据库

#画修正版K线图
shfz.kline_plot(ktype=1)

股票知识入门数据库

4结论

本文主要介绍面向对象编程的基础知识和股票数据管理应用示例。

通常,我们将用各种数据信息描述一个对象股票知识入门数据库,并且该对象包含某些属性或特征。例如炒股配资,如果某个股票被视为一个对象,则股票对象中包含的信息可能包括股票代码,公司名称,行业,收盘价等。对象的特性称为对象的属性;访问属性的函数称为方法,它是对象与外界通信的接口。具有相同属性和方法的对象构成一个类。换句话说,类是通过抽象对象形成的概念,对象是类的具体实现的示例(实例)。基于对象的编程思想具有三个主要特征:封装,继承和多态性,它们在构建定量交易系统中起着非常重要的作用。后续推文将介绍使用面向对象程序设计对定量策略进行回测。

参考资料:廖学峰的官方网站Python3教程-面向对象编程

关于Python财务量化

着重分享Python在金融量化领域的应用。加入“金融定量知识星球”(ID:27799067)),您可以获得30克以上的定量投资视频资料,与定量金融相关的PDF资料,官方帐户文章的完整源代码Python,定量投资前沿分析框架,与博客,结识圈子中的朋友,等等。

关于作者: 股票配资

热门文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注