Pythonで自作関数を作ることに挑戦してみた
ボクの備忘録
Pythonを使ってプログラミングを始めたばかりのボクは、勉強した内容をすぐに忘れてしまう。
だから、備忘録を兼ねて打倒資本家を目的とした暗号通貨自動売買アプリ開発の内容を残している。
前回は、ティッカーで入手した情報をデータベースから取り出すことに挑戦した。
今回は、情報を加工するための準備として関数をまとめたpyファイルを作る。
関数とは何か
今さらだけど、関数を作る前に、関数が何なのか復習して、自作関数を作ろう。
Pythonにおける「関数」とは、作成したひとまとまりのロジックに名前を付け、再利用を可能にする方法です。数学の関数と同様、「ある値を渡すと処理を行いある値を返す」という動きをします。
関数に渡す値のことを「引数」、関数を実行して得られる結果のことを「戻り値(返り値)」と呼びます。関数の仕様によっては、引数や戻り値の省略も可能です。Pythonの関数は、戻り値がない場合、「None」(「値がない」という意味の値)を返します。
Pythonには、言語として提供されている「組み込み関数」と、ユーザーが作成する「ユーザー定義関数」があります。関数の呼び出し方は、組み込み関数・ユーザー定義関数ともに同じです。
自分で関数を作るには、defコマンドを使って、そこに作業内容をプログラミングすればいい。
Python で関数オブジェクトを定義する際に def コマンドを利用する。平均や分散などを計算する際に、NumPy や SciPy で用意されたメソッドを利用すればよいが、独自のアルゴリズムで計算したい場合などは、関数を一からつくり上げる必要がある。
今回は、今まで使っていたファイルとは別に、拡張性を考えてクラスを作ってみよう。
Pythonでプログラミングする上で、関数やクラスの扱いは重要になります。
Pythonにおける「関数」は、数学の関数と似ていて、「何らかの値を渡すと、その値に応じた何らかの値を返すもの」。
また、ざっくりですが「クラス」とは、「オブジェクトを作成するための設計図」になります。
※オブジェクト:「Pythonで書いたプログラムが操作したり、処理したりするデータ」
以下、Jupyter notebook(ジュピターノートブック)を使って実際にPythonのコードを書いていきます。
今回、furture.pyという新しいファイルを作る。一番上にMagic commentを書いて、次のコードを加える。クラスを作るとき、defコマンドで初期設定をするのが一般的だけど、今回は関数だけ作りたいから、割愛。
class furture(object):
プログラミングを入れる箱として、関数を作るdefコマンドで定義する。今回は、二つの関数を作る。一つ目の関数のカッコの中のcore_dataがデータベースから抽出したリスト、core_sell_buyが売り買いを判定するリストにした。
def core(core_data, core_sell_buy):
二つ目の関数は、ティッカー情報の全ての項目。ちなみに、頭のselfは、最初に作ったクラス(正しくはインスタンスという)自体のことをいう。
def decision(self, ltp, ask, bid, ask_size, bid_size, ask_depth ,bid_depth, volume, volume_product):
関数を作る目的は、関数の中のプログラム実行結果を取り出すことにある。実行結果は、プログラムの最後の行にreturnを入れることで結果を出力する。
returnの役割は、関数の呼び出し元に「値=特定の情報」を返すことです。
普通は何かしらの処理を関数にまとめます。そのとき、関数の実行結果を呼び出し元に通知するのが「 return文」です。
ちなみに、自作関数を別のpyファイルで呼び出したい時は、まずimportでファイルを呼び出す。
import furture
次にファイル名、クラス名を書いてあげる。
ファイル名とクラス名は、引数に代入できる。
Distance = furture.furture
そして、ファイル名とクラス名の後ろに関数を書いてあげればいい。
Distance.core(NewData, Sell_Buy)
二次元配列
ボクが作ったデータベースは、二次元配列のリストとして保存されている。
多次元配列を説明するのは難しいので、一番わかりやすいサイトを引用として貼り付けた。リンク先に図で説明されている。
配列には次元があります。
次元とは配列の深さという意味で、[ ]を使って表し、中でも2次元以上の配列を多次元配列といいます。
配列の構造を文字だけでイメージするのは難しいので、図で理解してみましょう。
今回は、リストの二次元配列から、仮想通貨の最終取引価格だけを取り出したいので、最終取引価格が入っている部分だけを新しいリストに入れている。
Check_ltp = ([row[3] for row in core_data])
リストの一番後ろに新しい要素を追加するにはappendを使う。今回は使わないけど、逆に要素を取り除くにはpopだ。
リストに新しい要素を追加する方法です。リスト型で利用可能な append メソッドを使用します。
ボクの自作関数coreには、引数core_sell_buyに売り買いの情報を入れたいので、次のコードを書いた。
core_sell_buy = Check_result
return
そして、出来上がったコードはこちら。coreの関数で、ティッカー情報をデータの内容ごとで整理して、もう一つの関数decisionに渡している。そして、decisionから渡された結果でcoreが仮想通貨のシンボルコードと売り買い、または待機の結果を返している。
# -*- coding: utf-8 -*-
"""
The god who knows people is beyond the horizon.
"""
import requests
class furture(object):
def core(core_data, core_sell_buy):
"""
データの加工
"""
Check_symbol = ([row[1] for row in core_data])
Check_ltp = ([row[3] for row in core_data])
Check_ask = ([row[4] for row in core_data])
Check_bid = ([row[5] for row in core_data])
Check_ask_size = ([row[6] for row in core_data])
Check_bid_size = ([row[7] for row in core_data])
Check_ask_depth = ([row[8] for row in core_data])
Check_bid_depth = ([row[9] for row in core_data])
Check_volue = ([row[10] for row in core_data])
Check_volue_product = ([row[11] for row in core_data])
print(Check_symbol[0])
print("ltp " + str(Check_ltp[0]))
print("ask " + str(Check_ask[0]))
print("bid " + str(Check_bid[0]))
print("volue " + str(Check_volue[0]))
"""
データ解析
"""
Check_result = furture().decision(Check_ltp, Check_ask, Check_bid,Check_ask_size, Check_bid_size, Check_ask_depth, Check_bid_depth, Check_volue, Check_volue_product)
"""
売買判定
"""
core_sell_buy = Check_result
return
def decision(self, ltp, ask, bid, ask_size, bid_size, ask_depth ,bid_depth, volume, volume_product):
return 'Buy'
decisionには売り買いを予測するコードを書く予定…なんだけど、売買予測のコードが思いつかなくて、統計学の勉強をしている最中。
次回は、pybitflyerを使って仮想通貨の残高照会と売買の命令に挑戦しよう。
目次
前の記事