乙Py先生のプログラミング教室

乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

乙py式5時間で学ぶプログラミング基礎(python編)


乙py3

短時間でプログラミングを学ぶ事ができる動画講座を作りました。

YOUTUBEの動画と資料を載せておきますので
ぜひ参考にしてくださいませ。


なおPythonチートシートを作成しています。


コーディングに迷った際に役に立ち

WEB検索する時間を無くして

作業時間を効率化できます。

zenn
チートシート

note
Pythonチートシート

目次




1.この講座について
2.プログラミング言語について
3.プログラミング言語の学習方法について
4.プログラミングの学習環境について
5.目標設定について
6.Jupyterの使い方
7.演算
8.文字
9.インデックス
10.変数
11.予約語
12.データ型
13.文字列
14.文字列のフォーマット
15.算術演算子
16.代入演算子
17.関係演算子
18.論理演算子
19.基礎演習1
20.リスト1
20.リスト2
21.タプル
22.辞書型
23.if文
24.for文
25.while文
26.組み込み関数について
27.enumerate関数
28.zip関数
29.ソート
30.内包表記
31.基礎演習2
32.関数
33.global変数とスコープ
34.無名関数
35.オブジェクト指向の話
36.クラスについて
37.例外処理
38.ライブラリの利用
39.基礎演習3
40.まとめ
付録.その先、仕事とか、研究にどう使えるの?

今回は株価のデータを用いて
株の売買シミュレーションを
行ってみたいと思います。

解説動画はこちら




自動売買で儲けられるルールを探したい!!!
ということで、株価データを見て
適当なルールを作って売買シミュレーションを
行ってみたいと思います。


こちらのデータを参考にしています。

5分足のデータを用いることとしました。

データのリンク先


今回やりたい事としては

高い時に売って安い時に買う
or
安い時に買って高い時に売る

株の鉄則をそのまま考えてみたいと思います。

まずは日経平均の株価の
データを見てみることとします。

ここから先のコード群は
Google Colabで試すことのできる
コードになっているので
試したい方はコピペしてどうぞ。



直接pandasのデータフレームに取り込むか
データをダウンロードしてから
データフレームに取り込むコードです。

まずはライブラリをインポート
import pandas as pd
import numpy as np
import warnings
warnings.simplefilter('ignore')
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline


データの読み込みは次のコードです
データが「日付、時間、始値、高値、安値、終値」
となっていてヘッダーが無いので英名を付けておきます。
# 直接読み込む場合
df = pd.read_csv('https://atmtech.net/main/n225/Y2020-all.csv',header=None,names=['day','time','open','high','row','close'])

# 手元にダウンロードしてから行う場合
df = pd.read_csv('Y2020-all.csv',header=None,names=['day','time','open','high','row','close'])

# プレビュー
df.head()
スクリーンショット 2021-09-11 16.55.46

次にこのデータには不整合があるようなので
前処理することにします。
df['time'] = df['time'].str.replace('0.395833333','9:30:00')

def time_sep(d):
    l = d['time'].split(':')
    return '{0:02}:{1:02}:{2:02}'.format(int(l[0]),int(l[1]),int(l[2]))

def day_sep(d):
    l = d['day'].split('/')
    return '{0}-{1:02}-{2:02}'.format(int(l[0]),int(l[1]),int(l[2]))

df['time'] = df.apply(time_sep,axis=1)
df['day'] = df.apply(day_sep,axis=1)
df.head()
スクリーンショット 2021-09-11 16.55.50



これで不整合を取り除いて、データも綺麗にしました。

次に、安い時 or 高い時を探りたいので
朝9時の価格を基準にして終値を取得します。
df_9 = df[df['time']=='09:00:00'][['day','close']]
df_9 = df_9.reset_index(drop=True)
df_9.columns = ['day','stand']
df_9.head()


日単位で終値を取りました。
集計してみましょう。
# 集計してみる
pd.pivot_table(merge_df,index='day', columns='time', values='rate')
スクリーンショット 2021-09-11 16.56.12


これだと数字だけなので
よく分からないですよね。

数値だけだと分かりづらいので
グラフ化しましょう。

箱髭図にしてみます。
# 箱髭図を作ってみる
fig = plt.figure(figsize=(16,10))
ax = fig.add_subplot(1, 1, 1)
sns.boxplot(x='time', y='rate', data=merge_df, ax=ax)
plt.xticks(rotation=90)
plt.show()
download-2

次に時間帯ごとに集計をしてみることとします。
平均、中央値を出してみます。
# 時間帯ごとに集計する
calc_df = merge_df[['time','rate']][merge_df['time']!='00:00:00'].groupby(['time']).agg([np.mean,np.median,np.std])
calc_df.columns = ['mean','median','std']
calc_df.head()
折れ線グラフにしてみましょう。
# 折れ線グラフにしてみる
plt.figure(figsize=(16,10))
plt.plot([1 for i in range(len(calc_df['mean']))])
plt.plot(calc_df['mean'],color='red',label="mean")
plt.plot(calc_df['median'],color='green',label="median")
plt.xticks(rotation=90)
plt.legend(fontsize=20)
plt.show()
download-4


これで見ると
平均的に上がっている or 下がっている
中央値でも上がっている or 下がっている

と言うのが分かります。

朝9時に売って
両方ともが下がっている時間帯に買い戻せば
その差額分儲けられるのではと
仮説を立てました。



時間帯ごとに9時の終値から
上がったのか下がったのかの回数も
見てみることにしましょう。
# 価格差でフラグ値を付ける
merge_df['flg'] = merge_df['rate'] >=1

calc2_df = pd.crosstab(merge_df['time'], merge_df['flg'])
calc2_df.columns = ['down','up']
calc2_df = calc2_df.reset_index()
calc2_df = calc2_df[calc2_df['time']!='09:00:00']
calc2_df = calc2_df[calc2_df['time']!='00:00:00']

merge_df.head()

# 100%棒グラフを作る
plt.figure(figsize=(16,6))
plt.plot([121 for i in range(len(calc_df['mean']))])
height1 = np.array(calc2_df['down'])
height2 = np.array(calc2_df['up'])
p1 = plt.bar(calc2_df['time'], height1, color="red")
p2 = plt.bar(calc2_df['time'], height2, bottom=height1, color="green")
plt.xticks(rotation=90)
plt.legend((p2[0], p1[0]), ("UP","DOWN"))
plt.show()
download-5


これで見ると9:20は終値が9:00時点よりも
下がっている回数が多いことが分かります。

平均値や中央値も下がっていましたね。
ということで9時に売って9:20に買い戻すというのを
シミュレーションしてみたいと思います。

売買ルール
資金は1000万円
朝9:00に売って、9:20に買い戻す
売れる株分だけ売って、その分を買い戻す

これをコードにしてみると
money = 10000000
sel_close , buy_close = 0,0
sel_value , buy_value = 0,0
result , quantity = 0,0
result_df = pd.DataFrame()
for row in merge_df[(merge_df['time']=='09:00:00')|(merge_df['time']=='09:20:00')].iterrows():
    data = row[1]
    date = data[0]
    times = data[1]
    close = data[5]
    if times=='09:00:00':
        sel_close = close
        quantity = money//sel_close
        sel_value = quantity * sel_close
    elif times=='09:20:00':
        buy_close = close
        buy_value = quantity * buy_close
        result = (sel_value - buy_value)
        money = money + (sel_value - buy_value)
        tmp_df = pd.DataFrame([[date,sel_close,buy_close,sel_value,buy_value,result,money]],
                              columns=['date','sel_close','buy_close','sel_value','buy_value','result','money'])
        result_df = pd.concat([result_df,tmp_df])

result_df = result_df.reset_index(drop=True)
result_df.head()
スクリーンショット 2021-09-11 16.56.27



さてシミュレーションの結果は
どうなったでしょうか?
売買シミュレーションの結果は??????
plt.figure(figsize=(16,3))
plt.plot(result_df['money'],color='red')
plt.show()
download


そもそもの株価の動きは
どうだったのでしょうか???
plot_df = df[df['time']=='09:00:00']
plot_df = plot_df.reset_index(drop=True)
plt.figure(figsize=(16,3))
plt.plot(plot_df['close'],color='blue')
plt.show()
download-1


結果としては2020年は年初からコロナの影響で
ガツっと下がり、その後は上がり続けています。

売って買い戻すというルールなので
値が下がった方が良くなるのですが
値が上がってもいる状況でも
そこまで酷い成績にならない結果となりました。

この結果は2020年だけなので
なんとも言えないものですが

こう言うルールを検証していけば
自動売買で適応出来るルールが
発見できるかもしれません。

そうしたらシステム化して
ほっぽって置こうかなと
思っています。

今回は株価のデータを使った
売買シミュレーションついて
お送りしました。

それでは。

今回は乃木坂時々クロちゃんということで
TikTokの動画っぽいアレを作ってみることとしました。

解説動画はこちら





さて
今回はTikTok動画のアレみたいなやつを
作ってみようと思います。

アレとは 人の顔から次の人の顔に移り変わるやつの事で 一般的にはFaceMorphingと言うらしい?!です。

それを可能にするコードが
githubに有りましたので
それを参考にさせていただきます。

参考:face-morphing

このコード類を利用するには
少し沢山のインストールが必要で
特にopencvやdlibなどが必要です。

動かしたい方はgithubのRequirementsを
うまく満たすようにライブラリ群を揃えて下さい。

それではコードの方を見てみましょう。
JupyterNotebookで動かせるように
githubからファイルをダウンロードして
Notebookのディレクトリに配下に置きました。

まずはライブラリ群のインポートから
from morphing.face_landmark_detection import makeCorrespondence
from morphing.delaunay import makeDelaunay
from morphing.faceMorph import makeMorphs
import subprocess
import argparse
import shutil
import os

def doMorphing(thePredictor,theImage1,theImage2,theDuration,theFrameRate,theResult):
        [size,img1,img2,list1,list2,list3]=makeCorrespondence(thePredictor,theImage1,theImage2)
        if(size[0]==0):
                print("Sorry, but I couldn't find a face in the image "+size[1])
                return
        list4=makeDelaunay(size[1],size[0],list3)
        makeMorphs(theDuration,theFrameRate,img1,img2,list1,list2,list4,size,theResult)
これがうまく実行できていたら
動くだろうと思います。

実行部分はこれです。
# ランドマークファイルの場所
dat_path = 'shape_predictor_68_face_landmarks.datファイルのパス'
# 画像の指定
img1 = '画像のパス'
img2 = '画像のパス'
# 1秒あたりの画像枚数 dur = 5 # 動画の枚数 fr = 25 res = 'mp4ファイルの出力パス' doMorphing(dat_path,img1,img2,dur,fr,res)
2枚の画像と出力先を指定します。
1秒あたりの枚数と、全体の枚数も指定します。
多くすればよりスムーズになると思います。

出来上がりの確認は・・・
JupyterNotebook上では
%%HTML
を使うとHTMLを使用することができます。

%%HTML <video width="動画サイズ" height="
動画サイズ"> <source src="xxx.mp4" type="mp4のパス"> </video>

さて出来上がりを見てみましょう。
githubに有ったサンプル画像だとこうなります。

Videotogif (2)

こいつの仕組みとしては
画像と画像の中間画像を作っていって
それを動画化しているようです。

中間画像はこんな感じです。
bentyuukan

なかなか面白いですよね!!!


次に乃木坂46さんでやってみました。

Videotogif

いやー
ほんと素晴らしいですね!!!!!


クロちゃんも混ぜてみたくなったので
混ぜるとこうなります。
Videotogif (1)

うーーん
パンパンですね!!!!!


お口直しに
現在の乃木坂46全員分で
FaceMorphingしてますんで
見てやって下さい。

それでは。

このページのトップヘ